diff options
author | Joseph Myers <joseph@codesourcery.com> | 2016-05-27 17:47:54 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2016-05-27 17:47:54 +0000 |
commit | f6ef0657e493e1f84dfb5b0b1966cf34e371ae27 (patch) | |
tree | bb1f337bbc8ceb8b9a43fe869792f8c90be8f7e3 /sysdeps/powerpc/powerpc64/fpu/s_roundf.S | |
parent | debf7618f68deed8b378beb199525d4467edb6d4 (diff) | |
download | glibc-f6ef0657e493e1f84dfb5b0b1966cf34e371ae27.zip glibc-f6ef0657e493e1f84dfb5b0b1966cf34e371ae27.tar.gz glibc-f6ef0657e493e1f84dfb5b0b1966cf34e371ae27.tar.bz2 |
Fix powerpc64 ceil, rint etc. on sNaN input (bug 20160).
The powerpc64 versions of ceil, floor, round, trunc, rint, nearbyint
and their float versions return sNaN for sNaN input when they should
return qNaN. This patch fixes them to add a NaN argument to itself to
quiet sNaNs before returning.
Tested for powerpc64.
[BZ #20160]
* sysdeps/powerpc/powerpc64/fpu/s_ceil.S (__ceil): Add NaN
argument to itself before returning the result.
* sysdeps/powerpc/powerpc64/fpu/s_ceilf.S (__ceilf): Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_floor.S (__floor): Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_floorf.S (__floorf): Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_nearbyint.S (__nearbyint):
Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_nearbyintf.S (__nearbyintf):
Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_rint.S (__rint): Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_rintf.S (__rintf): Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_round.S (__round): Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_roundf.S (__roundf): Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_trunc.S (__trunc): Likewise.
* sysdeps/powerpc/powerpc64/fpu/s_truncf.S (__truncf): Likewise.
Diffstat (limited to 'sysdeps/powerpc/powerpc64/fpu/s_roundf.S')
-rw-r--r-- | sysdeps/powerpc/powerpc64/fpu/s_roundf.S | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/sysdeps/powerpc/powerpc64/fpu/s_roundf.S b/sysdeps/powerpc/powerpc64/fpu/s_roundf.S index 8841d83..e47a9df 100644 --- a/sysdeps/powerpc/powerpc64/fpu/s_roundf.S +++ b/sysdeps/powerpc/powerpc64/fpu/s_roundf.S @@ -46,7 +46,7 @@ EALIGN (__roundf, 4, 0) mffs fp11 /* Save current FPU rounding mode and "inexact" state. */ fcmpu cr6,fp1,fp12 /* if (x > 0.0) */ - bnllr- cr7 + bnl- cr7,.L10 mtfsfi 7,1 /* Set rounding mode toward 0. */ lfs fp10,.LC1@toc(2) ble- cr6,.L4 @@ -69,6 +69,12 @@ EALIGN (__roundf, 4, 0) mtfsf 0xff,fp11 /* Restore previous rounding mode and "inexact" state. */ blr +.L10: + /* Ensure sNaN input is converted to qNaN. */ + fcmpu cr7,fp1,fp1 + beqlr cr7 + fadds fp1,fp1,fp1 + blr END (__roundf) weak_alias (__roundf, roundf) |