Commit 76d2b81d by Dale Johannesen Committed by Dale Johannesen

rs6000.c (legitimate_offset_address_p): Make global, rename rs6000_legitimate_offset_address_p.


2004-06-22  Dale Johannesen  <dalej@apple.com>

	* config/rs6000/rs6000.c (legitimate_offset_address_p): Make
	global, rename rs6000_legitimate_offset_address_p.
	(rs6000_legitimate_address_p): Adjust calls to it.
	(lmw_operation): Ditto.
	(stmw_operation): Ditto.
	* config/rs6000/rs6000-protos.h: Declare it.
	* config/rs6000/rs6000.md (*movdf_hardfloat32): Use it
	instead of offsettable_memref_p.

2004-06-22  Dale Johannesen  <dalej@apple.com>

	* config/rs6000/rs6000.c (rs6000_legitimate_address): Disallow
	[reg+reg] mode for TFmode memory accesses.
	(rs6000_eliminate_indexed_memrefs): New.
	(rs6000_emit_move): Call preceding for TImode and TFmode.

From-SVN: r83504
parent e9cb3dac
2004-06-22 Dale Johannesen <dalej@apple.com>
* config/rs6000/rs6000.c (legitimate_offset_address_p): Make
global, rename rs6000_legitimate_offset_address_p.
(rs6000_legitimate_address_p): Adjust calls to it.
(lmw_operation): Ditto.
(stmw_operation): Ditto.
* config/rs6000/rs6000-protos.h: Declare it.
* config/rs6000/rs6000.md (*movdf_hardfloat32): Use it
instead of offsettable_memref_p.
2004-06-22 Dale Johannesen <dalej@apple.com>
* config/rs6000/rs6000.c (rs6000_legitimate_address): Disallow
[reg+reg] mode for TFmode memory accesses.
(rs6000_eliminate_indexed_memrefs): New.
(rs6000_emit_move): Call preceding for TImode and TFmode.
2004-06-22 Paolo Bonzini <bonzini@gnu.org> 2004-06-22 Paolo Bonzini <bonzini@gnu.org>
* tree-cfg.c (pass_warn_function_return): It needs * tree-cfg.c (pass_warn_function_return): It needs
......
...@@ -139,6 +139,7 @@ extern bool rs6000_mode_dependent_address (rtx); ...@@ -139,6 +139,7 @@ extern bool rs6000_mode_dependent_address (rtx);
extern rtx rs6000_return_addr (int, rtx); extern rtx rs6000_return_addr (int, rtx);
extern void rs6000_output_symbol_ref (FILE*, rtx); extern void rs6000_output_symbol_ref (FILE*, rtx);
extern HOST_WIDE_INT rs6000_initial_elimination_offset (int, int); extern HOST_WIDE_INT rs6000_initial_elimination_offset (int, int);
extern bool rs6000_legitimate_offset_address_p (enum machine_mode, rtx, int);
extern rtx rs6000_machopic_legitimize_pic_address (rtx orig, extern rtx rs6000_machopic_legitimize_pic_address (rtx orig,
enum machine_mode mode, rtx reg); enum machine_mode mode, rtx reg);
......
...@@ -303,7 +303,6 @@ static int constant_pool_expr_1 (rtx, int *, int *); ...@@ -303,7 +303,6 @@ static int constant_pool_expr_1 (rtx, int *, int *);
static bool constant_pool_expr_p (rtx); static bool constant_pool_expr_p (rtx);
static bool toc_relative_expr_p (rtx); static bool toc_relative_expr_p (rtx);
static bool legitimate_small_data_p (enum machine_mode, rtx); static bool legitimate_small_data_p (enum machine_mode, rtx);
static bool legitimate_offset_address_p (enum machine_mode, rtx, int);
static bool legitimate_indexed_address_p (rtx, int); static bool legitimate_indexed_address_p (rtx, int);
static bool legitimate_indirect_address_p (rtx, int); static bool legitimate_indirect_address_p (rtx, int);
static bool macho_lo_sum_memory_operand (rtx x, enum machine_mode mode); static bool macho_lo_sum_memory_operand (rtx x, enum machine_mode mode);
...@@ -316,6 +315,7 @@ static void rs6000_assemble_visibility (tree, int); ...@@ -316,6 +315,7 @@ static void rs6000_assemble_visibility (tree, int);
static int rs6000_ra_ever_killed (void); static int rs6000_ra_ever_killed (void);
static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *); static tree rs6000_handle_longcall_attribute (tree *, tree, tree, int, bool *);
static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *); static tree rs6000_handle_altivec_attribute (tree *, tree, tree, int, bool *);
static void rs6000_eliminate_indexed_memrefs (rtx operands[2]);
static const char *rs6000_mangle_fundamental_type (tree); static const char *rs6000_mangle_fundamental_type (tree);
extern const struct attribute_spec rs6000_attribute_table[]; extern const struct attribute_spec rs6000_attribute_table[];
static void rs6000_set_default_type_attributes (tree); static void rs6000_set_default_type_attributes (tree);
...@@ -2648,8 +2648,8 @@ legitimate_small_data_p (enum machine_mode mode, rtx x) ...@@ -2648,8 +2648,8 @@ legitimate_small_data_p (enum machine_mode mode, rtx x)
&& small_data_operand (x, mode)); && small_data_operand (x, mode));
} }
static bool bool
legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict) rs6000_legitimate_offset_address_p (enum machine_mode mode, rtx x, int strict)
{ {
unsigned HOST_WIDE_INT offset, extra; unsigned HOST_WIDE_INT offset, extra;
...@@ -3328,7 +3328,7 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode, ...@@ -3328,7 +3328,7 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
word aligned. word aligned.
For modes spanning multiple registers (DFmode in 32-bit GPRs, For modes spanning multiple registers (DFmode in 32-bit GPRs,
32-bit DImode, TImode), indexed addressing cannot be used because 32-bit DImode, TImode, TFmode), indexed addressing cannot be used because
adjacent memory cells are accessed by adding word-sized offsets adjacent memory cells are accessed by adding word-sized offsets
during assembly output. */ during assembly output. */
int int
...@@ -3356,9 +3356,10 @@ rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict) ...@@ -3356,9 +3356,10 @@ rs6000_legitimate_address (enum machine_mode mode, rtx x, int reg_ok_strict)
|| XEXP (x, 0) == arg_pointer_rtx) || XEXP (x, 0) == arg_pointer_rtx)
&& GET_CODE (XEXP (x, 1)) == CONST_INT) && GET_CODE (XEXP (x, 1)) == CONST_INT)
return 1; return 1;
if (legitimate_offset_address_p (mode, x, reg_ok_strict)) if (rs6000_legitimate_offset_address_p (mode, x, reg_ok_strict))
return 1; return 1;
if (mode != TImode if (mode != TImode
&& mode != TFmode
&& ((TARGET_HARD_FLOAT && TARGET_FPRS) && ((TARGET_HARD_FLOAT && TARGET_FPRS)
|| TARGET_POWERPC64 || TARGET_POWERPC64
|| (mode != DFmode && mode != TFmode)) || (mode != DFmode && mode != TFmode))
...@@ -3653,6 +3654,27 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2) ...@@ -3653,6 +3654,27 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c1, HOST_WIDE_INT c2)
return dest; return dest;
} }
/* Helper for the following. Get rid of [r+r] memory refs
in cases where it won't work (TImode, TFmode). */
static void
rs6000_eliminate_indexed_memrefs (rtx operands[2])
{
if (GET_CODE (operands[0]) == MEM
&& GET_CODE (XEXP (operands[0], 0)) != REG
&& ! reload_in_progress)
operands[0]
= replace_equiv_address (operands[0],
copy_addr_to_reg (XEXP (operands[0], 0)));
if (GET_CODE (operands[1]) == MEM
&& GET_CODE (XEXP (operands[1], 0)) != REG
&& ! reload_in_progress)
operands[1]
= replace_equiv_address (operands[1],
copy_addr_to_reg (XEXP (operands[1], 0)));
}
/* Emit a move from SOURCE to DEST in mode MODE. */ /* Emit a move from SOURCE to DEST in mode MODE. */
void void
rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode) rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
...@@ -3790,6 +3812,9 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode) ...@@ -3790,6 +3812,9 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
break; break;
case TFmode: case TFmode:
rs6000_eliminate_indexed_memrefs (operands);
/* fall through */
case DFmode: case DFmode:
case SFmode: case SFmode:
if (CONSTANT_P (operands[1]) if (CONSTANT_P (operands[1])
...@@ -3972,19 +3997,8 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode) ...@@ -3972,19 +3997,8 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
break; break;
case TImode: case TImode:
if (GET_CODE (operands[0]) == MEM rs6000_eliminate_indexed_memrefs (operands);
&& GET_CODE (XEXP (operands[0], 0)) != REG
&& ! reload_in_progress)
operands[0]
= replace_equiv_address (operands[0],
copy_addr_to_reg (XEXP (operands[0], 0)));
if (GET_CODE (operands[1]) == MEM
&& GET_CODE (XEXP (operands[1], 0)) != REG
&& ! reload_in_progress)
operands[1]
= replace_equiv_address (operands[1],
copy_addr_to_reg (XEXP (operands[1], 0)));
if (TARGET_POWER) if (TARGET_POWER)
{ {
emit_insn (gen_rtx_PARALLEL (VOIDmode, emit_insn (gen_rtx_PARALLEL (VOIDmode,
...@@ -8383,7 +8397,7 @@ lmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) ...@@ -8383,7 +8397,7 @@ lmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
if (base_regno == 0) if (base_regno == 0)
return 0; return 0;
} }
else if (legitimate_offset_address_p (SImode, src_addr, 0)) else if (rs6000_legitimate_offset_address_p (SImode, src_addr, 0))
{ {
offset = INTVAL (XEXP (src_addr, 1)); offset = INTVAL (XEXP (src_addr, 1));
base_regno = REGNO (XEXP (src_addr, 0)); base_regno = REGNO (XEXP (src_addr, 0));
...@@ -8411,7 +8425,7 @@ lmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) ...@@ -8411,7 +8425,7 @@ lmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
newoffset = 0; newoffset = 0;
addr_reg = newaddr; addr_reg = newaddr;
} }
else if (legitimate_offset_address_p (SImode, newaddr, 0)) else if (rs6000_legitimate_offset_address_p (SImode, newaddr, 0))
{ {
addr_reg = XEXP (newaddr, 0); addr_reg = XEXP (newaddr, 0);
newoffset = INTVAL (XEXP (newaddr, 1)); newoffset = INTVAL (XEXP (newaddr, 1));
...@@ -8459,7 +8473,7 @@ stmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) ...@@ -8459,7 +8473,7 @@ stmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
if (base_regno == 0) if (base_regno == 0)
return 0; return 0;
} }
else if (legitimate_offset_address_p (SImode, dest_addr, 0)) else if (rs6000_legitimate_offset_address_p (SImode, dest_addr, 0))
{ {
offset = INTVAL (XEXP (dest_addr, 1)); offset = INTVAL (XEXP (dest_addr, 1));
base_regno = REGNO (XEXP (dest_addr, 0)); base_regno = REGNO (XEXP (dest_addr, 0));
...@@ -8487,7 +8501,7 @@ stmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) ...@@ -8487,7 +8501,7 @@ stmw_operation (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
newoffset = 0; newoffset = 0;
addr_reg = newaddr; addr_reg = newaddr;
} }
else if (legitimate_offset_address_p (SImode, newaddr, 0)) else if (rs6000_legitimate_offset_address_p (SImode, newaddr, 0))
{ {
addr_reg = XEXP (newaddr, 0); addr_reg = XEXP (newaddr, 0);
newoffset = INTVAL (XEXP (newaddr, 1)); newoffset = INTVAL (XEXP (newaddr, 1));
......
...@@ -8051,11 +8051,13 @@ ...@@ -8051,11 +8051,13 @@
else else
return \"mr %0,%1\;mr %L0,%L1\"; return \"mr %0,%1\;mr %L0,%L1\";
case 1: case 1:
if (offsettable_memref_p (operands[1]) if (GET_CODE (operands[1]) == MEM
|| (GET_CODE (operands[1]) == MEM && (rs6000_legitimate_offset_address_p (DFmode, XEXP (operands[1], 0),
&& (GET_CODE (XEXP (operands[1], 0)) == LO_SUM reload_completed || reload_in_progress)
|| GET_CODE (XEXP (operands[1], 0)) == REG
|| GET_CODE (XEXP (operands[1], 0)) == LO_SUM
|| GET_CODE (XEXP (operands[1], 0)) == PRE_INC || GET_CODE (XEXP (operands[1], 0)) == PRE_INC
|| GET_CODE (XEXP (operands[1], 0)) == PRE_DEC))) || GET_CODE (XEXP (operands[1], 0)) == PRE_DEC))
{ {
/* If the low-address word is used in the address, we must load /* If the low-address word is used in the address, we must load
it last. Otherwise, load it first. Note that we cannot have it last. Otherwise, load it first. Note that we cannot have
...@@ -8091,11 +8093,13 @@ ...@@ -8091,11 +8093,13 @@
} }
} }
case 2: case 2:
if (offsettable_memref_p (operands[0]) if (GET_CODE (operands[0]) == MEM
|| (GET_CODE (operands[0]) == MEM && (rs6000_legitimate_offset_address_p (DFmode, XEXP (operands[0], 0),
&& (GET_CODE (XEXP (operands[0], 0)) == LO_SUM reload_completed || reload_in_progress)
|| GET_CODE (XEXP (operands[0], 0)) == REG
|| GET_CODE (XEXP (operands[0], 0)) == LO_SUM
|| GET_CODE (XEXP (operands[0], 0)) == PRE_INC || GET_CODE (XEXP (operands[0], 0)) == PRE_INC
|| GET_CODE (XEXP (operands[0], 0)) == PRE_DEC))) || GET_CODE (XEXP (operands[0], 0)) == PRE_DEC))
return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\"; return \"{st%U0|stw%U0} %1,%0\;{st|stw} %L1,%L0\";
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment