-2: not %edi
- sub $32,%rsp
- fnstenv (%rsp)
- and %edi,4(%rsp)
- or %esi,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
+feclearexcept:
+ # maintain exceptions in the sse mxcsr, clear x87 exceptions
+ mov %edi,%ecx
+ and $0x3f,%ecx
+ fnstsw %ax
+ test %eax,%ecx
+ jz 1f
+ fnclex
+1: stmxcsr -8(%rsp)
+ and $0x3f,%eax
+ or %eax,-8(%rsp)
+ test %ecx,-8(%rsp)
+ jz 1f
+ not %ecx
+ and %ecx,-8(%rsp)
+ ldmxcsr -8(%rsp)
+1: xor %eax,%eax
ret
.global feraiseexcept
.type feraiseexcept,@function
-feraiseexcept:
+feraiseexcept:
+ and $0x3f,%edi
+ stmxcsr -8(%rsp)
+ or %edi,-8(%rsp)
+ ldmxcsr -8(%rsp)
xor %eax,%eax
- mov %edi,%esi
- xor %edi,%edi
- test %esi,%esi
- jnz 2b
ret
-.global fesetround
-.type fesetround,@function
-fesetround:
+.global __fesetround
+.hidden __fesetround
+.type __fesetround,@function
+__fesetround:
push %rax
xor %eax,%eax
mov %edi,%ecx
ret
1: push %rax
push %rax
- push %rax
+ pushq $0xffff
pushq $0x37f
fldenv (%rsp)
pushq $0x1f80
.global fetestexcept
.type fetestexcept,@function
fetestexcept:
+ and $0x3f,%edi
push %rax
stmxcsr (%rsp)
pop %rsi