Do not raise "inexact" from x86_64 SSE4.1 ceil, floor (bug 15479).
authorJoseph Myers <joseph@codesourcery.com>
Tue, 24 May 2016 21:11:18 +0000 (21:11 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 24 May 2016 21:11:18 +0000 (21:11 +0000)
Continuing fixes for ceil and floor functions not to raise the
"inexact" exception, this patch fixes the x86_64 SSE4.1 versions.  The
roundss / roundsd instructions take an immediate operand that
determines the rounding mode and whether to raise "inexact"; this just
needs bit 3 set to disable "inexact", which this patch does.

Remark: we don't have an SSE4.1 version of trunc / truncf (using this
instruction with operand 11); I'd expect one to make sense, but of
course it should be benchmarked against the existing C code.  I'll
file a bug in Bugzilla for the lack of such a version.

Tested for x86_64.

[BZ #15479]
* sysdeps/x86_64/fpu/multiarch/s_ceil.S (__ceil_sse41): Set bit 3
of immediate operand to rounding instruction.
* sysdeps/x86_64/fpu/multiarch/s_ceilf.S (__ceilf_sse41):
Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floor.S (__floor_sse41):
Likewise.
* sysdeps/x86_64/fpu/multiarch/s_floorf.S (__floorf_sse41):
Likewise.

ChangeLog
sysdeps/x86_64/fpu/multiarch/s_ceil.S
sysdeps/x86_64/fpu/multiarch/s_ceilf.S
sysdeps/x86_64/fpu/multiarch/s_floor.S
sysdeps/x86_64/fpu/multiarch/s_floorf.S

index f327aa8..8f119fa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2016-05-24  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #15479]
+       * sysdeps/x86_64/fpu/multiarch/s_ceil.S (__ceil_sse41): Set bit 3
+       of immediate operand to rounding instruction.
+       * sysdeps/x86_64/fpu/multiarch/s_ceilf.S (__ceilf_sse41):
+       Likewise.
+       * sysdeps/x86_64/fpu/multiarch/s_floor.S (__floor_sse41):
+       Likewise.
+       * sysdeps/x86_64/fpu/multiarch/s_floorf.S (__floorf_sse41):
+       Likewise.
+
 2016-05-24  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
 
        * math/libm-test.inc (MIN_EXP): Directly define as
index 40fa729..f2ca31e 100644 (file)
@@ -33,6 +33,6 @@ weak_alias (__ceil, ceil)
 
 
 ENTRY(__ceil_sse41)
-       roundsd $2, %xmm0, %xmm0
+       roundsd $10, %xmm0, %xmm0
        ret
 END(__ceil_sse41)
index 9a06a5c..e7a7b3a 100644 (file)
@@ -33,6 +33,6 @@ weak_alias (__ceilf, ceilf)
 
 
 ENTRY(__ceilf_sse41)
-       roundss $2, %xmm0, %xmm0
+       roundss $10, %xmm0, %xmm0
        ret
 END(__ceilf_sse41)
index 57a0eee..19c0d44 100644 (file)
@@ -33,6 +33,6 @@ weak_alias (__floor, floor)
 
 
 ENTRY(__floor_sse41)
-       roundsd $1, %xmm0, %xmm0
+       roundsd $9, %xmm0, %xmm0
        ret
 END(__floor_sse41)
index 74a149a..96f51b6 100644 (file)
@@ -33,6 +33,6 @@ weak_alias (__floorf, floorf)
 
 
 ENTRY(__floorf_sse41)
-       roundss $1, %xmm0, %xmm0
+       roundss $9, %xmm0, %xmm0
        ret
 END(__floorf_sse41)