-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)
ret
.global fesetenv
+.type fesetenv,@function
fesetenv:
xor %eax,%eax
inc %rdi
ret
.global fetestexcept
+.type fetestexcept,@function
fetestexcept:
push %rax
stmxcsr (%rsp)