[PATCH][libm] Replace global constants with preprocessor defines
Andreas Jaeger
aj@suse.com
Thu Dec 27 09:02:00 GMT 2012
On 12/26/2012 08:45 AM, Siddhesh Poyarekar wrote:
> Hi,
>
> A lot of constants (including 1.0 and 0.0) are encoded as `struct
> number`. This adds an extra dereference in the code and hence makes
> it slower. Attached patch replaces these with preprocessor defines.
> I have only touched the multiprecision stuff for now and also only the
> more straightforward ones to make reviewing easier. I intend to clean
> out all such variables during 2.18 development. I have verified that
> these changes do not break the testsuite on x86_64.
>
> OK for 2.18?
>
> Siddhesh
>
> * sysdeps/ieee754/dbl-64/mpa.c (norm): Define R as RADIXI.
> (norm): Likewise.
> * sysdeps/ieee754/dbl-64/mpa2.h: Remove all static const
> variables with preprocessor constants.
> * sysdeps/ieee754/dbl-64/mpatan.h: Likewise.
> * sysdeps/ieee754/dbl-64/mpexp.h: Likewise.
> * sysdeps/ieee754/dbl-64/mpsqrt.h: Likewise.
>
>
> diff --git a/sysdeps/ieee754/dbl-64/mpa.c b/sysdeps/ieee754/dbl-64/mpa.c
> index f17e0d3..1c93bdc 100644
> --- a/sysdeps/ieee754/dbl-64/mpa.c
> +++ b/sysdeps/ieee754/dbl-64/mpa.c
> @@ -140,7 +140,7 @@ static void __cpymn(const mp_no *x, int m, mp_no *y, int n) {
> /* number *y, normalized case (|x| >= 2**(-1022))) */
> static void norm(const mp_no *x, double *y, int p)
> {
> - #define R radixi.d
> + #define R RADIXI
> int i;
> #if 0
> int k;
> @@ -200,7 +200,7 @@ static void denorm(const mp_no *x, double *y, int p)
> double a,v;
> #endif
>
> -#define R radixi.d
> +#define R RADIXI
> if (EX<-44 || (EX==-44 && X[1]<TWO5))
> { *y=ZERO; return; }
>
> diff --git a/sysdeps/ieee754/dbl-64/mpa2.h b/sysdeps/ieee754/dbl-64/mpa2.h
> index cfe22b8..1dd44ef 100644
> --- a/sysdeps/ieee754/dbl-64/mpa2.h
> +++ b/sysdeps/ieee754/dbl-64/mpa2.h
> @@ -30,65 +30,21 @@
> #ifndef MPA2_H
> #define MPA2_H
>
> -
> -#ifdef BIG_ENDI
> -static const number
> -/**/ radix = {{0x41700000, 0x00000000} }, /* 2**24 */
> -/**/ radixi = {{0x3e700000, 0x00000000} }, /* 2**-24 */
> -/**/ cutter = {{0x44b00000, 0x00000000} }, /* 2**76 */
> -/**/ zero = {{0x00000000, 0x00000000} }, /* 0 */
> -/**/ one = {{0x3ff00000, 0x00000000} }, /* 1 */
> -/**/ mone = {{0xbff00000, 0x00000000} }, /* -1 */
> -/**/ two = {{0x40000000, 0x00000000} }, /* 2 */
> -/**/ two5 = {{0x40400000, 0x00000000} }, /* 2**5 */
> -/**/ two10 = {{0x40900000, 0x00000000} }, /* 2**10 */
> -/**/ two18 = {{0x41100000, 0x00000000} }, /* 2**18 */
> -/**/ two19 = {{0x41200000, 0x00000000} }, /* 2**19 */
> -/**/ two23 = {{0x41600000, 0x00000000} }, /* 2**23 */
> -/**/ two52 = {{0x43300000, 0x00000000} }, /* 2**52 */
> -/**/ two57 = {{0x43800000, 0x00000000} }, /* 2**57 */
> -/**/ two71 = {{0x44600000, 0x00000000} }, /* 2**71 */
> -/**/ twom1032 = {{0x00000400, 0x00000000} }; /* 2**-1032 */
> -
> -#else
> -#ifdef LITTLE_ENDI
> -static const number
> -/**/ radix = {{0x00000000, 0x41700000} }, /* 2**24 */
> -/**/ radixi = {{0x00000000, 0x3e700000} }, /* 2**-24 */
> -/**/ cutter = {{0x00000000, 0x44b00000} }, /* 2**76 */
> -/**/ zero = {{0x00000000, 0x00000000} }, /* 0 */
> -/**/ one = {{0x00000000, 0x3ff00000} }, /* 1 */
> -/**/ mone = {{0x00000000, 0xbff00000} }, /* -1 */
> -/**/ two = {{0x00000000, 0x40000000} }, /* 2 */
> -/**/ two5 = {{0x00000000, 0x40400000} }, /* 2**5 */
> -/**/ two10 = {{0x00000000, 0x40900000} }, /* 2**10 */
> -/**/ two18 = {{0x00000000, 0x41100000} }, /* 2**18 */
> -/**/ two19 = {{0x00000000, 0x41200000} }, /* 2**19 */
> -/**/ two23 = {{0x00000000, 0x41600000} }, /* 2**23 */
> -/**/ two52 = {{0x00000000, 0x43300000} }, /* 2**52 */
> -/**/ two57 = {{0x00000000, 0x43800000} }, /* 2**57 */
> -/**/ two71 = {{0x00000000, 0x44600000} }, /* 2**71 */
> -/**/ twom1032 = {{0x00000000, 0x00000400} }; /* 2**-1032 */
> -
> -#endif
> -#endif
> -
> -#define RADIX radix.d
> -#define RADIXI radixi.d
> -#define CUTTER cutter.d
> -#define ZERO zero.d
> -#define ONE one.d
> -#define MONE mone.d
> -#define TWO two.d
> -#define TWO5 two5.d
> -#define TWO10 two10.d
> -#define TWO18 two18.d
> -#define TWO19 two19.d
> -#define TWO23 two23.d
> -#define TWO52 two52.d
> -#define TWO57 two57.d
> -#define TWO71 two71.d
> -#define TWOM1032 twom1032.d
> -
> +#define RADIX 0x1.0p24
> +#define RADIXI 0x1.0p-24
> +#define CUTTER 0x1.0p76
> +#define ZERO 0.0
> +#define ONE 1.0
> +#define MONE -1.0
> +#define TWO -2.0
> +#define TWO5 0x1.0p5
> +#define TWO10 0x1.0p10
> +#define TWO18 0x1.0p18
> +#define TWO19 0x1.0p19
> +#define TWO23 0x1.0p23
> +#define TWO52 0x1.0p52
> +#define TWO57 0x1.0p57
> +#define TWO71 0x1.0p71
> +#define TWOM1032 0x1.0p-1032
>
> #endif
> diff --git a/sysdeps/ieee754/dbl-64/mpatan.h b/sysdeps/ieee754/dbl-64/mpatan.h
> index c56b9b5..f920cc2 100644
> --- a/sysdeps/ieee754/dbl-64/mpatan.h
> +++ b/sysdeps/ieee754/dbl-64/mpatan.h
> @@ -30,8 +30,6 @@
> extern const number __atan_xm[8] attribute_hidden;
> extern const number __atan_twonm1[33] attribute_hidden;
> extern const number __atan_twom[8] attribute_hidden;
> -extern const number __atan_one attribute_hidden;
> -extern const number __atan_two attribute_hidden;
> extern const int __atan_np[33] attribute_hidden;
>
>
> @@ -97,10 +95,6 @@ extern const int __atan_np[33] attribute_hidden;
> /**/ {{0x40600000, 0x00000000} }, /* 128.0 */
> };
>
> - const number
> -/**/ __atan_one = {{0x3ff00000, 0x00000000} }, /* 1 */
> -/**/ __atan_two = {{0x40000000, 0x00000000} }; /* 2 */
> -
> #else
> #ifdef LITTLE_ENDI
>
> @@ -164,10 +158,6 @@ __atan_twonm1[33] = { /* 2n-1 */
> /**/ {{0x00000000, 0x40600000} }, /* 128.0 */
> };
>
> - const number
> -/**/ __atan_one = {{0x00000000, 0x3ff00000} }, /* 1 */
> -/**/ __atan_two = {{0x00000000, 0x40000000} }; /* 2 */
> -
> #endif
> #endif
>
> @@ -178,5 +168,5 @@ __atan_twonm1[33] = { /* 2n-1 */
> #endif
> #endif
>
> -#define ONE __atan_one.d
> -#define TWO __atan_two.d
> +#define ONE 1.0
> +#define TWO 2.0
> diff --git a/sysdeps/ieee754/dbl-64/mpexp.h b/sysdeps/ieee754/dbl-64/mpexp.h
> index 758255b..efa629d 100644
> --- a/sysdeps/ieee754/dbl-64/mpexp.h
> +++ b/sysdeps/ieee754/dbl-64/mpexp.h
> @@ -28,13 +28,6 @@
> #define MPEXP_H
>
> extern const number __mpexp_twomm1[33] attribute_hidden;
> -extern const number __mpexp_radix attribute_hidden;
> -extern const number __mpexp_radixi attribute_hidden;
> -extern const number __mpexp_zero attribute_hidden;
> -extern const number __mpexp_one attribute_hidden;
> -extern const number __mpexp_two attribute_hidden;
> -extern const number __mpexp_half attribute_hidden;
> -
>
> #ifndef AVOID_MPEXP_H
> #ifdef BIG_ENDI
> @@ -75,14 +68,6 @@ extern const number __mpexp_half attribute_hidden;
> /**/ {{0x3ae00000, 0x00000000} }, /* 2**-81 */
> };
>
> - const number
> -/**/ __mpexp_radix = {{0x41700000, 0x00000000} }, /* 2**24 */
> -/**/ __mpexp_radixi = {{0x3e700000, 0x00000000} }, /* 2**-24 */
> -/**/ __mpexp_zero = {{0x00000000, 0x00000000} }, /* 0 */
> -/**/ __mpexp_one = {{0x3ff00000, 0x00000000} }, /* 1 */
> -/**/ __mpexp_two = {{0x40000000, 0x00000000} }, /* 2 */
> -/**/ __mpexp_half = {{0x3fe00000, 0x00000000} }; /* 1/2 */
> -
> #else
> #ifdef LITTLE_ENDI
> const number
> @@ -121,23 +106,16 @@ extern const number __mpexp_half attribute_hidden;
> /**/ {{0x00000000, 0x3b100000} }, /* 2**-78 */
> /**/ {{0x00000000, 0x3ae00000} }, /* 2**-81 */
> };
> - const number
> -/**/ __mpexp_radix = {{0x00000000, 0x41700000} }, /* 2**24 */
> -/**/ __mpexp_radixi = {{0x00000000, 0x3e700000} }, /* 2**-24 */
> -/**/ __mpexp_zero = {{0x00000000, 0x00000000} }, /* 0 */
> -/**/ __mpexp_one = {{0x00000000, 0x3ff00000} }, /* 1 */
> -/**/ __mpexp_two = {{0x00000000, 0x40000000} }, /* 2 */
> -/**/ __mpexp_half = {{0x00000000, 0x3fe00000} }; /* 1/2 */
>
> #endif
> #endif
> #endif
>
> -#define RADIX __mpexp_radix.d
> -#define RADIXI __mpexp_radixi.d
> -#define ZERO __mpexp_zero.d
> -#define ONE __mpexp_one.d
> -#define TWO __mpexp_two.d
> -#define HALF __mpexp_half.d
> +#define RADIX 0x1.0p24
> +#define RADIXI 0x1.0p-24
> +#define ZERO 0.0
> +#define ONE 1.0
> +#define TWO 2.0
> +#define HALF 0x1.0p-1
Previously these had some comments (but were in hex, so this was really
needed). For some of them it is obvious but I suggest to stay with the
comments.
Let's say explictily "1/2" for HALF and 2^24 for RADIX etc.
Similar above for TWO5 etc. Either add a comment before that the
following are TWOX with 2^X or add it for each comment...
Andreas
--
Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
GPG fingerprint = 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126
More information about the Libc-alpha
mailing list