1  /* { dg-do run } */
       2  /* { dg-require-effective-target avx } */
       3  /* { dg-options "-O2 -mavx" } */
       4  
       5  #include "avx-check.h"
       6  
       7  #ifndef CTRL
       8  #define CTRL 6
       9  #endif
      10  
      11  #define mask_v(pos) (((CTRL & (1ULL << (pos))) >> (pos)) << 1)
      12  
      13  void static
      14  avx_test ()
      15  {
      16      union256d u, src; 
      17      union256i_q ctl;
      18  
      19      double  s[4] = {39578.467285, 7856.342941, 9674.67456, 13543.9788};
      20      long long m[4] = {mask_v(0), mask_v(1), mask_v(2), mask_v(3)};
      21      double  e[4] = {0.0};
      22  
      23      src.x = _mm256_loadu_pd(s);
      24      ctl.x  = _mm256_loadu_si256((__m256i*) m);
      25      u.x = _mm256_permutevar_pd(src.x, ctl.x);
      26  
      27      e[0] = s[0 + ((m[0] & 0x02) >> 1)];
      28      e[1] = s[0 + ((m[1] & 0x02) >> 1)];
      29      e[2] = s[2 + ((m[2] & 0x02) >> 1)];
      30      e[3] = s[2 + ((m[3] & 0x02) >> 1)];
      31  
      32      if (check_union256d (u, e))
      33        abort ();
      34  }
      35  
      36