| /* { dg-do run { target powerpc*-*-* } } */ |
| /* { dg-xfail-if "" { "powerpc-*-eabispe*" "powerpc-ibm-aix*" } { "-maltivec" } { "" } } */ |
| /* { dg-options "-maltivec -mabi=altivec -fno-inline" } */ |
| |
| #include <stdarg.h> |
| #include <signal.h> |
| |
| #include "altivec_check.h" |
| |
| #define vector __attribute__((vector_size (16))) |
| |
| const vector unsigned int v1 = {10,11,12,13}; |
| const vector unsigned int v2 = {20,21,22,23}; |
| const vector unsigned int v3 = {30,31,32,33}; |
| const vector unsigned int v4 = {40,41,42,43}; |
| |
| void foo(vector unsigned int a, ...) |
| { |
| va_list args; |
| vector unsigned int v; |
| |
| va_start (args, a); |
| if (memcmp (&a, &v1, sizeof (v)) != 0) |
| abort (); |
| v = va_arg (args, vector unsigned int); |
| if (memcmp (&v, &v2, sizeof (v)) != 0) |
| abort (); |
| v = va_arg (args, vector unsigned int); |
| if (memcmp (&v, &v3, sizeof (v)) != 0) |
| abort (); |
| v = va_arg (args, vector unsigned int); |
| if (memcmp (&v, &v4, sizeof (v)) != 0) |
| abort (); |
| va_end (args); |
| } |
| |
| void bar(vector unsigned int a, ...) |
| { |
| va_list args; |
| vector unsigned int v; |
| int b; |
| |
| va_start (args, a); |
| if (memcmp (&a, &v1, sizeof (v)) != 0) |
| abort (); |
| b = va_arg (args, int); |
| if (b != 2) |
| abort (); |
| v = va_arg (args, vector unsigned int); |
| if (memcmp (&v, &v2, sizeof (v)) != 0) |
| abort (); |
| v = va_arg (args, vector unsigned int); |
| if (memcmp (&v, &v3, sizeof (v)) != 0) |
| abort (); |
| va_end (args); |
| } |
| |
| |
| int main1(void) |
| { |
| /* In this call, in the Darwin ABI, the first argument goes into v2 |
| the second one into r9-r10 and memory, |
| and the next two in memory. */ |
| foo ((vector unsigned int){10,11,12,13}, |
| (vector unsigned int){20,21,22,23}, |
| (vector unsigned int){30,31,32,33}, |
| (vector unsigned int){40,41,42,43}); |
| /* In this call, in the Darwin ABI, the first argument goes into v2 |
| the second one into r9, then r10 is reserved and |
| there are two words of padding in memory, and the next two arguments |
| go after the padding. */ |
| bar ((vector unsigned int){10,11,12,13}, 2, |
| (vector unsigned int){20,21,22,23}, |
| (vector unsigned int){30,31,32,33}); |
| return 0; |
| } |
| |
| int main (void) |
| { |
| /* Exit on systems without AltiVec. */ |
| altivec_check (); |
| |
| return main1 (); |
| } |