re PR target/17836 (ABI breakage for 16-byte vectors (non-Altivec ABI & ISA))

PR target/17836
        * config/rs6000/rs6000.c (rs6000_return_in_memory): Return
        synthetic vectors in memory.
        (function_arg_boundary): Align large synthetic vectors.
        (rs6000_pass_by_reference): Pass synthetic vectors in memory.

From-SVN: r90995
This commit is contained in:
Paolo Bonzini 2004-11-21 20:21:10 -05:00 committed by David Edelsohn
parent 7fb3dd8b75
commit b693336bf3
2 changed files with 48 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2004-11-21 David Edelsohn <edelsohn@gnu.org>
PR target/17836
* config/rs6000/rs6000.c (rs6000_return_in_memory): Return
synthetic vectors in memory.
(function_arg_boundary): Align large synthetic vectors.
(rs6000_pass_by_reference): Pass synthetic vectors in memory.
2004-11-21 Jeff Law <law@redhat.com>
* cfg.c (update_bb_profile_for_threading): Do not rescale the

View File

@ -4640,6 +4640,21 @@ rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
&& (TARGET_AIX_STRUCT_RET
|| (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
return true;
/* Return synthetic vectors in memory. */
if (TREE_CODE (type) == VECTOR_TYPE
&& int_size_in_bytes (type) > (TARGET_ALTIVEC ? 16 : 8))
{
static bool warned_for_return_big_vectors = false;
if (!warned_for_return_big_vectors)
{
warning ("synthetic vectors returned by reference: "
"non-standard ABI extension with no compatibility guarantee");
warned_for_return_big_vectors = true;
}
return true;
}
if (DEFAULT_ABI == ABI_V4 && TYPE_MODE (type) == TFmode)
return true;
return false;
@ -4783,10 +4798,13 @@ 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 to be double word aligned.
Doubleword align SPE vectors.
Quadword align Altivec vectors.
Quadword align large synthetic vector types. */
int
function_arg_boundary (enum machine_mode mode, tree type ATTRIBUTE_UNUSED)
function_arg_boundary (enum machine_mode mode, tree type)
{
if (DEFAULT_ABI == ABI_V4 && GET_MODE_SIZE (mode) == 8)
return 64;
@ -4794,6 +4812,9 @@ function_arg_boundary (enum machine_mode mode, tree type ATTRIBUTE_UNUSED)
return 64;
else if (ALTIVEC_VECTOR_MODE (mode))
return 128;
else if (type && TREE_CODE (type) == VECTOR_TYPE
&& int_size_in_bytes (type) > 16)
return 128;
else
return PARM_BOUNDARY;
}
@ -5617,6 +5638,23 @@ rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
return 1;
}
/* Pass synthetic vectors in memory. */
if (type && TREE_CODE (type) == VECTOR_TYPE
&& int_size_in_bytes (type) > (TARGET_ALTIVEC ? 16 : 8))
{
static bool warned_for_pass_big_vectors = false;
if (TARGET_DEBUG_ARG)
fprintf (stderr, "function_arg_pass_by_reference: synthetic vector\n");
if (!warned_for_pass_big_vectors)
{
warning ("synthetic vector passed by reference: "
"non-standard ABI extension with no compatibility guarantee");
warned_for_pass_big_vectors = true;
}
return 1;
}
return 0;
}