summaryrefslogtreecommitdiff
path: root/src/fenv/x86_64/fenv.s
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2012-03-17 20:10:02 -0400
committerRich Felker <dalias@aerifal.cx>2012-03-17 20:10:02 -0400
commitb60053e7621a29ace6ab5c7b4e256e252f31ad13 (patch)
tree1cd44d854060c9ce3e1e2f0ce17db1417cfa7bf1 /src/fenv/x86_64/fenv.s
parent316e024f63af0d0d2bb0df3dfce2620f4be827d1 (diff)
downloadmusl-b60053e7621a29ace6ab5c7b4e256e252f31ad13.tar.gz
try fixing/optimizing x86_64 fenv exception code
untested; may need followup-fixes.
Diffstat (limited to 'src/fenv/x86_64/fenv.s')
-rw-r--r--src/fenv/x86_64/fenv.s41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/fenv/x86_64/fenv.s b/src/fenv/x86_64/fenv.s
index 11aa3da2..443e35a2 100644
--- a/src/fenv/x86_64/fenv.s
+++ b/src/fenv/x86_64/fenv.s
@@ -1,32 +1,37 @@
-2: not %edi
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept:
+ mov %edi,%ecx
+ not %ecx
+ stmxcsr -8(%rsp)
+ and %ecx,-8(%rsp)
+ ldmxcsr -8(%rsp)
+ test $0x3f,%ecx
+ jnz 2f
+1: fnclex
+ xor %eax,%eax
+ ret
+2: fnstsw %ax
+ and %ecx,%eax
+ jz 1b
sub $32,%rsp
fnstenv (%rsp)
- and %edi,4(%rsp)
- or %esi,4(%rsp)
+ mov %al,4(%rsp)
fldenv (%rsp)
- stmxcsr (%rsp)
- and %edi,(%rsp)
- ldmxcsr (%rsp)
add $32,%rsp
- ret
-
-.global feclearexcept
-.type feclearexcept,@function
-feclearexcept:
xor %eax,%eax
- xor %esi,%esi
- test %edi,%edi
- jnz 2b
ret
.global feraiseexcept
.type feraiseexcept,@function
feraiseexcept:
+ stmxcsr -8(%rsp)
+ or %edi,-8(%rsp)
+ ldmxcsr -8(%rsp)
+ fnstenv -32(%rsp)
+ or %edi,-28(%rsp)
+ fldenv -32(%rsp)
xor %eax,%eax
- mov %edi,%esi
- xor %edi,%edi
- test %esi,%esi
- jnz 2b
ret
.global fesetround