X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Ffenv%2Fx86_64%2Ffenv.s;h=443e35a27cc513f23b5d367a47a907cc1bfbb0ae;hb=adb88e773b3897fa222b5d1bb8e46b2d6b424214;hp=8226b52bbfe2001e7e1b4ee8b443fd21c5b4559a;hpb=e41182796014b0e2b52c7b3e6ee69ad7d0c3e723;p=musl diff --git a/src/fenv/x86_64/fenv.s b/src/fenv/x86_64/fenv.s index 8226b52b..443e35a2 100644 --- a/src/fenv/x86_64/fenv.s +++ b/src/fenv/x86_64/fenv.s @@ -1,49 +1,55 @@ -2: not %edi +.global feclearexcept +.type feclearexcept,@function +feclearexcept: + mov %edi,%ecx + not %ecx + stmxcsr -8(%rsp) + and %ecx,-8(%rsp) + ldmxcsr -8(%rsp) + test $0x3f,%ecx + jnz 2f +1: fnclex + xor %eax,%eax + ret +2: fnstsw %ax + and %ecx,%eax + jz 1b sub $32,%rsp fnstenv (%rsp) - and %edi,4(%rsp) - or %esi,4(%rsp) + mov %al,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 ret .global feraiseexcept .type feraiseexcept,@function feraiseexcept: + stmxcsr -8(%rsp) + or %edi,-8(%rsp) + ldmxcsr -8(%rsp) + fnstenv -32(%rsp) + or %edi,-28(%rsp) + fldenv -32(%rsp) xor %eax,%eax - mov %edi,%esi - xor %edi,%edi - test %esi,%esi - jnz 2b ret .global fesetround .type fesetround,@function fesetround: + push %rax xor %eax,%eax - sub $32,%rsp - fnstenv (%rsp) + mov %edi,%ecx + fnstcw (%rsp) andb $0xf3,1(%rsp) - or %edi,(%rsp) - fldenv (%rsp) + or %ch,1(%rsp) + fldcw (%rsp) stmxcsr (%rsp) - shl $3,%edi + shl $3,%ch andb $0x9f,1(%rsp) - or %edi,(%rsp) + or %ch,1(%rsp) ldmxcsr (%rsp) - add $32,%rsp + pop %rcx ret .global fegetround @@ -53,7 +59,7 @@ fegetround: stmxcsr (%rsp) pop %rax shr $3,%eax - and $0xc,%ah + and $0xc00,%eax ret .global fegetenv