blob: e4c04c2a82ab9c09a7477f36dc4d807883ec8fc7 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-require-effective-target lp64 } */
/* { dg-options "-O3 -msse2" } */
typedef long v2di __attribute__((vector_size(16)));
typedef int v4si __attribute__((vector_size(16)));
void bar (v4si *p, __int128_t *q)
{
union { __int128_t a; v4si b; } u;
u.a = *q;
(*p)[0] = u.b[0];
(*p)[1] = u.b[2];
(*p)[2] = u.b[1];
(*p)[3] = u.b[3];
}
/* The function should end up with sth like
[v]pshufd $216, (%esi), %xmm0
[v]movdqa %xmm0, (%edi)
ret
recognized by SLP vectorization involving an existing "vector". */
/* { dg-final { scan-assembler-not "punpck" } } */
/* { dg-final { scan-assembler-times "pshufd" 1 } } */