m68k.c (notice_update_cc): If an SFmode move is implemented using move.l...
authorRichard Sandiford <richard@codesourcery.com>
Fri, 19 Jan 2007 13:40:54 +0000 (13:40 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 19 Jan 2007 13:40:54 +0000 (13:40 +0000)
gcc/
* config/m68k/m68k.c (notice_update_cc): If an SFmode move is
implemented using move.l, do not use its cc result for floating-point
comparisons.

From-SVN: r120962

gcc/ChangeLog
gcc/config/m68k/m68k.c

index 4b62eb41e435eb7dc17c69a511f186f65bb22f04..bfe243824024db3e3ce2e6f4c8d023b6501ac87f 100644 (file)
@@ -1,3 +1,9 @@
+2007-01-19  Richard Sandiford  <richard@codesourcery.com>
+
+       * config/m68k/m68k.c (notice_update_cc): If an SFmode move is
+       implemented using move.l, do not use its cc result for floating-point
+       comparisons.
+
 2007-01-19  Richard Sandiford  <richard@codesourcery.com>
 
        * config/m68k/m68k.h (EXTRA_CONSTRAINT): Stop the 'T' constraint
index caa90cd3dcf1e594d4bc4d94ca0bd74ad969b6f9..78aae6dc0b54387faaa1a431e700f23d824e8b3a 100644 (file)
@@ -2834,12 +2834,18 @@ notice_update_cc (rtx exp, rtx insn)
          if (cc_status.value2 && modified_in_p (cc_status.value2, insn))
            cc_status.value2 = 0; 
        }
+      /* fmoves to memory or data registers do not set the condition
+        codes.  Normal moves _do_ set the condition codes, but not in
+        a way that is appropriate for comparison with 0, because -0.0
+        would be treated as a negative nonzero number.  Note that it
+        isn't appropriate to conditionalize this restiction on
+        HONOR_SIGNED_ZEROS because that macro merely indicates whether
+        we care about the difference between -0.0 and +0.0.  */
       else if (!FP_REG_P (SET_DEST (exp))
               && SET_DEST (exp) != cc0_rtx
               && (FP_REG_P (SET_SRC (exp))
                   || GET_CODE (SET_SRC (exp)) == FIX
-                  || GET_CODE (SET_SRC (exp)) == FLOAT_TRUNCATE
-                  || GET_CODE (SET_SRC (exp)) == FLOAT_EXTEND))
+                  || FLOAT_MODE_P (GET_MODE (SET_DEST (exp)))))
        CC_STATUS_INIT; 
       /* A pair of move insns doesn't produce a useful overall cc.  */
       else if (!FP_REG_P (SET_DEST (exp))