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