This patch ensures that programs using vector extensions to pass vectors
to functions pass the vectors in memory.
Even though we could technically do this in registers, the ABI would
have to be reworked to do so, and there's no call for that yet (maybe if
we want vector libgcc/libm).
This change doesn't have any observable affect on the testsuite, just
yet, but when I add smaller vector sizes (still a work-in-progress) then
the testcase failures become apparent.
Andrew
amdgcn: Pass vector parameters in memory
gcc/ChangeLog:
* config/gcn/gcn.c (gcn_function_arg): Disallow vector arguments.
(gcn_return_in_memory): Return vectors in memory.
diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
index b6ff0bbc2af..5693b75b672 100644
--- a/gcc/config/gcn/gcn.c
+++ b/gcc/config/gcn/gcn.c
@@ -2291,6 +2291,10 @@ gcn_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
if (targetm.calls.must_pass_in_stack (arg))
return 0;
+ /* Vector parameters are not supported yet. */
+ if (VECTOR_MODE_P (arg.mode))
+ return 0;
+
int reg_num = FIRST_PARM_REG + cum->num;
int num_regs = num_arg_regs (arg);
if (num_regs > 0)
@@ -2478,6 +2482,10 @@ gcn_return_in_memory (const_tree type, const_tree ARG_UNUSED (fntype))
if (AGGREGATE_TYPE_P (type))
return true;
+ /* Vector return values are not supported yet. */
+ if (VECTOR_TYPE_P (type))
+ return true;
+
if (mode == BLKmode)
return true;