Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / shuffle-vs-trunc-256.ll
blobfc6a2cd6441ba38115510a7abab809ba4a3aed56
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
9 ; RUN: llc < %s -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 ; AVX512F-LABEL: shuffle_v32i8_to_v8i8:
298 ; AVX512F:       # %bb.0:
299 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
300 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
301 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
302 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
303 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
304 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
305 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
306 ; AVX512F-NEXT:    retq
308 ; AVX512VL-LABEL: shuffle_v32i8_to_v8i8:
309 ; AVX512VL:       # %bb.0:
310 ; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
311 ; AVX512VL-NEXT:    vmovdqa 16(%rdi), %xmm1
312 ; AVX512VL-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
313 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
314 ; AVX512VL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
315 ; AVX512VL-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
316 ; AVX512VL-NEXT:    vmovq %xmm0, (%rsi)
317 ; AVX512VL-NEXT:    retq
319 ; AVX512BW-LABEL: shuffle_v32i8_to_v8i8:
320 ; AVX512BW:       # %bb.0:
321 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
322 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
323 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
324 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
325 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
326 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
327 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
328 ; AVX512BW-NEXT:    retq
330 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v8i8:
331 ; AVX512BWVL:       # %bb.0:
332 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %xmm0
333 ; AVX512BWVL-NEXT:    vmovdqa 16(%rdi), %xmm1
334 ; AVX512BWVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
335 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
336 ; AVX512BWVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
337 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
338 ; AVX512BWVL-NEXT:    vpmovwb %xmm0, (%rsi)
339 ; AVX512BWVL-NEXT:    retq
341 ; AVX512VBMIVL-LABEL: shuffle_v32i8_to_v8i8:
342 ; AVX512VBMIVL:       # %bb.0:
343 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %xmm0
344 ; AVX512VBMIVL-NEXT:    vmovdqa 16(%rdi), %xmm1
345 ; AVX512VBMIVL-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
346 ; AVX512VBMIVL-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
347 ; AVX512VBMIVL-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
348 ; AVX512VBMIVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
349 ; AVX512VBMIVL-NEXT:    vpmovwb %xmm0, (%rsi)
350 ; AVX512VBMIVL-NEXT:    retq
351   %vec = load <32 x i8>, <32 x i8>* %L
352   %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>
353   store <8 x i8> %strided.vec, <8 x i8>* %S
354   ret void
357 define void @trunc_v8i32_to_v8i8(<32 x i8>* %L, <8 x i8>* %S) nounwind {
358 ; AVX1-LABEL: trunc_v8i32_to_v8i8:
359 ; AVX1:       # %bb.0:
360 ; AVX1-NEXT:    vmovdqa (%rdi), %xmm0
361 ; AVX1-NEXT:    vmovdqa 16(%rdi), %xmm1
362 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u>
363 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
364 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
365 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
366 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
367 ; AVX1-NEXT:    retq
369 ; AVX2-LABEL: trunc_v8i32_to_v8i8:
370 ; AVX2:       # %bb.0:
371 ; AVX2-NEXT:    vmovdqa (%rdi), %ymm0
372 ; 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]
373 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
374 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
375 ; AVX2-NEXT:    vmovq %xmm0, (%rsi)
376 ; AVX2-NEXT:    vzeroupper
377 ; AVX2-NEXT:    retq
379 ; AVX512F-LABEL: trunc_v8i32_to_v8i8:
380 ; AVX512F:       # %bb.0:
381 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
382 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
383 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
384 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
385 ; AVX512F-NEXT:    vzeroupper
386 ; AVX512F-NEXT:    retq
388 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8:
389 ; AVX512VL:       # %bb.0:
390 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
391 ; AVX512VL-NEXT:    vpmovdb %ymm0, (%rsi)
392 ; AVX512VL-NEXT:    vzeroupper
393 ; AVX512VL-NEXT:    retq
395 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8:
396 ; AVX512BW:       # %bb.0:
397 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
398 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
399 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
400 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
401 ; AVX512BW-NEXT:    vzeroupper
402 ; AVX512BW-NEXT:    retq
404 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8:
405 ; AVX512BWVL:       # %bb.0:
406 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
407 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, (%rsi)
408 ; AVX512BWVL-NEXT:    vzeroupper
409 ; AVX512BWVL-NEXT:    retq
411 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8:
412 ; AVX512VBMIVL:       # %bb.0:
413 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
414 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, (%rsi)
415 ; AVX512VBMIVL-NEXT:    vzeroupper
416 ; AVX512VBMIVL-NEXT:    retq
417   %vec = load <32 x i8>, <32 x i8>* %L
418   %bc = bitcast <32 x i8> %vec to <8 x i32>
419   %strided.vec = trunc <8 x i32> %bc to <8 x i8>
420   store <8 x i8> %strided.vec, <8 x i8>* %S
421   ret void
424 define <2 x i64> @trunc_v8i32_to_v8i8_return_v2i64(<8 x i32> %vec) nounwind {
425 ; IR generated from:
426 ; return (__m128i) {(long long)__builtin_convertvector((__v8si)__A, __v8qi), 0};
427 ; AVX1-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
428 ; AVX1:       # %bb.0:
429 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
430 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
431 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
432 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
433 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
434 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
435 ; AVX1-NEXT:    vzeroupper
436 ; AVX1-NEXT:    retq
438 ; AVX2-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
439 ; AVX2:       # %bb.0:
440 ; 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]
441 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
442 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
443 ; AVX2-NEXT:    vzeroupper
444 ; AVX2-NEXT:    retq
446 ; AVX512F-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
447 ; AVX512F:       # %bb.0:
448 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
449 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
450 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
451 ; AVX512F-NEXT:    vzeroupper
452 ; AVX512F-NEXT:    retq
454 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
455 ; AVX512VL:       # %bb.0:
456 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
457 ; AVX512VL-NEXT:    vzeroupper
458 ; AVX512VL-NEXT:    retq
460 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
461 ; AVX512BW:       # %bb.0:
462 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
463 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
464 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
465 ; AVX512BW-NEXT:    vzeroupper
466 ; AVX512BW-NEXT:    retq
468 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
469 ; AVX512BWVL:       # %bb.0:
470 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
471 ; AVX512BWVL-NEXT:    vzeroupper
472 ; AVX512BWVL-NEXT:    retq
474 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8_return_v2i64:
475 ; AVX512VBMIVL:       # %bb.0:
476 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, %xmm0
477 ; AVX512VBMIVL-NEXT:    vzeroupper
478 ; AVX512VBMIVL-NEXT:    retq
479   %truncated.vec = trunc <8 x i32> %vec to <8 x i8>
480   %bc = bitcast <8 x i8> %truncated.vec to i64
481   %result = insertelement <2 x i64> zeroinitializer, i64 %bc, i32 0
482   ret <2 x i64> %result
485 define <16 x i8> @trunc_v8i32_to_v8i8_with_zext_return_v16i8(<8 x i32> %vec) nounwind {
486 ; AVX1-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
487 ; AVX1:       # %bb.0:
488 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
489 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
490 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
491 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
492 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
493 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
494 ; AVX1-NEXT:    vzeroupper
495 ; AVX1-NEXT:    retq
497 ; AVX2-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
498 ; AVX2:       # %bb.0:
499 ; 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]
500 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
501 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
502 ; AVX2-NEXT:    vzeroupper
503 ; AVX2-NEXT:    retq
505 ; AVX512F-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
506 ; AVX512F:       # %bb.0:
507 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
508 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
509 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
510 ; AVX512F-NEXT:    vzeroupper
511 ; AVX512F-NEXT:    retq
513 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
514 ; AVX512VL:       # %bb.0:
515 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
516 ; AVX512VL-NEXT:    vzeroupper
517 ; AVX512VL-NEXT:    retq
519 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
520 ; AVX512BW:       # %bb.0:
521 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
522 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
523 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
524 ; AVX512BW-NEXT:    vzeroupper
525 ; AVX512BW-NEXT:    retq
527 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
528 ; AVX512BWVL:       # %bb.0:
529 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
530 ; AVX512BWVL-NEXT:    vzeroupper
531 ; AVX512BWVL-NEXT:    retq
533 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8_with_zext_return_v16i8:
534 ; AVX512VBMIVL:       # %bb.0:
535 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, %xmm0
536 ; AVX512VBMIVL-NEXT:    vzeroupper
537 ; AVX512VBMIVL-NEXT:    retq
538   %truncated = trunc <8 x i32> %vec to <8 x i8>
539   %truncated.ext = zext <8 x i8> %truncated to <8 x i16>
540   %bc = bitcast <8 x i16> %truncated.ext to <16 x i8>
541   %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>
542   ret <16 x i8> %result
545 define <16 x i8> @trunc_v8i32_to_v8i8_via_v8i16_return_v16i8(<8 x i32> %vec) nounwind {
546 ; AVX1-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
547 ; AVX1:       # %bb.0:
548 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
549 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
550 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
551 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
552 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
553 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
554 ; AVX1-NEXT:    vzeroupper
555 ; AVX1-NEXT:    retq
557 ; AVX2-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
558 ; AVX2:       # %bb.0:
559 ; 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]
560 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
561 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
562 ; AVX2-NEXT:    vzeroupper
563 ; AVX2-NEXT:    retq
565 ; AVX512F-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
566 ; AVX512F:       # %bb.0:
567 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
568 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
569 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
570 ; AVX512F-NEXT:    vzeroupper
571 ; AVX512F-NEXT:    retq
573 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
574 ; AVX512VL:       # %bb.0:
575 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
576 ; AVX512VL-NEXT:    vzeroupper
577 ; AVX512VL-NEXT:    retq
579 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
580 ; AVX512BW:       # %bb.0:
581 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
582 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
583 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
584 ; AVX512BW-NEXT:    vzeroupper
585 ; AVX512BW-NEXT:    retq
587 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
588 ; AVX512BWVL:       # %bb.0:
589 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
590 ; AVX512BWVL-NEXT:    vzeroupper
591 ; AVX512BWVL-NEXT:    retq
593 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8_via_v8i16_return_v16i8:
594 ; AVX512VBMIVL:       # %bb.0:
595 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, %xmm0
596 ; AVX512VBMIVL-NEXT:    vzeroupper
597 ; AVX512VBMIVL-NEXT:    retq
598   %truncated = trunc <8 x i32> %vec to <8 x i16>
599   %bc = bitcast <8 x i16> %truncated to <16 x i8>
600   %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>
601   ret <16 x i8> %result
604 define <16 x i8> @trunc_v8i32_to_v8i8_return_v16i8(<8 x i32> %vec) nounwind {
605 ; AVX1-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
606 ; AVX1:       # %bb.0:
607 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
608 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
609 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
610 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
611 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
612 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
613 ; AVX1-NEXT:    vzeroupper
614 ; AVX1-NEXT:    retq
616 ; AVX2-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
617 ; AVX2:       # %bb.0:
618 ; 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]
619 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
620 ; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
621 ; AVX2-NEXT:    vzeroupper
622 ; AVX2-NEXT:    retq
624 ; AVX512F-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
625 ; AVX512F:       # %bb.0:
626 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
627 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
628 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
629 ; AVX512F-NEXT:    vzeroupper
630 ; AVX512F-NEXT:    retq
632 ; AVX512VL-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
633 ; AVX512VL:       # %bb.0:
634 ; AVX512VL-NEXT:    vpmovdb %ymm0, %xmm0
635 ; AVX512VL-NEXT:    vzeroupper
636 ; AVX512VL-NEXT:    retq
638 ; AVX512BW-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
639 ; AVX512BW:       # %bb.0:
640 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
641 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
642 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
643 ; AVX512BW-NEXT:    vzeroupper
644 ; AVX512BW-NEXT:    retq
646 ; AVX512BWVL-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
647 ; AVX512BWVL:       # %bb.0:
648 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, %xmm0
649 ; AVX512BWVL-NEXT:    vzeroupper
650 ; AVX512BWVL-NEXT:    retq
652 ; AVX512VBMIVL-LABEL: trunc_v8i32_to_v8i8_return_v16i8:
653 ; AVX512VBMIVL:       # %bb.0:
654 ; AVX512VBMIVL-NEXT:    vpmovdb %ymm0, %xmm0
655 ; AVX512VBMIVL-NEXT:    vzeroupper
656 ; AVX512VBMIVL-NEXT:    retq
657   %truncated = trunc <8 x i32> %vec to <8 x i8>
658   %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>
659   ret <16 x i8> %result
662 define <2 x i64> @trunc_v4i64_to_v4i16_return_v2i64(<4 x i64> %vec) nounwind {
663 ; IR generated from:
664 ; return (__m128i) {(long long)__builtin_convertvector((__v4di)x, __v4hi), 0};
665 ; AVX1-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
666 ; AVX1:       # %bb.0:
667 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
668 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
669 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
670 ; AVX1-NEXT:    vzeroupper
671 ; AVX1-NEXT:    retq
673 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
674 ; AVX2-SLOW:       # %bb.0:
675 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
676 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
677 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
678 ; AVX2-SLOW-NEXT:    vzeroupper
679 ; AVX2-SLOW-NEXT:    retq
681 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
682 ; AVX2-FAST:       # %bb.0:
683 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
684 ; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
685 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
686 ; AVX2-FAST-NEXT:    vzeroupper
687 ; AVX2-FAST-NEXT:    retq
689 ; AVX512F-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
690 ; AVX512F:       # %bb.0:
691 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
692 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
693 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
694 ; AVX512F-NEXT:    vzeroupper
695 ; AVX512F-NEXT:    retq
697 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
698 ; AVX512VL:       # %bb.0:
699 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
700 ; AVX512VL-NEXT:    vzeroupper
701 ; AVX512VL-NEXT:    retq
703 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
704 ; AVX512BW:       # %bb.0:
705 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
706 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
707 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
708 ; AVX512BW-NEXT:    vzeroupper
709 ; AVX512BW-NEXT:    retq
711 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
712 ; AVX512BWVL:       # %bb.0:
713 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
714 ; AVX512BWVL-NEXT:    vzeroupper
715 ; AVX512BWVL-NEXT:    retq
717 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16_return_v2i64:
718 ; AVX512VBMIVL:       # %bb.0:
719 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, %xmm0
720 ; AVX512VBMIVL-NEXT:    vzeroupper
721 ; AVX512VBMIVL-NEXT:    retq
722   %truncated = trunc <4 x i64> %vec to <4 x i16>
723   %bc = bitcast <4 x i16> %truncated to i64
724   %result = insertelement <2 x i64> zeroinitializer, i64 %bc, i32 0
725   ret <2 x i64> %result
728 define <8 x i16> @trunc_v4i64_to_v4i16_with_zext_return_v8i16(<4 x i64> %vec) nounwind {
729 ; AVX1-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
730 ; AVX1:       # %bb.0:
731 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
732 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
733 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
734 ; AVX1-NEXT:    vzeroupper
735 ; AVX1-NEXT:    retq
737 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
738 ; AVX2-SLOW:       # %bb.0:
739 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
740 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
741 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
742 ; AVX2-SLOW-NEXT:    vzeroupper
743 ; AVX2-SLOW-NEXT:    retq
745 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
746 ; AVX2-FAST:       # %bb.0:
747 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
748 ; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
749 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
750 ; AVX2-FAST-NEXT:    vzeroupper
751 ; AVX2-FAST-NEXT:    retq
753 ; AVX512F-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
754 ; AVX512F:       # %bb.0:
755 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
756 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
757 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
758 ; AVX512F-NEXT:    vzeroupper
759 ; AVX512F-NEXT:    retq
761 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
762 ; AVX512VL:       # %bb.0:
763 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
764 ; AVX512VL-NEXT:    vzeroupper
765 ; AVX512VL-NEXT:    retq
767 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
768 ; AVX512BW:       # %bb.0:
769 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
770 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
771 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
772 ; AVX512BW-NEXT:    vzeroupper
773 ; AVX512BW-NEXT:    retq
775 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
776 ; AVX512BWVL:       # %bb.0:
777 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
778 ; AVX512BWVL-NEXT:    vzeroupper
779 ; AVX512BWVL-NEXT:    retq
781 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16_with_zext_return_v8i16:
782 ; AVX512VBMIVL:       # %bb.0:
783 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, %xmm0
784 ; AVX512VBMIVL-NEXT:    vzeroupper
785 ; AVX512VBMIVL-NEXT:    retq
786   %truncated = trunc <4 x i64> %vec to <4 x i16>
787   %truncated.ext = zext <4 x i16> %truncated to <4 x i32>
788   %bc = bitcast <4 x i32> %truncated.ext to <8 x i16>
789   %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>
790   ret <8 x i16> %result
793 define <8 x i16> @trunc_v4i64_to_v4i16_via_v4i32_return_v8i16(<4 x i64> %vec) nounwind {
794 ; AVX1-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
795 ; AVX1:       # %bb.0:
796 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
797 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
798 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
799 ; AVX1-NEXT:    vzeroupper
800 ; AVX1-NEXT:    retq
802 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
803 ; AVX2-SLOW:       # %bb.0:
804 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
805 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
806 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
807 ; AVX2-SLOW-NEXT:    vzeroupper
808 ; AVX2-SLOW-NEXT:    retq
810 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
811 ; AVX2-FAST:       # %bb.0:
812 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
813 ; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
814 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
815 ; AVX2-FAST-NEXT:    vzeroupper
816 ; AVX2-FAST-NEXT:    retq
818 ; AVX512F-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
819 ; AVX512F:       # %bb.0:
820 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
821 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
822 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
823 ; AVX512F-NEXT:    vzeroupper
824 ; AVX512F-NEXT:    retq
826 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
827 ; AVX512VL:       # %bb.0:
828 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
829 ; AVX512VL-NEXT:    vzeroupper
830 ; AVX512VL-NEXT:    retq
832 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
833 ; AVX512BW:       # %bb.0:
834 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
835 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
836 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
837 ; AVX512BW-NEXT:    vzeroupper
838 ; AVX512BW-NEXT:    retq
840 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
841 ; AVX512BWVL:       # %bb.0:
842 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
843 ; AVX512BWVL-NEXT:    vzeroupper
844 ; AVX512BWVL-NEXT:    retq
846 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16_via_v4i32_return_v8i16:
847 ; AVX512VBMIVL:       # %bb.0:
848 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, %xmm0
849 ; AVX512VBMIVL-NEXT:    vzeroupper
850 ; AVX512VBMIVL-NEXT:    retq
851   %truncated = trunc <4 x i64> %vec to <4 x i32>
852   %bc = bitcast <4 x i32> %truncated to <8 x i16>
853   %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>
854   ret <8 x i16> %result
857 define <8 x i16> @trunc_v4i64_to_v4i16_return_v8i16(<4 x i64> %vec) nounwind {
858 ; AVX1-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
859 ; AVX1:       # %bb.0:
860 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
861 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
862 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
863 ; AVX1-NEXT:    vzeroupper
864 ; AVX1-NEXT:    retq
866 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
867 ; AVX2-SLOW:       # %bb.0:
868 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
869 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
870 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
871 ; AVX2-SLOW-NEXT:    vzeroupper
872 ; AVX2-SLOW-NEXT:    retq
874 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
875 ; AVX2-FAST:       # %bb.0:
876 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
877 ; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
878 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
879 ; AVX2-FAST-NEXT:    vzeroupper
880 ; AVX2-FAST-NEXT:    retq
882 ; AVX512F-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
883 ; AVX512F:       # %bb.0:
884 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
885 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
886 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
887 ; AVX512F-NEXT:    vzeroupper
888 ; AVX512F-NEXT:    retq
890 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
891 ; AVX512VL:       # %bb.0:
892 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
893 ; AVX512VL-NEXT:    vzeroupper
894 ; AVX512VL-NEXT:    retq
896 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
897 ; AVX512BW:       # %bb.0:
898 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
899 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
900 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13],zero,zero,zero,zero,zero,zero,zero,zero
901 ; AVX512BW-NEXT:    vzeroupper
902 ; AVX512BW-NEXT:    retq
904 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
905 ; AVX512BWVL:       # %bb.0:
906 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
907 ; AVX512BWVL-NEXT:    vzeroupper
908 ; AVX512BWVL-NEXT:    retq
910 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16_return_v8i16:
911 ; AVX512VBMIVL:       # %bb.0:
912 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, %xmm0
913 ; AVX512VBMIVL-NEXT:    vzeroupper
914 ; AVX512VBMIVL-NEXT:    retq
915   %truncated = trunc <4 x i64> %vec to <4 x i16>
916   %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>
917   ret <8 x i16> %result
920 define <16 x i8> @trunc_v4i64_to_v4i8_return_v16i8(<4 x i64> %vec) nounwind {
921 ; AVX1-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
922 ; AVX1:       # %bb.0:
923 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
924 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
925 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[u],zero
926 ; AVX1-NEXT:    vzeroupper
927 ; AVX1-NEXT:    retq
929 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
930 ; AVX2-SLOW:       # %bb.0:
931 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = ymm0[0,2,2,3,4,6,6,7]
932 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
933 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[u],zero
934 ; AVX2-SLOW-NEXT:    vzeroupper
935 ; AVX2-SLOW-NEXT:    retq
937 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
938 ; AVX2-FAST:       # %bb.0:
939 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,2,4,6,4,6,6,7]
940 ; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
941 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[u],zero
942 ; AVX2-FAST-NEXT:    vzeroupper
943 ; AVX2-FAST-NEXT:    retq
945 ; AVX512F-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
946 ; AVX512F:       # %bb.0:
947 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
948 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
949 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[u],zero
950 ; AVX512F-NEXT:    vzeroupper
951 ; AVX512F-NEXT:    retq
953 ; AVX512VL-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
954 ; AVX512VL:       # %bb.0:
955 ; AVX512VL-NEXT:    vpmovqb %ymm0, %xmm0
956 ; AVX512VL-NEXT:    vzeroupper
957 ; AVX512VL-NEXT:    retq
959 ; AVX512BW-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
960 ; AVX512BW:       # %bb.0:
961 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
962 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
963 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[u],zero
964 ; AVX512BW-NEXT:    vzeroupper
965 ; AVX512BW-NEXT:    retq
967 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
968 ; AVX512BWVL:       # %bb.0:
969 ; AVX512BWVL-NEXT:    vpmovqb %ymm0, %xmm0
970 ; AVX512BWVL-NEXT:    vzeroupper
971 ; AVX512BWVL-NEXT:    retq
973 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i8_return_v16i8:
974 ; AVX512VBMIVL:       # %bb.0:
975 ; AVX512VBMIVL-NEXT:    vpmovqb %ymm0, %xmm0
976 ; AVX512VBMIVL-NEXT:    vzeroupper
977 ; AVX512VBMIVL-NEXT:    retq
978   %truncated = trunc <4 x i64> %vec to <4 x i8>
979   %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>
980   ret <16 x i8> %result
983 define void @shuffle_v16i16_to_v4i16(<16 x i16>* %L, <4 x i16>* %S) nounwind {
984 ; AVX1-LABEL: shuffle_v16i16_to_v4i16:
985 ; AVX1:       # %bb.0:
986 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
987 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
988 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
989 ; AVX1-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
990 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
991 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
992 ; AVX1-NEXT:    retq
994 ; AVX2-SLOW-LABEL: shuffle_v16i16_to_v4i16:
995 ; AVX2-SLOW:       # %bb.0:
996 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
997 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
998 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
999 ; AVX2-SLOW-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1000 ; AVX2-SLOW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1001 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rsi)
1002 ; AVX2-SLOW-NEXT:    retq
1004 ; AVX2-FAST-LABEL: shuffle_v16i16_to_v4i16:
1005 ; AVX2-FAST:       # %bb.0:
1006 ; AVX2-FAST-NEXT:    vmovdqa (%rdi), %xmm0
1007 ; AVX2-FAST-NEXT:    vmovdqa 16(%rdi), %xmm1
1008 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1009 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1010 ; AVX2-FAST-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1011 ; AVX2-FAST-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1012 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rsi)
1013 ; AVX2-FAST-NEXT:    retq
1015 ; AVX512F-LABEL: shuffle_v16i16_to_v4i16:
1016 ; AVX512F:       # %bb.0:
1017 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = mem[0,2,2,3]
1018 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1019 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm1 = mem[0,2,2,3]
1020 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1021 ; AVX512F-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
1022 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
1023 ; AVX512F-NEXT:    retq
1025 ; AVX512VL-LABEL: shuffle_v16i16_to_v4i16:
1026 ; AVX512VL:       # %bb.0:
1027 ; AVX512VL-NEXT:    vmovaps (%rdi), %xmm0
1028 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
1029 ; AVX512VL-NEXT:    vpmovdw %xmm0, (%rsi)
1030 ; AVX512VL-NEXT:    retq
1032 ; AVX512BW-LABEL: shuffle_v16i16_to_v4i16:
1033 ; AVX512BW:       # %bb.0:
1034 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
1035 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
1036 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15]
1037 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1038 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1039 ; AVX512BW-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1040 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
1041 ; AVX512BW-NEXT:    retq
1043 ; AVX512BWVL-LABEL: shuffle_v16i16_to_v4i16:
1044 ; AVX512BWVL:       # %bb.0:
1045 ; AVX512BWVL-NEXT:    vmovaps (%rdi), %xmm0
1046 ; AVX512BWVL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
1047 ; AVX512BWVL-NEXT:    vpmovdw %xmm0, (%rsi)
1048 ; AVX512BWVL-NEXT:    retq
1050 ; AVX512VBMIVL-LABEL: shuffle_v16i16_to_v4i16:
1051 ; AVX512VBMIVL:       # %bb.0:
1052 ; AVX512VBMIVL-NEXT:    vmovaps (%rdi), %xmm0
1053 ; AVX512VBMIVL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
1054 ; AVX512VBMIVL-NEXT:    vpmovdw %xmm0, (%rsi)
1055 ; AVX512VBMIVL-NEXT:    retq
1056   %vec = load <16 x i16>, <16 x i16>* %L
1057   %strided.vec = shufflevector <16 x i16> %vec, <16 x i16> undef, <4 x i32> <i32 0, i32 4, i32 8, i32 12>
1058   store <4 x i16> %strided.vec, <4 x i16>* %S
1059   ret void
1062 define void @trunc_v4i64_to_v4i16(<16 x i16>* %L, <4 x i16>* %S) nounwind {
1063 ; AVX1-LABEL: trunc_v4i64_to_v4i16:
1064 ; AVX1:       # %bb.0:
1065 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
1066 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
1067 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1068 ; AVX1-NEXT:    vmovq %xmm0, (%rsi)
1069 ; AVX1-NEXT:    retq
1071 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i16:
1072 ; AVX2-SLOW:       # %bb.0:
1073 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = mem[0,2,2,3,4,6,6,7]
1074 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1075 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1076 ; AVX2-SLOW-NEXT:    vmovq %xmm0, (%rsi)
1077 ; AVX2-SLOW-NEXT:    vzeroupper
1078 ; AVX2-SLOW-NEXT:    retq
1080 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i16:
1081 ; AVX2-FAST:       # %bb.0:
1082 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm0 = [0,2,4,6,4,6,6,7]
1083 ; AVX2-FAST-NEXT:    vpermd (%rdi), %ymm0, %ymm0
1084 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1085 ; AVX2-FAST-NEXT:    vmovq %xmm0, (%rsi)
1086 ; AVX2-FAST-NEXT:    vzeroupper
1087 ; AVX2-FAST-NEXT:    retq
1089 ; AVX512F-LABEL: trunc_v4i64_to_v4i16:
1090 ; AVX512F:       # %bb.0:
1091 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1092 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
1093 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1094 ; AVX512F-NEXT:    vmovq %xmm0, (%rsi)
1095 ; AVX512F-NEXT:    vzeroupper
1096 ; AVX512F-NEXT:    retq
1098 ; AVX512VL-LABEL: trunc_v4i64_to_v4i16:
1099 ; AVX512VL:       # %bb.0:
1100 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
1101 ; AVX512VL-NEXT:    vpmovqw %ymm0, (%rsi)
1102 ; AVX512VL-NEXT:    vzeroupper
1103 ; AVX512VL-NEXT:    retq
1105 ; AVX512BW-LABEL: trunc_v4i64_to_v4i16:
1106 ; AVX512BW:       # %bb.0:
1107 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
1108 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
1109 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1110 ; AVX512BW-NEXT:    vmovq %xmm0, (%rsi)
1111 ; AVX512BW-NEXT:    vzeroupper
1112 ; AVX512BW-NEXT:    retq
1114 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i16:
1115 ; AVX512BWVL:       # %bb.0:
1116 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
1117 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, (%rsi)
1118 ; AVX512BWVL-NEXT:    vzeroupper
1119 ; AVX512BWVL-NEXT:    retq
1121 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i16:
1122 ; AVX512VBMIVL:       # %bb.0:
1123 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
1124 ; AVX512VBMIVL-NEXT:    vpmovqw %ymm0, (%rsi)
1125 ; AVX512VBMIVL-NEXT:    vzeroupper
1126 ; AVX512VBMIVL-NEXT:    retq
1127   %vec = load <16 x i16>, <16 x i16>* %L
1128   %bc = bitcast <16 x i16> %vec to <4 x i64>
1129   %strided.vec = trunc <4 x i64> %bc to <4 x i16>
1130   store <4 x i16> %strided.vec, <4 x i16>* %S
1131   ret void
1134 define void @shuffle_v32i8_to_v4i8(<32 x i8>* %L, <4 x i8>* %S) nounwind {
1135 ; AVX-LABEL: shuffle_v32i8_to_v4i8:
1136 ; AVX:       # %bb.0:
1137 ; AVX-NEXT:    vmovdqa (%rdi), %xmm0
1138 ; AVX-NEXT:    vmovdqa 16(%rdi), %xmm1
1139 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1140 ; AVX-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1141 ; AVX-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1142 ; AVX-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1143 ; AVX-NEXT:    vmovd %xmm0, (%rsi)
1144 ; AVX-NEXT:    retq
1146 ; AVX512F-LABEL: shuffle_v32i8_to_v4i8:
1147 ; AVX512F:       # %bb.0:
1148 ; AVX512F-NEXT:    vmovdqa (%rdi), %xmm0
1149 ; AVX512F-NEXT:    vmovdqa 16(%rdi), %xmm1
1150 ; AVX512F-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1151 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1152 ; AVX512F-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1153 ; AVX512F-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1154 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
1155 ; AVX512F-NEXT:    retq
1157 ; AVX512VL-LABEL: shuffle_v32i8_to_v4i8:
1158 ; AVX512VL:       # %bb.0:
1159 ; AVX512VL-NEXT:    vmovaps (%rdi), %xmm0
1160 ; AVX512VL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
1161 ; AVX512VL-NEXT:    vpmovdb %xmm0, (%rsi)
1162 ; AVX512VL-NEXT:    retq
1164 ; AVX512BW-LABEL: shuffle_v32i8_to_v4i8:
1165 ; AVX512BW:       # %bb.0:
1166 ; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
1167 ; AVX512BW-NEXT:    vmovdqa 16(%rdi), %xmm1
1168 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
1169 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1170 ; AVX512BW-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1171 ; AVX512BW-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1172 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
1173 ; AVX512BW-NEXT:    retq
1175 ; AVX512BWVL-LABEL: shuffle_v32i8_to_v4i8:
1176 ; AVX512BWVL:       # %bb.0:
1177 ; AVX512BWVL-NEXT:    vmovaps (%rdi), %xmm0
1178 ; AVX512BWVL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
1179 ; AVX512BWVL-NEXT:    vpmovdb %xmm0, (%rsi)
1180 ; AVX512BWVL-NEXT:    retq
1182 ; AVX512VBMIVL-LABEL: shuffle_v32i8_to_v4i8:
1183 ; AVX512VBMIVL:       # %bb.0:
1184 ; AVX512VBMIVL-NEXT:    vmovaps (%rdi), %xmm0
1185 ; AVX512VBMIVL-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
1186 ; AVX512VBMIVL-NEXT:    vpmovdb %xmm0, (%rsi)
1187 ; AVX512VBMIVL-NEXT:    retq
1188   %vec = load <32 x i8>, <32 x i8>* %L
1189   %strided.vec = shufflevector <32 x i8> %vec, <32 x i8> undef, <4 x i32> <i32 0, i32 8, i32 16, i32 24>
1190   store <4 x i8> %strided.vec, <4 x i8>* %S
1191   ret void
1194 define void @trunc_v4i64_to_v4i8(<32 x i8>* %L, <4 x i8>* %S) nounwind {
1195 ; AVX1-LABEL: trunc_v4i64_to_v4i8:
1196 ; AVX1:       # %bb.0:
1197 ; AVX1-NEXT:    vmovaps (%rdi), %xmm0
1198 ; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],mem[0,2]
1199 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
1200 ; AVX1-NEXT:    vmovd %xmm0, (%rsi)
1201 ; AVX1-NEXT:    retq
1203 ; AVX2-SLOW-LABEL: trunc_v4i64_to_v4i8:
1204 ; AVX2-SLOW:       # %bb.0:
1205 ; AVX2-SLOW-NEXT:    vpshufd {{.*#+}} ymm0 = mem[0,2,2,3,4,6,6,7]
1206 ; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1207 ; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
1208 ; AVX2-SLOW-NEXT:    vmovd %xmm0, (%rsi)
1209 ; AVX2-SLOW-NEXT:    vzeroupper
1210 ; AVX2-SLOW-NEXT:    retq
1212 ; AVX2-FAST-LABEL: trunc_v4i64_to_v4i8:
1213 ; AVX2-FAST:       # %bb.0:
1214 ; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm0 = [0,2,4,6,4,6,6,7]
1215 ; AVX2-FAST-NEXT:    vpermd (%rdi), %ymm0, %ymm0
1216 ; AVX2-FAST-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
1217 ; AVX2-FAST-NEXT:    vmovd %xmm0, (%rsi)
1218 ; AVX2-FAST-NEXT:    vzeroupper
1219 ; AVX2-FAST-NEXT:    retq
1221 ; AVX512F-LABEL: trunc_v4i64_to_v4i8:
1222 ; AVX512F:       # %bb.0:
1223 ; AVX512F-NEXT:    vmovdqa (%rdi), %ymm0
1224 ; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
1225 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
1226 ; AVX512F-NEXT:    vmovd %xmm0, (%rsi)
1227 ; AVX512F-NEXT:    vzeroupper
1228 ; AVX512F-NEXT:    retq
1230 ; AVX512VL-LABEL: trunc_v4i64_to_v4i8:
1231 ; AVX512VL:       # %bb.0:
1232 ; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
1233 ; AVX512VL-NEXT:    vpmovqb %ymm0, (%rsi)
1234 ; AVX512VL-NEXT:    vzeroupper
1235 ; AVX512VL-NEXT:    retq
1237 ; AVX512BW-LABEL: trunc_v4i64_to_v4i8:
1238 ; AVX512BW:       # %bb.0:
1239 ; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
1240 ; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
1241 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
1242 ; AVX512BW-NEXT:    vmovd %xmm0, (%rsi)
1243 ; AVX512BW-NEXT:    vzeroupper
1244 ; AVX512BW-NEXT:    retq
1246 ; AVX512BWVL-LABEL: trunc_v4i64_to_v4i8:
1247 ; AVX512BWVL:       # %bb.0:
1248 ; AVX512BWVL-NEXT:    vmovdqa (%rdi), %ymm0
1249 ; AVX512BWVL-NEXT:    vpmovqb %ymm0, (%rsi)
1250 ; AVX512BWVL-NEXT:    vzeroupper
1251 ; AVX512BWVL-NEXT:    retq
1253 ; AVX512VBMIVL-LABEL: trunc_v4i64_to_v4i8:
1254 ; AVX512VBMIVL:       # %bb.0:
1255 ; AVX512VBMIVL-NEXT:    vmovdqa (%rdi), %ymm0
1256 ; AVX512VBMIVL-NEXT:    vpmovqb %ymm0, (%rsi)
1257 ; AVX512VBMIVL-NEXT:    vzeroupper
1258 ; AVX512VBMIVL-NEXT:    retq
1259   %vec = load <32 x i8>, <32 x i8>* %L
1260   %bc = bitcast <32 x i8> %vec to <4 x i64>
1261   %strided.vec = trunc <4 x i64> %bc to <4 x i8>
1262   store <4 x i8> %strided.vec, <4 x i8>* %S
1263   ret void
1266 ; In this case not all elements are collected from the same source vector, so
1267 ; the resulting BUILD_VECTOR should not be combined to a truncate.
1268 define <16 x i8> @negative(<32 x i8> %v, <32 x i8> %w) nounwind {
1269 ; AVX1-LABEL: negative:
1270 ; AVX1:       # %bb.0:
1271 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm2 = xmm0[u,2,4,6,8,10,12,14],zero,zero,zero,zero,zero,zero,zero,zero
1272 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1273 ; AVX1-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u],zero,zero,zero,zero,zero,zero,zero,xmm0[0,2,4,6,8,10,12,14]
1274 ; AVX1-NEXT:    vpor %xmm2, %xmm0, %xmm0
1275 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1276 ; AVX1-NEXT:    vpblendvb %xmm2, %xmm0, %xmm1, %xmm0
1277 ; AVX1-NEXT:    vzeroupper
1278 ; AVX1-NEXT:    retq
1280 ; AVX2-LABEL: negative:
1281 ; AVX2:       # %bb.0:
1282 ; 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]
1283 ; 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]
1284 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1285 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1286 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1287 ; AVX2-NEXT:    vzeroupper
1288 ; AVX2-NEXT:    retq
1290 ; AVX512F-LABEL: negative:
1291 ; AVX512F:       # %bb.0:
1292 ; 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]
1293 ; 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]
1294 ; AVX512F-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1295 ; AVX512F-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1296 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1297 ; AVX512F-NEXT:    vzeroupper
1298 ; AVX512F-NEXT:    retq
1300 ; AVX512VL-LABEL: negative:
1301 ; AVX512VL:       # %bb.0:
1302 ; 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]
1303 ; 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]
1304 ; AVX512VL-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1305 ; AVX512VL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1306 ; AVX512VL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1307 ; AVX512VL-NEXT:    vzeroupper
1308 ; AVX512VL-NEXT:    retq
1310 ; AVX512BW-LABEL: negative:
1311 ; AVX512BW:       # %bb.0:
1312 ; 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]
1313 ; 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]
1314 ; AVX512BW-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
1315 ; AVX512BW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1316 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1317 ; AVX512BW-NEXT:    vzeroupper
1318 ; AVX512BW-NEXT:    retq
1320 ; AVX512BWVL-LABEL: negative:
1321 ; AVX512BWVL:       # %bb.0:
1322 ; 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]
1323 ; AVX512BWVL-NEXT:    movl $65537, %eax # imm = 0x10001
1324 ; AVX512BWVL-NEXT:    kmovd %eax, %k1
1325 ; AVX512BWVL-NEXT:    vmovdqu8 %ymm1, %ymm0 {%k1}
1326 ; AVX512BWVL-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,3,2,3]
1327 ; AVX512BWVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1328 ; AVX512BWVL-NEXT:    vzeroupper
1329 ; AVX512BWVL-NEXT:    retq
1331 ; AVX512VBMIVL-LABEL: negative:
1332 ; AVX512VBMIVL:       # %bb.0:
1333 ; 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]
1334 ; AVX512VBMIVL-NEXT:    vpermt2b %ymm1, %ymm2, %ymm0
1335 ; AVX512VBMIVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1336 ; AVX512VBMIVL-NEXT:    vzeroupper
1337 ; AVX512VBMIVL-NEXT:    retq
1338   %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>
1339   %w0 = extractelement <32 x i8> %w, i32 0
1340   %merged = insertelement <16 x i8> %strided.vec, i8 %w0, i32 0
1341   ret <16 x i8> %merged