c4x-protos.h, [...]: Add new functions nonimmediate_src_operand and nonimmediate_lsrc...
authorHerman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
Sun, 3 Mar 2002 23:05:33 +0000 (00:05 +0100)
committerMichael Hayes <m.hayes@gcc.gnu.org>
Sun, 3 Mar 2002 23:05:33 +0000 (23:05 +0000)
* c4x-protos.h, c4x.h, c4x.c, c4x.md: Add new functions
nonimmediate_src_operand and nonimmediate_lsrc_operand to
disallow ZERO_EXTEND with CONST_INT or CONST_DOUBLE.

From-SVN: r50266

gcc/ChangeLog
gcc/config/c4x/c4x-protos.h
gcc/config/c4x/c4x.c
gcc/config/c4x/c4x.h
gcc/config/c4x/c4x.md

index 792843c4c4ea8dd8e013712a9e1a5e725cfca8ca..e374165af228ed83fc49c3b0527be8ffb212f82e 100644 (file)
@@ -1,3 +1,9 @@
+2002-03-04  Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
+
+       * c4x-protos.h, c4x.h, c4x.c, c4x.md: Add new functions
+       nonimmediate_src_operand and nonimmediate_lsrc_operand to
+       disallow ZERO_EXTEND with CONST_INT or CONST_DOUBLE.
+
 2002-03-03  Richard Henderson  <rth@redhat.com>
 
        * toplev.c (rest_of_decl_compilation): Revert last two changes.
index d24a1f1bce4bc025e52058e48c153a7eb405b853..10ed818fde35744c7996b4711c2fea7f22774b8c 100644 (file)
@@ -157,6 +157,10 @@ extern int lsrc_operand PARAMS ((rtx, enum machine_mode));
 
 extern int tsrc_operand PARAMS ((rtx, enum machine_mode));
 
+extern int nonimmediate_src_operand PARAMS ((rtx, enum machine_mode));
+
+extern int nonimmediate_lsrc_operand PARAMS ((rtx, enum machine_mode));
+
 extern int addr_reg_operand PARAMS ((rtx, enum machine_mode));
 
 extern int index_reg_operand PARAMS ((rtx, enum machine_mode));
index 6743990bede00225ff2cb593ce840ba32a6b581b..e34ed5c59bdc550ea19104a095ca18a63af70c0c 100644 (file)
@@ -3465,6 +3465,34 @@ tsrc_operand (op, mode)
 }
 
 
+/* Check src operand of two operand non immedidate instructions.  */
+
+int
+nonimmediate_src_operand (op, mode)
+     rtx op;
+     enum machine_mode mode;
+{
+  if (GET_CODE (op) == CONST_INT || GET_CODE (op) == CONST_DOUBLE)
+    return 0;
+
+  return src_operand (op, mode);
+}
+
+
+/* Check logical src operand of two operand non immedidate instructions.  */
+
+int
+nonimmediate_lsrc_operand (op, mode)
+     rtx op;
+     enum machine_mode mode;
+{
+  if (GET_CODE (op) == CONST_INT || GET_CODE (op) == CONST_DOUBLE)
+    return 0;
+
+  return lsrc_operand (op, mode);
+}
+
+
 int
 reg_or_const_operand (op, mode)
      rtx op;
index d9cd3da4e995353dcce2d604a49df6d9b9696450..9ada032edc0b4e0c56083107cfa6bf5ea1834193 100644 (file)
@@ -2288,6 +2288,8 @@ if (final_sequence != NULL_RTX)                           \
   {"src_hi_operand", {SUBREG, REG, MEM, CONST_DOUBLE}},        \
   {"lsrc_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE}}, \
   {"tsrc_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE}}, \
+  {"nonimmediate_src_operand", {SUBREG, REG, MEM}},            \
+  {"nonimmediate_lsrc_operand", {SUBREG, REG, MEM}},           \
   {"any_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE}}, \
   {"par_ind_operand", {MEM}},                                  \
   {"parallel_operand", {SUBREG, REG, MEM}},                    \
index 242ed154cfe8309322af82b4e65da45bad97e9ce..f7e44b1c4ec26410a4db4862bc0958530f14bcbc 100644 (file)
                (truncate:QI
                 (lshiftrt:HI
                  (mult:HI
-                  (zero_extend:HI (match_operand:QI 1 "src_operand" ""))
-                  (zero_extend:HI (match_operand:QI 2 "lsrc_operand" "")))
+                  (zero_extend:HI (match_operand:QI 1
+                                  "nonimmediate_src_operand" ""))
+                  (zero_extend:HI (match_operand:QI 2
+                                  "nonimmediate_lsrc_operand" "")))
                  (const_int 32))))
               (clobber (reg:CC_NOOV 21))])]
  ""
         (truncate:QI
          (lshiftrt:HI
           (mult:HI 
-           (zero_extend:HI (match_operand:QI 1 "src_operand" "%0,rR,rS<>,0,rR,rS<>"))
-           (zero_extend:HI (match_operand:QI 2 "lsrc_operand" "rLm,JR,rS<>,rLm,JR,rS<>")))
+           (zero_extend:HI (match_operand:QI 1
+                           "nonimmediate_src_operand" "%0,rR,rS<>,0,rR,rS<>"))
+           (zero_extend:HI (match_operand:QI 2
+                           "nonimmediate_lsrc_operand" "rm,R,rS<>,rm,R,rS<>")))
           (const_int 32))))
    (clobber (reg:CC_NOOV 21))]
   "! TARGET_C3X && valid_operands (MULT, operands, QImode)"
         (truncate:QI
          (lshiftrt:HI
           (mult:HI 
-           (zero_extend:HI (match_operand:QI 1 "src_operand" "0,rR,rS<>"))
-           (zero_extend:HI (match_operand:QI 2 "lsrc_operand" "rLm,JR,rS<>")))
+           (zero_extend:HI (match_operand:QI 1
+                           "nonimmediate_src_operand" "0,rR,rS<>"))
+           (zero_extend:HI (match_operand:QI 2
+                           "nonimmediate_lsrc_operand" "rm,R,rS<>")))
           (const_int 32))))]
   "! TARGET_C3X && valid_operands (MULT, operands, QImode)"
   "@
 
 (define_insn "zero_extendqihi2"
   [(set (match_operand:HI 0 "reg_operand" "=?dc")
-        (zero_extend:HI (match_operand:QI 1 "src_operand" "rIm")))
+        (zero_extend:HI (match_operand:QI 1 "nonimmediate_src_operand" "rm")))
    (clobber (reg:CC 21))]
   ""
   "#"
 ; the first set.
 (define_split
   [(set (match_operand:HI 0 "reg_operand" "")
-        (zero_extend:HI (match_operand:QI 1 "src_operand" "")))
+        (zero_extend:HI (match_operand:QI 1 "nonimmediate_src_operand" "")))
    (clobber (reg:CC 21))]
   "reload_completed"
   [(set (match_dup 2) (match_dup 1))