119304Speter/* { dg-do run } */ 219304Speter/* { dg-require-effective-target avx } */ 319304Speter/* { dg-options "-O2 -mavx" } */ 419304Speter 519304Speter#include "avx-check.h" 619304Speter 719304Speter#ifndef CTRL 819304Speter#define CTRL 6 919304Speter#endif 1019304Speter 1119304Speter#define mask_v(pos) (((CTRL & (1ULL << (pos))) >> (pos)) << 1) 1219304Speter 1319304Spetervoid static 1419304Speteravx_test () 1519304Speter{ 1619304Speter union256d u, src; 1719304Speter union256i_q ctl; 1819304Speter 1919304Speter double s[4] = {39578.467285, 7856.342941, 9674.67456, 13543.9788}; 2019304Speter long long m[4] = {mask_v(0), mask_v(1), mask_v(2), mask_v(3)}; 2119304Speter double e[4] = {0.0}; 2219304Speter 2319304Speter src.x = _mm256_loadu_pd(s); 2419304Speter ctl.x = _mm256_loadu_si256((__m256i*) m); 2519304Speter u.x = _mm256_permutevar_pd(src.x, ctl.x); 2619304Speter 2719304Speter e[0] = s[0 + ((m[0] & 0x02) >> 1)]; 2819304Speter e[1] = s[0 + ((m[1] & 0x02) >> 1)]; 2919304Speter e[2] = s[2 + ((m[2] & 0x02) >> 1)]; 3019304Speter e[3] = s[2 + ((m[3] & 0x02) >> 1)]; 3119304Speter 3219304Speter if (check_union256d (u, e)) 3319304Speter abort (); 3419304Speter} 3519304Speter 3619304Speter 3719304Speter