* simplify-rtx.c (simplify_const_relational_operation): New function
authorsayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Mar 2004 17:06:25 +0000 (17:06 +0000)
committersayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Mar 2004 17:06:25 +0000 (17:06 +0000)
renamed from simplify_relational_operation.
(simplify_relational_operation): Change prototype to accept an
additional mode argument.  Call simplify_const_relational_operation.
(simplify_gen_relational): Update simplify_relational_operation call.
(simplify_ternary_operation): Update simplify_relational_operation
subroutine call to use simplify_const_relational_operation instead.

* rtl.h (simplify_const_relational_operation): Prototype here.
(simplify_relational_operation): Add addtional mode argument.

* combine.c (combine_simplify_rtx): Update calls to
simplify_relational_operation.
(simplify_set): Likewise.
(gen_binary): Likewise.
* cse.c (fold_rtx): Likewise.
* dojump.c (compare_from_rtx): Likewise.
(do_compare_rtx_and_jump): Likewise.
* integrate.c (subst_constants): Likewise.
* unroll.c (simplify_cmp_and_jump_insns): Likewise.

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

gcc/ChangeLog
gcc/combine.c
gcc/cse.c
gcc/dojump.c
gcc/integrate.c
gcc/rtl.h
gcc/simplify-rtx.c
gcc/unroll.c

index abdf3fa..0c98dbf 100644 (file)
@@ -1,3 +1,26 @@
+2004-03-09  Roger Sayle  <roger@eyesopen.com>
+
+       * simplify-rtx.c (simplify_const_relational_operation): New function
+       renamed from simplify_relational_operation.
+       (simplify_relational_operation): Change prototype to accept an
+       additional mode argument.  Call simplify_const_relational_operation.
+       (simplify_gen_relational): Update simplify_relational_operation call.
+       (simplify_ternary_operation): Update simplify_relational_operation
+       subroutine call to use simplify_const_relational_operation instead.
+
+       * rtl.h (simplify_const_relational_operation): Prototype here.
+       (simplify_relational_operation): Add addtional mode argument.
+
+       * combine.c (combine_simplify_rtx): Update calls to
+       simplify_relational_operation.
+       (simplify_set): Likewise.
+       (gen_binary): Likewise.
+       * cse.c (fold_rtx): Likewise.
+       * dojump.c (compare_from_rtx): Likewise.
+       (do_compare_rtx_and_jump): Likewise.
+       * integrate.c (subst_constants): Likewise.
+       * unroll.c (simplify_cmp_and_jump_insns): Likewise.
+
 2004-03-09  Kazu Hirata  <kazu@cs.umass.edu>
 
        * config/m32r/m32r.md: Remove all define_peephole's.
index c21d5c9..0262f1c 100644 (file)
@@ -3712,19 +3712,9 @@ combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int last,
            if (cmp_mode == VOIDmode)
              cmp_mode = op0_mode;
          }
-       temp = simplify_relational_operation (code, cmp_mode,
+       temp = simplify_relational_operation (code, mode, cmp_mode,
                                              XEXP (x, 0), XEXP (x, 1));
       }
-#ifdef FLOAT_STORE_FLAG_VALUE
-      if (temp != 0 && GET_MODE_CLASS (mode) == MODE_FLOAT)
-       {
-         if (temp == const0_rtx)
-           temp = CONST0_RTX (mode);
-         else
-           temp = CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALUE (mode),
-                                                mode);
-       }
-#endif
       break;
     case RTX_COMM_ARITH:
     case RTX_BIN_ARITH:
@@ -4993,7 +4983,8 @@ simplify_set (rtx x)
        tmp_mode = GET_MODE (op1);
       else
        tmp_mode = compare_mode;
-      tmp = simplify_relational_operation (old_code, tmp_mode, op0, op1);
+      tmp = simplify_const_relational_operation (old_code, tmp_mode,
+                                                op0, op1);
       if (tmp != NULL_RTX)
        {
          rtx pat = PATTERN (other_insn);
@@ -10108,7 +10099,7 @@ gen_binary (enum rtx_code code, enum machine_mode mode, rtx op0, rtx op1)
 
       if (op_mode == VOIDmode)
        op_mode = GET_MODE (op1);
-      result = simplify_relational_operation (code, op_mode, op0, op1);
+      result = simplify_relational_operation (code, mode, op_mode, op0, op1);
     }
   else
     result = simplify_binary_operation (code, mode, op0, op1);
index c84e761..632d353 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -3907,7 +3907,7 @@ fold_rtx (rtx x, rtx insn)
            }
        }
 
-      new = simplify_relational_operation (code,
+      new = simplify_relational_operation (code, mode,
                                           (mode_arg0 != VOIDmode
                                            ? mode_arg0
                                            : (GET_MODE (const_arg0
@@ -3922,16 +3922,6 @@ fold_rtx (rtx x, rtx insn)
                                                        : folded_arg1)),
                                           const_arg0 ? const_arg0 : folded_arg0,
                                           const_arg1 ? const_arg1 : folded_arg1);
-#ifdef FLOAT_STORE_FLAG_VALUE
-      if (new != 0 && GET_MODE_CLASS (mode) == MODE_FLOAT)
-       {
-         if (new == const0_rtx)
-           new = CONST0_RTX (mode);
-         else
-           new = (CONST_DOUBLE_FROM_REAL_VALUE
-                  (FLOAT_STORE_FLAG_VALUE (mode), mode));
-       }
-#endif
       break;
 
     case RTX_BIN_ARITH:
index 6b9569b..48e4953 100644 (file)
@@ -787,7 +787,8 @@ compare_from_rtx (rtx op0, rtx op1, enum rtx_code code, int unsignedp,
   do_pending_stack_adjust ();
 
   ucode = unsignedp ? unsigned_condition (code) : code;
-  if ((tem = simplify_relational_operation (ucode, mode, op0, op1)) != 0)
+  tem = simplify_const_relational_operation (ucode, mode, op0, op1);
+  if (tem != 0)
     return tem;
 
 #if 0
@@ -865,7 +866,8 @@ do_compare_rtx_and_jump (rtx op0, rtx op1, enum rtx_code code, int unsignedp,
   do_pending_stack_adjust ();
 
   ucode = unsignedp ? unsigned_condition (code) : code;
-  if ((tem = simplify_relational_operation (ucode, mode, op0, op1)) != 0)
+  tem = simplify_const_relational_operation (ucode, mode, op0, op1);
+  if (tem != 0)
     {
       if (tem == const_true_rtx)
         {
index f30e3b9..d90dfaa 100644 (file)
@@ -2738,24 +2738,8 @@ subst_constants (rtx *loc, rtx insn, struct inline_remap *map, int memonly)
 
          if (op_mode == VOIDmode)
            op_mode = GET_MODE (XEXP (x, 1));
-         new = simplify_relational_operation (code, op_mode,
+         new = simplify_relational_operation (code, GET_MODE (x), op_mode,
                                               XEXP (x, 0), XEXP (x, 1));
-#ifdef FLOAT_STORE_FLAG_VALUE
-         if (new != 0 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
-           {
-             enum machine_mode mode = GET_MODE (x);
-             if (new == const0_rtx)
-               new = CONST0_RTX (mode);
-             else
-               {
-                 REAL_VALUE_TYPE val;
-
-                 /* Avoid automatic aggregate initialization.  */
-                 val = FLOAT_STORE_FLAG_VALUE (mode);
-                 new = CONST_DOUBLE_FROM_REAL_VALUE (val, mode);
-               }
-           }
-#endif
          break;
        }
 
@@ -2783,10 +2767,10 @@ subst_constants (rtx *loc, rtx insn, struct inline_remap *map, int memonly)
                /* We have compare of two VOIDmode constants for which
                   we recorded the comparison mode.  */
                rtx temp =
-                 simplify_relational_operation (GET_CODE (op0),
-                                                map->compare_mode,
-                                                XEXP (op0, 0),
-                                                XEXP (op0, 1));
+                 simplify_const_relational_operation (GET_CODE (op0),
+                                                      map->compare_mode,
+                                                      XEXP (op0, 0),
+                                                      XEXP (op0, 1));
 
                if (temp == const0_rtx)
                  new = XEXP (x, 2);
index 6da7768..e98203f 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1751,8 +1751,10 @@ extern rtx simplify_binary_operation (enum rtx_code, enum machine_mode, rtx,
                                      rtx);
 extern rtx simplify_ternary_operation (enum rtx_code, enum machine_mode,
                                       enum machine_mode, rtx, rtx, rtx);
+extern rtx simplify_const_relational_operation (enum rtx_code,
+                                               enum machine_mode, rtx, rtx);
 extern rtx simplify_relational_operation (enum rtx_code, enum machine_mode,
-                                         rtx, rtx);
+                                         enum machine_mode, rtx, rtx);
 extern rtx simplify_gen_binary (enum rtx_code, enum machine_mode, rtx, rtx);
 extern rtx simplify_gen_unary (enum rtx_code, enum machine_mode, rtx,
                               enum machine_mode);
index b86a8b2..3647c24 100644 (file)
@@ -205,24 +205,9 @@ simplify_gen_relational (enum rtx_code code, enum machine_mode mode,
 
   if (cmp_mode != VOIDmode)
     {
-      tem = simplify_relational_operation (code, cmp_mode, op0, op1);
-
+      tem = simplify_relational_operation (code, mode, cmp_mode, op0, op1);
       if (tem)
-       {
-#ifdef FLOAT_STORE_FLAG_VALUE
-         if (GET_MODE_CLASS (mode) == MODE_FLOAT)
-           {
-             REAL_VALUE_TYPE val;
-             if (tem == const0_rtx)
-               return CONST0_RTX (mode);
-             if (tem != const_true_rtx)
-               abort ();
-             val = FLOAT_STORE_FLAG_VALUE (mode);
-             return CONST_DOUBLE_FROM_REAL_VALUE (val, mode);
-           }
-#endif
-         return tem;
-       }
+       return tem;
     }
 
   /* For the following tests, ensure const0_rtx is op1.  */
@@ -1156,6 +1141,7 @@ simplify_associative_operation (enum rtx_code code, enum machine_mode mode,
 
    Don't use this for relational operations such as EQ or LT.
    Use simplify_relational_operation instead.  */
+
 rtx
 simplify_binary_operation (enum rtx_code code, enum machine_mode mode,
                           rtx op0, rtx op1)
@@ -2515,12 +2501,13 @@ simplify_plus_minus (enum rtx_code code, enum machine_mode mode, rtx op0,
    is VOIDmode, both operands must also be VOIDmode and we compare the
    operands in "infinite precision".
 
-   If no simplification is possible, this function returns zero.  Otherwise,
-   it returns either const_true_rtx or const0_rtx.  */
+   If no simplification is possible, this function returns zero.
+   Otherwise, it returns either const_true_rtx or const0_rtx.  */
 
 rtx
-simplify_relational_operation (enum rtx_code code, enum machine_mode mode,
-                              rtx op0, rtx op1)
+simplify_const_relational_operation (enum rtx_code code,
+                                    enum machine_mode mode,
+                                    rtx op0, rtx op1)
 {
   int equal, op0lt, op0ltu, op1lt, op1ltu;
   rtx tem;
@@ -2569,8 +2556,8 @@ simplify_relational_operation (enum rtx_code code, enum machine_mode mode,
       /* We cannot do this for == or != if tem is a nonzero address.  */
       && ((code != EQ && code != NE) || ! nonzero_address_p (tem))
       && code != GTU && code != GEU && code != LTU && code != LEU)
-    return simplify_relational_operation (signed_condition (code),
-                                         mode, tem, const0_rtx);
+    return simplify_const_relational_operation (signed_condition (code),
+                                               mode, tem, const0_rtx);
 
   if (flag_unsafe_math_optimizations && code == ORDERED)
     return const_true_rtx;
@@ -2802,6 +2789,36 @@ simplify_relational_operation (enum rtx_code code, enum machine_mode mode,
       abort ();
     }
 }
+
+/* Like simplify_binary_operation except used for relational operators.
+   MODE is the mode of the result, and CMP_MODE is the mode of the operands.
+   If CMP_MODE is VOIDmode, both operands must also be VOIDmode and we
+   compare the operands in "infinite precision".  */
+
+rtx
+simplify_relational_operation (enum rtx_code code,
+                              enum machine_mode mode ATTRIBUTE_UNUSED,
+                              enum machine_mode cmp_mode, rtx op0, rtx op1)
+{
+  rtx tmp;
+
+  tmp = simplify_const_relational_operation (code, cmp_mode, op0, op1);
+  if (tmp)
+    {
+#ifdef FLOAT_STORE_FLAG_VALUE
+      if (GET_MODE_CLASS (mode) == MODE_FLOAT)
+       {
+         if (tmp == const0_rtx)
+           return CONST0_RTX (mode);
+         return CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALE (mode),
+                                              mode);
+       }
+#endif
+      return tmp;
+    }
+
+  return NULL_RTX;
+}
 \f
 /* Simplify CODE, an operation with result mode MODE and three operands,
    OP0, OP1, and OP2.  OP0_MODE was the mode of OP0 before it became
@@ -2898,8 +2915,10 @@ simplify_ternary_operation (enum rtx_code code, enum machine_mode mode,
          rtx temp;
          if (cmp_mode == VOIDmode)
            cmp_mode = op0_mode;
-         temp = simplify_relational_operation (GET_CODE (op0), cmp_mode,
-                                               XEXP (op0, 0), XEXP (op0, 1));
+         temp = simplify_const_relational_operation (GET_CODE (op0),
+                                                     cmp_mode,
+                                                     XEXP (op0, 0),
+                                                     XEXP (op0, 1));
 
          /* See if any simplifications were possible.  */
          if (temp == const0_rtx)
@@ -3561,22 +3580,12 @@ simplify_rtx (rtx x)
 
     case RTX_COMPARE:
     case RTX_COMM_COMPARE:
-      temp = simplify_relational_operation (code,
+      temp = simplify_relational_operation (code, mode,
                                            ((GET_MODE (XEXP (x, 0))
                                              != VOIDmode)
                                             ? GET_MODE (XEXP (x, 0))
                                             : GET_MODE (XEXP (x, 1))),
                                            XEXP (x, 0), XEXP (x, 1));
-#ifdef FLOAT_STORE_FLAG_VALUE
-      if (temp != 0 && GET_MODE_CLASS (mode) == MODE_FLOAT)
-       {
-         if (temp == const0_rtx)
-           temp = CONST0_RTX (mode);
-         else
-           temp = CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALUE (mode),
-                                                mode);
-       }
-#endif
       return temp;
 
     case RTX_EXTRA:
index 9ba2e91..88e4423 100644 (file)
@@ -1338,7 +1338,7 @@ simplify_cmp_and_jump_insns (enum rtx_code code, enum machine_mode mode,
 {
   rtx t, insn;
 
-  t = simplify_relational_operation (code, mode, op0, op1);
+  t = simplify_const_relational_operation (code, mode, op0, op1);
   if (!t)
     {
       enum rtx_code scode = signed_condition (code);