1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx } */
       3  /* { dg-options "-O2 -mavx" } */
       4  
       5  #include "avx-check.h"
       6  
       7  #ifndef MASK
       8  #define MASK 203
       9  #endif
      10  
      11  float select4(const float *src, unsigned int control)
      12  {
      13      switch(control) {
      14      case 0:
      15          return src[0];
      16      case 1:
      17          return src[1];
      18      case 2:
      19          return src[2];
      20      case 3:
      21          return src[3];
      22      }
      23      return -1;
      24  }
      25  
      26  
      27  void static
      28  avx_test (void)
      29  {
      30    union256 u, s1, s2;
      31    float e [8];
      32  
      33    s1.x = _mm256_set_ps (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8);
      34    s2.x = _mm256_set_ps (2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8);
      35    u.x = _mm256_shuffle_ps (s1.x, s2.x, MASK);
      36  
      37  
      38    e[0] = select4(s1.a,   (MASK >> 0) & 0x3);
      39    e[1] = select4(s1.a,   (MASK >> 2) & 0x3);
      40    e[2] = select4(s2.a,   (MASK >> 4) & 0x3);
      41    e[3] = select4(s2.a,   (MASK >> 6) & 0x3);
      42    e[4] = select4(s1.a+4, (MASK >> 0) & 0x3);
      43    e[5] = select4(s1.a+4, (MASK >> 2) & 0x3);
      44    e[6] = select4(s2.a+4, (MASK >> 4) & 0x3);
      45    e[7] = select4(s2.a+4, (MASK >> 6) & 0x3);
      46  
      47    if (check_union256 (u, e))
      48      abort ();
      49  }