| /* { dg-do run { target i?86-*-* x86_64-*-* } } */ |
| /* { dg-options "-msse2" } */ |
| /* { dg-require-effective-target sse2_runtime } */ |
| |
| typedef long long __m128i __attribute__ ((__vector_size__ (16), |
| __may_alias__)); |
| typedef int __v4si __attribute__ ((__vector_size__ (16))); |
| typedef long long __v2di __attribute__ ((__vector_size__ (16))); |
| typedef unsigned int uint32_t; |
| |
| typedef struct { |
| uint32_t v[4]; |
| } a4x32; |
| |
| a4x32* incr(a4x32* x) |
| { |
| x->v[0] += 1; |
| return x; |
| } |
| |
| typedef struct { |
| __m128i m; |
| } a1xm128i; |
| |
| static inline a1xm128i ssefunc( a1xm128i in, a1xm128i k) |
| { |
| a1xm128i ret; |
| ret.m = (__m128i)__builtin_ia32_pxor128 ((__v2di)in.m, (__v2di)k.m); |
| return ret; |
| } |
| |
| static a4x32 caster( a4x32 c4x32, a1xm128i k) |
| { |
| a1xm128i c1x128; |
| if( sizeof(c4x32) != sizeof(c1x128) ) __builtin_abort(); |
| __builtin_memcpy(&c1x128, &c4x32, sizeof(c1x128)); |
| c1x128 = ssefunc(c1x128, k); |
| __builtin_memcpy(&c4x32, &c1x128, sizeof(c4x32)); |
| return c4x32; |
| } |
| |
| typedef struct { |
| a1xm128i key; |
| a4x32 c; |
| __SIZE_TYPE__ elem; |
| a4x32 v; |
| } Engine; |
| |
| void ctor(Engine *e) |
| { |
| e->elem = 0; |
| e->key.m = (__m128i)(__v4si){ 0, 0, 0, 0 }; |
| e->c.v[0] = 0; |
| e->c.v[1] = 0; |
| e->c.v[2] = 0; |
| e->c.v[3] = 0; |
| } |
| |
| uint32_t method( Engine *e) |
| { |
| if( e->elem == 0 ) |
| { |
| e->v = caster(*incr(&e->c), e->key); |
| e->elem = 4; |
| } |
| return e->v.v[--e->elem]; |
| } |
| |
| int main() |
| { |
| Engine e4; ctor(&e4); |
| Engine e5; ctor(&e5); |
| if(method(&e4)!=method(&e5)) |
| __builtin_abort (); |
| return 0; |
| } |