aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2004-02-10 23:58:59 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2004-02-10 23:58:59 +0000
commita466bea388a4f4b83af79afa9e08e22499ad311a (patch)
treed93df7c73cdc0baaced42dc72ad3e185fabefe1f /gcc
parentcf81c88e37cd333bef4578538e7f6d20ed8067e1 (diff)
downloadgcc-a466bea388a4f4b83af79afa9e08e22499ad311a.zip
gcc-a466bea388a4f4b83af79afa9e08e22499ad311a.tar.gz
gcc-a466bea388a4f4b83af79afa9e08e22499ad311a.tar.bz2
h8300-protos.h: Add a prototype for h8300_regs_ok_for_stm.
* config/h8300/h8300-protos.h: Add a prototype for h8300_regs_ok_for_stm. * config/h8300/h8300.c (h8300_regs_ok_for_stm): New. * config/h8300/h8300.md (stm_h8300s_2_advanced, stm_h8300s_2_normal, stm_h8300s_2, stm_h8300s_3_advanced, stm_h8300s_3_normal, stm_h8300s_3, stm_h8300s_4_advanced, stm_h8300s_4_normal, stm_h8300s_4, ldm_h8300s_2_advanced, ldm_h8300s_2_normal, ldm_h8300s_2, ldm_h8300s_3_advanced, ldm_h8300s_3_normal, ldm_h8300s_3, ldm_h8300s_4_advanced, ldm_h8300s_4_normal, ldm_h8300s_4): Use h8300_regs_ok_for_stm(). From-SVN: r77624
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/config/h8300/h8300-protos.h1
-rw-r--r--gcc/config/h8300/h8300.c31
-rw-r--r--gcc/config/h8300/h8300.md96
4 files changed, 64 insertions, 78 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1311c64..bafbbb6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,17 @@
+2004-02-10 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300-protos.h: Add a prototype for
+ h8300_regs_ok_for_stm.
+ * config/h8300/h8300.c (h8300_regs_ok_for_stm): New.
+ * config/h8300/h8300.md (stm_h8300s_2_advanced,
+ stm_h8300s_2_normal, stm_h8300s_2, stm_h8300s_3_advanced,
+ stm_h8300s_3_normal, stm_h8300s_3, stm_h8300s_4_advanced,
+ stm_h8300s_4_normal, stm_h8300s_4, ldm_h8300s_2_advanced,
+ ldm_h8300s_2_normal, ldm_h8300s_2, ldm_h8300s_3_advanced,
+ ldm_h8300s_3_normal, ldm_h8300s_3, ldm_h8300s_4_advanced,
+ ldm_h8300s_4_normal, ldm_h8300s_4): Use
+ h8300_regs_ok_for_stm().
+
2004-02-10 Danny Smith <dannysmith@users.sourceforge.net>
PR c/14088
diff --git a/gcc/config/h8300/h8300-protos.h b/gcc/config/h8300/h8300-protos.h
index df78dac..2595a3c 100644
--- a/gcc/config/h8300/h8300-protos.h
+++ b/gcc/config/h8300/h8300-protos.h
@@ -102,6 +102,7 @@ extern void h8300_expand_prologue (void);
extern void h8300_expand_epilogue (void);
extern int h8300_current_function_interrupt_function_p (void);
extern int h8300_initial_elimination_offset (int, int);
+extern int h8300_regs_ok_for_stm (int, rtx[]);
extern int h8300_hard_regno_rename_ok (unsigned int, unsigned int);
struct cpp_reader;
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index 546a346..ee735be 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -4576,6 +4576,37 @@ same_cmp_following_p (rtx i1)
&& any_condjump_p (i2) && onlyjump_p (i2));
}
+/* Return nonzero if OPERANDS are valid for stm (or ldm) that pushes
+ (or pops) N registers. OPERANDS are asssumed to be an array of
+ registers. */
+
+int
+h8300_regs_ok_for_stm (int n, rtx operands[])
+{
+ switch (n)
+ {
+ case 2:
+ return ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
+ || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
+ || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5));
+ case 3:
+ return ((REGNO (operands[0]) == 0
+ && REGNO (operands[1]) == 1
+ && REGNO (operands[2]) == 2)
+ || (REGNO (operands[0]) == 4
+ && REGNO (operands[1]) == 5
+ && REGNO (operands[2]) == 6));
+
+ case 4:
+ return (REGNO (operands[0]) == 0
+ && REGNO (operands[1]) == 1
+ && REGNO (operands[2]) == 2
+ && REGNO (operands[3]) == 3);
+ }
+
+ abort ();
+}
+
/* Return nonzero if register OLD_REG can be renamed to register NEW_REG. */
int
diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index 99a72a3..b4c89f7 100644
--- a/gcc/config/h8300/h8300.md
+++ b/gcc/config/h8300/h8300.md
@@ -1911,9 +1911,7 @@
(set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -8)))
(match_operand:SI 1 "register_operand" ""))])]
"TARGET_H8300S && !TARGET_NORMAL_MODE
- && ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
- || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
- || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5))"
+ && h8300_regs_ok_for_stm (2, operands)"
"stm.l\\t%S0-%S1,@-er7"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -1927,9 +1925,7 @@
(set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -8)))
(match_operand:SI 1 "register_operand" ""))])]
"TARGET_H8300S && TARGET_NORMAL_MODE
- && ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
- || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
- || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5))"
+ && h8300_regs_ok_for_stm (2, operands)"
"stm.l\\t%S0-%S1,@-er7"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -1938,9 +1934,7 @@
[(match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "register_operand" "")]
"TARGET_H8300S
- && ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
- || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
- || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5))"
+ && h8300_regs_ok_for_stm (2, operands)"
"
{
if (!TARGET_NORMAL_MODE)
@@ -1961,12 +1955,7 @@
(set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -12)))
(match_operand:SI 2 "register_operand" ""))])]
"TARGET_H8300S && !TARGET_NORMAL_MODE
- && ((REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2)
- || (REGNO (operands[0]) == 4
- && REGNO (operands[1]) == 5
- && REGNO (operands[2]) == 6))"
+ && h8300_regs_ok_for_stm (3, operands)"
"stm.l\\t%S0-%S2,@-er7"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -1982,12 +1971,7 @@
(set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -12)))
(match_operand:SI 2 "register_operand" ""))])]
"TARGET_H8300S && TARGET_NORMAL_MODE
- && ((REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2)
- || (REGNO (operands[0]) == 4
- && REGNO (operands[1]) == 5
- && REGNO (operands[2]) == 6))"
+ && h8300_regs_ok_for_stm (3, operands)"
"stm.l\\t%S0-%S2,@-er7"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -1997,12 +1981,7 @@
(match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "register_operand" "")]
"TARGET_H8300S
- && ((REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2)
- || (REGNO (operands[0]) == 4
- && REGNO (operands[1]) == 5
- && REGNO (operands[2]) == 6))"
+ && h8300_regs_ok_for_stm (3, operands)"
"
{
if (!TARGET_NORMAL_MODE)
@@ -2027,10 +2006,7 @@
(set (mem:SI (plus:SI (reg:SI SP_REG) (const_int -16)))
(match_operand:SI 3 "register_operand" ""))])]
"TARGET_H8300S && !TARGET_NORMAL_MODE
- && REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2
- && REGNO (operands[3]) == 3"
+ && h8300_regs_ok_for_stm (4, operands)"
"stm.l\\t%S0-%S3,@-er7"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -2048,10 +2024,7 @@
(set (mem:SI (plus:HI (reg:HI SP_REG) (const_int -16)))
(match_operand:SI 3 "register_operand" ""))])]
"TARGET_H8300S && TARGET_NORMAL_MODE
- && REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2
- && REGNO (operands[3]) == 3"
+ && h8300_regs_ok_for_stm (4, operands)"
"stm.l\\t%S0-%S3,@-er7"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -2062,10 +2035,7 @@
(match_operand:SI 2 "register_operand" "")
(match_operand:SI 3 "register_operand" "")]
"TARGET_H8300S
- && REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2
- && REGNO (operands[3]) == 3"
+ && h8300_regs_ok_for_stm (4, operands)"
"
{
if (!TARGET_NORMAL_MODE)
@@ -2086,9 +2056,7 @@
(set (mem:SI (reg:SI SP_REG))
(match_operand:SI 1 "register_operand" ""))])]
"TARGET_H8300S && !TARGET_NORMAL_MODE
- && ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
- || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
- || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5))"
+ && h8300_regs_ok_for_stm (2, operands)"
"ldm.l\\t@er7+,%S0-%S1"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -2102,9 +2070,7 @@
(set (mem:SI (reg:HI SP_REG))
(match_operand:SI 1 "register_operand" ""))])]
"TARGET_H8300S && TARGET_NORMAL_MODE
- && ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
- || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
- || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5))"
+ && h8300_regs_ok_for_stm (2, operands)"
"ldm.l\\t@er7+,%S0-%S1"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -2113,9 +2079,7 @@
[(match_operand:SI 0 "register_operand" "")
(match_operand:SI 1 "register_operand" "")]
"TARGET_H8300S
- && ((REGNO (operands[0]) == 0 && REGNO (operands[1]) == 1)
- || (REGNO (operands[0]) == 2 && REGNO (operands[1]) == 3)
- || (REGNO (operands[0]) == 4 && REGNO (operands[1]) == 5))"
+ && h8300_regs_ok_for_stm (2, operands)"
"
{
if (!TARGET_NORMAL_MODE)
@@ -2136,12 +2100,7 @@
(set (mem:SI (reg:SI SP_REG))
(match_operand:SI 2 "register_operand" ""))])]
"TARGET_H8300S && !TARGET_NORMAL_MODE
- && ((REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2)
- || (REGNO (operands[0]) == 4
- && REGNO (operands[1]) == 5
- && REGNO (operands[2]) == 6))"
+ && h8300_regs_ok_for_stm (3, operands)"
"ldm.l\\t@er7+,%S0-%S2"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -2157,12 +2116,7 @@
(set (mem:SI (reg:HI SP_REG))
(match_operand:SI 2 "register_operand" ""))])]
"TARGET_H8300S && TARGET_NORMAL_MODE
- && ((REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2)
- || (REGNO (operands[0]) == 4
- && REGNO (operands[1]) == 5
- && REGNO (operands[2]) == 6))"
+ && h8300_regs_ok_for_stm (3, operands)"
"ldm.l\\t@er7+,%S0-%S2"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -2172,12 +2126,7 @@
(match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "register_operand" "")]
"TARGET_H8300S
- && ((REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2)
- || (REGNO (operands[0]) == 4
- && REGNO (operands[1]) == 5
- && REGNO (operands[2]) == 6))"
+ && h8300_regs_ok_for_stm (3, operands)"
"
{
if (!TARGET_NORMAL_MODE)
@@ -2202,10 +2151,7 @@
(set (mem:SI (reg:SI SP_REG))
(match_operand:SI 3 "register_operand" ""))])]
"TARGET_H8300S && !TARGET_NORMAL_MODE
- && REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2
- && REGNO (operands[3]) == 3"
+ && h8300_regs_ok_for_stm (4, operands)"
"ldm.l\\t@er7+,%S0-%S3"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -2223,10 +2169,7 @@
(set (mem:SI (reg:HI SP_REG))
(match_operand:SI 3 "register_operand" ""))])]
"TARGET_H8300S && !TARGET_NORMAL_MODE
- && REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2
- && REGNO (operands[3]) == 3"
+ && h8300_regs_ok_for_stm (4, operands)"
"ldm.l\\t@er7+,%S0-%S3"
[(set_attr "cc" "none")
(set_attr "length" "4")])
@@ -2237,10 +2180,7 @@
(match_operand:SI 2 "register_operand" "")
(match_operand:SI 3 "register_operand" "")]
"TARGET_H8300S && !TARGET_NORMAL_MODE
- && REGNO (operands[0]) == 0
- && REGNO (operands[1]) == 1
- && REGNO (operands[2]) == 2
- && REGNO (operands[3]) == 3"
+ && h8300_regs_ok_for_stm (4, operands)"
"
{
if (!TARGET_NORMAL_MODE)