diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-03-17 20:10:02 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-03-17 20:10:02 -0400 |
commit | b60053e7621a29ace6ab5c7b4e256e252f31ad13 (patch) | |
tree | 1cd44d854060c9ce3e1e2f0ce17db1417cfa7bf1 /src/fenv/x86_64/fenv.s | |
parent | 316e024f63af0d0d2bb0df3dfce2620f4be827d1 (diff) | |
download | musl-b60053e7621a29ace6ab5c7b4e256e252f31ad13.tar.gz |
try fixing/optimizing x86_64 fenv exception code
untested; may need followup-fixes.
Diffstat (limited to 'src/fenv/x86_64/fenv.s')
-rw-r--r-- | src/fenv/x86_64/fenv.s | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/src/fenv/x86_64/fenv.s b/src/fenv/x86_64/fenv.s index 11aa3da2..443e35a2 100644 --- a/src/fenv/x86_64/fenv.s +++ b/src/fenv/x86_64/fenv.s @@ -1,32 +1,37 @@ -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 |