aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/ieee754/dbl-64/s_modf.c
diff options
context:
space:
mode:
authorWilco Dijkstra <wdijkstr@arm.com>2021-01-07 15:26:26 +0000
committerWilco Dijkstra <wdijkstr@arm.com>2021-01-07 15:26:26 +0000
commit9e97f239eae1f2b1d2e694d844c0f6fd7c4dd271 (patch)
treea9a2828381bf838da12fa738da4f1bda4bee161c /sysdeps/ieee754/dbl-64/s_modf.c
parentcaa884dda78ff226243f8cb344915152052a5118 (diff)
downloadglibc-9e97f239eae1f2b1d2e694d844c0f6fd7c4dd271.zip
glibc-9e97f239eae1f2b1d2e694d844c0f6fd7c4dd271.tar.gz
glibc-9e97f239eae1f2b1d2e694d844c0f6fd7c4dd271.tar.bz2
Remove dbl-64/wordsize-64 (part 2)
Remove the wordsize-64 implementations by merging them into the main dbl-64 directory. The second patch just moves all wordsize-64 files and removes a few wordsize-64 uses in comments and Implies files. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/ieee754/dbl-64/s_modf.c')
-rw-r--r--sysdeps/ieee754/dbl-64/s_modf.c80
1 files changed, 30 insertions, 50 deletions
diff --git a/sysdeps/ieee754/dbl-64/s_modf.c b/sysdeps/ieee754/dbl-64/s_modf.c
index 722511c..8d14e78 100644
--- a/sysdeps/ieee754/dbl-64/s_modf.c
+++ b/sysdeps/ieee754/dbl-64/s_modf.c
@@ -1,3 +1,4 @@
+/* Rewritten for 64-bit machines by Ulrich Drepper <drepper@gmail.com>. */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
@@ -22,63 +23,42 @@
#include <math.h>
#include <math_private.h>
#include <libm-alias-double.h>
+#include <stdint.h>
static const double one = 1.0;
double
-__modf (double x, double *iptr)
+__modf(double x, double *iptr)
{
- int32_t i0, i1, j0;
- uint32_t i;
- EXTRACT_WORDS (i0, i1, x);
- j0 = ((i0 >> 20) & 0x7ff) - 0x3ff; /* exponent of x */
- if (j0 < 20) /* integer part in high x */
- {
- if (j0 < 0) /* |x|<1 */
- {
- INSERT_WORDS (*iptr, i0 & 0x80000000, 0); /* *iptr = +-0 */
- return x;
- }
- else
- {
- i = (0x000fffff) >> j0;
- if (((i0 & i) | i1) == 0) /* x is integral */
- {
- *iptr = x;
- INSERT_WORDS (x, i0 & 0x80000000, 0); /* return +-0 */
- return x;
- }
- else
- {
- INSERT_WORDS (*iptr, i0 & (~i), 0);
- return x - *iptr;
+ int64_t i0;
+ int32_t j0;
+ EXTRACT_WORDS64(i0,x);
+ j0 = ((i0>>52)&0x7ff)-0x3ff; /* exponent of x */
+ if(j0<52) { /* integer part in x */
+ if(j0<0) { /* |x|<1 */
+ /* *iptr = +-0 */
+ INSERT_WORDS64(*iptr,i0&UINT64_C(0x8000000000000000));
+ return x;
+ } else {
+ uint64_t i = UINT64_C(0x000fffffffffffff)>>j0;
+ if((i0&i)==0) { /* x is integral */
+ *iptr = x;
+ /* return +-0 */
+ INSERT_WORDS64(x,i0&UINT64_C(0x8000000000000000));
+ return x;
+ } else {
+ INSERT_WORDS64(*iptr,i0&(~i));
+ return x - *iptr;
+ }
}
+ } else { /* no fraction part */
+ *iptr = x*one;
+ /* We must handle NaNs separately. */
+ if (j0 == 0x400 && (i0 & UINT64_C(0xfffffffffffff)))
+ return x*one;
+ INSERT_WORDS64(x,i0&UINT64_C(0x8000000000000000)); /* return +-0 */
+ return x;
}
- }
- else if (__glibc_unlikely (j0 > 51)) /* no fraction part */
- {
- *iptr = x * one;
- /* We must handle NaNs separately. */
- if (j0 == 0x400 && ((i0 & 0xfffff) | i1))
- return x * one;
- INSERT_WORDS (x, i0 & 0x80000000, 0); /* return +-0 */
- return x;
- }
- else /* fraction part in low x */
- {
- i = ((uint32_t) (0xffffffff)) >> (j0 - 20);
- if ((i1 & i) == 0) /* x is integral */
- {
- *iptr = x;
- INSERT_WORDS (x, i0 & 0x80000000, 0); /* return +-0 */
- return x;
- }
- else
- {
- INSERT_WORDS (*iptr, i0, i1 & (~i));
- return x - *iptr;
- }
- }
}
#ifndef __modf
libm_alias_double (__modf, modf)