aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Hayes <m.hayes@elec.canterbury.ac.nz>1999-02-08 14:00:37 +0000
committerMichael Hayes <m.hayes@gcc.gnu.org>1999-02-08 14:00:37 +0000
commit2718204c76b792a31fb7719c3d6315b24a9a597d (patch)
tree9be4c9674b82e6d05ebb4bf340eff7603406d2ae /gcc
parentde67f00e393bc5d623ed70a4ca45d8be271edba1 (diff)
downloadgcc-2718204c76b792a31fb7719c3d6315b24a9a597d.zip
gcc-2718204c76b792a31fb7719c3d6315b24a9a597d.tar.gz
gcc-2718204c76b792a31fb7719c3d6315b24a9a597d.tar.bz2
c4x.c (c4x_legitimize_address): Don't generate a LO_SUM address for HImode or HFmode but instead force address...
* config/c4x/c4x.c (c4x_legitimize_address): Don't generate a LO_SUM address for HImode or HFmode but instead force address into a register so that it is offsettable. (c4x_emit_move_sequence): Handle LO_SUM immediate address. From-SVN: r25087
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/c4x/c4x.c34
2 files changed, 33 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c81dbb5..49d3227 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Tue Feb 9 10:52:27 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
+
+ * config/c4x/c4x.c (c4x_legitimize_address): Don't generate a
+ LO_SUM address for HImode or HFmode but instead force address into
+ a register so that it is offsettable.
+ (c4x_emit_move_sequence): Handle LO_SUM immediate address.
+
Tue Feb 9 10:46:42 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz>
* config/c4x/c4x.c (c4x_address_cost): Return cost of 1 for
diff --git a/gcc/config/c4x/c4x.c b/gcc/config/c4x/c4x.c
index 291c22d..e4ee65f 100644
--- a/gcc/config/c4x/c4x.c
+++ b/gcc/config/c4x/c4x.c
@@ -1015,7 +1015,6 @@ c4x_null_epilogue_p ()
return 0;
}
-
int
c4x_emit_move_sequence (operands, mode)
rtx *operands;
@@ -1030,7 +1029,15 @@ c4x_emit_move_sequence (operands, mode)
&& ! (stik_const_operand (op1, mode) && ! push_operand (op0, mode)))
op1 = force_reg (mode, op1);
- if (symbolic_operand (op1, mode))
+ if (GET_CODE (op1) == LO_SUM
+ && GET_MODE (op1) == Pmode
+ && dp_reg_operand (XEXP (op1, 0), mode))
+ {
+ /* expand_increment will sometimes create a LO_SUM immediate
+ address. */
+ op1 = XEXP (op1, 1);
+ }
+ else if (symbolic_operand (op1, mode))
{
if (TARGET_LOAD_ADDRESS)
{
@@ -1426,12 +1433,23 @@ c4x_legitimize_address (orig, mode)
{
if (GET_CODE (orig) == SYMBOL_REF)
{
- rtx dp_reg = gen_rtx_REG (Pmode, DP_REGNO);
-
- if (! TARGET_SMALL)
- emit_insn (gen_set_ldp (dp_reg, orig));
-
- return gen_rtx_LO_SUM (Pmode, dp_reg, orig);
+ if (mode == HImode || mode == HFmode)
+ {
+ /* We need to force the address into
+ a register so that it is offsettable. */
+ rtx addr_reg = gen_reg_rtx (Pmode);
+ emit_move_insn (addr_reg, orig);
+ return addr_reg;
+ }
+ else
+ {
+ rtx dp_reg = gen_rtx_REG (Pmode, DP_REGNO);
+
+ if (! TARGET_SMALL)
+ emit_insn (gen_set_ldp (dp_reg, orig));
+
+ return gen_rtx_LO_SUM (Pmode, dp_reg, orig);
+ }
}
return NULL_RTX;