This patch just replaces the varargs with a builtin_simd_arg*. The use of
varargs seems to make stepping into, and breakpointing, aarch64_simd_expand_args
difficult, and this adds typesafety and (I argue!) reduces complexity.
Tested check-gcc on aarch64-none-elf.
gcc/ChangeLog:
* config/aarch64/aarch64-builtins.c (aarch64_simd_expand_args): Replace
varargs with pointer parameter.
(aarch64_simd_expand_builtin): pass pointer into previous.
diff --git a/gcc/config/aarch64/aarch64-builtins.c b/gcc/config/aarch64/aarch64-builtins.c
index fee17ecf637436c8704f565be2eb9ef23891209a..1af17900785685e4e005710d3bb1743d88a11c16 100644
--- a/gcc/config/aarch64/aarch64-builtins.c
+++ b/gcc/config/aarch64/aarch64-builtins.c
@@ -904,9 +904,8 @@ typedef enum
static rtx
aarch64_simd_expand_args (rtx target, int icode, int have_retval,
- tree exp, ...)
+ tree exp, builtin_simd_arg *args)
{
- va_list ap;
rtx pat;
tree arg[SIMD_MAX_BUILTIN_ARGS];
rtx op[SIMD_MAX_BUILTIN_ARGS];
@@ -920,11 +919,9 @@ aarch64_simd_expand_args (rtx target, int icode, int have_retval,
|| !(*insn_data[icode].operand[0].predicate) (target, tmode)))
target = gen_reg_rtx (tmode);
- va_start (ap, exp);
-
for (;;)
{
- builtin_simd_arg thisarg = (builtin_simd_arg) va_arg (ap, int);
+ builtin_simd_arg thisarg = args[argc];
if (thisarg == SIMD_ARG_STOP)
break;
@@ -960,8 +957,6 @@ aarch64_simd_expand_args (rtx target, int icode, int have_retval,
}
}
- va_end (ap);
-
if (have_retval)
switch (argc)
{
@@ -1075,12 +1070,7 @@ aarch64_simd_expand_builtin (int fcode, tree exp, rtx target)
/* The interface to aarch64_simd_expand_args expects a 0 if
the function is void, and a 1 if it is not. */
return aarch64_simd_expand_args
- (target, icode, !is_void, exp,
- args[1],
- args[2],
- args[3],
- args[4],
- SIMD_ARG_STOP);
+ (target, icode, !is_void, exp, &args[1]);
}
rtx