aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@cygnus.com>1999-11-30 11:05:05 +0000
committerNick Clifton <nickc@gcc.gnu.org>1999-11-30 11:05:05 +0000
commit4c82e145460d5317eeadd5f6dab4993f45fd8497 (patch)
tree1d47ab902ea3c5c82832b4c6c5f260f78f17e998
parent4dc9341c04ba95ac73093573f645b49dcff494bf (diff)
downloadgcc-4c82e145460d5317eeadd5f6dab4993f45fd8497.zip
gcc-4c82e145460d5317eeadd5f6dab4993f45fd8497.tar.gz
gcc-4c82e145460d5317eeadd5f6dab4993f45fd8497.tar.bz2
Fix psimode truncation patterns to not accept MEMs that are not valid for
PSImode. From-SVN: r30721
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/config/mn10200/mn10200.c13
-rw-r--r--gcc/config/mn10200/mn10200.h3
-rw-r--r--gcc/config/mn10200/mn10200.md4
4 files changed, 30 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index facaadc..052c390 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+Tue Nov 30 14:58:14 1999 Nick Clifton <nickc@cygnus.com>
+
+ * config/mn10200/mn10200.h (PREDICATE_CODES): Add
+ psimode_truncation_operand.
+
+ * config/mn10200/mn10200.c (psimode_truncation_operand): New
+ function. Return true if the operand is either a MEM valid
+ for a PSImode address or not a MEM at all.
+
+ * config/mn10200/mn10200.md (truncsipsi2): Use
+ psimode_truncation_operand.
+
1999-11-30 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* flow.c (flow_nodes_print, flow_loops_cfg_dump): New functions.
diff --git a/gcc/config/mn10200/mn10200.c b/gcc/config/mn10200/mn10200.c
index 26b8248..6c39af3 100644
--- a/gcc/config/mn10200/mn10200.c
+++ b/gcc/config/mn10200/mn10200.c
@@ -875,6 +875,19 @@ constant_memory_operand (op, mode)
return GET_CODE (op) == MEM && CONSTANT_ADDRESS_P (XEXP (op, 0));
}
+/* Return true if OP is valid for a psi mode truncation operand.
+ It must either be a memory operand which is valid for a PSImode
+ address, or if it is not a memory operand at all. */
+int
+psimode_truncation_operand (op, mode)
+ rtx op;
+ enum machine_mode mode;
+{
+ return (general_operand (op, mode)
+ && (GET_CODE (op) != MEM
+ || memory_address_p (PSImode, XEXP (op, 0))));
+}
+
/* What (if any) secondary registers are needed to move IN with mode
MODE into a register from in register class CLASS.
diff --git a/gcc/config/mn10200/mn10200.h b/gcc/config/mn10200/mn10200.h
index 6f9cceb..abb50c9 100644
--- a/gcc/config/mn10200/mn10200.h
+++ b/gcc/config/mn10200/mn10200.h
@@ -1063,6 +1063,8 @@ do { char dstr[30]; \
#define PREDICATE_CODES \
{"call_address_operand", { SYMBOL_REF, REG }}, \
{"constant_memory_operand", { MEM }}, \
+ {"psimode_truncation_operand",{ PLUS, CONST_INT, CONST_DOUBLE, CONST, \
+ SYMBOL_REF, LABEL_REF, SUBREG, REG, MEM }},\
{"extendpsi_operand", { PLUS, CONST_INT, CONST_DOUBLE, CONST, \
SYMBOL_REF, LABEL_REF, SUBREG, REG, MEM }}, \
{"nshift_operator", { ASHIFTRT, LSHIFTRT, ASHIFT }},
@@ -1078,5 +1080,6 @@ extern enum reg_class secondary_reload_class ();
extern char *emit_a_shift ();
extern char *output_tst ();
extern int extendpsi_operand ();
+extern int psimode_truncation_operand ();
extern struct rtx_def *zero_dreg;
extern struct rtx_def *zero_areg;
diff --git a/gcc/config/mn10200/mn10200.md b/gcc/config/mn10200/mn10200.md
index 91057ab..3bfb204 100644
--- a/gcc/config/mn10200/mn10200.md
+++ b/gcc/config/mn10200/mn10200.md
@@ -1165,7 +1165,7 @@
(define_insn "truncsipsi2"
[(set (match_operand:PSI 0 "general_operand" "=a,?d,?*d,da")
- (truncate:PSI (match_operand:SI 1 "general_operand" "m,?m,?*d,i")))]
+ (truncate:PSI (match_operand:SI 1 "psimode_truncation_operand" "m,?m,?*d,i")))]
""
"@
mov %1,%0
@@ -1785,7 +1785,7 @@
(define_insn ""
[(set (match_operand:PSI 0 "general_operand" "=d,d,a,da")
(truncate:PSI
- (ashift:SI (match_operand:SI 1 "general_operand" "d,m,m,i")
+ (ashift:SI (match_operand:SI 1 "psimode_truncation_operand" "d,m,m,i")
(match_operand:HI 2 "const_int_operand" "i,i,i,i"))))]
""
"*