aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2016-05-24 21:11:18 +0000
committerJoseph Myers <joseph@codesourcery.com>2016-05-24 21:11:18 +0000
commit5ff81530dd14552a48a8fcb119e5867a1b504cc6 (patch)
treecea85f8f7867675eda9708b762ca2b8ab1ebbc52 /sysdeps
parent7cfcb778c9cc6ad3c3b5ac2dbb2308e81ba3235b (diff)
downloadglibc-5ff81530dd14552a48a8fcb119e5867a1b504cc6.tar
glibc-5ff81530dd14552a48a8fcb119e5867a1b504cc6.tar.gz
glibc-5ff81530dd14552a48a8fcb119e5867a1b504cc6.tar.bz2
glibc-5ff81530dd14552a48a8fcb119e5867a1b504cc6.zip
Do not raise "inexact" from x86_64 SSE4.1 ceil, floor (bug 15479).
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.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/x86_64/fpu/multiarch/s_ceil.S2
-rw-r--r--sysdeps/x86_64/fpu/multiarch/s_ceilf.S2
-rw-r--r--sysdeps/x86_64/fpu/multiarch/s_floor.S2
-rw-r--r--sysdeps/x86_64/fpu/multiarch/s_floorf.S2
4 files changed, 4 insertions, 4 deletions
diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceil.S b/sysdeps/x86_64/fpu/multiarch/s_ceil.S
index 40fa729955..f2ca31e5fa 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_ceil.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_ceil.S
@@ -33,6 +33,6 @@ weak_alias (__ceil, ceil)
ENTRY(__ceil_sse41)
- roundsd $2, %xmm0, %xmm0
+ roundsd $10, %xmm0, %xmm0
ret
END(__ceil_sse41)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_ceilf.S b/sysdeps/x86_64/fpu/multiarch/s_ceilf.S
index 9a06a5c174..e7a7b3a470 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_ceilf.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_ceilf.S
@@ -33,6 +33,6 @@ weak_alias (__ceilf, ceilf)
ENTRY(__ceilf_sse41)
- roundss $2, %xmm0, %xmm0
+ roundss $10, %xmm0, %xmm0
ret
END(__ceilf_sse41)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_floor.S b/sysdeps/x86_64/fpu/multiarch/s_floor.S
index 57a0eee5ba..19c0d44001 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_floor.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_floor.S
@@ -33,6 +33,6 @@ weak_alias (__floor, floor)
ENTRY(__floor_sse41)
- roundsd $1, %xmm0, %xmm0
+ roundsd $9, %xmm0, %xmm0
ret
END(__floor_sse41)
diff --git a/sysdeps/x86_64/fpu/multiarch/s_floorf.S b/sysdeps/x86_64/fpu/multiarch/s_floorf.S
index 74a149a950..96f51b6399 100644
--- a/sysdeps/x86_64/fpu/multiarch/s_floorf.S
+++ b/sysdeps/x86_64/fpu/multiarch/s_floorf.S
@@ -33,6 +33,6 @@ weak_alias (__floorf, floorf)
ENTRY(__floorf_sse41)
- roundss $1, %xmm0, %xmm0
+ roundss $9, %xmm0, %xmm0
ret
END(__floorf_sse41)