about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>2018-01-12 20:39:42 -0200
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>2018-01-12 20:39:42 -0200
commitaf1e6be4ba60067907ea9e19e0cd6897d194e9cf (patch)
tree7b4980cf45cfc1f7fd95b143cbc4fd2b3929e5b4
parent98d13ce07a6aee9efb2ef2405a95c6bb8e01dca3 (diff)
downloadglibc-af1e6be4ba60067907ea9e19e0cd6897d194e9cf.tar.gz
glibc-af1e6be4ba60067907ea9e19e0cd6897d194e9cf.tar.xz
glibc-af1e6be4ba60067907ea9e19e0cd6897d194e9cf.zip
powerpc: Fix llround spurious inexact on 32-bit POWER4 [BZ #22697]
This issue is similar to BZ #19235, where spurious exceptions are
created from adding 0.5 then converting to an integer.
The solution is based on Joseph's fix for BZ #19235.

	[BZ #22697]
	* sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S (__llround):
	Do not add 0.5 to integer or out-of-range arguments.
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S5
2 files changed, 11 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index e9035fe658..f33212f549 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-12  Tulio Magno Quites Machado Filho  <tuliom@linux.vnet.ibm.com>
+
+	[BZ #22697]
+	* sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S (__llround):
+	Do not add 0.5 to integer or out-of-range arguments.
+
 2018-01-12  Dmitry V. Levin  <ldv@altlinux.org>
 
 	* po/bg.po: Update translations.
diff --git a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S b/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S
index d0b00ac383..5ad89a1486 100644
--- a/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S
+++ b/sysdeps/powerpc/powerpc32/power4/fpu/s_llround.S
@@ -71,6 +71,11 @@ ENTRY (__llround)
 	fcmpu	cr1,fp1,fp12	/* x is negative? x < 0.0  */
 	blt-	cr6,.Lretzero	/* 0.5 > x < -0.5 so just return 0.  */
 	bge-	cr7,.Lnobias	/* 2^52 > x < -2^52 just convert with no bias.  */
+	/* Test whether an integer to avoid spurious "inexact".  */
+	fadd	fp3,fp2,fp9
+	fsub	fp3,fp3,fp9
+	fcmpu	cr5,fp2,fp3
+	beq	cr5,.Lnobias
 	fadd	fp3,fp2,fp10	/* |x|+=0.5 bias to prepare to round.  */
 	bge	cr1,.Lconvert	/* x is positive so don't negate x.  */
 	fnabs	fp3,fp3		/* -(|x|+=0.5)  */