about summary refs log tree commit diff
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
parent316e024f63af0d0d2bb0df3dfce2620f4be827d1 (diff)
downloadmusl-b60053e7621a29ace6ab5c7b4e256e252f31ad13.tar.gz
musl-b60053e7621a29ace6ab5c7b4e256e252f31ad13.tar.xz
musl-b60053e7621a29ace6ab5c7b4e256e252f31ad13.zip
try fixing/optimizing x86_64 fenv exception code
untested; may need followup-fixes.
-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