1  /* { dg-do run } */
       2  /* { dg-options "-O -msse2" } */
       3  /* { dg-require-effective-target sse2 } */
       4  
       5  #include "isa-check.h"
       6  #include "sse-os-support.h"
       7  
       8  typedef char S;
       9  typedef char V __attribute__((vector_size(4)));
      10  typedef char IV __attribute__((vector_size(4)));
      11  typedef union { S s[4]; V v; } U;
      12  
      13  static U i[2], b, c;
      14  
      15  extern int memcmp (const void *, const void *, __SIZE_TYPE__);
      16  #define assert(T) ((T) || (__builtin_trap (), 0))
      17  
      18  #define TEST(E0, E1, E2, E3) \
      19    b.v = __builtin_shuffle (i[0].v, i[1].v, (IV){E0, E1, E2, E3}); \
      20    c.s[0] = i[0].s[E0]; \
      21    c.s[1] = i[0].s[E1]; \
      22    c.s[2] = i[0].s[E2]; \
      23    c.s[3] = i[0].s[E3]; \
      24    __asm__("" : : : "memory"); \
      25    assert (memcmp (&b, &c, sizeof(c)) == 0);
      26  
      27  #include "vperm-4-2.inc"
      28  
      29  int main()
      30  {
      31    check_isa ();
      32  
      33    if (!sse_os_support ())
      34      exit (0);
      35  
      36    i[0].s[0] = 0;
      37    i[0].s[1] = 1;
      38    i[0].s[2] = 2;
      39    i[0].s[3] = 3;
      40    i[0].s[4] = 4;
      41    i[0].s[5] = 5;
      42    i[0].s[6] = 6;
      43    i[0].s[7] = 7;
      44  
      45    check();
      46    return 0;
      47  }