diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-03-20 03:21:26 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-03-20 03:21:26 +0000 |
commit | 41e2d0964834426db164c5e9b6f5d7a167815173 (patch) | |
tree | 523382feefc9e8e9434e7b5cd020d02eb91ebdc2 /sysdeps/libm-ieee754 | |
parent | d69e5f014e9e05e03d5ee41fb79ad98dea21f195 (diff) |
Optimize code by avoiding unneeded access to FP number.
Diffstat (limited to 'sysdeps/libm-ieee754')
-rw-r--r-- | sysdeps/libm-ieee754/s_modf.c | 10 | ||||
-rw-r--r-- | sysdeps/libm-ieee754/s_modff.c | 8 |
2 files changed, 10 insertions, 8 deletions
diff --git a/sysdeps/libm-ieee754/s_modf.c b/sysdeps/libm-ieee754/s_modf.c index 8075c5f813..888d4f416d 100644 --- a/sysdeps/libm-ieee754/s_modf.c +++ b/sysdeps/libm-ieee754/s_modf.c @@ -51,10 +51,8 @@ static double one = 1.0; } else { i = (0x000fffff)>>j0; if(((i0&i)|i1)==0) { /* x is integral */ - u_int32_t high; *iptr = x; - GET_HIGH_WORD(high,x); - INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */ + INSERT_WORDS(x,i0&0x80000000,0); /* return +-0 */ return x; } else { INSERT_WORDS(*iptr,i0&(~i),0); @@ -64,8 +62,10 @@ static double one = 1.0; } else if (j0>51) { /* no fraction part */ u_int32_t high; *iptr = x*one; - GET_HIGH_WORD(high,x); - INSERT_WORDS(x,high&0x80000000,0); /* return +-0 */ + /* 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 = ((u_int32_t)(0xffffffff))>>(j0-20); diff --git a/sysdeps/libm-ieee754/s_modff.c b/sysdeps/libm-ieee754/s_modff.c index 85f22c10e5..60f7f1ec29 100644 --- a/sysdeps/libm-ieee754/s_modff.c +++ b/sysdeps/libm-ieee754/s_modff.c @@ -8,7 +8,7 @@ * * Developed at SunPro, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice + * software is freely granted, provided that this notice * is preserved. * ==================================================== */ @@ -57,8 +57,10 @@ static float one = 1.0; } else { /* no fraction part */ u_int32_t ix; *iptr = x*one; - GET_FLOAT_WORD(ix,x); - SET_FLOAT_WORD(x,ix&0x80000000); /* return +-0 */ + /* We must handle NaNs separately. */ + if (j0 == 0x80 && (i0 & 0x7fffff)) + return x*one; + SET_FLOAT_WORD(x,i0&0x80000000); /* return +-0 */ return x; } } |