[DAGCombiner] Eliminate dead stores to stack.
[llvm-complete.git] / test / CodeGen / X86 / shuffle-vs-trunc-256-widen.ll
blob629d37bf81fea72ad45bd9ca383a24823618d4b3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
3 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2-SLOW
4 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -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 -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
6 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
7 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
8 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
9 ; RUN: llc < %s -x86-experimental-vector-widening-legalization -mtriple=x86_64-unknown-unknown -mattr=+avx512vbmi,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VBMIVL
11 ; PR31551
12 ; Pairs of shufflevector:trunc functions with functional equivalence.
13 ; Ideally, the shuffles should be lowered to code with the same quality as the truncates.
15 define void @shuffle_v32i8_to_v16i8(<32 x i8>* %L, <16 x i8>* %S) nounwind {
16 ; AVX-LABEL: shuffle_v32i8_to_v16i8:
17 ; AVX:       # %bb.0:
18 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
19 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
20 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
21 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
22 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
23 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
24 ; AVX-NEXT:    vmovdqa %xmm0, (%rsi)
25 ; AVX-NEXT:    retq
27 ; AVX512-LABEL: shuffle_v32i8_to_v16i8:
28 ; AVX512:       # %bb.0:
29 ; AVX512-NEXT:    vmovdqa (%rdi), %xmm0
30 ; AVX512-NEXT:    vmovdqa 16(%rdi), %xmm1
31 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
32 ; AVX512-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
33 ; AVX512-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
34 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
35 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsi)
36 ; AVX512-NEXT:    retq
37   %vec = load <32 x i8>, <32 x i8>* %L
38   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
39   store <16 x i8> %strided.vec, <16 x i8>* %S
40   ret void
43 define void @trunc_v16i16_to_v16i8(<32 x i8>* %L, <16 x i8>* %S) nounwind {
44 ; AVX1-LABEL: trunc_v16i16_to_v16i8:
45 ; AVX1:       # %bb.0:
46 ; AVX1-NEXT:    vmovaps (%rdi), %ymm0
47 ; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
48 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
49 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
50 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsi)
51 ; AVX1-NEXT:    vzeroupper
52 ; AVX1-NEXT:    retq
54 ; AVX2-LABEL: trunc_v16i16_to_v16i8:
55 ; AVX2:       # %bb.0:
56 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
57 ; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
58 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
59 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
60 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsi)
61 ; AVX2-NEXT:    vzeroupper
62 ; AVX2-NEXT:    retq
64 ; AVX512F-LABEL: trunc_v16i16_to_v16i8:
65 ; AVX512F:       # %bb.0:
66 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
67 ; AVX512F-NEXT:    vpmovdb %zmm0, (%rsi)
68 ; AVX512F-NEXT:    vzeroupper
69 ; AVX512F-NEXT:    retq
71 ; AVX512VL-LABEL: trunc_v16i16_to_v16i8:
72 ; AVX512VL:       # %bb.0:
73 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero,mem[8],zero,mem[9],zero,mem[10],zero,mem[11],zero,mem[12],zero,mem[13],zero,mem[14],zero,mem[15],zero
74 ; AVX512VL-NEXT:    vpmovdb %zmm0, (%rsi)
75 ; AVX512VL-NEXT:    vzeroupper
76 ; AVX512VL-NEXT:    retq
78 ; AVX512BW-LABEL: trunc_v16i16_to_v16i8:
79 ; AVX512BW:       # %bb.0:
80 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
81 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
82 ; AVX512BW-NEXT:    vmovdqa %xmm0, (%rsi)
83 ; AVX512BW-NEXT:    vzeroupper
84 ; AVX512BW-NEXT:    retq
86 ; AVX512BWVL-LABEL: trunc_v16i16_to_v16i8:
87 ; AVX512BWVL:       # %bb.0:
88 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
89 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, (%rsi)
90 ; AVX512BWVL-NEXT:    vzeroupper
91 ; AVX512BWVL-NEXT:    retq
93 ; AVX512VBMIVL-LABEL: trunc_v16i16_to_v16i8:
94 ; AVX512VBMIVL:       # %bb.0:
95 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
96 ; AVX512VBMIVL-NEXT:    vpmovwb %ymm0, (%rsi)
97 ; AVX512VBMIVL-NEXT:    vzeroupper
98 ; AVX512VBMIVL-NEXT:    retq
99   %vec = load <32 x i8>, <32 x i8>* %L
100   %bc = bitcast <32 x i8> %vec to <16 x i16>
101   %strided.vec = trunc <16 x i16> %bc to <16 x i8>
102   store <16 x i8> %strided.vec, <16 x i8>* %S
103   ret void
106 define void @shuffle_v16i16_to_v8i16(<16 x i16>* %L, <8 x i16>* %S) nounwind {
107 ; AVX-LABEL: shuffle_v16i16_to_v8i16:
108 ; AVX:       # %bb.0:
109 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
110 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
111 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
112 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
113 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
114 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
115 ; AVX-NEXT:    vmovdqa %xmm0, (%rsi)
116 ; AVX-NEXT:    retq
118 ; AVX512-LABEL: shuffle_v16i16_to_v8i16:
119 ; AVX512:       # %bb.0:
120 ; AVX512-NEXT:    vmovdqa (%rdi), %xmm0
121 ; AVX512-NEXT:    vmovdqa 16(%rdi), %xmm1
122 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
123 ; AVX512-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
124 ; AVX512-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
125 ; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
126 ; AVX512-NEXT:    vmovdqa %xmm0, (%rsi)
127 ; AVX512-NEXT:    retq
128   %vec = load <16 x i16>, <16 x i16>* %L
129   %strided.vec = shufflevector <16 x i16> %vec, <16 x i16> undef, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
130   store <8 x i16> %strided.vec, <8 x i16>* %S
131   ret void
134 define void @trunc_v8i32_to_v8i16(<16 x i16>* %L, <8 x i16>* %S) nounwind {
135 ; AVX1-LABEL: trunc_v8i32_to_v8i16:
136 ; AVX1:       # %bb.0:
137 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
138 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
139 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
140 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
141 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
142 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
143 ; AVX1-NEXT:    vmovdqa %xmm0, (%rsi)
144 ; AVX1-NEXT:    retq
146 ; AVX2-LABEL: trunc_v8i32_to_v8i16:
147 ; AVX2:       # %bb.0:
148 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
149 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
150 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
151 ; AVX2-NEXT:    vmovdqa %xmm0, (%rsi)
152 ; AVX2-NEXT:    vzeroupper
153 ; AVX2-NEXT:    retq
155 ; AVX512F-LABEL: trunc_v8i32_to_v8i16:
156 ; AVX512F:       # %bb.0:
157 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
158 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
159 ; AVX512F-NEXT:    vmovdqa %xmm0, (%rsi)
160 ; AVX512F-NEXT:    vzeroupper
161 ; AVX512F-NEXT:    retq
163 ; AVX512VL-LABEL: trunc_v8i32_to_v8i16:
164 ; AVX512VL:       # %bb.0:
165 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
166 ; AVX512VL-NEXT:    vpmovdw %ymm0, (%rsi)
167 ; AVX512VL-NEXT:    vzeroupper
168 ; AVX512VL-NEXT:    retq
170 ; AVX512BW-LABEL: trunc_v8i32_to_v8i16:
171 ; AVX512BW:       # %bb.0:
172 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
173 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
174 ; AVX512BW-NEXT:    vmovdqa %xmm0, (%rsi)
175 ; AVX512BW-NEXT:    vzeroupper
176 ; AVX512BW-NEXT:    retq
178 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i16:
179 ; AVX512BWVL:       # %bb.0:
180 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
181 ; AVX512BWVL-NEXT:    vpmovdw %ymm0, (%rsi)
182 ; AVX512BWVL-NEXT:    vzeroupper
183 ; AVX512BWVL-NEXT:    retq
185 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i16:
186 ; AVX512VBMIVL:       # %bb.0:
187 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
188 ; AVX512VBMIVL-NEXT:    vpmovdw %ymm0, (%rsi)
189 ; AVX512VBMIVL-NEXT:    vzeroupper
190 ; AVX512VBMIVL-NEXT:    retq
191   %vec = load <16 x i16>, <16 x i16>* %L
192   %bc = bitcast <16 x i16> %vec to <8 x i32>
193   %strided.vec = trunc <8 x i32> %bc to <8 x i16>
194   store <8 x i16> %strided.vec, <8 x i16>* %S
195   ret void
198 define void @shuffle_v8i32_to_v4i32(<8 x i32>* %L, <4 x i32>* %S) nounwind {
199 ; AVX-LABEL: shuffle_v8i32_to_v4i32:
200 ; AVX:       # %bb.0:
201 ; AVX-NEXT:    vmovaps (%rdi), %xmm0
202 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
203 ; AVX-NEXT:    vmovaps %xmm0, (%rsi)
204 ; AVX-NEXT:    retq
206 ; AVX512-LABEL: shuffle_v8i32_to_v4i32:
207 ; AVX512:       # %bb.0:
208 ; AVX512-NEXT:    vmovaps (%rdi), %xmm0
209 ; AVX512-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
210 ; AVX512-NEXT:    vmovaps %xmm0, (%rsi)
211 ; AVX512-NEXT:    retq
212   %vec = load <8 x i32>, <8 x i32>* %L
213   %strided.vec = shufflevector <8 x i32> %vec, <8 x i32> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
214   store <4 x i32> %strided.vec, <4 x i32>* %S
215   ret void
218 define void @trunc_v4i64_to_v4i32(<8 x i32>* %L, <4 x i32>* %S) nounwind {
219 ; AVX1-LABEL: trunc_v4i64_to_v4i32:
220 ; AVX1:       # %bb.0:
221 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
222 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
223 ; AVX1-NEXT:    vmovaps %xmm0, (%rsi)
224 ; AVX1-NEXT:    retq
226 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i32:
227 ; AVX2-SLOW:       # %bb.0:
228 ; AVX2-SLOW-NEXT:    vpermilps {{.*#+}} ymm0 = mem[0,2,2,3,4,6,6,7]
229 ; AVX2-SLOW-NEXT:    vpermpd {{.*#+}} ymm0 = ymm0[0,2,2,3]
230 ; AVX2-SLOW-NEXT:    vmovaps %xmm0, (%rsi)
231 ; AVX2-SLOW-NEXT:    vzeroupper
232 ; AVX2-SLOW-NEXT:    retq
234 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i32:
235 ; AVX2-FAST:       # %bb.0:
236 ; AVX2-FAST-NEXT:    vmovaps {{.*#+}} ymm0 = [0,2,4,6,4,6,6,7]
237 ; AVX2-FAST-NEXT:    vpermps (%rdi), %ymm0, %ymm0
238 ; AVX2-FAST-NEXT:    vmovaps %xmm0, (%rsi)
239 ; AVX2-FAST-NEXT:    vzeroupper
240 ; AVX2-FAST-NEXT:    retq
242 ; AVX512F-LABEL: trunc_v4i64_to_v4i32:
243 ; AVX512F:       # %bb.0:
244 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
245 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
246 ; AVX512F-NEXT:    vmovdqa %xmm0, (%rsi)
247 ; AVX512F-NEXT:    vzeroupper
248 ; AVX512F-NEXT:    retq
250 ; AVX512VL-LABEL: trunc_v4i64_to_v4i32:
251 ; AVX512VL:       # %bb.0:
252 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
253 ; AVX512VL-NEXT:    vpmovqd %ymm0, (%rsi)
254 ; AVX512VL-NEXT:    vzeroupper
255 ; AVX512VL-NEXT:    retq
257 ; AVX512BW-LABEL: trunc_v4i64_to_v4i32:
258 ; AVX512BW:       # %bb.0:
259 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
260 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
261 ; AVX512BW-NEXT:    vmovdqa %xmm0, (%rsi)
262 ; AVX512BW-NEXT:    vzeroupper
263 ; AVX512BW-NEXT:    retq
265 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i32:
266 ; AVX512BWVL:       # %bb.0:
267 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
268 ; AVX512BWVL-NEXT:    vpmovqd %ymm0, (%rsi)
269 ; AVX512BWVL-NEXT:    vzeroupper
270 ; AVX512BWVL-NEXT:    retq
272 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i32:
273 ; AVX512VBMIVL:       # %bb.0:
274 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
275 ; AVX512VBMIVL-NEXT:    vpmovqd %ymm0, (%rsi)
276 ; AVX512VBMIVL-NEXT:    vzeroupper
277 ; AVX512VBMIVL-NEXT:    retq
278   %vec = load <8 x i32>, <8 x i32>* %L
279   %bc = bitcast <8 x i32> %vec to <4 x i64>
280   %strided.vec = trunc <4 x i64> %bc to <4 x i32>
281   store <4 x i32> %strided.vec, <4 x i32>* %S
282   ret void
285 define void @shuffle_v32i8_to_v8i8(<32 x i8>* %L, <8 x i8>* %S) nounwind {
286 ; AVX-LABEL: shuffle_v32i8_to_v8i8:
287 ; AVX:       # %bb.0:
288 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
289 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
290 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
291 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
292 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
293 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
294 ; AVX-NEXT:    vmovq %xmm0, (%rsi)
295 ; AVX-NEXT:    retq
297 ; AVX512-LABEL: shuffle_v32i8_to_v8i8:
298 ; AVX512:       # %bb.0:
299 ; AVX512-NEXT:    vmovdqa (%rdi), %xmm0
300 ; AVX512-NEXT:    vmovdqa 16(%rdi), %xmm1
301 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
302 ; AVX512-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
303 ; AVX512-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
304 ; AVX512-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
305 ; AVX512-NEXT:    vmovq %xmm0, (%rsi)
306 ; AVX512-NEXT:    retq
307   %vec = load <32 x i8>, <32 x i8>* %L
308   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <8 x i32> <i32 0, i32 4, i32 8, i32 12, i32 16, i32 20, i32 24, i32 28>
309   store <8 x i8> %strided.vec, <8 x i8>* %S
310   ret void
313 define void @trunc_v8i32_to_v8i8(<32 x i8>* %L, <8 x i8>* %S) nounwind {
314 ; AVX-LABEL: trunc_v8i32_to_v8i8:
315 ; AVX:       # %bb.0:
316 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
317 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
318 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
319 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
320 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
321 ; AVX-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
322 ; AVX-NEXT:    vmovq %xmm0, (%rsi)
323 ; AVX-NEXT:    retq
325 ; AVX512F-LABEL: trunc_v8i32_to_v8i8:
326 ; AVX512F:       # %bb.0:
327 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
328 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
329 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
330 ; AVX512F-NEXT:    vzeroupper
331 ; AVX512F-NEXT:    retq
333 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8:
334 ; AVX512VL:       # %bb.0:
335 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
336 ; AVX512VL-NEXT:    vpmovdb %ymm0, (%rsi)
337 ; AVX512VL-NEXT:    vzeroupper
338 ; AVX512VL-NEXT:    retq
340 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8:
341 ; AVX512BW:       # %bb.0:
342 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
343 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
344 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
345 ; AVX512BW-NEXT:    vzeroupper
346 ; AVX512BW-NEXT:    retq
348 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8:
349 ; AVX512BWVL:       # %bb.0:
350 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
351 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, (%rsi)
352 ; AVX512BWVL-NEXT:    vzeroupper
353 ; AVX512BWVL-NEXT:    retq
355 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8:
356 ; AVX512VBMIVL:       # %bb.0:
357 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
358 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, (%rsi)
359 ; AVX512VBMIVL-NEXT:    vzeroupper
360 ; AVX512VBMIVL-NEXT:    retq
361   %vec = load <32 x i8>, <32 x i8>* %L
362   %bc = bitcast <32 x i8> %vec to <8 x i32>
363   %strided.vec = trunc <8 x i32> %bc to <8 x i8>
364   store <8 x i8> %strided.vec, <8 x i8>* %S
365   ret void
368 define <2 x i64> @trunc_v8i32_to_v8i8_return_v2i64(<8 x i32> %vec) nounwind {
369 ; IR generated from:
370 ; return (__m128i) {(long long)__builtin_convertvector((__v8si)__A, __v8qi), 0};
371 ; AVX1-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
372 ; AVX1:       # %bb.0:
373 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
374 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
375 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
376 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
377 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
378 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
379 ; AVX1-NEXT:    vzeroupper
380 ; AVX1-NEXT:    retq
382 ; AVX2-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
383 ; AVX2:       # %bb.0:
384 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
385 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
386 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
387 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
388 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
389 ; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
390 ; AVX2-NEXT:    vzeroupper
391 ; AVX2-NEXT:    retq
393 ; AVX512F-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
394 ; AVX512F:       # %bb.0:
395 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
396 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
397 ; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
398 ; AVX512F-NEXT:    vzeroupper
399 ; AVX512F-NEXT:    retq
401 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
402 ; AVX512VL:       # %bb.0:
403 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
404 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
405 ; AVX512VL-NEXT:    vzeroupper
406 ; AVX512VL-NEXT:    retq
408 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
409 ; AVX512BW:       # %bb.0:
410 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
411 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
412 ; AVX512BW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
413 ; AVX512BW-NEXT:    vzeroupper
414 ; AVX512BW-NEXT:    retq
416 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
417 ; AVX512BWVL:       # %bb.0:
418 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
419 ; AVX512BWVL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
420 ; AVX512BWVL-NEXT:    vzeroupper
421 ; AVX512BWVL-NEXT:    retq
423 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
424 ; AVX512VBMIVL:       # %bb.0:
425 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, %xmm0
426 ; AVX512VBMIVL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
427 ; AVX512VBMIVL-NEXT:    vzeroupper
428 ; AVX512VBMIVL-NEXT:    retq
429   %truncated.vec = trunc <8 x i32> %vec to <8 x i8>
430   %bc = bitcast <8 x i8> %truncated.vec to i64
431   %result = insertelement <2 x i64> zeroinitializer, i64 %bc, i32 0
432   ret <2 x i64> %result
435 define <16 x i8> @trunc_v8i32_to_v8i8_with_zext_return_v16i8(<8 x i32> %vec) nounwind {
436 ; AVX1-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
437 ; AVX1:       # %bb.0:
438 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
439 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
440 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
441 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
442 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
443 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
444 ; AVX1-NEXT:    vzeroupper
445 ; AVX1-NEXT:    retq
447 ; AVX2-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
448 ; AVX2:       # %bb.0:
449 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
450 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
451 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
452 ; AVX2-NEXT:    vzeroupper
453 ; AVX2-NEXT:    retq
455 ; AVX512F-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
456 ; AVX512F:       # %bb.0:
457 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
458 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
459 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
460 ; AVX512F-NEXT:    vzeroupper
461 ; AVX512F-NEXT:    retq
463 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
464 ; AVX512VL:       # %bb.0:
465 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
466 ; AVX512VL-NEXT:    vzeroupper
467 ; AVX512VL-NEXT:    retq
469 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
470 ; AVX512BW:       # %bb.0:
471 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
472 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
473 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
474 ; AVX512BW-NEXT:    vzeroupper
475 ; AVX512BW-NEXT:    retq
477 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
478 ; AVX512BWVL:       # %bb.0:
479 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
480 ; AVX512BWVL-NEXT:    vzeroupper
481 ; AVX512BWVL-NEXT:    retq
483 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
484 ; AVX512VBMIVL:       # %bb.0:
485 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, %xmm0
486 ; AVX512VBMIVL-NEXT:    vzeroupper
487 ; AVX512VBMIVL-NEXT:    retq
488   %truncated = trunc <8 x i32> %vec to <8 x i8>
489   %truncated.ext = zext <8 x i8> %truncated to <8 x i16>
490   %bc = bitcast <8 x i16> %truncated.ext to <16 x i8>
491   %result = shufflevector <16 x i8> %bc, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
492   ret <16 x i8> %result
495 define <16 x i8> @trunc_v8i32_to_v8i8_via_v8i16_return_v16i8(<8 x i32> %vec) nounwind {
496 ; AVX1-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
497 ; AVX1:       # %bb.0:
498 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
499 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
500 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
501 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
502 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
503 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
504 ; AVX1-NEXT:    vzeroupper
505 ; AVX1-NEXT:    retq
507 ; AVX2-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
508 ; AVX2:       # %bb.0:
509 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
510 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
511 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
512 ; AVX2-NEXT:    vzeroupper
513 ; AVX2-NEXT:    retq
515 ; AVX512F-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
516 ; AVX512F:       # %bb.0:
517 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
518 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
519 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
520 ; AVX512F-NEXT:    vzeroupper
521 ; AVX512F-NEXT:    retq
523 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
524 ; AVX512VL:       # %bb.0:
525 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
526 ; AVX512VL-NEXT:    vzeroupper
527 ; AVX512VL-NEXT:    retq
529 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
530 ; AVX512BW:       # %bb.0:
531 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
532 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
533 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
534 ; AVX512BW-NEXT:    vzeroupper
535 ; AVX512BW-NEXT:    retq
537 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
538 ; AVX512BWVL:       # %bb.0:
539 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
540 ; AVX512BWVL-NEXT:    vzeroupper
541 ; AVX512BWVL-NEXT:    retq
543 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
544 ; AVX512VBMIVL:       # %bb.0:
545 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, %xmm0
546 ; AVX512VBMIVL-NEXT:    vzeroupper
547 ; AVX512VBMIVL-NEXT:    retq
548   %truncated = trunc <8 x i32> %vec to <8 x i16>
549   %bc = bitcast <8 x i16> %truncated to <16 x i8>
550   %result = shufflevector <16 x i8> %bc, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 17, i32 20, i32 24, i32 22, i32 31, i32 28, i32 28, i32 29>
551   ret <16 x i8> %result
554 define <16 x i8> @trunc_v8i32_to_v8i8_return_v16i8(<8 x i32> %vec) nounwind {
555 ; AVX1-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
556 ; AVX1:       # %bb.0:
557 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
558 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
559 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
560 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
561 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
562 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
563 ; AVX1-NEXT:    vzeroupper
564 ; AVX1-NEXT:    retq
566 ; AVX2-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
567 ; AVX2:       # %bb.0:
568 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
569 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
570 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
571 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
572 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
573 ; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
574 ; AVX2-NEXT:    vzeroupper
575 ; AVX2-NEXT:    retq
577 ; AVX512F-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
578 ; AVX512F:       # %bb.0:
579 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
580 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
581 ; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
582 ; AVX512F-NEXT:    vzeroupper
583 ; AVX512F-NEXT:    retq
585 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
586 ; AVX512VL:       # %bb.0:
587 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
588 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
589 ; AVX512VL-NEXT:    vzeroupper
590 ; AVX512VL-NEXT:    retq
592 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
593 ; AVX512BW:       # %bb.0:
594 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
595 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
596 ; AVX512BW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
597 ; AVX512BW-NEXT:    vzeroupper
598 ; AVX512BW-NEXT:    retq
600 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
601 ; AVX512BWVL:       # %bb.0:
602 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
603 ; AVX512BWVL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
604 ; AVX512BWVL-NEXT:    vzeroupper
605 ; AVX512BWVL-NEXT:    retq
607 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
608 ; AVX512VBMIVL:       # %bb.0:
609 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, %xmm0
610 ; AVX512VBMIVL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
611 ; AVX512VBMIVL-NEXT:    vzeroupper
612 ; AVX512VBMIVL-NEXT:    retq
613   %truncated = trunc <8 x i32> %vec to <8 x i8>
614   %result = shufflevector <8 x i8> %truncated, <8 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
615   ret <16 x i8> %result
618 define <2 x i64> @trunc_v4i64_to_v4i16_return_v2i64(<4 x i64> %vec) nounwind {
619 ; IR generated from:
620 ; return (__m128i) {(long long)__builtin_convertvector((__v4di)x, __v4hi), 0};
621 ; AVX1-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
622 ; AVX1:       # %bb.0:
623 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
624 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
625 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
626 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
627 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
628 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
629 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
630 ; AVX1-NEXT:    vzeroupper
631 ; AVX1-NEXT:    retq
633 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
634 ; AVX2-SLOW:       # %bb.0:
635 ; AVX2-SLOW-NEXT:    vextracti128 $1, %ymm0, %xmm1
636 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
637 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
638 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
639 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
640 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
641 ; AVX2-SLOW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
642 ; AVX2-SLOW-NEXT:    vzeroupper
643 ; AVX2-SLOW-NEXT:    retq
645 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
646 ; AVX2-FAST:       # %bb.0:
647 ; AVX2-FAST-NEXT:    vextracti128 $1, %ymm0, %xmm1
648 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
649 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
650 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
651 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
652 ; AVX2-FAST-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
653 ; AVX2-FAST-NEXT:    vzeroupper
654 ; AVX2-FAST-NEXT:    retq
656 ; AVX512F-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
657 ; AVX512F:       # %bb.0:
658 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
659 ; AVX512F-NEXT:    vpmovqw %zmm0, %xmm0
660 ; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
661 ; AVX512F-NEXT:    vzeroupper
662 ; AVX512F-NEXT:    retq
664 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
665 ; AVX512VL:       # %bb.0:
666 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
667 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
668 ; AVX512VL-NEXT:    vzeroupper
669 ; AVX512VL-NEXT:    retq
671 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
672 ; AVX512BW:       # %bb.0:
673 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
674 ; AVX512BW-NEXT:    vpmovqw %zmm0, %xmm0
675 ; AVX512BW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
676 ; AVX512BW-NEXT:    vzeroupper
677 ; AVX512BW-NEXT:    retq
679 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
680 ; AVX512BWVL:       # %bb.0:
681 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
682 ; AVX512BWVL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
683 ; AVX512BWVL-NEXT:    vzeroupper
684 ; AVX512BWVL-NEXT:    retq
686 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
687 ; AVX512VBMIVL:       # %bb.0:
688 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, %xmm0
689 ; AVX512VBMIVL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
690 ; AVX512VBMIVL-NEXT:    vzeroupper
691 ; AVX512VBMIVL-NEXT:    retq
692   %truncated = trunc <4 x i64> %vec to <4 x i16>
693   %bc = bitcast <4 x i16> %truncated to i64
694   %result = insertelement <2 x i64> zeroinitializer, i64 %bc, i32 0
695   ret <2 x i64> %result
698 define <8 x i16> @trunc_v4i64_to_v4i16_with_zext_return_v8i16(<4 x i64> %vec) nounwind {
699 ; AVX1-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
700 ; AVX1:       # %bb.0:
701 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
702 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
703 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
704 ; AVX1-NEXT:    vzeroupper
705 ; AVX1-NEXT:    retq
707 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
708 ; AVX2-SLOW:       # %bb.0:
709 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
710 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
711 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
712 ; AVX2-SLOW-NEXT:    vzeroupper
713 ; AVX2-SLOW-NEXT:    retq
715 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
716 ; AVX2-FAST:       # %bb.0:
717 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
718 ; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
719 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
720 ; AVX2-FAST-NEXT:    vzeroupper
721 ; AVX2-FAST-NEXT:    retq
723 ; AVX512F-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
724 ; AVX512F:       # %bb.0:
725 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
726 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
727 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
728 ; AVX512F-NEXT:    vzeroupper
729 ; AVX512F-NEXT:    retq
731 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
732 ; AVX512VL:       # %bb.0:
733 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
734 ; AVX512VL-NEXT:    vzeroupper
735 ; AVX512VL-NEXT:    retq
737 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
738 ; AVX512BW:       # %bb.0:
739 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
740 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
741 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
742 ; AVX512BW-NEXT:    vzeroupper
743 ; AVX512BW-NEXT:    retq
745 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
746 ; AVX512BWVL:       # %bb.0:
747 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
748 ; AVX512BWVL-NEXT:    vzeroupper
749 ; AVX512BWVL-NEXT:    retq
751 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
752 ; AVX512VBMIVL:       # %bb.0:
753 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, %xmm0
754 ; AVX512VBMIVL-NEXT:    vzeroupper
755 ; AVX512VBMIVL-NEXT:    retq
756   %truncated = trunc <4 x i64> %vec to <4 x i16>
757   %truncated.ext = zext <4 x i16> %truncated to <4 x i32>
758   %bc = bitcast <4 x i32> %truncated.ext to <8 x i16>
759   %result = shufflevector <8 x i16> %bc, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 1, i32 3, i32 5, i32 7>
760   ret <8 x i16> %result
763 define <8 x i16> @trunc_v4i64_to_v4i16_via_v4i32_return_v8i16(<4 x i64> %vec) nounwind {
764 ; AVX1-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
765 ; AVX1:       # %bb.0:
766 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
767 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
768 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
769 ; AVX1-NEXT:    vzeroupper
770 ; AVX1-NEXT:    retq
772 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
773 ; AVX2-SLOW:       # %bb.0:
774 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
775 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
776 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
777 ; AVX2-SLOW-NEXT:    vzeroupper
778 ; AVX2-SLOW-NEXT:    retq
780 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
781 ; AVX2-FAST:       # %bb.0:
782 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
783 ; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
784 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
785 ; AVX2-FAST-NEXT:    vzeroupper
786 ; AVX2-FAST-NEXT:    retq
788 ; AVX512F-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
789 ; AVX512F:       # %bb.0:
790 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
791 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
792 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
793 ; AVX512F-NEXT:    vzeroupper
794 ; AVX512F-NEXT:    retq
796 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
797 ; AVX512VL:       # %bb.0:
798 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
799 ; AVX512VL-NEXT:    vzeroupper
800 ; AVX512VL-NEXT:    retq
802 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
803 ; AVX512BW:       # %bb.0:
804 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
805 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
806 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
807 ; AVX512BW-NEXT:    vzeroupper
808 ; AVX512BW-NEXT:    retq
810 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
811 ; AVX512BWVL:       # %bb.0:
812 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
813 ; AVX512BWVL-NEXT:    vzeroupper
814 ; AVX512BWVL-NEXT:    retq
816 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
817 ; AVX512VBMIVL:       # %bb.0:
818 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, %xmm0
819 ; AVX512VBMIVL-NEXT:    vzeroupper
820 ; AVX512VBMIVL-NEXT:    retq
821   %truncated = trunc <4 x i64> %vec to <4 x i32>
822   %bc = bitcast <4 x i32> %truncated to <8 x i16>
823   %result = shufflevector <8 x i16> %bc, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 8, i32 undef, i32 13>
824   ret <8 x i16> %result
827 define <8 x i16> @trunc_v4i64_to_v4i16_return_v8i16(<4 x i64> %vec) nounwind {
828 ; AVX1-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
829 ; AVX1:       # %bb.0:
830 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
831 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
832 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
833 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
834 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
835 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
836 ; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
837 ; AVX1-NEXT:    vzeroupper
838 ; AVX1-NEXT:    retq
840 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
841 ; AVX2-SLOW:       # %bb.0:
842 ; AVX2-SLOW-NEXT:    vextracti128 $1, %ymm0, %xmm1
843 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
844 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
845 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
846 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
847 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
848 ; AVX2-SLOW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
849 ; AVX2-SLOW-NEXT:    vzeroupper
850 ; AVX2-SLOW-NEXT:    retq
852 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
853 ; AVX2-FAST:       # %bb.0:
854 ; AVX2-FAST-NEXT:    vextracti128 $1, %ymm0, %xmm1
855 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
856 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
857 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
858 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
859 ; AVX2-FAST-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
860 ; AVX2-FAST-NEXT:    vzeroupper
861 ; AVX2-FAST-NEXT:    retq
863 ; AVX512F-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
864 ; AVX512F:       # %bb.0:
865 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
866 ; AVX512F-NEXT:    vpmovqw %zmm0, %xmm0
867 ; AVX512F-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
868 ; AVX512F-NEXT:    vzeroupper
869 ; AVX512F-NEXT:    retq
871 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
872 ; AVX512VL:       # %bb.0:
873 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
874 ; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
875 ; AVX512VL-NEXT:    vzeroupper
876 ; AVX512VL-NEXT:    retq
878 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
879 ; AVX512BW:       # %bb.0:
880 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
881 ; AVX512BW-NEXT:    vpmovqw %zmm0, %xmm0
882 ; AVX512BW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
883 ; AVX512BW-NEXT:    vzeroupper
884 ; AVX512BW-NEXT:    retq
886 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
887 ; AVX512BWVL:       # %bb.0:
888 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
889 ; AVX512BWVL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
890 ; AVX512BWVL-NEXT:    vzeroupper
891 ; AVX512BWVL-NEXT:    retq
893 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
894 ; AVX512VBMIVL:       # %bb.0:
895 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, %xmm0
896 ; AVX512VBMIVL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
897 ; AVX512VBMIVL-NEXT:    vzeroupper
898 ; AVX512VBMIVL-NEXT:    retq
899   %truncated = trunc <4 x i64> %vec to <4 x i16>
900   %result = shufflevector <4 x i16> %truncated, <4 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
901   ret <8 x i16> %result
904 define <16 x i8> @trunc_v4i64_to_v4i8_return_v16i8(<4 x i64> %vec) nounwind {
905 ; AVX1-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
906 ; AVX1:       # %bb.0:
907 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
908 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
909 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
910 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
911 ; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
912 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
913 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
914 ; AVX1-NEXT:    vzeroupper
915 ; AVX1-NEXT:    retq
917 ; AVX2-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
918 ; AVX2:       # %bb.0:
919 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
920 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
921 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
922 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
923 ; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
924 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
925 ; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
926 ; AVX2-NEXT:    vzeroupper
927 ; AVX2-NEXT:    retq
929 ; AVX512F-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
930 ; AVX512F:       # %bb.0:
931 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
932 ; AVX512F-NEXT:    vpmovqb %zmm0, %xmm0
933 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
934 ; AVX512F-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
935 ; AVX512F-NEXT:    vzeroupper
936 ; AVX512F-NEXT:    retq
938 ; AVX512VL-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
939 ; AVX512VL:       # %bb.0:
940 ; AVX512VL-NEXT:    vpmovqb %ymm0, %xmm0
941 ; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
942 ; AVX512VL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
943 ; AVX512VL-NEXT:    vzeroupper
944 ; AVX512VL-NEXT:    retq
946 ; AVX512BW-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
947 ; AVX512BW:       # %bb.0:
948 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
949 ; AVX512BW-NEXT:    vpmovqb %zmm0, %xmm0
950 ; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
951 ; AVX512BW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
952 ; AVX512BW-NEXT:    vzeroupper
953 ; AVX512BW-NEXT:    retq
955 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
956 ; AVX512BWVL:       # %bb.0:
957 ; AVX512BWVL-NEXT:    vpmovqb %ymm0, %xmm0
958 ; AVX512BWVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
959 ; AVX512BWVL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
960 ; AVX512BWVL-NEXT:    vzeroupper
961 ; AVX512BWVL-NEXT:    retq
963 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
964 ; AVX512VBMIVL:       # %bb.0:
965 ; AVX512VBMIVL-NEXT:    vpmovqb %ymm0, %xmm0
966 ; AVX512VBMIVL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
967 ; AVX512VBMIVL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
968 ; AVX512VBMIVL-NEXT:    vzeroupper
969 ; AVX512VBMIVL-NEXT:    retq
970   %truncated = trunc <4 x i64> %vec to <4 x i8>
971   %result = shufflevector <4 x i8> %truncated, <4 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 4, i32 5, i32 6, i32 7, i32 5, i32 5, i32 undef, i32 7>
972   ret <16 x i8> %result
975 define void @shuffle_v16i16_to_v4i16(<16 x i16>* %L, <4 x i16>* %S) nounwind {
976 ; AVX1-LABEL: shuffle_v16i16_to_v4i16:
977 ; AVX1:       # %bb.0:
978 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
979 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
980 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
981 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
982 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
983 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
984 ; AVX1-NEXT:    retq
986 ; AVX2-SLOW-LABEL: shuffle_v16i16_to_v4i16:
987 ; AVX2-SLOW:       # %bb.0:
988 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
989 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
990 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
991 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
992 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
993 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rsi)
994 ; AVX2-SLOW-NEXT:    retq
996 ; AVX2-FAST-LABEL: shuffle_v16i16_to_v4i16:
997 ; AVX2-FAST:       # %bb.0:
998 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %xmm0
999 ; AVX2-FAST-NEXT:    vmovdqa 16(%rdi), %xmm1
1000 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1001 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1002 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1003 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1004 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rsi)
1005 ; AVX2-FAST-NEXT:    retq
1007 ; AVX512F-LABEL: shuffle_v16i16_to_v4i16:
1008 ; AVX512F:       # %bb.0:
1009 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
1010 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1011 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
1012 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1013 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1014 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
1015 ; AVX512F-NEXT:    retq
1017 ; AVX512VL-LABEL: shuffle_v16i16_to_v4i16:
1018 ; AVX512VL:       # %bb.0:
1019 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
1020 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
1021 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1022 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1023 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1024 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1025 ; AVX512VL-NEXT:    vmovq %xmm0, (%rsi)
1026 ; AVX512VL-NEXT:    retq
1028 ; AVX512BW-LABEL: shuffle_v16i16_to_v4i16:
1029 ; AVX512BW:       # %bb.0:
1030 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
1031 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
1032 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1033 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1034 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1035 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1036 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
1037 ; AVX512BW-NEXT:    retq
1039 ; AVX512BWVL-LABEL: shuffle_v16i16_to_v4i16:
1040 ; AVX512BWVL:       # %bb.0:
1041 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
1042 ; AVX512BWVL-NEXT:    vmovdqa 16(%rdi), %xmm1
1043 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1044 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1045 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1046 ; AVX512BWVL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1047 ; AVX512BWVL-NEXT:    vmovq %xmm0, (%rsi)
1048 ; AVX512BWVL-NEXT:    retq
1050 ; AVX512VBMIVL-LABEL: shuffle_v16i16_to_v4i16:
1051 ; AVX512VBMIVL:       # %bb.0:
1052 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %xmm0
1053 ; AVX512VBMIVL-NEXT:    vmovdqa 16(%rdi), %xmm1
1054 ; AVX512VBMIVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1055 ; AVX512VBMIVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1056 ; AVX512VBMIVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1057 ; AVX512VBMIVL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1058 ; AVX512VBMIVL-NEXT:    vmovq %xmm0, (%rsi)
1059 ; AVX512VBMIVL-NEXT:    retq
1060   %vec = load <16 x i16>, <16 x i16>* %L
1061   %strided.vec = shufflevector <16 x i16> %vec, <16 x i16> undef, <4 x i32> <i32 0, i32 4, i32 8, i32 12>
1062   store <4 x i16> %strided.vec, <4 x i16>* %S
1063   ret void
1066 define void @trunc_v4i64_to_v4i16(<16 x i16>* %L, <4 x i16>* %S) nounwind {
1067 ; AVX1-LABEL: trunc_v4i64_to_v4i16:
1068 ; AVX1:       # %bb.0:
1069 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
1070 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1071 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
1072 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1073 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1074 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
1075 ; AVX1-NEXT:    retq
1077 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16:
1078 ; AVX2-SLOW:       # %bb.0:
1079 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
1080 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1081 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
1082 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1083 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1084 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rsi)
1085 ; AVX2-SLOW-NEXT:    retq
1087 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16:
1088 ; AVX2-FAST:       # %bb.0:
1089 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %xmm0
1090 ; AVX2-FAST-NEXT:    vmovdqa 16(%rdi), %xmm1
1091 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1092 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1093 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1094 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1095 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rsi)
1096 ; AVX2-FAST-NEXT:    retq
1098 ; AVX512F-LABEL: trunc_v4i64_to_v4i16:
1099 ; AVX512F:       # %bb.0:
1100 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1101 ; AVX512F-NEXT:    vpmovqw %zmm0, %xmm0
1102 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
1103 ; AVX512F-NEXT:    vzeroupper
1104 ; AVX512F-NEXT:    retq
1106 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16:
1107 ; AVX512VL:       # %bb.0:
1108 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
1109 ; AVX512VL-NEXT:    vpmovqw %ymm0, (%rsi)
1110 ; AVX512VL-NEXT:    vzeroupper
1111 ; AVX512VL-NEXT:    retq
1113 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16:
1114 ; AVX512BW:       # %bb.0:
1115 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
1116 ; AVX512BW-NEXT:    vpmovqw %zmm0, %xmm0
1117 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
1118 ; AVX512BW-NEXT:    vzeroupper
1119 ; AVX512BW-NEXT:    retq
1121 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16:
1122 ; AVX512BWVL:       # %bb.0:
1123 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
1124 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, (%rsi)
1125 ; AVX512BWVL-NEXT:    vzeroupper
1126 ; AVX512BWVL-NEXT:    retq
1128 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16:
1129 ; AVX512VBMIVL:       # %bb.0:
1130 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
1131 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, (%rsi)
1132 ; AVX512VBMIVL-NEXT:    vzeroupper
1133 ; AVX512VBMIVL-NEXT:    retq
1134   %vec = load <16 x i16>, <16 x i16>* %L
1135   %bc = bitcast <16 x i16> %vec to <4 x i64>
1136   %strided.vec = trunc <4 x i64> %bc to <4 x i16>
1137   store <4 x i16> %strided.vec, <4 x i16>* %S
1138   ret void
1141 define void @shuffle_v32i8_to_v4i8(<32 x i8>* %L, <4 x i8>* %S) nounwind {
1142 ; AVX-LABEL: shuffle_v32i8_to_v4i8:
1143 ; AVX:       # %bb.0:
1144 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1145 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
1146 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1147 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1148 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1149 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1150 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
1151 ; AVX-NEXT:    retq
1153 ; AVX512-LABEL: shuffle_v32i8_to_v4i8:
1154 ; AVX512:       # %bb.0:
1155 ; AVX512-NEXT:    vmovdqa (%rdi), %xmm0
1156 ; AVX512-NEXT:    vmovdqa 16(%rdi), %xmm1
1157 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1158 ; AVX512-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1159 ; AVX512-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1160 ; AVX512-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1161 ; AVX512-NEXT:    vmovd %xmm0, (%rsi)
1162 ; AVX512-NEXT:    retq
1163   %vec = load <32 x i8>, <32 x i8>* %L
1164   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 0, i32 8, i32 16, i32 24>
1165   store <4 x i8> %strided.vec, <4 x i8>* %S
1166   ret void
1169 define void @trunc_v4i64_to_v4i8(<32 x i8>* %L, <4 x i8>* %S) nounwind {
1170 ; AVX-LABEL: trunc_v4i64_to_v4i8:
1171 ; AVX:       # %bb.0:
1172 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1173 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
1174 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1175 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1176 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1177 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1178 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
1179 ; AVX-NEXT:    retq
1181 ; AVX512F-LABEL: trunc_v4i64_to_v4i8:
1182 ; AVX512F:       # %bb.0:
1183 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1184 ; AVX512F-NEXT:    vpmovqb %zmm0, %xmm0
1185 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
1186 ; AVX512F-NEXT:    vzeroupper
1187 ; AVX512F-NEXT:    retq
1189 ; AVX512VL-LABEL: trunc_v4i64_to_v4i8:
1190 ; AVX512VL:       # %bb.0:
1191 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
1192 ; AVX512VL-NEXT:    vpmovqb %ymm0, (%rsi)
1193 ; AVX512VL-NEXT:    vzeroupper
1194 ; AVX512VL-NEXT:    retq
1196 ; AVX512BW-LABEL: trunc_v4i64_to_v4i8:
1197 ; AVX512BW:       # %bb.0:
1198 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
1199 ; AVX512BW-NEXT:    vpmovqb %zmm0, %xmm0
1200 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
1201 ; AVX512BW-NEXT:    vzeroupper
1202 ; AVX512BW-NEXT:    retq
1204 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i8:
1205 ; AVX512BWVL:       # %bb.0:
1206 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
1207 ; AVX512BWVL-NEXT:    vpmovqb %ymm0, (%rsi)
1208 ; AVX512BWVL-NEXT:    vzeroupper
1209 ; AVX512BWVL-NEXT:    retq
1211 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i8:
1212 ; AVX512VBMIVL:       # %bb.0:
1213 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
1214 ; AVX512VBMIVL-NEXT:    vpmovqb %ymm0, (%rsi)
1215 ; AVX512VBMIVL-NEXT:    vzeroupper
1216 ; AVX512VBMIVL-NEXT:    retq
1217   %vec = load <32 x i8>, <32 x i8>* %L
1218   %bc = bitcast <32 x i8> %vec to <4 x i64>
1219   %strided.vec = trunc <4 x i64> %bc to <4 x i8>
1220   store <4 x i8> %strided.vec, <4 x i8>* %S
1221   ret void
1224 ; In this case not all elements are collected from the same source vector, so
1225 ; the resulting BUILD_VECTOR should not be combined to a truncate.
1226 define <16 x i8> @negative(<32 x i8> %v, <32 x i8> %w) nounwind {
1227 ; AVX1-LABEL: negative:
1228 ; AVX1:       # %bb.0:
1229 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = xmm0[u,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
1230 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1231 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u],zero,zero,zero,zero,zero,zero,zero,xmm0[0,2,4,6,8,10,12,14]
1232 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1233 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1234 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
1235 ; AVX1-NEXT:    vzeroupper
1236 ; AVX1-NEXT:    retq
1238 ; AVX2-LABEL: negative:
1239 ; AVX2:       # %bb.0:
1240 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[u,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14,u,18,20,22,24,26,28,30,16,18,20,22,24,26,28,30]
1241 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1242 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1243 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1244 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1245 ; AVX2-NEXT:    vzeroupper
1246 ; AVX2-NEXT:    retq
1248 ; AVX512F-LABEL: negative:
1249 ; AVX512F:       # %bb.0:
1250 ; AVX512F-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[u,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14,u,18,20,22,24,26,28,30,16,18,20,22,24,26,28,30]
1251 ; AVX512F-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1252 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1253 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1254 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1255 ; AVX512F-NEXT:    vzeroupper
1256 ; AVX512F-NEXT:    retq
1258 ; AVX512VL-LABEL: negative:
1259 ; AVX512VL:       # %bb.0:
1260 ; AVX512VL-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[u,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14,u,18,20,22,24,26,28,30,16,18,20,22,24,26,28,30]
1261 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1262 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1263 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1264 ; AVX512VL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1265 ; AVX512VL-NEXT:    vzeroupper
1266 ; AVX512VL-NEXT:    retq
1268 ; AVX512BW-LABEL: negative:
1269 ; AVX512BW:       # %bb.0:
1270 ; AVX512BW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[u,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14,u,18,20,22,24,26,28,30,16,18,20,22,24,26,28,30]
1271 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1272 ; AVX512BW-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1273 ; AVX512BW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1274 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1275 ; AVX512BW-NEXT:    vzeroupper
1276 ; AVX512BW-NEXT:    retq
1278 ; AVX512BWVL-LABEL: negative:
1279 ; AVX512BWVL:       # %bb.0:
1280 ; AVX512BWVL-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[u,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14,u,18,20,22,24,26,28,30,16,18,20,22,24,26,28,30]
1281 ; AVX512BWVL-NEXT:    movl $65537, %eax # imm = 0x10001
1282 ; AVX512BWVL-NEXT:    kmovd %eax, %k1
1283 ; AVX512BWVL-NEXT:    vmovdqu8 %ymm1, %ymm0 {%k1}
1284 ; AVX512BWVL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1285 ; AVX512BWVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1286 ; AVX512BWVL-NEXT:    vzeroupper
1287 ; AVX512BWVL-NEXT:    retq
1289 ; AVX512VBMIVL-LABEL: negative:
1290 ; AVX512VBMIVL:       # %bb.0:
1291 ; AVX512VBMIVL-NEXT:    vmovdqa {{.*#+}} ymm2 = [32,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,48,18,20,22,24,26,28,30,16,18,20,22,24,26,28,30]
1292 ; AVX512VBMIVL-NEXT:    vpermt2b %ymm1, %ymm2, %ymm0
1293 ; AVX512VBMIVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1294 ; AVX512VBMIVL-NEXT:    vzeroupper
1295 ; AVX512VBMIVL-NEXT:    retq
1296   %strided.vec = shufflevector <32 x i8> %v, <32 x i8> undef, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26, i32 28, i32 30>
1297   %w0 = extractelement <32 x i8> %w, i32 0
1298   %merged = insertelement <16 x i8> %strided.vec, i8 %w0, i32 0
1299   ret <16 x i8> %merged