From b60053e7621a29ace6ab5c7b4e256e252f31ad13 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sat, 17 Mar 2012 20:10:02 -0400 Subject: [PATCH] try fixing/optimizing x86_64 fenv exception code untested; may need followup-fixes. --- src/fenv/x86_64/fenv.s | 41 +++++++++++++++++++++++------------------ 1 file 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 -- 2.25.1