blob: a0f4d1c3f47fbc0858b3c94b36d4bf91fa233767 [file] [log] [blame]
/* 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;
}