about summary refs log tree commit diff
path: root/sysdeps/powerpc/powerpc32/fpu/s_round.S
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-05-27 17:31:21 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-05-27 17:31:21 +0000
commitdebf7618f68deed8b378beb199525d4467edb6d4 (patch)
tree7735fc554becbc3f0555369adc5dfdce33e4e549 /sysdeps/powerpc/powerpc32/fpu/s_round.S
parentf64f68f53b2bd7c490f198b6da84f0ef41942aee (diff)
downloadglibc-debf7618f68deed8b378beb199525d4467edb6d4.tar.gz
glibc-debf7618f68deed8b378beb199525d4467edb6d4.tar.xz
glibc-debf7618f68deed8b378beb199525d4467edb6d4.zip
Fix powerpc32 ceil, rint etc. on sNaN input (bug 20160).
The powerpc32 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.  The powerpc64 versions, which have the
same bug, will be addressed separately.

Tested for powerpc32.

	[BZ #20160]
	* sysdeps/powerpc/powerpc32/fpu/s_ceil.S (__ceil): Add NaN
	argument to itself before returning the result.
	* sysdeps/powerpc/powerpc32/fpu/s_ceilf.S (__ceilf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_floor.S (__floor): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_floorf.S (__floorf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_nearbyint.S (__nearbyint):
	Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_nearbyintf.S (__nearbyintf):
	Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_rint.S (__rint): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_rintf.S (__rintf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_round.S (__round): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_roundf.S (__roundf): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_trunc.S (__trunc): Likewise.
	* sysdeps/powerpc/powerpc32/fpu/s_truncf.S (__truncf): Likewise.
Diffstat (limited to 'sysdeps/powerpc/powerpc32/fpu/s_round.S')
-rw-r--r--sysdeps/powerpc/powerpc32/fpu/s_round.S8
1 files changed, 7 insertions, 1 deletions
diff --git a/sysdeps/powerpc/powerpc32/fpu/s_round.S b/sysdeps/powerpc/powerpc32/fpu/s_round.S
index ae25364bd9..c224e0c2e3 100644
--- a/sysdeps/powerpc/powerpc32/fpu/s_round.S
+++ b/sysdeps/powerpc/powerpc32/fpu/s_round.S
@@ -57,7 +57,7 @@ ENTRY (__round)
 	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.  */
 #ifdef SHARED
 	lfs	fp10,.LC1-.LC0(r9)
@@ -85,6 +85,12 @@ ENTRY (__round)
 	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
+	fadd	fp1,fp1,fp1
+	blr
 	END (__round)
 
 weak_alias (__round, round)