1221828Sgrehan/* { dg-do run } */
2221828Sgrehan/* { dg-require-effective-target avx } */
3221828Sgrehan/* { dg-options "-O2 -mavx" } */
4221828Sgrehan
5221828Sgrehan#include "avx-check.h"
6221828Sgrehan
7221828Sgrehan#ifndef MASK
8221828Sgrehan#define MASK 203
9221828Sgrehan#endif
10221828Sgrehan
11221828Sgrehanfloat select4(const float *src, unsigned int control)
12221828Sgrehan{
13221828Sgrehan    switch(control) {
14221828Sgrehan    case 0:
15221828Sgrehan        return src[0];
16221828Sgrehan    case 1:
17221828Sgrehan        return src[1];
18221828Sgrehan    case 2:
19221828Sgrehan        return src[2];
20221828Sgrehan    case 3:
21221828Sgrehan        return src[3];
22221828Sgrehan    }
23221828Sgrehan    return -1;
24221828Sgrehan}
25221828Sgrehan
26221828Sgrehan
27221828Sgrehanvoid static
28221828Sgrehanavx_test (void)
29221828Sgrehan{
30221828Sgrehan  union256 u, s1, s2;
31221828Sgrehan  float e [8];
32221828Sgrehan
33221828Sgrehan  s1.x = _mm256_set_ps (1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8);
34221828Sgrehan  s2.x = _mm256_set_ps (2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8);
35221828Sgrehan  u.x = _mm256_shuffle_ps (s1.x, s2.x, MASK);
36221828Sgrehan
37221828Sgrehan
38221828Sgrehan  e[0] = select4(s1.a,   (MASK >> 0) & 0x3);
39221828Sgrehan  e[1] = select4(s1.a,   (MASK >> 2) & 0x3);
40221828Sgrehan  e[2] = select4(s2.a,   (MASK >> 4) & 0x3);
41221828Sgrehan  e[3] = select4(s2.a,   (MASK >> 6) & 0x3);
42221828Sgrehan  e[4] = select4(s1.a+4, (MASK >> 0) & 0x3);
43221828Sgrehan  e[5] = select4(s1.a+4, (MASK >> 2) & 0x3);
44221828Sgrehan  e[6] = select4(s2.a+4, (MASK >> 4) & 0x3);
45221828Sgrehan  e[7] = select4(s2.a+4, (MASK >> 6) & 0x3);
46221828Sgrehan
47221828Sgrehan  if (check_union256 (u, e))
48221828Sgrehan    abort ();
49221828Sgrehan}
50221828Sgrehan