/* Functional tests for the "target" attribute and pragma. */ /* { dg-do run } */ /* { dg-require-effective-target target_attribute } */ /* { dg-require-effective-target s390_vx } */ /* { dg-options "-march=z900 -mno-vx -mzarch" } */ #define V16 __attribute__ ((vector_size(16))) #pragma GCC push_options #pragma GCC target ("arch=z13,vx") __attribute__ ((noinline)) void foo (char *d, int *off) { typedef struct { char c; V16 char vc; } s_t; s_t s = { 1,{ 0,11,22,33,44,55,66,77,88,99,101,111,121,131,141,151 }}; *off = __builtin_offsetof(s_t, vc); __builtin_memcpy(d, &s.vc, 16); } #pragma GCC pop_options #pragma GCC push_options #pragma GCC target ("arch=z13,no-vx") __attribute__ ((noinline)) void bar (char *d, int *off) { typedef struct { char c; V16 char vc; } s_t; s_t s = { 1,{ 0,11,22,33,44,55,66,77,88,99,101,111,121,131,141,151 }}; *off = __builtin_offsetof(s_t, vc); __builtin_memcpy(d, &s.vc, 16); } #pragma GCC pop_options int main(int argc, char **argv) { char buf[16] = { 0 }; char buf2[16] = { 0 }; int off = 0; int off2 = 0; int rc; rc = 0; foo(buf, &off); if (off != 8) rc += 1; if (buf[7] != 77) rc += 2; bar (buf2, &off2); if (off2 != 16) rc += 4; if (buf2[6] != 66) rc += 8; return rc; }