re PR target/28207 (128-bit IBM long double misaligned on stack)

PR target/28207
	* config/rs6000/rs6000.c (function_arg_boundary): Double-word align
	128-bit IBM long doubles for ABI_V4.

From-SVN: r115170
This commit is contained in:
Alan Modra 2006-07-04 03:35:48 +00:00 committed by Alan Modra
parent 60410f3ad2
commit 84e9ad15fa
2 changed files with 17 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2006-07-04 Alan Modra <amodra@bigpond.net.au>
PR target/28207
* config/rs6000/rs6000.c (function_arg_boundary): Double-word align
128-bit IBM long doubles for ABI_V4.
2006-07-03 Eric Botcazou <ebotcazou@adacore.com>
* tree.c (range_in_array_bounds_p): New predicate.

View File

@ -4485,7 +4485,12 @@ function_arg_padding (enum machine_mode mode, tree type)
of an argument with the specified mode and type. If it is not defined,
PARM_BOUNDARY is used for all arguments.
V.4 wants long longs to be double word aligned.
V.4 wants long longs and doubles to be double word aligned. Just
testing the mode size is a boneheaded way to do this as it means
that other types such as complex int are also double word aligned.
However, we're stuck with this because changing the ABI might break
existing library interfaces.
Doubleword align SPE vectors.
Quadword align Altivec vectors.
Quadword align large synthetic vector types. */
@ -4493,7 +4498,11 @@ function_arg_padding (enum machine_mode mode, tree type)
int
function_arg_boundary (enum machine_mode mode, tree type)
{
if (DEFAULT_ABI == ABI_V4 && GET_MODE_SIZE (mode) == 8)
if (DEFAULT_ABI == ABI_V4
&& (GET_MODE_SIZE (mode) == 8
|| (TARGET_HARD_FLOAT
&& TARGET_FPRS
&& mode == TFmode)))
return 64;
else if (SPE_VECTOR_MODE (mode)
|| (type && TREE_CODE (type) == VECTOR_TYPE