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