Commit b693336b by Paolo Bonzini Committed by David Edelsohn

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
parent 7fb3dd8b
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> 2004-11-21 Jeff Law <law@redhat.com>
* cfg.c (update_bb_profile_for_threading): Do not rescale the * cfg.c (update_bb_profile_for_threading): Do not rescale the
......
...@@ -4640,6 +4640,21 @@ rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED) ...@@ -4640,6 +4640,21 @@ rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
&& (TARGET_AIX_STRUCT_RET && (TARGET_AIX_STRUCT_RET
|| (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8)) || (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8))
return true; 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) if (DEFAULT_ABI == ABI_V4 && TYPE_MODE (type) == TFmode)
return true; return true;
return false; return false;
...@@ -4783,10 +4798,13 @@ function_arg_padding (enum machine_mode mode, tree type) ...@@ -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, of an argument with the specified mode and type. If it is not defined,
PARM_BOUNDARY is used for all arguments. 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 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) if (DEFAULT_ABI == ABI_V4 && GET_MODE_SIZE (mode) == 8)
return 64; return 64;
...@@ -4794,6 +4812,9 @@ function_arg_boundary (enum machine_mode mode, tree type ATTRIBUTE_UNUSED) ...@@ -4794,6 +4812,9 @@ function_arg_boundary (enum machine_mode mode, tree type ATTRIBUTE_UNUSED)
return 64; return 64;
else if (ALTIVEC_VECTOR_MODE (mode)) else if (ALTIVEC_VECTOR_MODE (mode))
return 128; return 128;
else if (type && TREE_CODE (type) == VECTOR_TYPE
&& int_size_in_bytes (type) > 16)
return 128;
else else
return PARM_BOUNDARY; return PARM_BOUNDARY;
} }
...@@ -5617,6 +5638,23 @@ rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED, ...@@ -5617,6 +5638,23 @@ rs6000_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
return 1; 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; return 0;
} }
......
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