summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/m68hc11/m68hc11.c18
2 files changed, 18 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4d467a2341e..0aaa0527db1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2010-11-19 Joern Rennecke <amylaar@spamcop.net>
+
+ PR target/46436
+ * config/m68hc11/m68hc11.c (m68hc11_gen_highpart): Split shift count
+ to accomodate 32 bit HOST_WIDE_INT.
+ (m68hc11_emit_logical): Remove unused variable insn.
+ (m68hc11_check_z_replacement) <CLOBBER>: Set this_insn_uses_ix and
+ this_insn_uses_iy before use.
+
2010-11-19 Joseph Myers <joseph@codesourcery.com>
PR c/46547
diff --git a/gcc/config/m68hc11/m68hc11.c b/gcc/config/m68hc11/m68hc11.c
index 6e11a080bb2..08cb0390b21 100644
--- a/gcc/config/m68hc11/m68hc11.c
+++ b/gcc/config/m68hc11/m68hc11.c
@@ -1999,7 +1999,7 @@ m68hc11_gen_highpart (enum machine_mode mode, rtx x)
}
else if (mode == SImode)
{
- return gen_int_mode (val >> 32, SImode);
+ return gen_int_mode ((val >> 16) >> 16, SImode);
}
}
if (mode == QImode && D_REG_P (x))
@@ -2967,8 +2967,6 @@ m68hc11_emit_logical (enum machine_mode mode, enum rtx_code code, rtx *operands)
}
else if (operands[1] != 0 && operands[2] != 0)
{
- rtx insn;
-
if (!H_REG_P (operands[0]) && operands[3])
{
emit_move_insn (operands[3], operands[1]);
@@ -2976,15 +2974,13 @@ m68hc11_emit_logical (enum machine_mode mode, enum rtx_code code, rtx *operands)
operands[3],
gen_rtx_fmt_ee (code, mode,
operands[3], operands[2])));
- insn = emit_move_insn (operands[0], operands[3]);
+ emit_move_insn (operands[0], operands[3]);
}
else
{
- insn = emit_insn (gen_rtx_SET (mode,
- operands[0],
- gen_rtx_fmt_ee (code, mode,
- operands[0],
- operands[2])));
+ emit_insn (gen_rtx_SET (mode, operands[0],
+ gen_rtx_fmt_ee (code, mode,
+ operands[0], operands[2])));
}
}
@@ -4657,6 +4653,10 @@ m68hc11_check_z_replacement (rtx insn, struct replace_info *info)
}
if (GET_CODE (body) == CLOBBER)
{
+ rtx dst = XEXP (body, 0);
+
+ this_insn_uses_ix = reg_mentioned_p (ix_reg, dst);
+ this_insn_uses_iy = reg_mentioned_p (iy_reg, dst);
/* IX and IY are used at the same time, we have to restore
the value of the scratch register before this insn. */