workaround gcc got-register-reload performance problems in malloc
[musl] / src / fenv / x86_64 / fenv.s
index 3ed2275..443e35a 100644 (file)
@@ -1,58 +1,69 @@
-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
-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
+.type fesetround,@function
 fesetround:
+       push %rax
        xor %eax,%eax
-       sub $32,%rsp
-       fnstenv (%rsp)
+       mov %edi,%ecx
+       fnstcw (%rsp)
        andb $0xf3,1(%rsp)
-       or %edi,(%rsp)
-       fldenv (%rsp)
+       or %ch,1(%rsp)
+       fldcw (%rsp)
        stmxcsr (%rsp)
-       shl $3,%edi
+       shl $3,%ch
        andb $0x9f,1(%rsp)
-       or %edi,(%rsp)
+       or %ch,1(%rsp)
        ldmxcsr (%rsp)
-       add $32,%rsp
+       pop %rcx
        ret
 
 .global fegetround
+.type fegetround,@function
 fegetround:
        push %rax
        stmxcsr (%rsp)
        pop %rax
        shr $3,%eax
-       and $0xc,%ah
+       and $0xc00,%eax
        ret
 
 .global fegetenv
+.type fegetenv,@function
 fegetenv:
        xor %eax,%eax
        fnstenv (%rdi)
@@ -60,6 +71,7 @@ fegetenv:
        ret
 
 .global fesetenv
+.type fesetenv,@function
 fesetenv:
        xor %eax,%eax
        inc %rdi
@@ -78,6 +90,7 @@ fesetenv:
        ret
 
 .global fetestexcept
+.type fetestexcept,@function
 fetestexcept:
        push %rax
        stmxcsr (%rsp)