aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2003-02-25 23:19:12 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2003-02-25 23:19:12 +0000
commitfc943f55426024c7cb2e43d24dd90c2b2e103f70 (patch)
tree07d38bb5655c8d1b255deb04c5e5f5490c2e071c
parent3eaa60442ff2727dab5f81465771461f91de8e8b (diff)
downloadgcc-fc943f55426024c7cb2e43d24dd90c2b2e103f70.zip
gcc-fc943f55426024c7cb2e43d24dd90c2b2e103f70.tar.gz
gcc-fc943f55426024c7cb2e43d24dd90c2b2e103f70.tar.bz2
reload1.c (reload_cse_move2add): Use STRICT_LOW_PART if PLUS does not reduce the cost of SET.
* reload1.c (reload_cse_move2add): Use STRICT_LOW_PART if PLUS does not reduce the cost of SET. From-SVN: r63426
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/reload1.c37
2 files changed, 41 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3bc23a7..d985ed5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-02-25 Kazu Hirata <kazu@cs.umass.edu>
+
+ * reload1.c (reload_cse_move2add): Use STRICT_LOW_PART if PLUS
+ does not reduce the cost of SET.
+
2003-02-25 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
PR target/9732
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 441a447..31ede25 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -9159,7 +9159,12 @@ reload_cse_move2add (first)
to
(set (REGX) (CONST_INT A))
...
- (set (REGX) (plus (REGX) (CONST_INT B-A))) */
+ (set (REGX) (plus (REGX) (CONST_INT B-A)))
+ or
+ (set (REGX) (CONST_INT A))
+ ...
+ (set (STRICT_LOW_PART (REGX)) (CONST_INT B))
+ */
if (GET_CODE (src) == CONST_INT && reg_base_reg[regno] < 0)
{
@@ -9179,6 +9184,36 @@ reload_cse_move2add (first)
&& have_add2_insn (reg, new_src))
success = validate_change (insn, &PATTERN (insn),
gen_add2_insn (reg, new_src), 0);
+ else
+ {
+ enum machine_mode narrow_mode;
+ for (narrow_mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
+ narrow_mode != GET_MODE (reg);
+ narrow_mode = GET_MODE_WIDER_MODE (narrow_mode))
+ {
+ if (have_insn_for (STRICT_LOW_PART, narrow_mode)
+ && ((reg_offset[regno]
+ & ~GET_MODE_MASK (narrow_mode))
+ == (INTVAL (src)
+ & ~GET_MODE_MASK (narrow_mode))))
+ {
+ rtx narrow_reg = gen_rtx_REG (narrow_mode,
+ REGNO (reg));
+ rtx narrow_src =
+ GEN_INT (trunc_int_for_mode (INTVAL (src),
+ narrow_mode));
+ rtx new_set =
+ gen_rtx_SET (VOIDmode,
+ gen_rtx_STRICT_LOW_PART (VOIDmode,
+ narrow_reg),
+ narrow_src);
+ success = validate_change (insn, &PATTERN (insn),
+ new_set, 0);
+ if (success)
+ break;
+ }
+ }
+ }
reg_set_luid[regno] = move2add_luid;
reg_mode[regno] = GET_MODE (reg);
reg_offset[regno] = INTVAL (src);