From 773b0fe4473be18fdcc1b822630e2ebdb1719536 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 13 Jun 2011 13:37:43 -0400 Subject: x86_64 fenv support (untested; at least known to build successfully) --- src/fenv/x86_64/fenv.s | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/fenv/x86_64/fenv.s (limited to 'src') diff --git a/src/fenv/x86_64/fenv.s b/src/fenv/x86_64/fenv.s new file mode 100644 index 00000000..3ed22755 --- /dev/null +++ b/src/fenv/x86_64/fenv.s @@ -0,0 +1,88 @@ +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 +feclearexcept: + xor %eax,%eax + xor %esi,%esi + test %edi,%edi + jnz 2b + ret + +.global feraiseexcept +feraiseexcept: + xor %eax,%eax + mov %edi,%esi + xor %edi,%edi + test %esi,%esi + jnz 2b + ret + +.global fesetround +fesetround: + xor %eax,%eax + sub $32,%rsp + fnstenv (%rsp) + andb $0xf3,1(%rsp) + or %edi,(%rsp) + fldenv (%rsp) + stmxcsr (%rsp) + shl $3,%edi + andb $0x9f,1(%rsp) + or %edi,(%rsp) + ldmxcsr (%rsp) + add $32,%rsp + ret + +.global fegetround +fegetround: + push %rax + stmxcsr (%rsp) + pop %rax + shr $3,%eax + and $0xc,%ah + ret + +.global fegetenv +fegetenv: + xor %eax,%eax + fnstenv (%rdi) + stmxcsr 28(%rdi) + ret + +.global fesetenv +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 +fetestexcept: + push %rax + stmxcsr (%rsp) + pop %rsi + fnstsw %ax + or %esi,%eax + and %edi,%eax + ret -- cgit v1.2.3-70-g09d2