summaryrefslogtreecommitdiff
path: root/sysdeps/ieee754/dbl-64/e_sqrt.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-12-01 01:01:36 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-12-01 01:01:36 +0000
commit60f435bb0c097ead2d4609aa7e45a203eb24e43c (patch)
tree57707e61b9a43a675aada5dc4802ed11edd1ecbb /sysdeps/ieee754/dbl-64/e_sqrt.c
parent9627da32ec76600244e7723e99b9d4e27691f1ff (diff)
downloadglibc-60f435bb0c097ead2d4609aa7e45a203eb24e43c.tar.gz
Use hex float constants in sysdeps/ieee754/dbl-64/e_sqrt.c.
Various sysdeps/ieee754/dbl-64 functions use double constants defined using a union between a double and two ints, with separate big-endian and little-endian definitions of the constants. With modern C, this is unnecessary complication; hex float constants (or __builtin_inf etc.) suffice to specify the exact value desired, and so can avoid separate versions for each endianness. Having this complication also complicates cleanups such as removing slow paths from these library functions, as they need to make sure to remove both copies of variables that are no longer used after such a cleanup (and in at least one case, proper removal of a slow path will also involve removing slow-path-only values from the middle of an array - an array with both big-endian and little-endian copies - and adjusting other references to that array). So it makes sense to clean up the code to define these constants using hex floats and so eliminate the endianness conditional. This patch does so in the case of sqrt, where the two constants are such that it makes sense just to put them directly in the code using them and eliminate the names for them altogether. Tested for arm (the code generated for sqrt does change, though not in any significant way). * sysdeps/ieee754/dbl-64/e_sqrt.c: Do not include uroot.h. (__ieee754_sqrt): Use hex float constants instead of tm256.x and t512.x. * sysdeps/ieee754/dbl-64/uroot.h: Remove file.
Diffstat (limited to 'sysdeps/ieee754/dbl-64/e_sqrt.c')
-rw-r--r--sysdeps/ieee754/dbl-64/e_sqrt.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_sqrt.c b/sysdeps/ieee754/dbl-64/e_sqrt.c
index fff6d148fe..c1fed7d97e 100644
--- a/sysdeps/ieee754/dbl-64/e_sqrt.c
+++ b/sysdeps/ieee754/dbl-64/e_sqrt.c
@@ -21,7 +21,7 @@
/* */
/* FUNCTION: usqrt */
/* */
-/* FILES NEEDED: dla.h endian.h mydefs.h uroot.h */
+/* FILES NEEDED: dla.h endian.h mydefs.h */
/* uroot.tbl */
/* */
/* An ultimate sqrt routine. Given an IEEE double machine number x */
@@ -47,7 +47,6 @@
double
__ieee754_sqrt (double x)
{
-#include "uroot.h"
static const double
rt0 = 9.99999999859990725855365213134618E-01,
rt1 = 4.99999999495955425917856814202739E-01,
@@ -134,7 +133,7 @@ __ieee754_sqrt (double x)
return x; /* sqrt(+0)=+0, sqrt(-0)=-0 */
if (k < 0)
return (x - x) / (x - x); /* sqrt(-ve)=sNaN */
- return tm256.x * __ieee754_sqrt (x * t512.x);
+ return 0x1p-256 * __ieee754_sqrt (x * 0x1p512);
}
}
strong_alias (__ieee754_sqrt, __sqrt_finite)