[PATCH][libm] Replace global constants with preprocessor defines

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH][libm] Replace global constants with preprocessor defines

Siddhesh Poyarekar-3
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
 
 #endif
diff --git a/sysdeps/ieee754/dbl-64/mpsqrt.h b/sysdeps/ieee754/dbl-64/mpsqrt.h
index 7cf5b69..f0a6a6b 100644
--- a/sysdeps/ieee754/dbl-64/mpsqrt.h
+++ b/sysdeps/ieee754/dbl-64/mpsqrt.h
@@ -27,31 +27,15 @@
 #ifndef MPSQRT_H
 #define MPSQRT_H
 
-extern const number __mpsqrt_one attribute_hidden;
-extern const number __mpsqrt_halfrad attribute_hidden;
 extern const int __mpsqrt_mp[33] attribute_hidden;
 
 
 #ifndef AVOID_MPSQRT_H
-#ifdef BIG_ENDI
-  const number
-/**/ __mpsqrt_one            = {{0x3ff00000, 0x00000000} }, /* 1      */
-/**/ __mpsqrt_halfrad        = {{0x41600000, 0x00000000} }; /* 2**23  */
-
-#else
-#ifdef LITTLE_ENDI
-  const number
-/**/ __mpsqrt_one            = {{0x00000000, 0x3ff00000} }, /* 1      */
-/**/ __mpsqrt_halfrad        = {{0x00000000, 0x41600000} }; /* 2**23  */
-
-#endif
-#endif
-
   const int __mpsqrt_mp[33] = {0,0,0,0,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,
      4,4,4,4,4,4,4,4,4};
 #endif
 
-#define  ONE       __mpsqrt_one.d
-#define  HALFRAD   __mpsqrt_halfrad.d
+#define  ONE       1.0
+#define  HALFRAD   0x1.0p23
 
 #endif
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH][libm] Replace global constants with preprocessor defines

Andreas Jaeger-8
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
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH][libm] Replace global constants with preprocessor defines

Siddhesh Poyarekar-3
On Thu, Dec 27, 2012 at 10:01:38AM +0100, Andreas Jaeger wrote:
> 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...

Thanks, here's v2 of the patch.

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..0d93da3 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 /* 2^24    */
+#define  RADIXI    0x1.0p-24 /* 2^-24   */
+#define  CUTTER    0x1.0p76 /* 2^76    */
+#define  ZERO      0.0 /* 0       */
+#define  ONE       1.0 /* 1       */
+#define  MONE      -1.0 /* -1      */
+#define  TWO       -2.0 /* -2      */
+#define  TWO5      0x1.0p5 /* 2^5     */
+#define  TWO10     0x1.0p10 /* 2^10    */
+#define  TWO18     0x1.0p18 /* 2^18    */
+#define  TWO19     0x1.0p19 /* 2^19    */
+#define  TWO23     0x1.0p23 /* 2^23    */
+#define  TWO52     0x1.0p52 /* 2^52    */
+#define  TWO57     0x1.0p57 /* 2^57    */
+#define  TWO71     0x1.0p71 /* 2^71    */
+#define  TWOM1032  0x1.0p-1032 /* 2^-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..59f5c67 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 /* 2^24 */
+#define  RADIXI    0x1.0p-24 /* 2^-24 */
+#define  ZERO      0.0 /* 0 */
+#define  ONE       1.0 /* 1 */
+#define  TWO       2.0 /* 2 */
+#define  HALF      0x1.0p-1 /* 1/2 */
 
 #endif
diff --git a/sysdeps/ieee754/dbl-64/mpsqrt.h b/sysdeps/ieee754/dbl-64/mpsqrt.h
index 7cf5b69..f776821 100644
--- a/sysdeps/ieee754/dbl-64/mpsqrt.h
+++ b/sysdeps/ieee754/dbl-64/mpsqrt.h
@@ -27,31 +27,15 @@
 #ifndef MPSQRT_H
 #define MPSQRT_H
 
-extern const number __mpsqrt_one attribute_hidden;
-extern const number __mpsqrt_halfrad attribute_hidden;
 extern const int __mpsqrt_mp[33] attribute_hidden;
 
 
 #ifndef AVOID_MPSQRT_H
-#ifdef BIG_ENDI
-  const number
-/**/ __mpsqrt_one            = {{0x3ff00000, 0x00000000} }, /* 1      */
-/**/ __mpsqrt_halfrad        = {{0x41600000, 0x00000000} }; /* 2**23  */
-
-#else
-#ifdef LITTLE_ENDI
-  const number
-/**/ __mpsqrt_one            = {{0x00000000, 0x3ff00000} }, /* 1      */
-/**/ __mpsqrt_halfrad        = {{0x00000000, 0x41600000} }; /* 2**23  */
-
-#endif
-#endif
-
   const int __mpsqrt_mp[33] = {0,0,0,0,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,
      4,4,4,4,4,4,4,4,4};
 #endif
 
-#define  ONE       __mpsqrt_one.d
-#define  HALFRAD   __mpsqrt_halfrad.d
+#define  ONE       1.0 /* 1 */
+#define  HALFRAD   0x1.0p23 /* 2^23 */
 
 #endif
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH][libm] Replace global constants with preprocessor defines

Andreas Jaeger-8
On 12/27/2012 12:49 PM, Siddhesh Poyarekar wrote:

> On Thu, Dec 27, 2012 at 10:01:38AM +0100, Andreas Jaeger wrote:
>> 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...
>
> Thanks, here's v2 of the patch.

Thanks, this is fine,

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
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH][libm] Replace global constants with preprocessor defines

Florian Weimer-5
In reply to this post by Siddhesh Poyarekar-3
On 12/26/2012 08:45 AM, Siddhesh Poyarekar wrote:

> 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.

This might have been done to cut down constant pool references on RISC
CPUs (ppc64 might qualify).  Hopefully, current GCC can perform this
optimization where beneficial.

--
Florian Weimer / Red Hat Product Security Team