1135446Strhodes/* { dg-do run } */
2254897Serwin/* { dg-options "-mavx2 -O2" } */
3135446Strhodes/* { dg-require-effective-target avx2 } */
4135446Strhodes
5193149Sdougb#include "avx2-check.h"
6135446Strhodes#include <string.h>
7135446Strhodes
8135446Strhodes#define NUM 10
9135446Strhodes
10135446Strhodesstatic void
11135446Strhodesinit_permd (int *src1, int *src2, int seed)
12135446Strhodes{
13135446Strhodes  int i, sign = 1;
14135446Strhodes
15135446Strhodes  for (i = 0; i < 8; i++)
16135446Strhodes    {
17135446Strhodes      src1[i] = (i + seed) * (i + seed) * sign;
18254897Serwin      src2[i] = (i + seed + 20) * sign;
19135446Strhodes      sign = -sign;
20135446Strhodes    }
21135446Strhodes}
22135446Strhodes
23135446Strhodesstatic void
24135446Strhodescalc_permd (int *src1, int *src2, int *dst)
25135446Strhodes{
26135446Strhodes  int i;
27193149Sdougb  unsigned temp;
28170222Sdougb
29135446Strhodes  memcpy (dst, src1, 32);
30135446Strhodes  for (i = 0; i < 8; i++)
31135446Strhodes    {
32135446Strhodes      temp = src2[i];
33135446Strhodes      dst[i] = src1[temp & 7];
34135446Strhodes    }
35135446Strhodes}
36135446Strhodes
37135446Strhodesstatic void
38135446Strhodesavx2_test (void)
39135446Strhodes{
40135446Strhodes  union256i_d src1, src2, dst;
41135446Strhodes  int dst_ref[8];
42135446Strhodes  int i;
43135446Strhodes
44135446Strhodes  for (i = 0; i < NUM; i++)
45135446Strhodes    {
46135446Strhodes      init_permd (src1.a, src2.a, i);
47135446Strhodes
48135446Strhodes      dst.x = _mm256_permutevar8x32_epi32 (src1.x, src2.x);
49135446Strhodes      calc_permd (src1.a, src2.a, dst_ref);
50135446Strhodes
51135446Strhodes      if (check_union256i_d (dst, dst_ref))
52135446Strhodes	abort ();
53170222Sdougb    }
54170222Sdougb}
55170222Sdougb