[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / shuffle-strided-with-offset-256.ll
blob8cbcfc4a158b8b8aec93a287c155f516c6b0263e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-SLOW
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-FAST
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
10 define void @shuffle_v32i8_to_v16i8_1(<32 x i8>* %L, <16 x i8>* %S) nounwind {
11 ; AVX-LABEL: shuffle_v32i8_to_v16i8_1:
12 ; AVX:       # %bb.0:
13 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
14 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
15 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u>
16 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
17 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
18 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
19 ; AVX-NEXT:    vmovdqa %xmm0, (%rsi)
20 ; AVX-NEXT:    retq
22 ; AVX512-LABEL: shuffle_v32i8_to_v16i8_1:
23 ; AVX512:       # %bb.0:
24 ; AVX512-NEXT:    vmovdqa (%rdi), %xmm0
25 ; AVX512-NEXT:    vmovdqa 16(%rdi), %xmm1
26 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u>
27 ; AVX512-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
28 ; AVX512-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
29 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
30 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsi)
31 ; AVX512-NEXT:    retq
32   %vec = load <32 x i8>, <32 x i8>* %L
33   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <16 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15, i32 17, i32 19, i32 21, i32 23, i32 25, i32 27, i32 29, i32 31>
34   store <16 x i8> %strided.vec, <16 x i8>* %S
35   ret void
38 define void @shuffle_v16i16_to_v8i16_1(<16 x i16>* %L, <8 x i16>* %S) nounwind {
39 ; AVX-LABEL: shuffle_v16i16_to_v8i16_1:
40 ; AVX:       # %bb.0:
41 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
42 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
43 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
44 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
45 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
46 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
47 ; AVX-NEXT:    vmovdqa %xmm0, (%rsi)
48 ; AVX-NEXT:    retq
50 ; AVX512F-LABEL: shuffle_v16i16_to_v8i16_1:
51 ; AVX512F:       # %bb.0:
52 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
53 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
54 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
55 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
56 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
57 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
58 ; AVX512F-NEXT:    vmovdqa %xmm0, (%rsi)
59 ; AVX512F-NEXT:    retq
61 ; AVX512VL-LABEL: shuffle_v16i16_to_v8i16_1:
62 ; AVX512VL:       # %bb.0:
63 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
64 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
65 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
66 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
67 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
68 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
69 ; AVX512VL-NEXT:    vmovdqa %xmm0, (%rsi)
70 ; AVX512VL-NEXT:    retq
72 ; AVX512BW-LABEL: shuffle_v16i16_to_v8i16_1:
73 ; AVX512BW:       # %bb.0:
74 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
75 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
76 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,3,6,7,10,11,14,15,14,15,10,11,12,13,14,15]
77 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
78 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
79 ; AVX512BW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
80 ; AVX512BW-NEXT:    vmovdqa %xmm0, (%rsi)
81 ; AVX512BW-NEXT:    retq
83 ; AVX512BWVL-LABEL: shuffle_v16i16_to_v8i16_1:
84 ; AVX512BWVL:       # %bb.0:
85 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
86 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,3,5,7,9,11,13,15]
87 ; AVX512BWVL-NEXT:    vpermi2w 16(%rdi), %xmm0, %xmm1
88 ; AVX512BWVL-NEXT:    vmovdqa %xmm1, (%rsi)
89 ; AVX512BWVL-NEXT:    retq
90   %vec = load <16 x i16>, <16 x i16>* %L
91   %strided.vec = shufflevector <16 x i16> %vec, <16 x i16> undef, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
92   store <8 x i16> %strided.vec, <8 x i16>* %S
93   ret void
96 define void @shuffle_v8i32_to_v4i32_1(<8 x i32>* %L, <4 x i32>* %S) nounwind {
97 ; AVX-LABEL: shuffle_v8i32_to_v4i32_1:
98 ; AVX:       # %bb.0:
99 ; AVX-NEXT:    vmovaps (%rdi), %xmm0
100 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],mem[1,3]
101 ; AVX-NEXT:    vmovaps %xmm0, (%rsi)
102 ; AVX-NEXT:    retq
104 ; AVX512-LABEL: shuffle_v8i32_to_v4i32_1:
105 ; AVX512:       # %bb.0:
106 ; AVX512-NEXT:    vmovaps (%rdi), %xmm0
107 ; AVX512-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],mem[1,3]
108 ; AVX512-NEXT:    vmovaps %xmm0, (%rsi)
109 ; AVX512-NEXT:    retq
110   %vec = load <8 x i32>, <8 x i32>* %L
111   %strided.vec = shufflevector <8 x i32> %vec, <8 x i32> undef, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
112   store <4 x i32> %strided.vec, <4 x i32>* %S
113   ret void
116 define void @shuffle_v32i8_to_v8i8_1(<32 x i8>* %L, <8 x i8>* %S) nounwind {
117 ; AVX-LABEL: shuffle_v32i8_to_v8i8_1:
118 ; AVX:       # %bb.0:
119 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
120 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
121 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
122 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
123 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
124 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
125 ; AVX-NEXT:    vmovq %xmm0, (%rsi)
126 ; AVX-NEXT:    retq
128 ; AVX512F-LABEL: shuffle_v32i8_to_v8i8_1:
129 ; AVX512F:       # %bb.0:
130 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
131 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
132 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
133 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
134 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
135 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
136 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
137 ; AVX512F-NEXT:    retq
139 ; AVX512VL-LABEL: shuffle_v32i8_to_v8i8_1:
140 ; AVX512VL:       # %bb.0:
141 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
142 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
143 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
144 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
145 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
146 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
147 ; AVX512VL-NEXT:    vmovq %xmm0, (%rsi)
148 ; AVX512VL-NEXT:    retq
150 ; AVX512BW-LABEL: shuffle_v32i8_to_v8i8_1:
151 ; AVX512BW:       # %bb.0:
152 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
153 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
154 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,5,9,13,u,u,u,u,u,u,u,u,u,u,u,u>
155 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
156 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
157 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
158 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
159 ; AVX512BW-NEXT:    retq
161 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v8i8_1:
162 ; AVX512BWVL:       # %bb.0:
163 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
164 ; AVX512BWVL-NEXT:    vmovdqa 16(%rdi), %xmm1
165 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,5,5,9,9,13,13,13,13,5,5,12,12,13,13]
166 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
167 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
168 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
169 ; AVX512BWVL-NEXT:    vpmovwb %xmm0, (%rsi)
170 ; AVX512BWVL-NEXT:    retq
171   %vec = load <32 x i8>, <32 x i8>* %L
172   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <8 x i32> <i32 1, i32 5, i32 9, i32 13, i32 17, i32 21, i32 25, i32 29>
173   store <8 x i8> %strided.vec, <8 x i8>* %S
174   ret void
177 define void @shuffle_v32i8_to_v8i8_2(<32 x i8>* %L, <8 x i8>* %S) nounwind {
178 ; AVX-LABEL: shuffle_v32i8_to_v8i8_2:
179 ; AVX:       # %bb.0:
180 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
181 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
182 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u>
183 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
184 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
185 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
186 ; AVX-NEXT:    vmovq %xmm0, (%rsi)
187 ; AVX-NEXT:    retq
189 ; AVX512F-LABEL: shuffle_v32i8_to_v8i8_2:
190 ; AVX512F:       # %bb.0:
191 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
192 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
193 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u>
194 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
195 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
196 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
197 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
198 ; AVX512F-NEXT:    retq
200 ; AVX512VL-LABEL: shuffle_v32i8_to_v8i8_2:
201 ; AVX512VL:       # %bb.0:
202 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
203 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
204 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = <2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u>
205 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
206 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
207 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
208 ; AVX512VL-NEXT:    vmovq %xmm0, (%rsi)
209 ; AVX512VL-NEXT:    retq
211 ; AVX512BW-LABEL: shuffle_v32i8_to_v8i8_2:
212 ; AVX512BW:       # %bb.0:
213 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
214 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
215 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <2,6,10,14,u,u,u,u,u,u,u,u,u,u,u,u>
216 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
217 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
218 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
219 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
220 ; AVX512BW-NEXT:    retq
222 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v8i8_2:
223 ; AVX512BWVL:       # %bb.0:
224 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
225 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,3,5,7,9,11,13,15]
226 ; AVX512BWVL-NEXT:    vpermi2w 16(%rdi), %xmm0, %xmm1
227 ; AVX512BWVL-NEXT:    vpmovwb %xmm1, (%rsi)
228 ; AVX512BWVL-NEXT:    retq
229   %vec = load <32 x i8>, <32 x i8>* %L
230   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <8 x i32> <i32 2, i32 6, i32 10, i32 14, i32 18, i32 22, i32 26, i32 30>
231   store <8 x i8> %strided.vec, <8 x i8>* %S
232   ret void
235 define void @shuffle_v32i8_to_v8i8_3(<32 x i8>* %L, <8 x i8>* %S) nounwind {
236 ; AVX-LABEL: shuffle_v32i8_to_v8i8_3:
237 ; AVX:       # %bb.0:
238 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
239 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
240 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <3,7,11,15,u,u,u,u,u,u,u,u,u,u,u,u>
241 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
242 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
243 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
244 ; AVX-NEXT:    vmovq %xmm0, (%rsi)
245 ; AVX-NEXT:    retq
247 ; AVX512F-LABEL: shuffle_v32i8_to_v8i8_3:
248 ; AVX512F:       # %bb.0:
249 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
250 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
251 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <3,7,11,15,u,u,u,u,u,u,u,u,u,u,u,u>
252 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
253 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
254 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
255 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
256 ; AVX512F-NEXT:    retq
258 ; AVX512VL-LABEL: shuffle_v32i8_to_v8i8_3:
259 ; AVX512VL:       # %bb.0:
260 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
261 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
262 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = <3,7,11,15,u,u,u,u,u,u,u,u,u,u,u,u>
263 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
264 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
265 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
266 ; AVX512VL-NEXT:    vmovq %xmm0, (%rsi)
267 ; AVX512VL-NEXT:    retq
269 ; AVX512BW-LABEL: shuffle_v32i8_to_v8i8_3:
270 ; AVX512BW:       # %bb.0:
271 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
272 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
273 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <3,7,11,15,u,u,u,u,u,u,u,u,u,u,u,u>
274 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
275 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
276 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
277 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
278 ; AVX512BW-NEXT:    retq
280 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v8i8_3:
281 ; AVX512BWVL:       # %bb.0:
282 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
283 ; AVX512BWVL-NEXT:    vmovdqa 16(%rdi), %xmm1
284 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,3,7,7,11,11,15,15,7,7,15,15,6,6,7,7]
285 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
286 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
287 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
288 ; AVX512BWVL-NEXT:    vpmovwb %xmm0, (%rsi)
289 ; AVX512BWVL-NEXT:    retq
290   %vec = load <32 x i8>, <32 x i8>* %L
291   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <8 x i32> <i32 3, i32 7, i32 11, i32 15, i32 19, i32 23, i32 27, i32 31>
292   store <8 x i8> %strided.vec, <8 x i8>* %S
293   ret void
296 define void @shuffle_v16i16_to_v4i16_1(<16 x i16>* %L, <4 x i16>* %S) nounwind {
297 ; AVX1-LABEL: shuffle_v16i16_to_v4i16_1:
298 ; AVX1:       # %bb.0:
299 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
300 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[1,3,2,3,4,5,6,7]
301 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
302 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[1,3,2,3,4,5,6,7]
303 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
304 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
305 ; AVX1-NEXT:    retq
307 ; AVX2-SLOW-LABEL: shuffle_v16i16_to_v4i16_1:
308 ; AVX2-SLOW:       # %bb.0:
309 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
310 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[1,3,2,3,4,5,6,7]
311 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
312 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[1,3,2,3,4,5,6,7]
313 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
314 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rsi)
315 ; AVX2-SLOW-NEXT:    retq
317 ; AVX2-FAST-LABEL: shuffle_v16i16_to_v4i16_1:
318 ; AVX2-FAST:       # %bb.0:
319 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %xmm0
320 ; AVX2-FAST-NEXT:    vmovdqa 16(%rdi), %xmm1
321 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,3,10,11,8,9,10,11,8,9,10,11,12,13,14,15]
322 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
323 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
324 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
325 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rsi)
326 ; AVX2-FAST-NEXT:    retq
328 ; AVX512F-LABEL: shuffle_v16i16_to_v4i16_1:
329 ; AVX512F:       # %bb.0:
330 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
331 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[1,3,2,3,4,5,6,7]
332 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
333 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[1,3,2,3,4,5,6,7]
334 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
335 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
336 ; AVX512F-NEXT:    retq
338 ; AVX512VL-LABEL: shuffle_v16i16_to_v4i16_1:
339 ; AVX512VL:       # %bb.0:
340 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
341 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
342 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,3,2,3,10,11,10,11,8,9,10,11,12,13,14,15]
343 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
344 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
345 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
346 ; AVX512VL-NEXT:    vpmovdw %xmm0, (%rsi)
347 ; AVX512VL-NEXT:    retq
349 ; AVX512BW-LABEL: shuffle_v16i16_to_v4i16_1:
350 ; AVX512BW:       # %bb.0:
351 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
352 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
353 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,3,10,11,8,9,10,11,8,9,10,11,12,13,14,15]
354 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
355 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
356 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
357 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
358 ; AVX512BW-NEXT:    retq
360 ; AVX512BWVL-LABEL: shuffle_v16i16_to_v4i16_1:
361 ; AVX512BWVL:       # %bb.0:
362 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
363 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,1,5,5,9,9,13,13]
364 ; AVX512BWVL-NEXT:    vpermi2w 16(%rdi), %xmm0, %xmm1
365 ; AVX512BWVL-NEXT:    vpmovdw %xmm1, (%rsi)
366 ; AVX512BWVL-NEXT:    retq
367   %vec = load <16 x i16>, <16 x i16>* %L
368   %strided.vec = shufflevector <16 x i16> %vec, <16 x i16> undef, <4 x i32> <i32 1, i32 5, i32 9, i32 13>
369   store <4 x i16> %strided.vec, <4 x i16>* %S
370   ret void
373 define void @shuffle_v16i16_to_v4i16_2(<16 x i16>* %L, <4 x i16>* %S) nounwind {
374 ; AVX1-LABEL: shuffle_v16i16_to_v4i16_2:
375 ; AVX1:       # %bb.0:
376 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = mem[3,1,2,3]
377 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,0,2,3,4,5,6,7]
378 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = mem[3,1,2,3]
379 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[2,0,2,3,4,5,6,7]
380 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
381 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
382 ; AVX1-NEXT:    retq
384 ; AVX2-SLOW-LABEL: shuffle_v16i16_to_v4i16_2:
385 ; AVX2-SLOW:       # %bb.0:
386 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = mem[3,1,2,3]
387 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,0,2,3,4,5,6,7]
388 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = mem[3,1,2,3]
389 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[2,0,2,3,4,5,6,7]
390 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
391 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rsi)
392 ; AVX2-SLOW-NEXT:    retq
394 ; AVX2-FAST-LABEL: shuffle_v16i16_to_v4i16_2:
395 ; AVX2-FAST:       # %bb.0:
396 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %xmm0
397 ; AVX2-FAST-NEXT:    vmovdqa 16(%rdi), %xmm1
398 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [4,5,12,13,4,5,6,7,8,9,10,11,12,13,14,15]
399 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
400 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
401 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
402 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rsi)
403 ; AVX2-FAST-NEXT:    retq
405 ; AVX512F-LABEL: shuffle_v16i16_to_v4i16_2:
406 ; AVX512F:       # %bb.0:
407 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = mem[3,1,2,3]
408 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,0,2,3,4,5,6,7]
409 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = mem[3,1,2,3]
410 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[2,0,2,3,4,5,6,7]
411 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
412 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
413 ; AVX512F-NEXT:    retq
415 ; AVX512VL-LABEL: shuffle_v16i16_to_v4i16_2:
416 ; AVX512VL:       # %bb.0:
417 ; AVX512VL-NEXT:    vmovaps (%rdi), %xmm0
418 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],mem[1,3]
419 ; AVX512VL-NEXT:    vpmovdw %xmm0, (%rsi)
420 ; AVX512VL-NEXT:    retq
422 ; AVX512BW-LABEL: shuffle_v16i16_to_v4i16_2:
423 ; AVX512BW:       # %bb.0:
424 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
425 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
426 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [4,5,12,13,4,5,6,7,8,9,10,11,12,13,14,15]
427 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
428 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
429 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
430 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
431 ; AVX512BW-NEXT:    retq
433 ; AVX512BWVL-LABEL: shuffle_v16i16_to_v4i16_2:
434 ; AVX512BWVL:       # %bb.0:
435 ; AVX512BWVL-NEXT:    vmovaps (%rdi), %xmm0
436 ; AVX512BWVL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],mem[1,3]
437 ; AVX512BWVL-NEXT:    vpmovdw %xmm0, (%rsi)
438 ; AVX512BWVL-NEXT:    retq
439   %vec = load <16 x i16>, <16 x i16>* %L
440   %strided.vec = shufflevector <16 x i16> %vec, <16 x i16> undef, <4 x i32> <i32 2, i32 6, i32 10, i32 14>
441   store <4 x i16> %strided.vec, <4 x i16>* %S
442   ret void
445 define void @shuffle_v16i16_to_v4i16_3(<16 x i16>* %L, <4 x i16>* %S) nounwind {
446 ; AVX1-LABEL: shuffle_v16i16_to_v4i16_3:
447 ; AVX1:       # %bb.0:
448 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = mem[3,1,2,3]
449 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[3,1,2,3,4,5,6,7]
450 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = mem[3,1,2,3]
451 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[3,1,2,3,4,5,6,7]
452 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
453 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
454 ; AVX1-NEXT:    retq
456 ; AVX2-SLOW-LABEL: shuffle_v16i16_to_v4i16_3:
457 ; AVX2-SLOW:       # %bb.0:
458 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = mem[3,1,2,3]
459 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[3,1,2,3,4,5,6,7]
460 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = mem[3,1,2,3]
461 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[3,1,2,3,4,5,6,7]
462 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
463 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rsi)
464 ; AVX2-SLOW-NEXT:    retq
466 ; AVX2-FAST-LABEL: shuffle_v16i16_to_v4i16_3:
467 ; AVX2-FAST:       # %bb.0:
468 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %xmm0
469 ; AVX2-FAST-NEXT:    vmovdqa 16(%rdi), %xmm1
470 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [6,7,14,15,4,5,6,7,8,9,10,11,12,13,14,15]
471 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
472 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
473 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
474 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rsi)
475 ; AVX2-FAST-NEXT:    retq
477 ; AVX512F-LABEL: shuffle_v16i16_to_v4i16_3:
478 ; AVX512F:       # %bb.0:
479 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = mem[3,1,2,3]
480 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[3,1,2,3,4,5,6,7]
481 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = mem[3,1,2,3]
482 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[3,1,2,3,4,5,6,7]
483 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
484 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
485 ; AVX512F-NEXT:    retq
487 ; AVX512VL-LABEL: shuffle_v16i16_to_v4i16_3:
488 ; AVX512VL:       # %bb.0:
489 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
490 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
491 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [6,7,14,15,14,15,6,7,8,9,10,11,12,13,14,15]
492 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
493 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
494 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
495 ; AVX512VL-NEXT:    vpmovdw %xmm0, (%rsi)
496 ; AVX512VL-NEXT:    retq
498 ; AVX512BW-LABEL: shuffle_v16i16_to_v4i16_3:
499 ; AVX512BW:       # %bb.0:
500 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
501 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
502 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [6,7,14,15,4,5,6,7,8,9,10,11,12,13,14,15]
503 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
504 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
505 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
506 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
507 ; AVX512BW-NEXT:    retq
509 ; AVX512BWVL-LABEL: shuffle_v16i16_to_v4i16_3:
510 ; AVX512BWVL:       # %bb.0:
511 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
512 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [3,7,7,3,11,15,15,11]
513 ; AVX512BWVL-NEXT:    vpermi2w 16(%rdi), %xmm0, %xmm1
514 ; AVX512BWVL-NEXT:    vpmovdw %xmm1, (%rsi)
515 ; AVX512BWVL-NEXT:    retq
516   %vec = load <16 x i16>, <16 x i16>* %L
517   %strided.vec = shufflevector <16 x i16> %vec, <16 x i16> undef, <4 x i32> <i32 3, i32 7, i32 11, i32 15>
518   store <4 x i16> %strided.vec, <4 x i16>* %S
519   ret void
522 define void @shuffle_v32i8_to_v4i8_1(<32 x i8>* %L, <4 x i8>* %S) nounwind {
523 ; AVX-LABEL: shuffle_v32i8_to_v4i8_1:
524 ; AVX:       # %bb.0:
525 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
526 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
527 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,9,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
528 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
529 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
530 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
531 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
532 ; AVX-NEXT:    retq
534 ; AVX512F-LABEL: shuffle_v32i8_to_v4i8_1:
535 ; AVX512F:       # %bb.0:
536 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
537 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
538 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,9,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
539 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
540 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
541 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
542 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
543 ; AVX512F-NEXT:    retq
545 ; AVX512VL-LABEL: shuffle_v32i8_to_v4i8_1:
546 ; AVX512VL:       # %bb.0:
547 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
548 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
549 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,255,255,9,9,255,255,9,9,255,255,11,11,255,255]
550 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
551 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
552 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
553 ; AVX512VL-NEXT:    vpmovdb %xmm0, (%rsi)
554 ; AVX512VL-NEXT:    retq
556 ; AVX512BW-LABEL: shuffle_v32i8_to_v4i8_1:
557 ; AVX512BW:       # %bb.0:
558 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
559 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
560 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <1,9,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
561 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
562 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
563 ; AVX512BW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
564 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
565 ; AVX512BW-NEXT:    retq
567 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v4i8_1:
568 ; AVX512BWVL:       # %bb.0:
569 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
570 ; AVX512BWVL-NEXT:    vmovdqa 16(%rdi), %xmm1
571 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [1,1,255,255,9,9,255,255,9,9,255,255,11,11,255,255]
572 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
573 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
574 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
575 ; AVX512BWVL-NEXT:    vpmovdb %xmm0, (%rsi)
576 ; AVX512BWVL-NEXT:    retq
577   %vec = load <32 x i8>, <32 x i8>* %L
578   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 1, i32 9, i32 17, i32 25>
579   store <4 x i8> %strided.vec, <4 x i8>* %S
580   ret void
583 define void @shuffle_v32i8_to_v4i8_2(<32 x i8>* %L, <4 x i8>* %S) nounwind {
584 ; AVX-LABEL: shuffle_v32i8_to_v4i8_2:
585 ; AVX:       # %bb.0:
586 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
587 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
588 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <2,10,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
589 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
590 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
591 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
592 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
593 ; AVX-NEXT:    retq
595 ; AVX512F-LABEL: shuffle_v32i8_to_v4i8_2:
596 ; AVX512F:       # %bb.0:
597 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
598 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
599 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <2,10,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
600 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
601 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
602 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
603 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
604 ; AVX512F-NEXT:    retq
606 ; AVX512VL-LABEL: shuffle_v32i8_to_v4i8_2:
607 ; AVX512VL:       # %bb.0:
608 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
609 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
610 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [2,3,2,3,10,11,10,11,8,9,10,11,12,13,14,15]
611 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
612 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
613 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
614 ; AVX512VL-NEXT:    vpmovdb %xmm0, (%rsi)
615 ; AVX512VL-NEXT:    retq
617 ; AVX512BW-LABEL: shuffle_v32i8_to_v4i8_2:
618 ; AVX512BW:       # %bb.0:
619 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
620 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
621 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <2,10,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
622 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
623 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
624 ; AVX512BW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
625 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
626 ; AVX512BW-NEXT:    retq
628 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v4i8_2:
629 ; AVX512BWVL:       # %bb.0:
630 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
631 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [1,1,5,5,9,9,13,13]
632 ; AVX512BWVL-NEXT:    vpermi2w 16(%rdi), %xmm0, %xmm1
633 ; AVX512BWVL-NEXT:    vpmovdb %xmm1, (%rsi)
634 ; AVX512BWVL-NEXT:    retq
635   %vec = load <32 x i8>, <32 x i8>* %L
636   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 2, i32 10, i32 18, i32 26>
637   store <4 x i8> %strided.vec, <4 x i8>* %S
638   ret void
641 define void @shuffle_v32i8_to_v4i8_3(<32 x i8>* %L, <4 x i8>* %S) nounwind {
642 ; AVX-LABEL: shuffle_v32i8_to_v4i8_3:
643 ; AVX:       # %bb.0:
644 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
645 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
646 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <3,11,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
647 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
648 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
649 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
650 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
651 ; AVX-NEXT:    retq
653 ; AVX512F-LABEL: shuffle_v32i8_to_v4i8_3:
654 ; AVX512F:       # %bb.0:
655 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
656 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
657 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <3,11,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
658 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
659 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
660 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
661 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
662 ; AVX512F-NEXT:    retq
664 ; AVX512VL-LABEL: shuffle_v32i8_to_v4i8_3:
665 ; AVX512VL:       # %bb.0:
666 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
667 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
668 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,3,11,11,11,11,3,3,8,8,9,9,10,10,11,11]
669 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
670 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
671 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
672 ; AVX512VL-NEXT:    vpmovdb %xmm0, (%rsi)
673 ; AVX512VL-NEXT:    retq
675 ; AVX512BW-LABEL: shuffle_v32i8_to_v4i8_3:
676 ; AVX512BW:       # %bb.0:
677 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
678 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
679 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <3,11,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
680 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
681 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
682 ; AVX512BW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
683 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
684 ; AVX512BW-NEXT:    retq
686 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v4i8_3:
687 ; AVX512BWVL:       # %bb.0:
688 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
689 ; AVX512BWVL-NEXT:    vmovdqa 16(%rdi), %xmm1
690 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [3,3,11,11,11,11,3,3,8,8,9,9,10,10,11,11]
691 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
692 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
693 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
694 ; AVX512BWVL-NEXT:    vpmovdb %xmm0, (%rsi)
695 ; AVX512BWVL-NEXT:    retq
696   %vec = load <32 x i8>, <32 x i8>* %L
697   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 3, i32 11, i32 19, i32 27>
698   store <4 x i8> %strided.vec, <4 x i8>* %S
699   ret void
702 define void @shuffle_v32i8_to_v4i8_4(<32 x i8>* %L, <4 x i8>* %S) nounwind {
703 ; AVX-LABEL: shuffle_v32i8_to_v4i8_4:
704 ; AVX:       # %bb.0:
705 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
706 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
707 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <4,12,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
708 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
709 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
710 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
711 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
712 ; AVX-NEXT:    retq
714 ; AVX512F-LABEL: shuffle_v32i8_to_v4i8_4:
715 ; AVX512F:       # %bb.0:
716 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
717 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
718 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <4,12,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
719 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
720 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
721 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
722 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
723 ; AVX512F-NEXT:    retq
725 ; AVX512VL-LABEL: shuffle_v32i8_to_v4i8_4:
726 ; AVX512VL:       # %bb.0:
727 ; AVX512VL-NEXT:    vmovaps (%rdi), %xmm0
728 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],mem[1,3]
729 ; AVX512VL-NEXT:    vpmovdb %xmm0, (%rsi)
730 ; AVX512VL-NEXT:    retq
732 ; AVX512BW-LABEL: shuffle_v32i8_to_v4i8_4:
733 ; AVX512BW:       # %bb.0:
734 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
735 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
736 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <4,12,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
737 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
738 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
739 ; AVX512BW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
740 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
741 ; AVX512BW-NEXT:    retq
743 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v4i8_4:
744 ; AVX512BWVL:       # %bb.0:
745 ; AVX512BWVL-NEXT:    vmovaps (%rdi), %xmm0
746 ; AVX512BWVL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[1,3],mem[1,3]
747 ; AVX512BWVL-NEXT:    vpmovdb %xmm0, (%rsi)
748 ; AVX512BWVL-NEXT:    retq
749   %vec = load <32 x i8>, <32 x i8>* %L
750   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 4, i32 12, i32 20, i32 28>
751   store <4 x i8> %strided.vec, <4 x i8>* %S
752   ret void
755 define void @shuffle_v32i8_to_v4i8_5(<32 x i8>* %L, <4 x i8>* %S) nounwind {
756 ; AVX-LABEL: shuffle_v32i8_to_v4i8_5:
757 ; AVX:       # %bb.0:
758 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
759 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
760 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <5,13,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
761 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
762 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
763 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
764 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
765 ; AVX-NEXT:    retq
767 ; AVX512F-LABEL: shuffle_v32i8_to_v4i8_5:
768 ; AVX512F:       # %bb.0:
769 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
770 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
771 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <5,13,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
772 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
773 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
774 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
775 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
776 ; AVX512F-NEXT:    retq
778 ; AVX512VL-LABEL: shuffle_v32i8_to_v4i8_5:
779 ; AVX512VL:       # %bb.0:
780 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
781 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
782 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [5,5,13,13,13,13,5,5,4,4,5,5,6,6,7,7]
783 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
784 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
785 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
786 ; AVX512VL-NEXT:    vpmovdb %xmm0, (%rsi)
787 ; AVX512VL-NEXT:    retq
789 ; AVX512BW-LABEL: shuffle_v32i8_to_v4i8_5:
790 ; AVX512BW:       # %bb.0:
791 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
792 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
793 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <5,13,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
794 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
795 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
796 ; AVX512BW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
797 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
798 ; AVX512BW-NEXT:    retq
800 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v4i8_5:
801 ; AVX512BWVL:       # %bb.0:
802 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
803 ; AVX512BWVL-NEXT:    vmovdqa 16(%rdi), %xmm1
804 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [5,5,13,13,13,13,5,5,4,4,5,5,6,6,7,7]
805 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
806 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
807 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
808 ; AVX512BWVL-NEXT:    vpmovdb %xmm0, (%rsi)
809 ; AVX512BWVL-NEXT:    retq
810   %vec = load <32 x i8>, <32 x i8>* %L
811   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 5, i32 13, i32 21, i32 29>
812   store <4 x i8> %strided.vec, <4 x i8>* %S
813   ret void
816 define void @shuffle_v32i8_to_v4i8_6(<32 x i8>* %L, <4 x i8>* %S) nounwind {
817 ; AVX-LABEL: shuffle_v32i8_to_v4i8_6:
818 ; AVX:       # %bb.0:
819 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
820 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
821 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <6,14,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
822 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
823 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
824 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
825 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
826 ; AVX-NEXT:    retq
828 ; AVX512F-LABEL: shuffle_v32i8_to_v4i8_6:
829 ; AVX512F:       # %bb.0:
830 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
831 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
832 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <6,14,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
833 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
834 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
835 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
836 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
837 ; AVX512F-NEXT:    retq
839 ; AVX512VL-LABEL: shuffle_v32i8_to_v4i8_6:
840 ; AVX512VL:       # %bb.0:
841 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
842 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
843 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [6,7,14,15,14,15,6,7,8,9,10,11,12,13,14,15]
844 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
845 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
846 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
847 ; AVX512VL-NEXT:    vpmovdb %xmm0, (%rsi)
848 ; AVX512VL-NEXT:    retq
850 ; AVX512BW-LABEL: shuffle_v32i8_to_v4i8_6:
851 ; AVX512BW:       # %bb.0:
852 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
853 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
854 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <6,14,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
855 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
856 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
857 ; AVX512BW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
858 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
859 ; AVX512BW-NEXT:    retq
861 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v4i8_6:
862 ; AVX512BWVL:       # %bb.0:
863 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
864 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm1 = [3,7,7,3,11,15,15,11]
865 ; AVX512BWVL-NEXT:    vpermi2w 16(%rdi), %xmm0, %xmm1
866 ; AVX512BWVL-NEXT:    vpmovdb %xmm1, (%rsi)
867 ; AVX512BWVL-NEXT:    retq
868   %vec = load <32 x i8>, <32 x i8>* %L
869   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 6, i32 14, i32 22, i32 30>
870   store <4 x i8> %strided.vec, <4 x i8>* %S
871   ret void
874 define void @shuffle_v32i8_to_v4i8_7(<32 x i8>* %L, <4 x i8>* %S) nounwind {
875 ; AVX-LABEL: shuffle_v32i8_to_v4i8_7:
876 ; AVX:       # %bb.0:
877 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
878 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
879 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <7,15,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
880 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
881 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
882 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
883 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
884 ; AVX-NEXT:    retq
886 ; AVX512F-LABEL: shuffle_v32i8_to_v4i8_7:
887 ; AVX512F:       # %bb.0:
888 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
889 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
890 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <7,15,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
891 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
892 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
893 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
894 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
895 ; AVX512F-NEXT:    retq
897 ; AVX512VL-LABEL: shuffle_v32i8_to_v4i8_7:
898 ; AVX512VL:       # %bb.0:
899 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
900 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
901 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,14,14,15,15,14,14,15,15,4,4,5,5,6,6]
902 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
903 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
904 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
905 ; AVX512VL-NEXT:    vpmovdb %xmm0, (%rsi)
906 ; AVX512VL-NEXT:    retq
908 ; AVX512BW-LABEL: shuffle_v32i8_to_v4i8_7:
909 ; AVX512BW:       # %bb.0:
910 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
911 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
912 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <7,15,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
913 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
914 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
915 ; AVX512BW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
916 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
917 ; AVX512BW-NEXT:    retq
919 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v4i8_7:
920 ; AVX512BWVL:       # %bb.0:
921 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
922 ; AVX512BWVL-NEXT:    vmovdqa 16(%rdi), %xmm1
923 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [7,7,14,14,15,15,14,14,15,15,4,4,5,5,6,6]
924 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
925 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
926 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
927 ; AVX512BWVL-NEXT:    vpmovdb %xmm0, (%rsi)
928 ; AVX512BWVL-NEXT:    retq
929   %vec = load <32 x i8>, <32 x i8>* %L
930   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 7, i32 15, i32 23, i32 31>
931   store <4 x i8> %strided.vec, <4 x i8>* %S
932   ret void