combine.c (simplify_comparison): Update op1 after constant extension.
authorRichard Henderson <rth@redhat.com>
Tue, 22 May 2001 06:46:20 +0000 (23:46 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 22 May 2001 06:46:20 +0000 (23:46 -0700)
        * combine.c (simplify_comparison): Update op1 after constant
        extension.
        * recog.c (const_int_operand): Accept only constants valid
        for the given mode.
        * genrecog.c: Update comments wrt const_int_operand.

From-SVN: r42427

gcc/ChangeLog
gcc/combine.c
gcc/genrecog.c
gcc/recog.c

index 20caa7a7724b9088fa7feb91035b83430f7cbe3f..cd7336eafb17d3f1f0dd52e411bf9cfb5cee8bc5 100644 (file)
@@ -1,5 +1,11 @@
 2001-05-21  Richard Henderson  <rth@redhat.com>
 
+       * combine.c (simplify_comparison): Update op1 after constant
+       extension.
+       * recog.c (const_int_operand): Accept only constants valid
+       for the given mode.
+       * genrecog.c: Update comments wrt const_int_operand.
+
        * emit-rtl.c (init_emit_once): Zero unused memory in a
        CONST_DOUBLE.
 
index 11ef550c9b5828bf82aa1ffc95dac3fe06bf5c96..e3ad70a960410366f2573715a508d406b06d0c80 100644 (file)
@@ -10025,6 +10025,7 @@ simplify_comparison (code, pop0, pop1)
       /* Get the constant we are comparing against and turn off all bits
         not on in our mode.  */
       const_op = trunc_int_for_mode (INTVAL (op1), mode);
+      op1 = GEN_INT (const_op);
 
       /* If we are comparing against a constant power of two and the value
         being compared can only have that single bit nonzero (e.g., it was
index 228a5701eb472955e19b6d9207122d7df468993a..00f425bc82268411f5b27ed244fe2a21a55f7139 100644 (file)
@@ -842,18 +842,16 @@ add_to_sequence (pattern, last, position, insn_type, top)
            test->u.pred.name = pred_name;
            test->u.pred.mode = mode;
 
-           /* See if we know about this predicate and save its number.  If
-              we do, and it only accepts one code, note that fact.  The
-              predicate `const_int_operand' only tests for a CONST_INT, so
-              if we do so we can avoid calling it at all.
-
-              Finally, if we know that the predicate does not allow
-              CONST_INT, we know that the only way the predicate can match
-              is if the modes match (here we use the kludge of relying on
-              the fact that "address_operand" accepts CONST_INT; otherwise,
-              it would have to be a special case), so we can test the mode
-              (but we need not).  This fact should considerably simplify the
-              generated code.  */
+           /* See if we know about this predicate and save its number.
+              If we do, and it only accepts one code, note that fact.
+
+              If we know that the predicate does not allow CONST_INT,
+              we know that the only way the predicate can match is if
+              the modes match (here we use the kludge of relying on the
+              fact that "address_operand" accepts CONST_INT; otherwise,
+              it would have to be a special case), so we can test the
+              mode (but we need not).  This fact should considerably
+              simplify the generated code.  */
 
            for (i = 0; i < NUM_KNOWN_PREDS; i++)
              if (! strcmp (preds[i].name, pred_name))
index 833a12253a76826c19d1bc63024fb271837cb2f7..888a2f546ff07f59ce4db34f686f718daf602441 100644 (file)
@@ -1145,9 +1145,16 @@ immediate_operand (op, mode)
 int
 const_int_operand (op, mode)
      register rtx op;
-     enum machine_mode mode ATTRIBUTE_UNUSED;
+     enum machine_mode mode;
 {
-  return GET_CODE (op) == CONST_INT;
+  if (GET_CODE (op) != CONST_INT)
+    return 0;
+
+  if (mode != VOIDmode
+      && trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
+    return 0;
+
+  return 1;
 }
 
 /* Returns 1 if OP is an operand that is a constant integer or constant