1/* { dg-do run } */
2/* { dg-require-effective-target avx2 } */
3/* { dg-options "-O2 -mavx2" } */
4
5#include <string.h>
6#include "ssse3-vals.h"
7#include "avx2-check.h"
8
9/* Test the 256-bit form */
10static void
11avx2_test_palignr256 (__m256i t1, __m256i t2, unsigned int imm, __m256i * r)
12{
13  switch (imm)
14    {
15    case 0:
16      *r = _mm256_alignr_epi8 (t1, t2, 0);
17      break;
18    case 1:
19      *r = _mm256_alignr_epi8 (t1, t2, 1);
20      break;
21    case 2:
22      *r = _mm256_alignr_epi8 (t1, t2, 2);
23      break;
24    case 3:
25      *r = _mm256_alignr_epi8 (t1, t2, 3);
26      break;
27    case 4:
28      *r = _mm256_alignr_epi8 (t1, t2, 4);
29      break;
30    case 5:
31      *r = _mm256_alignr_epi8 (t1, t2, 5);
32      break;
33    case 6:
34      *r = _mm256_alignr_epi8 (t1, t2, 6);
35      break;
36    case 7:
37      *r = _mm256_alignr_epi8 (t1, t2, 7);
38      break;
39    case 8:
40      *r = _mm256_alignr_epi8 (t1, t2, 8);
41      break;
42    case 9:
43      *r = _mm256_alignr_epi8 (t1, t2, 9);
44      break;
45    case 10:
46      *r = _mm256_alignr_epi8 (t1, t2, 10);
47      break;
48    case 11:
49      *r = _mm256_alignr_epi8 (t1, t2, 11);
50      break;
51    case 12:
52      *r = _mm256_alignr_epi8 (t1, t2, 12);
53      break;
54    case 13:
55      *r = _mm256_alignr_epi8 (t1, t2, 13);
56      break;
57    case 14:
58      *r = _mm256_alignr_epi8 (t1, t2, 14);
59      break;
60    case 15:
61      *r = _mm256_alignr_epi8 (t1, t2, 15);
62      break;
63    case 16:
64      *r = _mm256_alignr_epi8 (t1, t2, 16);
65      break;
66    case 17:
67      *r = _mm256_alignr_epi8 (t1, t2, 17);
68      break;
69    case 18:
70      *r = _mm256_alignr_epi8 (t1, t2, 18);
71      break;
72    case 19:
73      *r = _mm256_alignr_epi8 (t1, t2, 19);
74      break;
75    case 20:
76      *r = _mm256_alignr_epi8 (t1, t2, 20);
77      break;
78    case 21:
79      *r = _mm256_alignr_epi8 (t1, t2, 21);
80      break;
81    case 22:
82      *r = _mm256_alignr_epi8 (t1, t2, 22);
83      break;
84    case 23:
85      *r = _mm256_alignr_epi8 (t1, t2, 23);
86      break;
87    case 24:
88      *r = _mm256_alignr_epi8 (t1, t2, 24);
89      break;
90    case 25:
91      *r = _mm256_alignr_epi8 (t1, t2, 25);
92      break;
93    case 26:
94      *r = _mm256_alignr_epi8 (t1, t2, 26);
95      break;
96    case 27:
97      *r = _mm256_alignr_epi8 (t1, t2, 27);
98      break;
99    case 28:
100      *r = _mm256_alignr_epi8 (t1, t2, 28);
101      break;
102    case 29:
103      *r = _mm256_alignr_epi8 (t1, t2, 29);
104      break;
105    case 30:
106      *r = _mm256_alignr_epi8 (t1, t2, 30);
107      break;
108    case 31:
109      *r = _mm256_alignr_epi8 (t1, t2, 31);
110      break;
111    default:
112      *r = _mm256_alignr_epi8 (t1, t2, 32);
113      break;
114    }
115}
116
117/* Routine to manually compute the results */
118static void
119compute_correct_result_256 (int *i1, int *i2, unsigned int imm, int *r)
120{
121  char buf[32];
122  char *bout = (char *) r;
123  int i;
124
125  /* Fill lowers 128 bit of ymm */
126  memcpy (&buf[0], i2, 16);
127  memcpy (&buf[16], i1, 16);
128
129  for (i = 0; i < 16; i++)
130    if (imm >= 32 || imm + i >= 32)
131      bout[i] = 0;
132    else
133      bout[i] = buf[imm + i];
134
135  /* Fill higher 128 bit of ymm */
136  bout += 16;
137  memcpy (&buf[0], i2 + 4, 16);
138  memcpy (&buf[16], i1 + 4, 16);
139
140  for (i = 0; i < 16; i++)
141    if (imm >= 32 || imm + i >= 32)
142      bout[i] = 0;
143    else
144      bout[i] = buf[imm + i];
145}
146
147static void
148avx2_test (void)
149{
150  int i;
151  int ck[8];
152  int r[8];
153  unsigned int imm;
154  int fail = 0;
155
156  union256i_q s1, s2, d;
157
158  for (i = 0; i < 256; i += 16)
159    for (imm = 0; imm < 100; imm++)
160      {
161	/* Recompute the results for 256-bits */
162	compute_correct_result_256 (&vals[i + 0], &vals[i + 8], imm, ck);
163
164	s1.x = _mm256_loadu_si256 ((__m256i *) & vals[i + 0]);
165	s2.x = _mm256_loadu_si256 ((__m256i *) & vals[i + 8]);
166
167	/* Run the 256-bit tests */
168	avx2_test_palignr256 (s1.x, s2.x, imm, &d.x);
169
170	_mm256_storeu_si256 ((__m256i *) r, d.x);
171
172	fail += checkVi (r, ck, 8);
173      }
174
175  if (fail != 0)
176    abort ();
177}
178