diff options
author | Michael Hayes <m.hayes@elec.canterbury.ac.nz> | 1999-02-08 14:00:37 +0000 |
---|---|---|
committer | Michael Hayes <m.hayes@gcc.gnu.org> | 1999-02-08 14:00:37 +0000 |
commit | 2718204c76b792a31fb7719c3d6315b24a9a597d (patch) | |
tree | 9be4c9674b82e6d05ebb4bf340eff7603406d2ae /gcc | |
parent | de67f00e393bc5d623ed70a4ca45d8be271edba1 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/c4x/c4x.c | 34 |
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; |