| Index: fusl/src/fenv/x86_64/fenv.s
|
| diff --git a/fusl/src/fenv/x86_64/fenv.s b/fusl/src/fenv/x86_64/fenv.s
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b5aeaf4f494df7ddbf46664f427f5c887b618a6f
|
| --- /dev/null
|
| +++ b/fusl/src/fenv/x86_64/fenv.s
|
| @@ -0,0 +1,97 @@
|
| +.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
|
| + pushq $0xffff
|
| + 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
|
|
|