From 521ffb38371db5b1d3a6dd023a204d77091f5053 Mon Sep 17 00:00:00 2001 From: Taylor R Campbell Date: Sat, 22 Feb 2014 22:28:39 +0000 Subject: [PATCH] On i386, avoid FCOM[P] and FTST in favour of FUCOM[P]. The FCOM[P] and FTST instructions trap even on quiet NaN; the FUCOM[P] instructions don't. --- src/compiler/machines/i386/rulflo.scm | 17 +++++++---------- src/microcode/cmpauxmd/i386.m4 | 6 ++++-- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/compiler/machines/i386/rulflo.scm b/src/compiler/machines/i386/rulflo.scm index 5dc0ab630..ace08312e 100644 --- a/src/compiler/machines/i386/rulflo.scm +++ b/src/compiler/machines/i386/rulflo.scm @@ -657,14 +657,14 @@ USA. (st2 (flonum-source! source2))) (cond ((zero? st1) (flonum-branch! predicate - (LAP (FCOM (ST 0) (ST ,st2))))) + (LAP (FUCOM (ST 0) (ST ,st2))))) ((zero? st2) (flonum-branch! (commute-flonum-predicate predicate) - (LAP (FCOM (ST 0) (ST ,st1))))) + (LAP (FUCOM (ST 0) (ST ,st1))))) (else (flonum-branch! predicate (LAP (FLD (ST ,st1)) - (FCOMP (ST 0) (ST ,(1+ st2))))))))) + (FUCOMP (ST 0) (ST ,(1+ st2))))))))) (define-rule predicate (FLONUM-PRED-2-ARGS (? predicate) @@ -692,18 +692,15 @@ USA. (define (flonum-compare-zero predicate source) (let ((sti (flonum-source! source))) - (if (zero? sti) - (flonum-branch! predicate - (LAP (FTST))) - (flonum-branch! (commute-flonum-predicate predicate) - (LAP (FLDZ) - (FCOMP (ST 0) (ST ,(1+ sti)))))))) + (flonum-branch! (commute-flonum-predicate predicate) + (LAP (FLDZ) + (FUCOMP (ST 0) (ST ,(1+ sti))))))) (define (flonum-compare-one predicate source) (let ((sti (flonum-source! source))) (flonum-branch! (commute-flonum-predicate predicate) (LAP (FLD1) - (FCOMP (ST 0) (ST ,(1+ sti))))))) + (FUCOMP (ST 0) (ST ,(1+ sti))))))) (define (commute-flonum-predicate pred) (case pred diff --git a/src/microcode/cmpauxmd/i386.m4 b/src/microcode/cmpauxmd/i386.m4 index a779873c5..33cf5476c 100644 --- a/src/microcode/cmpauxmd/i386.m4 +++ b/src/microcode/cmpauxmd/i386.m4 @@ -984,7 +984,8 @@ define_hook_label(generic_$1) jne asm_generic_$1_fail OP(and,l) TW(rmask,REG(edx)) OP(fld,l) DOF(4,REG(edx)) - ftst + fldz + fucomp ST(1) fstsw REG(ax) fstp ST(0) sahf @@ -1088,7 +1089,8 @@ asm_generic_divide_flo_flo: OP(mov,l) TW(REG(ebx),REG(ecx)) OP(and,l) TW(rmask,REG(ecx)) OP(fld,l) DOF(4,REG(ecx)) # fldd - ftst + fldz + fucomp ST(1) fstsw REG(ax) sahf je asm_generic_divide_by_zero -- 2.25.1