X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Ffenv%2Fx86_64%2Ffenv.s;h=98d876da26e98e80052b7f1754636d932aff8053;hb=a0993f8f0f161423ecdcb754f282ffd2fe47a7b5;hp=11aa3da2fa4fc55717a8ec21c64411f1d60ee59f;hpb=9cb6878e747909c7a45dd1c4dd550ac62e1f7690;p=musl diff --git a/src/fenv/x86_64/fenv.s b/src/fenv/x86_64/fenv.s index 11aa3da2..98d876da 100644 --- a/src/fenv/x86_64/fenv.s +++ b/src/fenv/x86_64/fenv.s @@ -1,37 +1,38 @@ -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 .type feclearexcept,@function -feclearexcept: - xor %eax,%eax - xor %esi,%esi - test %edi,%edi - jnz 2b +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: +feraiseexcept: + and $0x3f,%edi + stmxcsr -8(%rsp) + or %edi,-8(%rsp) + ldmxcsr -8(%rsp) xor %eax,%eax - mov %edi,%esi - xor %edi,%edi - test %esi,%esi - jnz 2b ret -.global fesetround -.type fesetround,@function -fesetround: +.global __fesetround +.hidden __fesetround +.type __fesetround,@function +__fesetround: push %rax xor %eax,%eax mov %edi,%ecx @@ -76,7 +77,7 @@ fesetenv: ret 1: push %rax push %rax - push %rax + pushq $0xffff pushq $0x37f fldenv (%rsp) pushq $0x1f80 @@ -87,6 +88,7 @@ fesetenv: .global fetestexcept .type fetestexcept,@function fetestexcept: + and $0x3f,%edi push %rax stmxcsr (%rsp) pop %rsi