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