OSDN Git Service

2002-04-16 Dale Johannesen <dalej@apple.com>
authordje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Apr 2002 15:25:30 +0000 (15:25 +0000)
committerdje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 16 Apr 2002 15:25:30 +0000 (15:25 +0000)
        * config/rs6000/rs6000.c (rs6000_emit_cmove): Fail if modes of
        comparison operands do not match each other or if modes of
        conditions do not match result.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52367 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 99828fd..0ff5bff 100644 (file)
@@ -1,3 +1,9 @@
+2002-04-16  Dale Johannesen <dalej@apple.com>
+
+       * config/rs6000/rs6000.c (rs6000_emit_cmove): Fail if modes of
+       comparison operands do not match each other or if modes of
+       conditions do not match result.
+
 2002-04-16  Hartmut Penner <hpenner@de.ibm.com>
 
        PR target/6305
index 0409810..efd3a0b 100644 (file)
@@ -7245,9 +7245,18 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
   rtx op0 = rs6000_compare_op0;
   rtx op1 = rs6000_compare_op1;
   REAL_VALUE_TYPE c1;
-  enum machine_mode mode = GET_MODE (op0);
+  enum machine_mode compare_mode = GET_MODE (op0);
+  enum machine_mode result_mode = GET_MODE (dest);
   rtx temp;
 
+  /* These modes should always match. */
+  if ( GET_MODE (op1) != compare_mode )
+    return 0;
+  if ( GET_MODE (true_cond) != result_mode )
+    return 0;
+  if ( GET_MODE (false_cond) != result_mode )
+    return 0;
+
   /* First, work out if the hardware can do this at all, or
      if it's too slow...  */
   /* If the comparison is an integer one, since we only have fsel
@@ -7290,11 +7299,11 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
   /* At this point we know we can use fsel.  */
 
   /* Reduce the comparison to a comparison against zero.  */
-  temp = gen_reg_rtx (mode);
+  temp = gen_reg_rtx (compare_mode);
   emit_insn (gen_rtx_SET (VOIDmode, temp,
-                         gen_rtx_MINUS (mode, op0, op1)));
+                         gen_rtx_MINUS (compare_mode, op0, op1)));
   op0 = temp;
-  op1 = CONST0_RTX (mode);
+  op1 = CONST0_RTX (compare_mode);
 
   /* If we don't care about NaNs we can reduce some of the comparisons
      down to faster ones.  */
@@ -7324,52 +7333,52 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
       break;
 
     case LE:
-      temp = gen_reg_rtx (mode);
-      emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0)));
+      temp = gen_reg_rtx (compare_mode);
+      emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
       op0 = temp;
       break;
 
     case ORDERED:
-      temp = gen_reg_rtx (mode);
-      emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (mode, op0)));
+      temp = gen_reg_rtx (compare_mode);
+      emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_ABS (compare_mode, op0)));
       op0 = temp;
       break;
 
     case EQ:
-      temp = gen_reg_rtx (mode);
+      temp = gen_reg_rtx (compare_mode);
       emit_insn (gen_rtx_SET (VOIDmode, temp, 
-                             gen_rtx_NEG (mode,
-                                          gen_rtx_ABS (mode, op0))));
+                             gen_rtx_NEG (compare_mode,
+                                          gen_rtx_ABS (compare_mode, op0))));
       op0 = temp;
       break;
 
     case UNGE:
-      temp = gen_reg_rtx (mode);
+      temp = gen_reg_rtx (result_mode);
       emit_insn (gen_rtx_SET (VOIDmode, temp,
-                             gen_rtx_IF_THEN_ELSE (mode, 
+                             gen_rtx_IF_THEN_ELSE (result_mode,
                                                    gen_rtx_GE (VOIDmode,
                                                                op0, op1),
                                                    true_cond, false_cond)));
       false_cond = temp;
       true_cond = false_cond;
 
-      temp = gen_reg_rtx (mode);
-      emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0)));
+      temp = gen_reg_rtx (compare_mode);
+      emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
       op0 = temp;
       break;
 
     case GT:
-      temp = gen_reg_rtx (mode);
+      temp = gen_reg_rtx (result_mode);
       emit_insn (gen_rtx_SET (VOIDmode, temp,
-                             gen_rtx_IF_THEN_ELSE (mode, 
+                             gen_rtx_IF_THEN_ELSE (result_mode, 
                                                    gen_rtx_GE (VOIDmode,
                                                                op0, op1),
                                                    true_cond, false_cond)));
       true_cond = temp;
       false_cond = true_cond;
 
-      temp = gen_reg_rtx (mode);
-      emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (mode, op0)));
+      temp = gen_reg_rtx (compare_mode);
+      emit_insn (gen_rtx_SET (VOIDmode, temp, gen_rtx_NEG (compare_mode, op0)));
       op0 = temp;
       break;
 
@@ -7378,7 +7387,7 @@ rs6000_emit_cmove (dest, op, true_cond, false_cond)
     }
 
   emit_insn (gen_rtx_SET (VOIDmode, dest,
-                         gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
+                         gen_rtx_IF_THEN_ELSE (result_mode,
                                                gen_rtx_GE (VOIDmode,
                                                            op0, op1),
                                                true_cond, false_cond)));