On i386, avoid FCOM[P] and FTST in favour of FUCOM[P].
authorTaylor R Campbell <campbell@mumble.net>
Sat, 22 Feb 2014 22:28:39 +0000 (22:28 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Sat, 22 Feb 2014 22:28:40 +0000 (22:28 +0000)
The FCOM[P] and FTST instructions trap even on quiet NaN; the
FUCOM[P] instructions don't.

src/compiler/machines/i386/rulflo.scm
src/microcode/cmpauxmd/i386.m4

index 5dc0ab63056b1132f68cf8494f7e607a23654c36..ace08312e572718e2ad5244b7131bda7fc20a78e 100644 (file)
@@ -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.
 \f
 (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
index a779873c56afcdc6576131eca2b3b68405fc586e..33cf5476cad559bd0d2da128fe4b3193b862bd57 100644 (file)
@@ -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