aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <joern.rennecke@arc.com>2007-02-06 23:12:35 +0000
committerKaz Kojima <kkojima@gcc.gnu.org>2007-02-06 23:12:35 +0000
commit6f8eec2991e0bccb2e7a2cf54fe2558910b4dfc9 (patch)
tree755e9a9ac2a7c627c1c4dbc20736b6328b108362
parent89f8f30f3565328a2805adafd22e05219b56d562 (diff)
downloadgcc-6f8eec2991e0bccb2e7a2cf54fe2558910b4dfc9.zip
gcc-6f8eec2991e0bccb2e7a2cf54fe2558910b4dfc9.tar.gz
gcc-6f8eec2991e0bccb2e7a2cf54fe2558910b4dfc9.tar.bz2
re PR target/29746 (gcc fails to bootstrap on sh4-*-linux-gnu)
PR target/29746 * config/sh/sh.c (expand_cbranchdi4): Use scratch register properly. (sh_initialize_trampoline): Add parentheses to avoid a warning. Co-Authored-By: Kaz Kojima <kkojima@gcc.gnu.org> From-SVN: r121671
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/sh/sh.c19
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fac53a7..b5cc0a3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2007-02-06 J"orn Rennecke <joern.rennecke@arc.com>
+ Kaz Kojima <kkojima@gcc.gnu.org>
+
+ PR target/29746
+ * config/sh/sh.c (expand_cbranchdi4): Use scratch register
+ properly.
+ (sh_initialize_trampoline): Add parentheses to avoid a warning.
+
2007-02-06 Zdenek Dvorak <dvorakz@suse.cz>
* doc/loop.texi: Document possibility not to perform disambiguation
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index f9de2a6..3e71e11 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -1488,6 +1488,7 @@ expand_cbranchdi4 (rtx *operands, enum rtx_code comparison)
int num_branches;
int prob, rev_prob;
int msw_taken_prob = -1, msw_skip_prob = -1, lsw_taken_prob = -1;
+ rtx scratch = operands[4];
comparison = prepare_cbranch_operands (operands, DImode, comparison);
op1h = gen_highpart_mode (SImode, DImode, operands[1]);
@@ -1539,7 +1540,7 @@ expand_cbranchdi4 (rtx *operands, enum rtx_code comparison)
return true;
}
msw_taken = NE;
- lsw_taken_prob = prob;
+ msw_taken_prob = prob;
lsw_taken = NE;
lsw_taken_prob = 0;
break;
@@ -1611,6 +1612,13 @@ expand_cbranchdi4 (rtx *operands, enum rtx_code comparison)
operands[1] = op1h;
operands[2] = op2h;
operands[4] = NULL_RTX;
+ if (reload_completed
+ && ! arith_reg_or_0_operand (op2h, SImode) && true_regnum (op1h)
+ && (msw_taken != CODE_FOR_nothing || msw_skip != CODE_FOR_nothing))
+ {
+ emit_move_insn (scratch, operands[2]);
+ operands[2] = scratch;
+ }
if (msw_taken != CODE_FOR_nothing)
expand_cbranchsi4 (operands, msw_taken, msw_taken_prob);
if (msw_skip != CODE_FOR_nothing)
@@ -1624,7 +1632,12 @@ expand_cbranchdi4 (rtx *operands, enum rtx_code comparison)
operands[1] = op1l;
operands[2] = op2l;
if (lsw_taken != CODE_FOR_nothing)
- expand_cbranchsi4 (operands, lsw_taken, lsw_taken_prob);
+ {
+ if (reload_completed
+ && ! arith_reg_or_0_operand (op2l, SImode) && true_regnum (op1l))
+ operands[4] = scratch;
+ expand_cbranchsi4 (operands, lsw_taken, lsw_taken_prob);
+ }
if (msw_skip != CODE_FOR_nothing)
emit_label (skip_label);
return true;
@@ -9600,7 +9613,7 @@ sh_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
if (TARGET_HARVARD)
{
if (!TARGET_INLINE_IC_INVALIDATE
- || !(TARGET_SH4A_ARCH || TARGET_SH4_300) && TARGET_USERMODE)
+ || (!(TARGET_SH4A_ARCH || TARGET_SH4_300) && TARGET_USERMODE))
emit_library_call (function_symbol (NULL, "__ic_invalidate",
FUNCTION_ORDINARY),
0, VOIDmode, 1, tramp, SImode);