Commit 61dd226f by Nathan Froyd Committed by Nathan Froyd

rs6000.c (rs6000_legitimize_address): Check to ensure that we can address an…

rs6000.c (rs6000_legitimize_address): Check to ensure that we can address an entire entity > 8 bytes.

	* config/rs6000/rs6000.c (rs6000_legitimize_address): Check to
	ensure that we can address an entire entity > 8 bytes.  Don't
	generate reg+reg addressing for such data.

From-SVN: r132567
parent 2165fd38
2008-02-22 Nathan Froyd <froydnj@codesourcery.com> 2008-02-22 Nathan Froyd <froydnj@codesourcery.com>
* config/rs6000/rs6000.c (rs6000_legitimize_address): Check to
ensure that we can address an entire entity > 8 bytes. Don't
generate reg+reg addressing for such data.
2008-02-22 Nathan Froyd <froydnj@codesourcery.com>
* config/rs6000/rs6000.h (CONSTANT_ALIGNMENT): Don't overalign * config/rs6000/rs6000.h (CONSTANT_ALIGNMENT): Don't overalign
strings when optimizing for size, unless the target cares about strings when optimizing for size, unless the target cares about
alignment. alignment.
......
...@@ -3630,19 +3630,29 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, ...@@ -3630,19 +3630,29 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
/* We accept [reg + reg] and [reg + OFFSET]. */ /* We accept [reg + reg] and [reg + OFFSET]. */
if (GET_CODE (x) == PLUS) if (GET_CODE (x) == PLUS)
{ {
rtx op1 = XEXP (x, 0); rtx op1 = XEXP (x, 0);
rtx op2 = XEXP (x, 1); rtx op2 = XEXP (x, 1);
rtx y;
op1 = force_reg (Pmode, op1);
op1 = force_reg (Pmode, op1);
if (GET_CODE (op2) != REG
&& (GET_CODE (op2) != CONST_INT if (GET_CODE (op2) != REG
|| !SPE_CONST_OFFSET_OK (INTVAL (op2)))) && (GET_CODE (op2) != CONST_INT
op2 = force_reg (Pmode, op2); || !SPE_CONST_OFFSET_OK (INTVAL (op2))
|| (GET_MODE_SIZE (mode) > 8
return gen_rtx_PLUS (Pmode, op1, op2); && !SPE_CONST_OFFSET_OK (INTVAL (op2) + 8))))
} op2 = force_reg (Pmode, op2);
/* We can't always do [reg + reg] for these, because [reg +
reg + offset] is not a legitimate addressing mode. */
y = gen_rtx_PLUS (Pmode, op1, op2);
if (GET_MODE_SIZE (mode) > 8 && REG_P (op2))
return force_reg (Pmode, y);
else
return y;
}
return force_reg (Pmode, x); return force_reg (Pmode, x);
} }
......
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