try fixing/optimizing x86_64 fenv exception code
authorRich Felker <dalias@aerifal.cx>
Sun, 18 Mar 2012 00:10:02 +0000 (20:10 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 18 Mar 2012 00:10:02 +0000 (20:10 -0400)
untested; may need followup-fixes.

src/fenv/x86_64/fenv.s

index 11aa3da..443e35a 100644 (file)
@@ -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