.global feclearexcept .type feclearexcept,@function 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: and $0x3f,%edi stmxcsr -8(%rsp) or %edi,-8(%rsp) ldmxcsr -8(%rsp) xor %eax,%eax ret .global __fesetround .type __fesetround,@function __fesetround: push %rax xor %eax,%eax mov %edi,%ecx fnstcw (%rsp) andb $0xf3,1(%rsp) or %ch,1(%rsp) fldcw (%rsp) stmxcsr (%rsp) shl $3,%ch andb $0x9f,1(%rsp) or %ch,1(%rsp) ldmxcsr (%rsp) pop %rcx ret .global fegetround .type fegetround,@function fegetround: push %rax stmxcsr (%rsp) pop %rax shr $3,%eax and $0xc00,%eax ret .global fegetenv .type fegetenv,@function fegetenv: xor %eax,%eax fnstenv (%rdi) stmxcsr 28(%rdi) ret .global fesetenv .type fesetenv,@function fesetenv: xor %eax,%eax inc %rdi jz 1f fldenv -1(%rdi) ldmxcsr 27(%rdi) ret 1: push %rax push %rax push %rax pushq $0x37f fldenv (%rsp) pushq $0x1f80 ldmxcsr (%rsp) add $40,%rsp ret .global fetestexcept .type fetestexcept,@function fetestexcept: and $0x3f,%edi push %rax stmxcsr (%rsp) pop %rsi fnstsw %ax or %esi,%eax and %edi,%eax ret