optimize x86 feclearexcept
authorRich Felker <dalias@aerifal.cx>
Sat, 17 Mar 2012 23:29:00 +0000 (19:29 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 17 Mar 2012 23:29:00 +0000 (19:29 -0400)
if all exception flags will be cleared, we can avoid the expensive
store/reload of the environment and just use the fnclex instruction.

src/fenv/i386/fenv.s

index 647b796..e365b8f 100644 (file)
@@ -1,30 +1,34 @@
-2:     not %ecx
+.global feclearexcept
+.type feclearexcept,@function
+feclearexcept: 
+       mov 4(%esp),%ecx
+       not %ecx
+       test $0x3f,%ecx
+       jnz 2f
+1:     fnclex
+       xor %eax,%eax
+       ret
+2:     fnstsw %ax
+       and %ecx,%eax
+       jz 1b
        sub $32,%esp
        fnstenv (%esp)
-       and %ecx,4(%esp)
-       or %edx,4(%esp)
+       mov %al,4(%esp)
        fldenv (%esp)
        add $32,%esp
-       ret
-
-.global feclearexcept
-.type feclearexcept,@function
-feclearexcept: 
        xor %eax,%eax
-       mov 4(%esp),%ecx
-       xor %edx,%edx
-       test %ecx,%ecx
-       jnz 2b
        ret
 
 .global feraiseexcept
 .type feraiseexcept,@function
 feraiseexcept: 
+       mov 4(%esp),%eax
+       sub $32,%esp
+       fnstenv (%esp)
+       or %al,4(%esp)
+       fldenv (%esp)
+       add $32,%esp
        xor %eax,%eax
-       mov 4(%esp),%edx
-       xor %ecx,%ecx
-       test %edx,%edx
-       jnz 2b
        ret
 
 .global fesetround