aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2004-11-21 20:21:10 -0500
committerDavid Edelsohn <dje@gcc.gnu.org>2004-11-21 20:21:10 -0500
commitb693336bf3a985d6ee779cd18c44bfa02fc78310 (patch)
treea6d16d3d62f6ce5c0e1b2e8553d4ac71683cc106 /gcc/config
parent7fb3dd8b751e9dfb6b38aa6c937f6d97a28d7c5a (diff)
downloadgcc-b693336bf3a985d6ee779cd18c44bfa02fc78310.zip
gcc-b693336bf3a985d6ee779cd18c44bfa02fc78310.tar.gz
gcc-b693336bf3a985d6ee779cd18c44bfa02fc78310.tar.bz2
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
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/rs6000/rs6000.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 7bf6554..2d4e618 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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;
}