Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-trunc.ll
blobf8e3a7a23056fb4d4ded7f695c02b888d574f8e2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2-SSSE3,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE,SSE2-SSSE3,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-SLOW
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST-ALL
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX,AVX2,AVX2-FAST-PERLANE
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=AVX512 --check-prefix=AVX512F
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512VL
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
13 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BW
14 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-crosslane-shuffle,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
15 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-perlane-shuffle | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
17 define <8 x i32> @trunc8i64_8i32(<8 x i64> %a) {
18 ; SSE-LABEL: trunc8i64_8i32:
19 ; SSE:       # %bb.0: # %entry
20 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
21 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
22 ; SSE-NEXT:    movaps %xmm2, %xmm1
23 ; SSE-NEXT:    retq
25 ; AVX1-LABEL: trunc8i64_8i32:
26 ; AVX1:       # %bb.0: # %entry
27 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
28 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
29 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
30 ; AVX1-NEXT:    retq
32 ; AVX2-SLOW-LABEL: trunc8i64_8i32:
33 ; AVX2-SLOW:       # %bb.0: # %entry
34 ; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
35 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
36 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
37 ; AVX2-SLOW-NEXT:    retq
39 ; AVX2-FAST-ALL-LABEL: trunc8i64_8i32:
40 ; AVX2-FAST-ALL:       # %bb.0: # %entry
41 ; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
42 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm2, %ymm0
43 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm2, %ymm1
44 ; AVX2-FAST-ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
45 ; AVX2-FAST-ALL-NEXT:    retq
47 ; AVX2-FAST-PERLANE-LABEL: trunc8i64_8i32:
48 ; AVX2-FAST-PERLANE:       # %bb.0: # %entry
49 ; AVX2-FAST-PERLANE-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
50 ; AVX2-FAST-PERLANE-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
51 ; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
52 ; AVX2-FAST-PERLANE-NEXT:    retq
54 ; AVX512-LABEL: trunc8i64_8i32:
55 ; AVX512:       # %bb.0: # %entry
56 ; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
57 ; AVX512-NEXT:    retq
58 entry:
59   %0 = trunc <8 x i64> %a to <8 x i32>
60   ret <8 x i32> %0
63 define <8 x i32> @trunc8i64_8i32_ashr(<8 x i64> %a) {
64 ; SSE-LABEL: trunc8i64_8i32_ashr:
65 ; SSE:       # %bb.0: # %entry
66 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
67 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
68 ; SSE-NEXT:    movaps %xmm2, %xmm1
69 ; SSE-NEXT:    retq
71 ; AVX1-LABEL: trunc8i64_8i32_ashr:
72 ; AVX1:       # %bb.0: # %entry
73 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
74 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
75 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]
76 ; AVX1-NEXT:    retq
78 ; AVX2-SLOW-LABEL: trunc8i64_8i32_ashr:
79 ; AVX2-SLOW:       # %bb.0: # %entry
80 ; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
81 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
82 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]
83 ; AVX2-SLOW-NEXT:    retq
85 ; AVX2-FAST-ALL-LABEL: trunc8i64_8i32_ashr:
86 ; AVX2-FAST-ALL:       # %bb.0: # %entry
87 ; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} xmm2 = [1,3,5,7]
88 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm2, %ymm0
89 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm2, %ymm1
90 ; AVX2-FAST-ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
91 ; AVX2-FAST-ALL-NEXT:    retq
93 ; AVX2-FAST-PERLANE-LABEL: trunc8i64_8i32_ashr:
94 ; AVX2-FAST-PERLANE:       # %bb.0: # %entry
95 ; AVX2-FAST-PERLANE-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
96 ; AVX2-FAST-PERLANE-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
97 ; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]
98 ; AVX2-FAST-PERLANE-NEXT:    retq
100 ; AVX512-LABEL: trunc8i64_8i32_ashr:
101 ; AVX512:       # %bb.0: # %entry
102 ; AVX512-NEXT:    vpsrlq $32, %zmm0, %zmm0
103 ; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
104 ; AVX512-NEXT:    retq
105 entry:
106   %0 = ashr <8 x i64> %a, <i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32>
107   %1 = trunc <8 x i64> %0 to <8 x i32>
108   ret <8 x i32> %1
111 define <8 x i32> @trunc8i64_8i32_lshr(<8 x i64> %a) {
112 ; SSE-LABEL: trunc8i64_8i32_lshr:
113 ; SSE:       # %bb.0: # %entry
114 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
115 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
116 ; SSE-NEXT:    movaps %xmm2, %xmm1
117 ; SSE-NEXT:    retq
119 ; AVX1-LABEL: trunc8i64_8i32_lshr:
120 ; AVX1:       # %bb.0: # %entry
121 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
122 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
123 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]
124 ; AVX1-NEXT:    retq
126 ; AVX2-SLOW-LABEL: trunc8i64_8i32_lshr:
127 ; AVX2-SLOW:       # %bb.0: # %entry
128 ; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
129 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
130 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]
131 ; AVX2-SLOW-NEXT:    retq
133 ; AVX2-FAST-ALL-LABEL: trunc8i64_8i32_lshr:
134 ; AVX2-FAST-ALL:       # %bb.0: # %entry
135 ; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} xmm2 = [1,3,5,7]
136 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm2, %ymm0
137 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm2, %ymm1
138 ; AVX2-FAST-ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
139 ; AVX2-FAST-ALL-NEXT:    retq
141 ; AVX2-FAST-PERLANE-LABEL: trunc8i64_8i32_lshr:
142 ; AVX2-FAST-PERLANE:       # %bb.0: # %entry
143 ; AVX2-FAST-PERLANE-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
144 ; AVX2-FAST-PERLANE-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
145 ; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[1,3],ymm2[1,3],ymm0[5,7],ymm2[5,7]
146 ; AVX2-FAST-PERLANE-NEXT:    retq
148 ; AVX512-LABEL: trunc8i64_8i32_lshr:
149 ; AVX512:       # %bb.0: # %entry
150 ; AVX512-NEXT:    vpsrlq $32, %zmm0, %zmm0
151 ; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
152 ; AVX512-NEXT:    retq
153 entry:
154   %0 = lshr <8 x i64> %a, <i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32, i64 32>
155   %1 = trunc <8 x i64> %0 to <8 x i32>
156   ret <8 x i32> %1
159 define <8 x i16> @trunc8i64_8i16(<8 x i64> %a) {
160 ; SSE2-SSSE3-LABEL: trunc8i64_8i16:
161 ; SSE2-SSSE3:       # %bb.0: # %entry
162 ; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
163 ; SSE2-SSSE3-NEXT:    pslld $16, %xmm2
164 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm2
165 ; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
166 ; SSE2-SSSE3-NEXT:    pslld $16, %xmm0
167 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm0
168 ; SSE2-SSSE3-NEXT:    packssdw %xmm2, %xmm0
169 ; SSE2-SSSE3-NEXT:    retq
171 ; SSE41-LABEL: trunc8i64_8i16:
172 ; SSE41:       # %bb.0: # %entry
173 ; SSE41-NEXT:    pxor %xmm4, %xmm4
174 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]
175 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]
176 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
177 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]
178 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]
179 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
180 ; SSE41-NEXT:    packusdw %xmm2, %xmm0
181 ; SSE41-NEXT:    retq
183 ; AVX1-LABEL: trunc8i64_8i16:
184 ; AVX1:       # %bb.0: # %entry
185 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535]
186 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
187 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
188 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
189 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
190 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
191 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
192 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
193 ; AVX1-NEXT:    vzeroupper
194 ; AVX1-NEXT:    retq
196 ; AVX2-LABEL: trunc8i64_8i16:
197 ; AVX2:       # %bb.0: # %entry
198 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
199 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm1[0],ymm2[1,2,3],ymm1[4],ymm2[5,6,7],ymm1[8],ymm2[9,10,11],ymm1[12],ymm2[13,14,15]
200 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3],ymm0[4],ymm2[5,6,7],ymm0[8],ymm2[9,10,11],ymm0[12],ymm2[13,14,15]
201 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
202 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
203 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
204 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
205 ; AVX2-NEXT:    vzeroupper
206 ; AVX2-NEXT:    retq
208 ; AVX512-LABEL: trunc8i64_8i16:
209 ; AVX512:       # %bb.0: # %entry
210 ; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
211 ; AVX512-NEXT:    vzeroupper
212 ; AVX512-NEXT:    retq
213 entry:
214   %0 = trunc <8 x i64> %a to <8 x i16>
215   ret <8 x i16> %0
218 define void @trunc8i64_8i8(<8 x i64> %a) {
219 ; SSE2-SSSE3-LABEL: trunc8i64_8i8:
220 ; SSE2-SSSE3:       # %bb.0: # %entry
221 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
222 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm3
223 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm2
224 ; SSE2-SSSE3-NEXT:    packuswb %xmm3, %xmm2
225 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm1
226 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm0
227 ; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0
228 ; SSE2-SSSE3-NEXT:    packuswb %xmm2, %xmm0
229 ; SSE2-SSSE3-NEXT:    packuswb %xmm0, %xmm0
230 ; SSE2-SSSE3-NEXT:    movq %xmm0, (%rax)
231 ; SSE2-SSSE3-NEXT:    retq
233 ; SSE41-LABEL: trunc8i64_8i8:
234 ; SSE41:       # %bb.0: # %entry
235 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
236 ; SSE41-NEXT:    pand %xmm4, %xmm3
237 ; SSE41-NEXT:    pand %xmm4, %xmm2
238 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
239 ; SSE41-NEXT:    pand %xmm4, %xmm1
240 ; SSE41-NEXT:    pand %xmm4, %xmm0
241 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
242 ; SSE41-NEXT:    packusdw %xmm2, %xmm0
243 ; SSE41-NEXT:    packuswb %xmm0, %xmm0
244 ; SSE41-NEXT:    movq %xmm0, (%rax)
245 ; SSE41-NEXT:    retq
247 ; AVX1-LABEL: trunc8i64_8i8:
248 ; AVX1:       # %bb.0: # %entry
249 ; AVX1-NEXT:    vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255]
250 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
251 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
252 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
253 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
254 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
255 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
256 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
257 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
258 ; AVX1-NEXT:    vmovq %xmm0, (%rax)
259 ; AVX1-NEXT:    vzeroupper
260 ; AVX1-NEXT:    retq
262 ; AVX2-LABEL: trunc8i64_8i8:
263 ; AVX2:       # %bb.0: # %entry
264 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
265 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
266 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
267 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
268 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
269 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
270 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
271 ; AVX2-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0
272 ; AVX2-NEXT:    vmovq %xmm0, (%rax)
273 ; AVX2-NEXT:    vzeroupper
274 ; AVX2-NEXT:    retq
276 ; AVX512-LABEL: trunc8i64_8i8:
277 ; AVX512:       # %bb.0: # %entry
278 ; AVX512-NEXT:    vpmovqb %zmm0, (%rax)
279 ; AVX512-NEXT:    vzeroupper
280 ; AVX512-NEXT:    retq
281 entry:
282   %0 = trunc <8 x i64> %a to <8 x i8>
283   store <8 x i8> %0, ptr undef, align 4
284   ret void
287 define <8 x i16> @trunc8i32_8i16(<8 x i32> %a) {
288 ; SSE2-LABEL: trunc8i32_8i16:
289 ; SSE2:       # %bb.0: # %entry
290 ; SSE2-NEXT:    pslld $16, %xmm1
291 ; SSE2-NEXT:    psrad $16, %xmm1
292 ; SSE2-NEXT:    pslld $16, %xmm0
293 ; SSE2-NEXT:    psrad $16, %xmm0
294 ; SSE2-NEXT:    packssdw %xmm1, %xmm0
295 ; SSE2-NEXT:    retq
297 ; SSSE3-LABEL: trunc8i32_8i16:
298 ; SSSE3:       # %bb.0: # %entry
299 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
300 ; SSSE3-NEXT:    pshufb %xmm2, %xmm1
301 ; SSSE3-NEXT:    pshufb %xmm2, %xmm0
302 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
303 ; SSSE3-NEXT:    retq
305 ; SSE41-LABEL: trunc8i32_8i16:
306 ; SSE41:       # %bb.0: # %entry
307 ; SSE41-NEXT:    pxor %xmm2, %xmm2
308 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
309 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
310 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
311 ; SSE41-NEXT:    retq
313 ; AVX1-LABEL: trunc8i32_8i16:
314 ; AVX1:       # %bb.0: # %entry
315 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
316 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
317 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
318 ; AVX1-NEXT:    vzeroupper
319 ; AVX1-NEXT:    retq
321 ; AVX2-LABEL: trunc8i32_8i16:
322 ; AVX2:       # %bb.0: # %entry
323 ; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
324 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
325 ; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
326 ; AVX2-NEXT:    vzeroupper
327 ; AVX2-NEXT:    retq
329 ; AVX512F-LABEL: trunc8i32_8i16:
330 ; AVX512F:       # %bb.0: # %entry
331 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
332 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
333 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
334 ; AVX512F-NEXT:    vzeroupper
335 ; AVX512F-NEXT:    retq
337 ; AVX512VL-LABEL: trunc8i32_8i16:
338 ; AVX512VL:       # %bb.0: # %entry
339 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
340 ; AVX512VL-NEXT:    vzeroupper
341 ; AVX512VL-NEXT:    retq
343 ; AVX512BW-LABEL: trunc8i32_8i16:
344 ; AVX512BW:       # %bb.0: # %entry
345 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
346 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
347 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
348 ; AVX512BW-NEXT:    vzeroupper
349 ; AVX512BW-NEXT:    retq
351 ; AVX512BWVL-LABEL: trunc8i32_8i16:
352 ; AVX512BWVL:       # %bb.0: # %entry
353 ; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0
354 ; AVX512BWVL-NEXT:    vzeroupper
355 ; AVX512BWVL-NEXT:    retq
356 entry:
357   %0 = trunc <8 x i32> %a to <8 x i16>
358   ret <8 x i16> %0
361 define <8 x i16> @trunc8i32_8i16_ashr(<8 x i32> %a) {
362 ; SSE2-SSSE3-LABEL: trunc8i32_8i16_ashr:
363 ; SSE2-SSSE3:       # %bb.0: # %entry
364 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm1
365 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm0
366 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm0
367 ; SSE2-SSSE3-NEXT:    retq
369 ; SSE41-LABEL: trunc8i32_8i16_ashr:
370 ; SSE41:       # %bb.0: # %entry
371 ; SSE41-NEXT:    psrld $16, %xmm1
372 ; SSE41-NEXT:    psrld $16, %xmm0
373 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
374 ; SSE41-NEXT:    retq
376 ; AVX1-LABEL: trunc8i32_8i16_ashr:
377 ; AVX1:       # %bb.0: # %entry
378 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
379 ; AVX1-NEXT:    vpsrld $16, %xmm1, %xmm1
380 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
381 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
382 ; AVX1-NEXT:    vzeroupper
383 ; AVX1-NEXT:    retq
385 ; AVX2-LABEL: trunc8i32_8i16_ashr:
386 ; AVX2:       # %bb.0: # %entry
387 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
388 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
389 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
390 ; AVX2-NEXT:    vzeroupper
391 ; AVX2-NEXT:    retq
393 ; AVX512F-LABEL: trunc8i32_8i16_ashr:
394 ; AVX512F:       # %bb.0: # %entry
395 ; AVX512F-NEXT:    vpsrld $16, %ymm0, %ymm0
396 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
397 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
398 ; AVX512F-NEXT:    vzeroupper
399 ; AVX512F-NEXT:    retq
401 ; AVX512VL-LABEL: trunc8i32_8i16_ashr:
402 ; AVX512VL:       # %bb.0: # %entry
403 ; AVX512VL-NEXT:    vpsrld $16, %ymm0, %ymm0
404 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
405 ; AVX512VL-NEXT:    vzeroupper
406 ; AVX512VL-NEXT:    retq
408 ; AVX512BW-LABEL: trunc8i32_8i16_ashr:
409 ; AVX512BW:       # %bb.0: # %entry
410 ; AVX512BW-NEXT:    vpsrld $16, %ymm0, %ymm0
411 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
412 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
413 ; AVX512BW-NEXT:    vzeroupper
414 ; AVX512BW-NEXT:    retq
416 ; AVX512BWVL-LABEL: trunc8i32_8i16_ashr:
417 ; AVX512BWVL:       # %bb.0: # %entry
418 ; AVX512BWVL-NEXT:    vpsrld $16, %ymm0, %ymm0
419 ; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0
420 ; AVX512BWVL-NEXT:    vzeroupper
421 ; AVX512BWVL-NEXT:    retq
422 entry:
423   %0 = ashr <8 x i32> %a, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
424   %1 = trunc <8 x i32> %0 to <8 x i16>
425   ret <8 x i16> %1
428 define <8 x i16> @trunc8i32_8i16_lshr(<8 x i32> %a) {
429 ; SSE2-SSSE3-LABEL: trunc8i32_8i16_lshr:
430 ; SSE2-SSSE3:       # %bb.0: # %entry
431 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm1
432 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm0
433 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm0
434 ; SSE2-SSSE3-NEXT:    retq
436 ; SSE41-LABEL: trunc8i32_8i16_lshr:
437 ; SSE41:       # %bb.0: # %entry
438 ; SSE41-NEXT:    psrld $16, %xmm1
439 ; SSE41-NEXT:    psrld $16, %xmm0
440 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
441 ; SSE41-NEXT:    retq
443 ; AVX1-LABEL: trunc8i32_8i16_lshr:
444 ; AVX1:       # %bb.0: # %entry
445 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
446 ; AVX1-NEXT:    vpsrld $16, %xmm1, %xmm1
447 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
448 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
449 ; AVX1-NEXT:    vzeroupper
450 ; AVX1-NEXT:    retq
452 ; AVX2-LABEL: trunc8i32_8i16_lshr:
453 ; AVX2:       # %bb.0: # %entry
454 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
455 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
456 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
457 ; AVX2-NEXT:    vzeroupper
458 ; AVX2-NEXT:    retq
460 ; AVX512F-LABEL: trunc8i32_8i16_lshr:
461 ; AVX512F:       # %bb.0: # %entry
462 ; AVX512F-NEXT:    vpsrld $16, %ymm0, %ymm0
463 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
464 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
465 ; AVX512F-NEXT:    vzeroupper
466 ; AVX512F-NEXT:    retq
468 ; AVX512VL-LABEL: trunc8i32_8i16_lshr:
469 ; AVX512VL:       # %bb.0: # %entry
470 ; AVX512VL-NEXT:    vpsrld $16, %ymm0, %ymm0
471 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
472 ; AVX512VL-NEXT:    vzeroupper
473 ; AVX512VL-NEXT:    retq
475 ; AVX512BW-LABEL: trunc8i32_8i16_lshr:
476 ; AVX512BW:       # %bb.0: # %entry
477 ; AVX512BW-NEXT:    vpsrld $16, %ymm0, %ymm0
478 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
479 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
480 ; AVX512BW-NEXT:    vzeroupper
481 ; AVX512BW-NEXT:    retq
483 ; AVX512BWVL-LABEL: trunc8i32_8i16_lshr:
484 ; AVX512BWVL:       # %bb.0: # %entry
485 ; AVX512BWVL-NEXT:    vpsrld $16, %ymm0, %ymm0
486 ; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0
487 ; AVX512BWVL-NEXT:    vzeroupper
488 ; AVX512BWVL-NEXT:    retq
489 entry:
490   %0 = lshr <8 x i32> %a, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
491   %1 = trunc <8 x i32> %0 to <8 x i16>
492   ret <8 x i16> %1
495 define void @trunc8i32_8i8(<8 x i32> %a) {
496 ; SSE2-SSSE3-LABEL: trunc8i32_8i8:
497 ; SSE2-SSSE3:       # %bb.0: # %entry
498 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
499 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
500 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm0
501 ; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0
502 ; SSE2-SSSE3-NEXT:    packuswb %xmm0, %xmm0
503 ; SSE2-SSSE3-NEXT:    movq %xmm0, (%rax)
504 ; SSE2-SSSE3-NEXT:    retq
506 ; SSE41-LABEL: trunc8i32_8i8:
507 ; SSE41:       # %bb.0: # %entry
508 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
509 ; SSE41-NEXT:    pand %xmm2, %xmm1
510 ; SSE41-NEXT:    pand %xmm2, %xmm0
511 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
512 ; SSE41-NEXT:    packuswb %xmm0, %xmm0
513 ; SSE41-NEXT:    movq %xmm0, (%rax)
514 ; SSE41-NEXT:    retq
516 ; AVX1-LABEL: trunc8i32_8i8:
517 ; AVX1:       # %bb.0: # %entry
518 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
519 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12]
520 ; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
521 ; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
522 ; AVX1-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
523 ; AVX1-NEXT:    vmovq %xmm0, (%rax)
524 ; AVX1-NEXT:    vzeroupper
525 ; AVX1-NEXT:    retq
527 ; AVX2-LABEL: trunc8i32_8i8:
528 ; AVX2:       # %bb.0: # %entry
529 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
530 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [0,4,8,12,0,4,8,12,0,4,8,12,0,4,8,12]
531 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
532 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
533 ; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
534 ; AVX2-NEXT:    vmovq %xmm0, (%rax)
535 ; AVX2-NEXT:    vzeroupper
536 ; AVX2-NEXT:    retq
538 ; AVX512F-LABEL: trunc8i32_8i8:
539 ; AVX512F:       # %bb.0: # %entry
540 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
541 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
542 ; AVX512F-NEXT:    vmovq %xmm0, (%rax)
543 ; AVX512F-NEXT:    vzeroupper
544 ; AVX512F-NEXT:    retq
546 ; AVX512VL-LABEL: trunc8i32_8i8:
547 ; AVX512VL:       # %bb.0: # %entry
548 ; AVX512VL-NEXT:    vpmovdb %ymm0, (%rax)
549 ; AVX512VL-NEXT:    vzeroupper
550 ; AVX512VL-NEXT:    retq
552 ; AVX512BW-LABEL: trunc8i32_8i8:
553 ; AVX512BW:       # %bb.0: # %entry
554 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
555 ; AVX512BW-NEXT:    vpmovdb %zmm0, %xmm0
556 ; AVX512BW-NEXT:    vmovq %xmm0, (%rax)
557 ; AVX512BW-NEXT:    vzeroupper
558 ; AVX512BW-NEXT:    retq
560 ; AVX512BWVL-LABEL: trunc8i32_8i8:
561 ; AVX512BWVL:       # %bb.0: # %entry
562 ; AVX512BWVL-NEXT:    vpmovdb %ymm0, (%rax)
563 ; AVX512BWVL-NEXT:    vzeroupper
564 ; AVX512BWVL-NEXT:    retq
565 entry:
566   %0 = trunc <8 x i32> %a to <8 x i8>
567   store <8 x i8> %0, ptr undef, align 4
568   ret void
571 define void @trunc16i32_16i16(<16 x i32> %a) {
572 ; SSE2-LABEL: trunc16i32_16i16:
573 ; SSE2:       # %bb.0: # %entry
574 ; SSE2-NEXT:    pslld $16, %xmm1
575 ; SSE2-NEXT:    psrad $16, %xmm1
576 ; SSE2-NEXT:    pslld $16, %xmm0
577 ; SSE2-NEXT:    psrad $16, %xmm0
578 ; SSE2-NEXT:    packssdw %xmm1, %xmm0
579 ; SSE2-NEXT:    pslld $16, %xmm3
580 ; SSE2-NEXT:    psrad $16, %xmm3
581 ; SSE2-NEXT:    pslld $16, %xmm2
582 ; SSE2-NEXT:    psrad $16, %xmm2
583 ; SSE2-NEXT:    packssdw %xmm3, %xmm2
584 ; SSE2-NEXT:    movdqu %xmm2, (%rax)
585 ; SSE2-NEXT:    movdqu %xmm0, (%rax)
586 ; SSE2-NEXT:    retq
588 ; SSSE3-LABEL: trunc16i32_16i16:
589 ; SSSE3:       # %bb.0: # %entry
590 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
591 ; SSSE3-NEXT:    pshufb %xmm4, %xmm1
592 ; SSSE3-NEXT:    pshufb %xmm4, %xmm0
593 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
594 ; SSSE3-NEXT:    pshufb %xmm4, %xmm3
595 ; SSSE3-NEXT:    pshufb %xmm4, %xmm2
596 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
597 ; SSSE3-NEXT:    movdqu %xmm2, (%rax)
598 ; SSSE3-NEXT:    movdqu %xmm0, (%rax)
599 ; SSSE3-NEXT:    retq
601 ; SSE41-LABEL: trunc16i32_16i16:
602 ; SSE41:       # %bb.0: # %entry
603 ; SSE41-NEXT:    pxor %xmm4, %xmm4
604 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]
605 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]
606 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
607 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1],xmm3[2],xmm4[3],xmm3[4],xmm4[5],xmm3[6],xmm4[7]
608 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3],xmm2[4],xmm4[5],xmm2[6],xmm4[7]
609 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
610 ; SSE41-NEXT:    movdqu %xmm2, (%rax)
611 ; SSE41-NEXT:    movdqu %xmm0, (%rax)
612 ; SSE41-NEXT:    retq
614 ; AVX1-LABEL: trunc16i32_16i16:
615 ; AVX1:       # %bb.0: # %entry
616 ; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
617 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
618 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
619 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
620 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
621 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
622 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
623 ; AVX1-NEXT:    vmovdqu %xmm1, (%rax)
624 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
625 ; AVX1-NEXT:    vzeroupper
626 ; AVX1-NEXT:    retq
628 ; AVX2-LABEL: trunc16i32_16i16:
629 ; AVX2:       # %bb.0: # %entry
630 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
631 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7],ymm1[8],ymm2[9],ymm1[10],ymm2[11],ymm1[12],ymm2[13],ymm1[14],ymm2[15]
632 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1],ymm0[2],ymm2[3],ymm0[4],ymm2[5],ymm0[6],ymm2[7],ymm0[8],ymm2[9],ymm0[10],ymm2[11],ymm0[12],ymm2[13],ymm0[14],ymm2[15]
633 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
634 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
635 ; AVX2-NEXT:    vmovdqu %ymm0, (%rax)
636 ; AVX2-NEXT:    vzeroupper
637 ; AVX2-NEXT:    retq
639 ; AVX512-LABEL: trunc16i32_16i16:
640 ; AVX512:       # %bb.0: # %entry
641 ; AVX512-NEXT:    vpmovdw %zmm0, (%rax)
642 ; AVX512-NEXT:    vzeroupper
643 ; AVX512-NEXT:    retq
644 entry:
645   %0 = trunc <16 x i32> %a to <16 x i16>
646   store <16 x i16> %0, ptr undef, align 4
647   ret void
650 define void @trunc16i32_16i16_ashr(<16 x i32> %a) {
651 ; SSE2-SSSE3-LABEL: trunc16i32_16i16_ashr:
652 ; SSE2-SSSE3:       # %bb.0: # %entry
653 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm1
654 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm0
655 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm0
656 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm3
657 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm2
658 ; SSE2-SSSE3-NEXT:    packssdw %xmm3, %xmm2
659 ; SSE2-SSSE3-NEXT:    movdqu %xmm2, (%rax)
660 ; SSE2-SSSE3-NEXT:    movdqu %xmm0, (%rax)
661 ; SSE2-SSSE3-NEXT:    retq
663 ; SSE41-LABEL: trunc16i32_16i16_ashr:
664 ; SSE41:       # %bb.0: # %entry
665 ; SSE41-NEXT:    psrld $16, %xmm3
666 ; SSE41-NEXT:    psrld $16, %xmm2
667 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
668 ; SSE41-NEXT:    psrld $16, %xmm1
669 ; SSE41-NEXT:    psrld $16, %xmm0
670 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
671 ; SSE41-NEXT:    movdqu %xmm2, (%rax)
672 ; SSE41-NEXT:    movdqu %xmm0, (%rax)
673 ; SSE41-NEXT:    retq
675 ; AVX1-LABEL: trunc16i32_16i16_ashr:
676 ; AVX1:       # %bb.0: # %entry
677 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
678 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
679 ; AVX1-NEXT:    vpsrld $16, %xmm1, %xmm1
680 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
681 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
682 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
683 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
684 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
685 ; AVX1-NEXT:    vmovdqu %xmm1, (%rax)
686 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
687 ; AVX1-NEXT:    vzeroupper
688 ; AVX1-NEXT:    retq
690 ; AVX2-LABEL: trunc16i32_16i16_ashr:
691 ; AVX2:       # %bb.0: # %entry
692 ; AVX2-NEXT:    vpsrld $16, %ymm1, %ymm1
693 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
694 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
695 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
696 ; AVX2-NEXT:    vmovdqu %ymm0, (%rax)
697 ; AVX2-NEXT:    vzeroupper
698 ; AVX2-NEXT:    retq
700 ; AVX512-LABEL: trunc16i32_16i16_ashr:
701 ; AVX512:       # %bb.0: # %entry
702 ; AVX512-NEXT:    vpsrld $16, %zmm0, %zmm0
703 ; AVX512-NEXT:    vpmovdw %zmm0, (%rax)
704 ; AVX512-NEXT:    vzeroupper
705 ; AVX512-NEXT:    retq
706 entry:
707   %0 = ashr <16 x i32> %a, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
708   %1 = trunc <16 x i32> %0 to <16 x i16>
709   store <16 x i16> %1, ptr undef, align 4
710   ret void
713 define void @trunc16i32_16i16_lshr(<16 x i32> %a) {
714 ; SSE2-SSSE3-LABEL: trunc16i32_16i16_lshr:
715 ; SSE2-SSSE3:       # %bb.0: # %entry
716 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm1
717 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm0
718 ; SSE2-SSSE3-NEXT:    packssdw %xmm1, %xmm0
719 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm3
720 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm2
721 ; SSE2-SSSE3-NEXT:    packssdw %xmm3, %xmm2
722 ; SSE2-SSSE3-NEXT:    movdqu %xmm2, (%rax)
723 ; SSE2-SSSE3-NEXT:    movdqu %xmm0, (%rax)
724 ; SSE2-SSSE3-NEXT:    retq
726 ; SSE41-LABEL: trunc16i32_16i16_lshr:
727 ; SSE41:       # %bb.0: # %entry
728 ; SSE41-NEXT:    psrld $16, %xmm3
729 ; SSE41-NEXT:    psrld $16, %xmm2
730 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
731 ; SSE41-NEXT:    psrld $16, %xmm1
732 ; SSE41-NEXT:    psrld $16, %xmm0
733 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
734 ; SSE41-NEXT:    movdqu %xmm2, (%rax)
735 ; SSE41-NEXT:    movdqu %xmm0, (%rax)
736 ; SSE41-NEXT:    retq
738 ; AVX1-LABEL: trunc16i32_16i16_lshr:
739 ; AVX1:       # %bb.0: # %entry
740 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
741 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
742 ; AVX1-NEXT:    vpsrld $16, %xmm1, %xmm1
743 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
744 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
745 ; AVX1-NEXT:    vpsrld $16, %xmm2, %xmm2
746 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm0
747 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
748 ; AVX1-NEXT:    vmovdqu %xmm1, (%rax)
749 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
750 ; AVX1-NEXT:    vzeroupper
751 ; AVX1-NEXT:    retq
753 ; AVX2-LABEL: trunc16i32_16i16_lshr:
754 ; AVX2:       # %bb.0: # %entry
755 ; AVX2-NEXT:    vpsrld $16, %ymm1, %ymm1
756 ; AVX2-NEXT:    vpsrld $16, %ymm0, %ymm0
757 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
758 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
759 ; AVX2-NEXT:    vmovdqu %ymm0, (%rax)
760 ; AVX2-NEXT:    vzeroupper
761 ; AVX2-NEXT:    retq
763 ; AVX512-LABEL: trunc16i32_16i16_lshr:
764 ; AVX512:       # %bb.0: # %entry
765 ; AVX512-NEXT:    vpsrld $16, %zmm0, %zmm0
766 ; AVX512-NEXT:    vpmovdw %zmm0, (%rax)
767 ; AVX512-NEXT:    vzeroupper
768 ; AVX512-NEXT:    retq
769 entry:
770   %0 = lshr <16 x i32> %a, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
771   %1 = trunc <16 x i32> %0 to <16 x i16>
772   store <16 x i16> %1, ptr undef, align 4
773   ret void
776 define void @trunc16i32_16i8(<16 x i32> %a) {
777 ; SSE2-SSSE3-LABEL: trunc16i32_16i8:
778 ; SSE2-SSSE3:       # %bb.0: # %entry
779 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
780 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm3
781 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm2
782 ; SSE2-SSSE3-NEXT:    packuswb %xmm3, %xmm2
783 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm1
784 ; SSE2-SSSE3-NEXT:    pand %xmm4, %xmm0
785 ; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0
786 ; SSE2-SSSE3-NEXT:    packuswb %xmm2, %xmm0
787 ; SSE2-SSSE3-NEXT:    movdqu %xmm0, (%rax)
788 ; SSE2-SSSE3-NEXT:    retq
790 ; SSE41-LABEL: trunc16i32_16i8:
791 ; SSE41:       # %bb.0: # %entry
792 ; SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
793 ; SSE41-NEXT:    pand %xmm4, %xmm3
794 ; SSE41-NEXT:    pand %xmm4, %xmm2
795 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
796 ; SSE41-NEXT:    pand %xmm4, %xmm1
797 ; SSE41-NEXT:    pand %xmm4, %xmm0
798 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
799 ; SSE41-NEXT:    packuswb %xmm2, %xmm0
800 ; SSE41-NEXT:    movdqu %xmm0, (%rax)
801 ; SSE41-NEXT:    retq
803 ; AVX1-LABEL: trunc16i32_16i8:
804 ; AVX1:       # %bb.0: # %entry
805 ; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
806 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
807 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
808 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
809 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
810 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
811 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
812 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
813 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
814 ; AVX1-NEXT:    vzeroupper
815 ; AVX1-NEXT:    retq
817 ; AVX2-LABEL: trunc16i32_16i8:
818 ; AVX2:       # %bb.0: # %entry
819 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
820 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
821 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
822 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
823 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
824 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
825 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
826 ; AVX2-NEXT:    vmovdqu %xmm0, (%rax)
827 ; AVX2-NEXT:    vzeroupper
828 ; AVX2-NEXT:    retq
830 ; AVX512-LABEL: trunc16i32_16i8:
831 ; AVX512:       # %bb.0: # %entry
832 ; AVX512-NEXT:    vpmovdb %zmm0, (%rax)
833 ; AVX512-NEXT:    vzeroupper
834 ; AVX512-NEXT:    retq
835 entry:
836   %0 = trunc <16 x i32> %a to <16 x i8>
837   store <16 x i8> %0, ptr undef, align 4
838   ret void
841 define void @trunc16i32_16i8_ashr(<16 x i32> %a) {
842 ; SSE2-SSSE3-LABEL: trunc16i32_16i8_ashr:
843 ; SSE2-SSSE3:       # %bb.0: # %entry
844 ; SSE2-SSSE3-NEXT:    psrld $24, %xmm1
845 ; SSE2-SSSE3-NEXT:    psrld $24, %xmm0
846 ; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0
847 ; SSE2-SSSE3-NEXT:    psrld $24, %xmm3
848 ; SSE2-SSSE3-NEXT:    psrld $24, %xmm2
849 ; SSE2-SSSE3-NEXT:    packuswb %xmm3, %xmm2
850 ; SSE2-SSSE3-NEXT:    packuswb %xmm2, %xmm0
851 ; SSE2-SSSE3-NEXT:    movdqu %xmm0, (%rax)
852 ; SSE2-SSSE3-NEXT:    retq
854 ; SSE41-LABEL: trunc16i32_16i8_ashr:
855 ; SSE41:       # %bb.0: # %entry
856 ; SSE41-NEXT:    psrld $24, %xmm1
857 ; SSE41-NEXT:    psrld $24, %xmm0
858 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
859 ; SSE41-NEXT:    psrld $24, %xmm3
860 ; SSE41-NEXT:    psrld $24, %xmm2
861 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
862 ; SSE41-NEXT:    packuswb %xmm2, %xmm0
863 ; SSE41-NEXT:    movdqu %xmm0, (%rax)
864 ; SSE41-NEXT:    retq
866 ; AVX1-LABEL: trunc16i32_16i8_ashr:
867 ; AVX1:       # %bb.0: # %entry
868 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
869 ; AVX1-NEXT:    vpsrld $24, %xmm2, %xmm2
870 ; AVX1-NEXT:    vpsrld $24, %xmm0, %xmm0
871 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
872 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
873 ; AVX1-NEXT:    vpsrld $24, %xmm2, %xmm2
874 ; AVX1-NEXT:    vpsrld $24, %xmm1, %xmm1
875 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
876 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
877 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
878 ; AVX1-NEXT:    vzeroupper
879 ; AVX1-NEXT:    retq
881 ; AVX2-LABEL: trunc16i32_16i8_ashr:
882 ; AVX2:       # %bb.0: # %entry
883 ; AVX2-NEXT:    vpsrld $24, %ymm1, %ymm1
884 ; AVX2-NEXT:    vpsrld $24, %ymm0, %ymm0
885 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
886 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
887 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
888 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
889 ; AVX2-NEXT:    vmovdqu %xmm0, (%rax)
890 ; AVX2-NEXT:    vzeroupper
891 ; AVX2-NEXT:    retq
893 ; AVX512-LABEL: trunc16i32_16i8_ashr:
894 ; AVX512:       # %bb.0: # %entry
895 ; AVX512-NEXT:    vpsrld $24, %zmm0, %zmm0
896 ; AVX512-NEXT:    vpmovdb %zmm0, (%rax)
897 ; AVX512-NEXT:    vzeroupper
898 ; AVX512-NEXT:    retq
899 entry:
900   %0 = ashr <16 x i32> %a, <i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24>
901   %1 = trunc <16 x i32> %0 to <16 x i8>
902   store <16 x i8> %1, ptr undef, align 4
903   ret void
906 define void @trunc16i32_16i8_lshr(<16 x i32> %a) {
907 ; SSE2-SSSE3-LABEL: trunc16i32_16i8_lshr:
908 ; SSE2-SSSE3:       # %bb.0: # %entry
909 ; SSE2-SSSE3-NEXT:    psrld $24, %xmm1
910 ; SSE2-SSSE3-NEXT:    psrld $24, %xmm0
911 ; SSE2-SSSE3-NEXT:    packuswb %xmm1, %xmm0
912 ; SSE2-SSSE3-NEXT:    psrld $24, %xmm3
913 ; SSE2-SSSE3-NEXT:    psrld $24, %xmm2
914 ; SSE2-SSSE3-NEXT:    packuswb %xmm3, %xmm2
915 ; SSE2-SSSE3-NEXT:    packuswb %xmm2, %xmm0
916 ; SSE2-SSSE3-NEXT:    movdqu %xmm0, (%rax)
917 ; SSE2-SSSE3-NEXT:    retq
919 ; SSE41-LABEL: trunc16i32_16i8_lshr:
920 ; SSE41:       # %bb.0: # %entry
921 ; SSE41-NEXT:    psrld $24, %xmm1
922 ; SSE41-NEXT:    psrld $24, %xmm0
923 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
924 ; SSE41-NEXT:    psrld $24, %xmm3
925 ; SSE41-NEXT:    psrld $24, %xmm2
926 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
927 ; SSE41-NEXT:    packuswb %xmm2, %xmm0
928 ; SSE41-NEXT:    movdqu %xmm0, (%rax)
929 ; SSE41-NEXT:    retq
931 ; AVX1-LABEL: trunc16i32_16i8_lshr:
932 ; AVX1:       # %bb.0: # %entry
933 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
934 ; AVX1-NEXT:    vpsrld $24, %xmm2, %xmm2
935 ; AVX1-NEXT:    vpsrld $24, %xmm0, %xmm0
936 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
937 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
938 ; AVX1-NEXT:    vpsrld $24, %xmm2, %xmm2
939 ; AVX1-NEXT:    vpsrld $24, %xmm1, %xmm1
940 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
941 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
942 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
943 ; AVX1-NEXT:    vzeroupper
944 ; AVX1-NEXT:    retq
946 ; AVX2-LABEL: trunc16i32_16i8_lshr:
947 ; AVX2:       # %bb.0: # %entry
948 ; AVX2-NEXT:    vpsrld $24, %ymm1, %ymm1
949 ; AVX2-NEXT:    vpsrld $24, %ymm0, %ymm0
950 ; AVX2-NEXT:    vpackusdw %ymm1, %ymm0, %ymm0
951 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
952 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
953 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
954 ; AVX2-NEXT:    vmovdqu %xmm0, (%rax)
955 ; AVX2-NEXT:    vzeroupper
956 ; AVX2-NEXT:    retq
958 ; AVX512-LABEL: trunc16i32_16i8_lshr:
959 ; AVX512:       # %bb.0: # %entry
960 ; AVX512-NEXT:    vpsrld $24, %zmm0, %zmm0
961 ; AVX512-NEXT:    vpmovdb %zmm0, (%rax)
962 ; AVX512-NEXT:    vzeroupper
963 ; AVX512-NEXT:    retq
964 entry:
965   %0 = lshr <16 x i32> %a, <i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24, i32 24>
966   %1 = trunc <16 x i32> %0 to <16 x i8>
967   store <16 x i8> %1, ptr undef, align 4
968   ret void
971 ;PR25684
972 define void @trunc16i16_16i8(<16 x i16> %a) {
973 ; SSE-LABEL: trunc16i16_16i8:
974 ; SSE:       # %bb.0: # %entry
975 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
976 ; SSE-NEXT:    pand %xmm2, %xmm1
977 ; SSE-NEXT:    pand %xmm2, %xmm0
978 ; SSE-NEXT:    packuswb %xmm1, %xmm0
979 ; SSE-NEXT:    movdqu %xmm0, (%rax)
980 ; SSE-NEXT:    retq
982 ; AVX1-LABEL: trunc16i16_16i8:
983 ; AVX1:       # %bb.0: # %entry
984 ; AVX1-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
985 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
986 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
987 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
988 ; AVX1-NEXT:    vzeroupper
989 ; AVX1-NEXT:    retq
991 ; AVX2-LABEL: trunc16i16_16i8:
992 ; AVX2:       # %bb.0: # %entry
993 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
994 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
995 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
996 ; AVX2-NEXT:    vmovdqu %xmm0, (%rax)
997 ; AVX2-NEXT:    vzeroupper
998 ; AVX2-NEXT:    retq
1000 ; AVX512F-LABEL: trunc16i16_16i8:
1001 ; AVX512F:       # %bb.0: # %entry
1002 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1003 ; AVX512F-NEXT:    vpmovdb %zmm0, (%rax)
1004 ; AVX512F-NEXT:    vzeroupper
1005 ; AVX512F-NEXT:    retq
1007 ; AVX512VL-LABEL: trunc16i16_16i8:
1008 ; AVX512VL:       # %bb.0: # %entry
1009 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1010 ; AVX512VL-NEXT:    vpmovdb %zmm0, (%rax)
1011 ; AVX512VL-NEXT:    vzeroupper
1012 ; AVX512VL-NEXT:    retq
1014 ; AVX512BW-LABEL: trunc16i16_16i8:
1015 ; AVX512BW:       # %bb.0: # %entry
1016 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1017 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1018 ; AVX512BW-NEXT:    vmovdqu %xmm0, (%rax)
1019 ; AVX512BW-NEXT:    vzeroupper
1020 ; AVX512BW-NEXT:    retq
1022 ; AVX512BWVL-LABEL: trunc16i16_16i8:
1023 ; AVX512BWVL:       # %bb.0: # %entry
1024 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, (%rax)
1025 ; AVX512BWVL-NEXT:    vzeroupper
1026 ; AVX512BWVL-NEXT:    retq
1027 entry:
1028   %0 = trunc <16 x i16> %a to <16 x i8>
1029   store <16 x i8> %0, ptr undef, align 4
1030   ret void
1033 define void @trunc16i16_16i8_ashr(<16 x i16> %a) {
1034 ; SSE-LABEL: trunc16i16_16i8_ashr:
1035 ; SSE:       # %bb.0: # %entry
1036 ; SSE-NEXT:    psrlw $8, %xmm1
1037 ; SSE-NEXT:    psrlw $8, %xmm0
1038 ; SSE-NEXT:    packuswb %xmm1, %xmm0
1039 ; SSE-NEXT:    movdqu %xmm0, (%rax)
1040 ; SSE-NEXT:    retq
1042 ; AVX1-LABEL: trunc16i16_16i8_ashr:
1043 ; AVX1:       # %bb.0: # %entry
1044 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1045 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
1046 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1047 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1048 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
1049 ; AVX1-NEXT:    vzeroupper
1050 ; AVX1-NEXT:    retq
1052 ; AVX2-LABEL: trunc16i16_16i8_ashr:
1053 ; AVX2:       # %bb.0: # %entry
1054 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1055 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1056 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1057 ; AVX2-NEXT:    vmovdqu %xmm0, (%rax)
1058 ; AVX2-NEXT:    vzeroupper
1059 ; AVX2-NEXT:    retq
1061 ; AVX512F-LABEL: trunc16i16_16i8_ashr:
1062 ; AVX512F:       # %bb.0: # %entry
1063 ; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0
1064 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1065 ; AVX512F-NEXT:    vpmovdb %zmm0, (%rax)
1066 ; AVX512F-NEXT:    vzeroupper
1067 ; AVX512F-NEXT:    retq
1069 ; AVX512VL-LABEL: trunc16i16_16i8_ashr:
1070 ; AVX512VL:       # %bb.0: # %entry
1071 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1072 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1073 ; AVX512VL-NEXT:    vpmovdb %zmm0, (%rax)
1074 ; AVX512VL-NEXT:    vzeroupper
1075 ; AVX512VL-NEXT:    retq
1077 ; AVX512BW-LABEL: trunc16i16_16i8_ashr:
1078 ; AVX512BW:       # %bb.0: # %entry
1079 ; AVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0
1080 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1081 ; AVX512BW-NEXT:    vmovdqu %xmm0, (%rax)
1082 ; AVX512BW-NEXT:    vzeroupper
1083 ; AVX512BW-NEXT:    retq
1085 ; AVX512BWVL-LABEL: trunc16i16_16i8_ashr:
1086 ; AVX512BWVL:       # %bb.0: # %entry
1087 ; AVX512BWVL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1088 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, (%rax)
1089 ; AVX512BWVL-NEXT:    vzeroupper
1090 ; AVX512BWVL-NEXT:    retq
1091 entry:
1092   %0 = ashr <16 x i16> %a, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1093   %1 = trunc <16 x i16> %0 to <16 x i8>
1094   store <16 x i8> %1, ptr undef, align 4
1095   ret void
1098 define void @trunc16i16_16i8_lshr(<16 x i16> %a) {
1099 ; SSE-LABEL: trunc16i16_16i8_lshr:
1100 ; SSE:       # %bb.0: # %entry
1101 ; SSE-NEXT:    psrlw $8, %xmm1
1102 ; SSE-NEXT:    psrlw $8, %xmm0
1103 ; SSE-NEXT:    packuswb %xmm1, %xmm0
1104 ; SSE-NEXT:    movdqu %xmm0, (%rax)
1105 ; SSE-NEXT:    retq
1107 ; AVX1-LABEL: trunc16i16_16i8_lshr:
1108 ; AVX1:       # %bb.0: # %entry
1109 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1110 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
1111 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1112 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1113 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
1114 ; AVX1-NEXT:    vzeroupper
1115 ; AVX1-NEXT:    retq
1117 ; AVX2-LABEL: trunc16i16_16i8_lshr:
1118 ; AVX2:       # %bb.0: # %entry
1119 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1120 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1121 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1122 ; AVX2-NEXT:    vmovdqu %xmm0, (%rax)
1123 ; AVX2-NEXT:    vzeroupper
1124 ; AVX2-NEXT:    retq
1126 ; AVX512F-LABEL: trunc16i16_16i8_lshr:
1127 ; AVX512F:       # %bb.0: # %entry
1128 ; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0
1129 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1130 ; AVX512F-NEXT:    vpmovdb %zmm0, (%rax)
1131 ; AVX512F-NEXT:    vzeroupper
1132 ; AVX512F-NEXT:    retq
1134 ; AVX512VL-LABEL: trunc16i16_16i8_lshr:
1135 ; AVX512VL:       # %bb.0: # %entry
1136 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1137 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1138 ; AVX512VL-NEXT:    vpmovdb %zmm0, (%rax)
1139 ; AVX512VL-NEXT:    vzeroupper
1140 ; AVX512VL-NEXT:    retq
1142 ; AVX512BW-LABEL: trunc16i16_16i8_lshr:
1143 ; AVX512BW:       # %bb.0: # %entry
1144 ; AVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0
1145 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1146 ; AVX512BW-NEXT:    vmovdqu %xmm0, (%rax)
1147 ; AVX512BW-NEXT:    vzeroupper
1148 ; AVX512BW-NEXT:    retq
1150 ; AVX512BWVL-LABEL: trunc16i16_16i8_lshr:
1151 ; AVX512BWVL:       # %bb.0: # %entry
1152 ; AVX512BWVL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1153 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, (%rax)
1154 ; AVX512BWVL-NEXT:    vzeroupper
1155 ; AVX512BWVL-NEXT:    retq
1156 entry:
1157   %0 = lshr <16 x i16> %a, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1158   %1 = trunc <16 x i16> %0 to <16 x i8>
1159   store <16 x i8> %1, ptr undef, align 4
1160   ret void
1163 define void @trunc32i16_32i8(<32 x i16> %a) {
1164 ; SSE-LABEL: trunc32i16_32i8:
1165 ; SSE:       # %bb.0: # %entry
1166 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
1167 ; SSE-NEXT:    pand %xmm4, %xmm1
1168 ; SSE-NEXT:    pand %xmm4, %xmm0
1169 ; SSE-NEXT:    packuswb %xmm1, %xmm0
1170 ; SSE-NEXT:    pand %xmm4, %xmm3
1171 ; SSE-NEXT:    pand %xmm4, %xmm2
1172 ; SSE-NEXT:    packuswb %xmm3, %xmm2
1173 ; SSE-NEXT:    movdqu %xmm2, (%rax)
1174 ; SSE-NEXT:    movdqu %xmm0, (%rax)
1175 ; SSE-NEXT:    retq
1177 ; AVX1-LABEL: trunc32i16_32i8:
1178 ; AVX1:       # %bb.0: # %entry
1179 ; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1180 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
1181 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1182 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
1183 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
1184 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1185 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1186 ; AVX1-NEXT:    vmovdqu %xmm1, (%rax)
1187 ; AVX1-NEXT:    vmovdqu %xmm0, (%rax)
1188 ; AVX1-NEXT:    vzeroupper
1189 ; AVX1-NEXT:    retq
1191 ; AVX2-LABEL: trunc32i16_32i8:
1192 ; AVX2:       # %bb.0: # %entry
1193 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
1194 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
1195 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
1196 ; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1197 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1198 ; AVX2-NEXT:    vmovdqu %ymm0, (%rax)
1199 ; AVX2-NEXT:    vzeroupper
1200 ; AVX2-NEXT:    retq
1202 ; AVX512F-LABEL: trunc32i16_32i8:
1203 ; AVX512F:       # %bb.0: # %entry
1204 ; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1205 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
1206 ; AVX512F-NEXT:    vpmovdb %zmm1, (%rax)
1207 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1208 ; AVX512F-NEXT:    vpmovdb %zmm0, (%rax)
1209 ; AVX512F-NEXT:    vzeroupper
1210 ; AVX512F-NEXT:    retq
1212 ; AVX512VL-LABEL: trunc32i16_32i8:
1213 ; AVX512VL:       # %bb.0: # %entry
1214 ; AVX512VL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1215 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
1216 ; AVX512VL-NEXT:    vpmovdb %zmm1, (%rax)
1217 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1218 ; AVX512VL-NEXT:    vpmovdb %zmm0, (%rax)
1219 ; AVX512VL-NEXT:    vzeroupper
1220 ; AVX512VL-NEXT:    retq
1222 ; AVX512BW-LABEL: trunc32i16_32i8:
1223 ; AVX512BW:       # %bb.0: # %entry
1224 ; AVX512BW-NEXT:    vpmovwb %zmm0, (%rax)
1225 ; AVX512BW-NEXT:    vzeroupper
1226 ; AVX512BW-NEXT:    retq
1228 ; AVX512BWVL-LABEL: trunc32i16_32i8:
1229 ; AVX512BWVL:       # %bb.0: # %entry
1230 ; AVX512BWVL-NEXT:    vpmovwb %zmm0, (%rax)
1231 ; AVX512BWVL-NEXT:    vzeroupper
1232 ; AVX512BWVL-NEXT:    retq
1233 entry:
1234   %0 = trunc <32 x i16> %a to <32 x i8>
1235   store <32 x i8> %0, ptr undef, align 4
1236   ret void
1239 define <8 x i32> @trunc2x4i64_8i32(<4 x i64> %a, <4 x i64> %b) {
1240 ; SSE-LABEL: trunc2x4i64_8i32:
1241 ; SSE:       # %bb.0: # %entry
1242 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1243 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
1244 ; SSE-NEXT:    movaps %xmm2, %xmm1
1245 ; SSE-NEXT:    retq
1247 ; AVX1-LABEL: trunc2x4i64_8i32:
1248 ; AVX1:       # %bb.0: # %entry
1249 ; AVX1-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
1250 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1251 ; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
1252 ; AVX1-NEXT:    retq
1254 ; AVX2-SLOW-LABEL: trunc2x4i64_8i32:
1255 ; AVX2-SLOW:       # %bb.0: # %entry
1256 ; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
1257 ; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1258 ; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
1259 ; AVX2-SLOW-NEXT:    retq
1261 ; AVX2-FAST-ALL-LABEL: trunc2x4i64_8i32:
1262 ; AVX2-FAST-ALL:       # %bb.0: # %entry
1263 ; AVX2-FAST-ALL-NEXT:    vmovaps {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
1264 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm0, %ymm2, %ymm0
1265 ; AVX2-FAST-ALL-NEXT:    vpermps %ymm1, %ymm2, %ymm1
1266 ; AVX2-FAST-ALL-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1267 ; AVX2-FAST-ALL-NEXT:    retq
1269 ; AVX2-FAST-PERLANE-LABEL: trunc2x4i64_8i32:
1270 ; AVX2-FAST-PERLANE:       # %bb.0: # %entry
1271 ; AVX2-FAST-PERLANE-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
1272 ; AVX2-FAST-PERLANE-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1273 ; AVX2-FAST-PERLANE-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
1274 ; AVX2-FAST-PERLANE-NEXT:    retq
1276 ; AVX512-LABEL: trunc2x4i64_8i32:
1277 ; AVX512:       # %bb.0: # %entry
1278 ; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1279 ; AVX512-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1280 ; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
1281 ; AVX512-NEXT:    retq
1282 entry:
1283   %0 = trunc <4 x i64> %a to <4 x i32>
1284   %1 = trunc <4 x i64> %b to <4 x i32>
1285   %2 = shufflevector <4 x i32> %0, <4 x i32> %1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1286   ret <8 x i32> %2
1289 define <8 x i16> @trunc2x4i64_8i16(<4 x i64> %a, <4 x i64> %b) {
1290 ; SSE2-SSSE3-LABEL: trunc2x4i64_8i16:
1291 ; SSE2-SSSE3:       # %bb.0: # %entry
1292 ; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1293 ; SSE2-SSSE3-NEXT:    pslld $16, %xmm0
1294 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm0
1295 ; SSE2-SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
1296 ; SSE2-SSSE3-NEXT:    pslld $16, %xmm2
1297 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm2
1298 ; SSE2-SSSE3-NEXT:    packssdw %xmm2, %xmm0
1299 ; SSE2-SSSE3-NEXT:    retq
1301 ; SSE41-LABEL: trunc2x4i64_8i16:
1302 ; SSE41:       # %bb.0: # %entry
1303 ; SSE41-NEXT:    pxor %xmm4, %xmm4
1304 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]
1305 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]
1306 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
1307 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]
1308 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]
1309 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
1310 ; SSE41-NEXT:    packusdw %xmm2, %xmm0
1311 ; SSE41-NEXT:    retq
1313 ; AVX1-LABEL: trunc2x4i64_8i16:
1314 ; AVX1:       # %bb.0: # %entry
1315 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1316 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1317 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]
1318 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7]
1319 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
1320 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1321 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]
1322 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7]
1323 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1324 ; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1325 ; AVX1-NEXT:    vzeroupper
1326 ; AVX1-NEXT:    retq
1328 ; AVX2-LABEL: trunc2x4i64_8i16:
1329 ; AVX2:       # %bb.0: # %entry
1330 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1331 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm1 = ymm1[0],ymm2[1,2,3],ymm1[4],ymm2[5,6,7],ymm1[8],ymm2[9,10,11],ymm1[12],ymm2[13,14,15]
1332 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
1333 ; AVX2-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1334 ; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3],ymm0[4],ymm2[5,6,7],ymm0[8],ymm2[9,10,11],ymm0[12],ymm2[13,14,15]
1335 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1336 ; AVX2-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1337 ; AVX2-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1338 ; AVX2-NEXT:    vzeroupper
1339 ; AVX2-NEXT:    retq
1341 ; AVX512F-LABEL: trunc2x4i64_8i16:
1342 ; AVX512F:       # %bb.0: # %entry
1343 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1344 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1345 ; AVX512F-NEXT:    vpmovqw %zmm0, %xmm0
1346 ; AVX512F-NEXT:    vpmovqw %zmm1, %xmm1
1347 ; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1348 ; AVX512F-NEXT:    vzeroupper
1349 ; AVX512F-NEXT:    retq
1351 ; AVX512VL-LABEL: trunc2x4i64_8i16:
1352 ; AVX512VL:       # %bb.0: # %entry
1353 ; AVX512VL-NEXT:    vpmovqw %ymm0, %xmm0
1354 ; AVX512VL-NEXT:    vpmovqw %ymm1, %xmm1
1355 ; AVX512VL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1356 ; AVX512VL-NEXT:    vzeroupper
1357 ; AVX512VL-NEXT:    retq
1359 ; AVX512BW-LABEL: trunc2x4i64_8i16:
1360 ; AVX512BW:       # %bb.0: # %entry
1361 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1362 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1363 ; AVX512BW-NEXT:    vpmovqw %zmm0, %xmm0
1364 ; AVX512BW-NEXT:    vpmovqw %zmm1, %xmm1
1365 ; AVX512BW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1366 ; AVX512BW-NEXT:    vzeroupper
1367 ; AVX512BW-NEXT:    retq
1369 ; AVX512BWVL-LABEL: trunc2x4i64_8i16:
1370 ; AVX512BWVL:       # %bb.0: # %entry
1371 ; AVX512BWVL-NEXT:    vpmovqw %ymm0, %xmm0
1372 ; AVX512BWVL-NEXT:    vpmovqw %ymm1, %xmm1
1373 ; AVX512BWVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1374 ; AVX512BWVL-NEXT:    vzeroupper
1375 ; AVX512BWVL-NEXT:    retq
1376 entry:
1377   %0 = trunc <4 x i64> %a to <4 x i16>
1378   %1 = trunc <4 x i64> %b to <4 x i16>
1379   %2 = shufflevector <4 x i16> %0, <4 x i16> %1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1380   ret <8 x i16> %2
1383 define <4 x i32> @trunc2x2i64_4i32(<2 x i64> %a, <2 x i64> %b) {
1384 ; SSE-LABEL: trunc2x2i64_4i32:
1385 ; SSE:       # %bb.0: # %entry
1386 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1387 ; SSE-NEXT:    retq
1389 ; AVX-LABEL: trunc2x2i64_4i32:
1390 ; AVX:       # %bb.0: # %entry
1391 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1392 ; AVX-NEXT:    retq
1394 ; AVX512F-LABEL: trunc2x2i64_4i32:
1395 ; AVX512F:       # %bb.0: # %entry
1396 ; AVX512F-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1397 ; AVX512F-NEXT:    retq
1399 ; AVX512VL-LABEL: trunc2x2i64_4i32:
1400 ; AVX512VL:       # %bb.0: # %entry
1401 ; AVX512VL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1402 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1403 ; AVX512VL-NEXT:    vpmovqd %ymm0, %xmm0
1404 ; AVX512VL-NEXT:    vzeroupper
1405 ; AVX512VL-NEXT:    retq
1407 ; AVX512BW-LABEL: trunc2x2i64_4i32:
1408 ; AVX512BW:       # %bb.0: # %entry
1409 ; AVX512BW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1410 ; AVX512BW-NEXT:    retq
1412 ; AVX512BWVL-LABEL: trunc2x2i64_4i32:
1413 ; AVX512BWVL:       # %bb.0: # %entry
1414 ; AVX512BWVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1415 ; AVX512BWVL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1416 ; AVX512BWVL-NEXT:    vpmovqd %ymm0, %xmm0
1417 ; AVX512BWVL-NEXT:    vzeroupper
1418 ; AVX512BWVL-NEXT:    retq
1419 entry:
1420   %0 = trunc <2 x i64> %a to <2 x i32>
1421   %1 = trunc <2 x i64> %b to <2 x i32>
1422   %2 = shufflevector <2 x i32> %0, <2 x i32> %1, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
1423   ret <4 x i32> %2
1426 define i64 @trunc2i64_i64(<2 x i64> %inval) {
1427 ; SSE-LABEL: trunc2i64_i64:
1428 ; SSE:       # %bb.0: # %entry
1429 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1430 ; SSE-NEXT:    movq %xmm0, %rax
1431 ; SSE-NEXT:    retq
1433 ; AVX-LABEL: trunc2i64_i64:
1434 ; AVX:       # %bb.0: # %entry
1435 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1436 ; AVX-NEXT:    vmovq %xmm0, %rax
1437 ; AVX-NEXT:    retq
1439 ; AVX512-LABEL: trunc2i64_i64:
1440 ; AVX512:       # %bb.0: # %entry
1441 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1442 ; AVX512-NEXT:    vmovq %xmm0, %rax
1443 ; AVX512-NEXT:    retq
1444 entry:
1445   %0 = trunc <2 x i64> %inval to <2 x i32>
1446   %1 = bitcast <2 x i32> %0 to i64
1447   ret i64 %1
1450 define <8 x i16> @trunc2x4i32_8i16(<4 x i32> %a, <4 x i32> %b) {
1451 ; SSE2-LABEL: trunc2x4i32_8i16:
1452 ; SSE2:       # %bb.0: # %entry
1453 ; SSE2-NEXT:    pslld $16, %xmm1
1454 ; SSE2-NEXT:    psrad $16, %xmm1
1455 ; SSE2-NEXT:    pslld $16, %xmm0
1456 ; SSE2-NEXT:    psrad $16, %xmm0
1457 ; SSE2-NEXT:    packssdw %xmm1, %xmm0
1458 ; SSE2-NEXT:    retq
1460 ; SSSE3-LABEL: trunc2x4i32_8i16:
1461 ; SSSE3:       # %bb.0: # %entry
1462 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1463 ; SSSE3-NEXT:    pshufb %xmm2, %xmm1
1464 ; SSSE3-NEXT:    pshufb %xmm2, %xmm0
1465 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1466 ; SSSE3-NEXT:    retq
1468 ; SSE41-LABEL: trunc2x4i32_8i16:
1469 ; SSE41:       # %bb.0: # %entry
1470 ; SSE41-NEXT:    pxor %xmm2, %xmm2
1471 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
1472 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
1473 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
1474 ; SSE41-NEXT:    retq
1476 ; AVX-LABEL: trunc2x4i32_8i16:
1477 ; AVX:       # %bb.0: # %entry
1478 ; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1479 ; AVX-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
1480 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
1481 ; AVX-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1482 ; AVX-NEXT:    retq
1484 ; AVX512F-LABEL: trunc2x4i32_8i16:
1485 ; AVX512F:       # %bb.0: # %entry
1486 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1487 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1488 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
1489 ; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1490 ; AVX512F-NEXT:    vzeroupper
1491 ; AVX512F-NEXT:    retq
1493 ; AVX512VL-LABEL: trunc2x4i32_8i16:
1494 ; AVX512VL:       # %bb.0: # %entry
1495 ; AVX512VL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1496 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1497 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
1498 ; AVX512VL-NEXT:    vzeroupper
1499 ; AVX512VL-NEXT:    retq
1501 ; AVX512BW-LABEL: trunc2x4i32_8i16:
1502 ; AVX512BW:       # %bb.0: # %entry
1503 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1504 ; AVX512BW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1505 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
1506 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1507 ; AVX512BW-NEXT:    vzeroupper
1508 ; AVX512BW-NEXT:    retq
1510 ; AVX512BWVL-LABEL: trunc2x4i32_8i16:
1511 ; AVX512BWVL:       # %bb.0: # %entry
1512 ; AVX512BWVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1513 ; AVX512BWVL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1514 ; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0
1515 ; AVX512BWVL-NEXT:    vzeroupper
1516 ; AVX512BWVL-NEXT:    retq
1517 entry:
1518   %0 = trunc <4 x i32> %a to <4 x i16>
1519   %1 = trunc <4 x i32> %b to <4 x i16>
1520   %2 = shufflevector <4 x i16> %0, <4 x i16> %1, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1521   ret <8 x i16> %2
1524 ; PR15524 http://llvm.org/bugs/show_bug.cgi?id=15524
1525 define i64 @trunc4i32_i64(<4 x i32> %inval) {
1526 ; SSE2-LABEL: trunc4i32_i64:
1527 ; SSE2:       # %bb.0: # %entry
1528 ; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1529 ; SSE2-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
1530 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1531 ; SSE2-NEXT:    movq %xmm0, %rax
1532 ; SSE2-NEXT:    retq
1534 ; SSSE3-LABEL: trunc4i32_i64:
1535 ; SSSE3:       # %bb.0: # %entry
1536 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]
1537 ; SSSE3-NEXT:    movq %xmm0, %rax
1538 ; SSSE3-NEXT:    retq
1540 ; SSE41-LABEL: trunc4i32_i64:
1541 ; SSE41:       # %bb.0: # %entry
1542 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]
1543 ; SSE41-NEXT:    movq %xmm0, %rax
1544 ; SSE41-NEXT:    retq
1546 ; AVX-LABEL: trunc4i32_i64:
1547 ; AVX:       # %bb.0: # %entry
1548 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]
1549 ; AVX-NEXT:    vmovq %xmm0, %rax
1550 ; AVX-NEXT:    retq
1552 ; AVX512F-LABEL: trunc4i32_i64:
1553 ; AVX512F:       # %bb.0: # %entry
1554 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]
1555 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1556 ; AVX512F-NEXT:    retq
1558 ; AVX512VL-LABEL: trunc4i32_i64:
1559 ; AVX512VL:       # %bb.0: # %entry
1560 ; AVX512VL-NEXT:    vpmovdw %xmm0, %xmm0
1561 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1562 ; AVX512VL-NEXT:    retq
1564 ; AVX512BW-LABEL: trunc4i32_i64:
1565 ; AVX512BW:       # %bb.0: # %entry
1566 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u]
1567 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
1568 ; AVX512BW-NEXT:    retq
1570 ; AVX512BWVL-LABEL: trunc4i32_i64:
1571 ; AVX512BWVL:       # %bb.0: # %entry
1572 ; AVX512BWVL-NEXT:    vpmovdw %xmm0, %xmm0
1573 ; AVX512BWVL-NEXT:    vmovq %xmm0, %rax
1574 ; AVX512BWVL-NEXT:    retq
1575 entry:
1576   %0 = trunc <4 x i32> %inval to <4 x i16>
1577   %1 = bitcast <4 x i16> %0 to i64
1578   ret i64 %1
1581 define <32 x i8> @trunc2x16i16_32i8(<16 x i16> %a, <16 x i16> %b) {
1582 ; SSE-LABEL: trunc2x16i16_32i8:
1583 ; SSE:       # %bb.0: # %entry
1584 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
1585 ; SSE-NEXT:    pand %xmm4, %xmm1
1586 ; SSE-NEXT:    pand %xmm4, %xmm0
1587 ; SSE-NEXT:    packuswb %xmm1, %xmm0
1588 ; SSE-NEXT:    pand %xmm4, %xmm3
1589 ; SSE-NEXT:    pand %xmm2, %xmm4
1590 ; SSE-NEXT:    packuswb %xmm3, %xmm4
1591 ; SSE-NEXT:    movdqa %xmm4, %xmm1
1592 ; SSE-NEXT:    retq
1594 ; AVX1-LABEL: trunc2x16i16_32i8:
1595 ; AVX1:       # %bb.0: # %entry
1596 ; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1597 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
1598 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1599 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
1600 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
1601 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1602 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1603 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1604 ; AVX1-NEXT:    retq
1606 ; AVX2-LABEL: trunc2x16i16_32i8:
1607 ; AVX2:       # %bb.0: # %entry
1608 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1609 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
1610 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
1611 ; AVX2-NEXT:    vpackuswb %ymm1, %ymm0, %ymm0
1612 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
1613 ; AVX2-NEXT:    retq
1615 ; AVX512F-LABEL: trunc2x16i16_32i8:
1616 ; AVX512F:       # %bb.0: # %entry
1617 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1618 ; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
1619 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
1620 ; AVX512F-NEXT:    vpmovdb %zmm1, %xmm1
1621 ; AVX512F-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1622 ; AVX512F-NEXT:    retq
1624 ; AVX512VL-LABEL: trunc2x16i16_32i8:
1625 ; AVX512VL:       # %bb.0: # %entry
1626 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1627 ; AVX512VL-NEXT:    vpmovdb %zmm0, %xmm0
1628 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
1629 ; AVX512VL-NEXT:    vpmovdb %zmm1, %xmm1
1630 ; AVX512VL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1631 ; AVX512VL-NEXT:    retq
1633 ; AVX512BW-LABEL: trunc2x16i16_32i8:
1634 ; AVX512BW:       # %bb.0: # %entry
1635 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1636 ; AVX512BW-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1637 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1638 ; AVX512BW-NEXT:    retq
1640 ; AVX512BWVL-LABEL: trunc2x16i16_32i8:
1641 ; AVX512BWVL:       # %bb.0: # %entry
1642 ; AVX512BWVL-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1643 ; AVX512BWVL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1644 ; AVX512BWVL-NEXT:    vpmovwb %zmm0, %ymm0
1645 ; AVX512BWVL-NEXT:    retq
1646 entry:
1647   %0 = trunc <16 x i16> %a to <16 x i8>
1648   %1 = trunc <16 x i16> %b to <16 x i8>
1649   %2 = shufflevector <16 x i8> %0, <16 x i8> %1, <32 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, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
1650   ret <32 x i8> %2
1653 define <16 x i8> @trunc2x8i16_16i8(<8 x i16> %a, <8 x i16> %b) {
1654 ; SSE-LABEL: trunc2x8i16_16i8:
1655 ; SSE:       # %bb.0: # %entry
1656 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1657 ; SSE-NEXT:    pand %xmm2, %xmm1
1658 ; SSE-NEXT:    pand %xmm2, %xmm0
1659 ; SSE-NEXT:    packuswb %xmm1, %xmm0
1660 ; SSE-NEXT:    retq
1662 ; AVX1-LABEL: trunc2x8i16_16i8:
1663 ; AVX1:       # %bb.0: # %entry
1664 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1665 ; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
1666 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
1667 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1668 ; AVX1-NEXT:    retq
1670 ; AVX2-LABEL: trunc2x8i16_16i8:
1671 ; AVX2:       # %bb.0: # %entry
1672 ; AVX2-NEXT:    vpbroadcastw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1673 ; AVX2-NEXT:    vpand %xmm2, %xmm1, %xmm1
1674 ; AVX2-NEXT:    vpand %xmm2, %xmm0, %xmm0
1675 ; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1676 ; AVX2-NEXT:    retq
1678 ; AVX512F-LABEL: trunc2x8i16_16i8:
1679 ; AVX512F:       # %bb.0: # %entry
1680 ; AVX512F-NEXT:    vpbroadcastw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1681 ; AVX512F-NEXT:    vpand %xmm2, %xmm1, %xmm1
1682 ; AVX512F-NEXT:    vpand %xmm2, %xmm0, %xmm0
1683 ; AVX512F-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1684 ; AVX512F-NEXT:    retq
1686 ; AVX512VL-LABEL: trunc2x8i16_16i8:
1687 ; AVX512VL:       # %bb.0: # %entry
1688 ; AVX512VL-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1689 ; AVX512VL-NEXT:    vpand %xmm2, %xmm1, %xmm1
1690 ; AVX512VL-NEXT:    vpand %xmm2, %xmm0, %xmm0
1691 ; AVX512VL-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1692 ; AVX512VL-NEXT:    retq
1694 ; AVX512BW-LABEL: trunc2x8i16_16i8:
1695 ; AVX512BW:       # %bb.0: # %entry
1696 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1697 ; AVX512BW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1698 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1699 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1700 ; AVX512BW-NEXT:    vzeroupper
1701 ; AVX512BW-NEXT:    retq
1703 ; AVX512BWVL-LABEL: trunc2x8i16_16i8:
1704 ; AVX512BWVL:       # %bb.0: # %entry
1705 ; AVX512BWVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0
1706 ; AVX512BWVL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1707 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, %xmm0
1708 ; AVX512BWVL-NEXT:    vzeroupper
1709 ; AVX512BWVL-NEXT:    retq
1710 entry:
1711   %0 = trunc <8 x i16> %a to <8 x i8>
1712   %1 = trunc <8 x i16> %b to <8 x i8>
1713   %2 = shufflevector <8 x i8> %0, <8 x i8> %1, <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>
1714   ret <16 x i8> %2
1717 ; PR15524 http://llvm.org/bugs/show_bug.cgi?id=15524
1718 define i64 @trunc8i16_i64(<8 x i16> %inval) {
1719 ; SSE2-LABEL: trunc8i16_i64:
1720 ; SSE2:       # %bb.0: # %entry
1721 ; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1722 ; SSE2-NEXT:    packuswb %xmm0, %xmm0
1723 ; SSE2-NEXT:    movq %xmm0, %rax
1724 ; SSE2-NEXT:    retq
1726 ; SSSE3-LABEL: trunc8i16_i64:
1727 ; SSSE3:       # %bb.0: # %entry
1728 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1729 ; SSSE3-NEXT:    movq %xmm0, %rax
1730 ; SSSE3-NEXT:    retq
1732 ; SSE41-LABEL: trunc8i16_i64:
1733 ; SSE41:       # %bb.0: # %entry
1734 ; SSE41-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1735 ; SSE41-NEXT:    movq %xmm0, %rax
1736 ; SSE41-NEXT:    retq
1738 ; AVX-LABEL: trunc8i16_i64:
1739 ; AVX:       # %bb.0: # %entry
1740 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1741 ; AVX-NEXT:    vmovq %xmm0, %rax
1742 ; AVX-NEXT:    retq
1744 ; AVX512F-LABEL: trunc8i16_i64:
1745 ; AVX512F:       # %bb.0: # %entry
1746 ; AVX512F-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1747 ; AVX512F-NEXT:    vmovq %xmm0, %rax
1748 ; AVX512F-NEXT:    retq
1750 ; AVX512VL-LABEL: trunc8i16_i64:
1751 ; AVX512VL:       # %bb.0: # %entry
1752 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1753 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
1754 ; AVX512VL-NEXT:    retq
1756 ; AVX512BW-LABEL: trunc8i16_i64:
1757 ; AVX512BW:       # %bb.0: # %entry
1758 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
1759 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
1760 ; AVX512BW-NEXT:    retq
1762 ; AVX512BWVL-LABEL: trunc8i16_i64:
1763 ; AVX512BWVL:       # %bb.0: # %entry
1764 ; AVX512BWVL-NEXT:    vpmovwb %xmm0, %xmm0
1765 ; AVX512BWVL-NEXT:    vmovq %xmm0, %rax
1766 ; AVX512BWVL-NEXT:    retq
1767 entry:
1768   %0 = trunc <8 x i16> %inval to <8 x i8>
1769   %1 = bitcast <8 x i8> %0 to i64
1770   ret i64 %1
1773 define <16 x i8> @trunc16i64_16i8_const() {
1774 ; SSE-LABEL: trunc16i64_16i8_const:
1775 ; SSE:       # %bb.0: # %entry
1776 ; SSE-NEXT:    xorps %xmm0, %xmm0
1777 ; SSE-NEXT:    retq
1779 ; AVX-LABEL: trunc16i64_16i8_const:
1780 ; AVX:       # %bb.0: # %entry
1781 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1782 ; AVX-NEXT:    retq
1784 ; AVX512-LABEL: trunc16i64_16i8_const:
1785 ; AVX512:       # %bb.0: # %entry
1786 ; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1787 ; AVX512-NEXT:    retq
1789 entry:
1790   %0 = trunc <16 x i64> zeroinitializer to <16 x i8>
1791   %1 = shufflevector <16 x i8> %0, <16 x i8> %0, <16 x i32> <i32 28, i32 30, i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 undef, i32 14, i32 16, i32 18, i32 20, i32 22, i32 24, i32 26>
1792   ret <16 x i8> %1
1795 define <8 x i16> @PR32160(<8 x i32> %x) {
1796 ; SSE-LABEL: PR32160:
1797 ; SSE:       # %bb.0:
1798 ; SSE-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
1799 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,2,2]
1800 ; SSE-NEXT:    retq
1802 ; AVX-LABEL: PR32160:
1803 ; AVX:       # %bb.0:
1804 ; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[8,9,8,9,8,9,8,9,8,9,8,9,8,9,8,9]
1805 ; AVX-NEXT:    vzeroupper
1806 ; AVX-NEXT:    retq
1808 ; AVX512F-LABEL: PR32160:
1809 ; AVX512F:       # %bb.0:
1810 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1811 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
1812 ; AVX512F-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[2,2,2,2,4,5,6,7]
1813 ; AVX512F-NEXT:    vpbroadcastd %xmm0, %xmm0
1814 ; AVX512F-NEXT:    vzeroupper
1815 ; AVX512F-NEXT:    retq
1817 ; AVX512VL-LABEL: PR32160:
1818 ; AVX512VL:       # %bb.0:
1819 ; AVX512VL-NEXT:    vpmovdw %ymm0, %xmm0
1820 ; AVX512VL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5]
1821 ; AVX512VL-NEXT:    vzeroupper
1822 ; AVX512VL-NEXT:    retq
1824 ; AVX512BW-LABEL: PR32160:
1825 ; AVX512BW:       # %bb.0:
1826 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1827 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
1828 ; AVX512BW-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5]
1829 ; AVX512BW-NEXT:    vzeroupper
1830 ; AVX512BW-NEXT:    retq
1832 ; AVX512BWVL-LABEL: PR32160:
1833 ; AVX512BWVL:       # %bb.0:
1834 ; AVX512BWVL-NEXT:    vpmovdw %ymm0, %xmm0
1835 ; AVX512BWVL-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5]
1836 ; AVX512BWVL-NEXT:    vzeroupper
1837 ; AVX512BWVL-NEXT:    retq
1838   %shuf = trunc <8 x i32> %x to <8 x i16>
1839   %trunc = shufflevector <8 x i16> %shuf, <8 x i16> undef, <8 x i32> <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2>
1840   ret <8 x i16> %trunc
1843 define void @PR34773(ptr %a0, ptr %a1) {
1844 ; SSE-LABEL: PR34773:
1845 ; SSE:       # %bb.0:
1846 ; SSE-NEXT:    movdqu (%rdi), %xmm0
1847 ; SSE-NEXT:    movdqu 16(%rdi), %xmm1
1848 ; SSE-NEXT:    movdqu 32(%rdi), %xmm2
1849 ; SSE-NEXT:    movdqu 48(%rdi), %xmm3
1850 ; SSE-NEXT:    psrlw $8, %xmm1
1851 ; SSE-NEXT:    psrlw $8, %xmm0
1852 ; SSE-NEXT:    packuswb %xmm1, %xmm0
1853 ; SSE-NEXT:    psrlw $8, %xmm3
1854 ; SSE-NEXT:    psrlw $8, %xmm2
1855 ; SSE-NEXT:    packuswb %xmm3, %xmm2
1856 ; SSE-NEXT:    movdqu %xmm0, (%rsi)
1857 ; SSE-NEXT:    movdqu %xmm2, 16(%rsi)
1858 ; SSE-NEXT:    retq
1860 ; AVX1-LABEL: PR34773:
1861 ; AVX1:       # %bb.0:
1862 ; AVX1-NEXT:    vmovdqu (%rdi), %xmm0
1863 ; AVX1-NEXT:    vmovdqu 16(%rdi), %xmm1
1864 ; AVX1-NEXT:    vmovdqu 32(%rdi), %xmm2
1865 ; AVX1-NEXT:    vmovdqu 48(%rdi), %xmm3
1866 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
1867 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
1868 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1869 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm1
1870 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
1871 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
1872 ; AVX1-NEXT:    vmovdqu %xmm0, (%rsi)
1873 ; AVX1-NEXT:    vmovdqu %xmm1, 16(%rsi)
1874 ; AVX1-NEXT:    retq
1876 ; AVX2-LABEL: PR34773:
1877 ; AVX2:       # %bb.0:
1878 ; AVX2-NEXT:    vmovdqu (%rdi), %ymm0
1879 ; AVX2-NEXT:    vmovdqu 32(%rdi), %ymm1
1880 ; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm0
1881 ; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm1
1882 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1883 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1884 ; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1885 ; AVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1886 ; AVX2-NEXT:    vmovdqu %xmm0, (%rsi)
1887 ; AVX2-NEXT:    vmovdqu %xmm1, 16(%rsi)
1888 ; AVX2-NEXT:    vzeroupper
1889 ; AVX2-NEXT:    retq
1891 ; AVX512F-LABEL: PR34773:
1892 ; AVX512F:       # %bb.0:
1893 ; AVX512F-NEXT:    vmovdqu (%rdi), %ymm0
1894 ; AVX512F-NEXT:    vmovdqu 32(%rdi), %ymm1
1895 ; AVX512F-NEXT:    vpsrlw $8, %ymm0, %ymm0
1896 ; AVX512F-NEXT:    vpsrlw $8, %ymm1, %ymm1
1897 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1898 ; AVX512F-NEXT:    vpmovdb %zmm0, (%rsi)
1899 ; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
1900 ; AVX512F-NEXT:    vpmovdb %zmm0, 16(%rsi)
1901 ; AVX512F-NEXT:    vzeroupper
1902 ; AVX512F-NEXT:    retq
1904 ; AVX512VL-LABEL: PR34773:
1905 ; AVX512VL:       # %bb.0:
1906 ; AVX512VL-NEXT:    vmovdqu (%rdi), %ymm0
1907 ; AVX512VL-NEXT:    vmovdqu 32(%rdi), %ymm1
1908 ; AVX512VL-NEXT:    vpsrlw $8, %ymm0, %ymm0
1909 ; AVX512VL-NEXT:    vpsrlw $8, %ymm1, %ymm1
1910 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1911 ; AVX512VL-NEXT:    vpmovdb %zmm0, (%rsi)
1912 ; AVX512VL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
1913 ; AVX512VL-NEXT:    vpmovdb %zmm0, 16(%rsi)
1914 ; AVX512VL-NEXT:    vzeroupper
1915 ; AVX512VL-NEXT:    retq
1917 ; AVX512BW-LABEL: PR34773:
1918 ; AVX512BW:       # %bb.0:
1919 ; AVX512BW-NEXT:    vmovdqu (%rdi), %ymm0
1920 ; AVX512BW-NEXT:    vmovdqu 32(%rdi), %ymm1
1921 ; AVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0
1922 ; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
1923 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1924 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
1925 ; AVX512BW-NEXT:    vmovdqu %xmm0, (%rsi)
1926 ; AVX512BW-NEXT:    vmovdqu %xmm1, 16(%rsi)
1927 ; AVX512BW-NEXT:    vzeroupper
1928 ; AVX512BW-NEXT:    retq
1930 ; AVX512BWVL-LABEL: PR34773:
1931 ; AVX512BWVL:       # %bb.0:
1932 ; AVX512BWVL-NEXT:    vpsrlw $8, (%rdi), %ymm0
1933 ; AVX512BWVL-NEXT:    vpsrlw $8, 32(%rdi), %ymm1
1934 ; AVX512BWVL-NEXT:    vpmovwb %ymm0, (%rsi)
1935 ; AVX512BWVL-NEXT:    vpmovwb %ymm1, 16(%rsi)
1936 ; AVX512BWVL-NEXT:    vzeroupper
1937 ; AVX512BWVL-NEXT:    retq
1938   %1  = getelementptr i16, ptr %a0, i64 16
1939   %2  = getelementptr i8, ptr %a1, i64 16
1940   %3  = load <16 x i16>, ptr %a0, align 2
1941   %4  = load <16 x i16>, ptr %1, align 2
1942   %5  = lshr <16 x i16> %3, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1943   %6 = lshr <16 x i16> %4, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
1944   %7 = trunc <16 x i16> %5  to <16 x i8>
1945   %8 = trunc <16 x i16> %6 to <16 x i8>
1946   store <16 x i8> %7, ptr %a1, align 1
1947   store <16 x i8> %8, ptr %2, align 1
1948   ret void
1951 define i16 @PR66194(i8 %q) {
1952 ; SSE2-SSSE3-LABEL: PR66194:
1953 ; SSE2-SSSE3:       # %bb.0: # %entry
1954 ; SSE2-SSSE3-NEXT:    xorl %eax, %eax
1955 ; SSE2-SSSE3-NEXT:    xorl %ecx, %ecx
1956 ; SSE2-SSSE3-NEXT:    testb %dil, %dil
1957 ; SSE2-SSSE3-NEXT:    setne %al
1958 ; SSE2-SSSE3-NEXT:    sete %cl
1959 ; SSE2-SSSE3-NEXT:    movl %ecx, %edx
1960 ; SSE2-SSSE3-NEXT:    shll $16, %edx
1961 ; SSE2-SSSE3-NEXT:    orl %eax, %edx
1962 ; SSE2-SSSE3-NEXT:    movd %edx, %xmm0
1963 ; SSE2-SSSE3-NEXT:    pinsrw $2, %eax, %xmm0
1964 ; SSE2-SSSE3-NEXT:    pinsrw $3, %eax, %xmm0
1965 ; SSE2-SSSE3-NEXT:    pinsrw $4, %ecx, %xmm0
1966 ; SSE2-SSSE3-NEXT:    pinsrw $5, %eax, %xmm0
1967 ; SSE2-SSSE3-NEXT:    pinsrw $6, %eax, %xmm0
1968 ; SSE2-SSSE3-NEXT:    pinsrw $7, %ecx, %xmm0
1969 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
1970 ; SSE2-SSSE3-NEXT:    psubw %xmm1, %xmm0
1971 ; SSE2-SSSE3-NEXT:    packuswb %xmm0, %xmm0
1972 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm1
1973 ; SSE2-SSSE3-NEXT:    psadbw %xmm0, %xmm1
1974 ; SSE2-SSSE3-NEXT:    movd %xmm1, %eax
1975 ; SSE2-SSSE3-NEXT:    # kill: def $ax killed $ax killed $eax
1976 ; SSE2-SSSE3-NEXT:    retq
1978 ; SSE41-LABEL: PR66194:
1979 ; SSE41:       # %bb.0: # %entry
1980 ; SSE41-NEXT:    xorl %eax, %eax
1981 ; SSE41-NEXT:    xorl %ecx, %ecx
1982 ; SSE41-NEXT:    testb %dil, %dil
1983 ; SSE41-NEXT:    setne %al
1984 ; SSE41-NEXT:    sete %cl
1985 ; SSE41-NEXT:    movd %eax, %xmm0
1986 ; SSE41-NEXT:    pinsrb $2, %ecx, %xmm0
1987 ; SSE41-NEXT:    pinsrb $4, %eax, %xmm0
1988 ; SSE41-NEXT:    pinsrb $6, %eax, %xmm0
1989 ; SSE41-NEXT:    pinsrb $8, %ecx, %xmm0
1990 ; SSE41-NEXT:    pinsrb $10, %eax, %xmm0
1991 ; SSE41-NEXT:    pinsrb $12, %eax, %xmm0
1992 ; SSE41-NEXT:    pinsrb $14, %ecx, %xmm0
1993 ; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
1994 ; SSE41-NEXT:    psubw %xmm1, %xmm0
1995 ; SSE41-NEXT:    packuswb %xmm0, %xmm0
1996 ; SSE41-NEXT:    pxor %xmm1, %xmm1
1997 ; SSE41-NEXT:    psadbw %xmm0, %xmm1
1998 ; SSE41-NEXT:    movd %xmm1, %eax
1999 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
2000 ; SSE41-NEXT:    retq
2002 ; AVX1-LABEL: PR66194:
2003 ; AVX1:       # %bb.0: # %entry
2004 ; AVX1-NEXT:    xorl %eax, %eax
2005 ; AVX1-NEXT:    testb %dil, %dil
2006 ; AVX1-NEXT:    setne %al
2007 ; AVX1-NEXT:    sete %cl
2008 ; AVX1-NEXT:    vmovd %eax, %xmm0
2009 ; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm0, %xmm0
2010 ; AVX1-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
2011 ; AVX1-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
2012 ; AVX1-NEXT:    vpinsrb $8, %ecx, %xmm0, %xmm0
2013 ; AVX1-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
2014 ; AVX1-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
2015 ; AVX1-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
2016 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
2017 ; AVX1-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
2018 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2019 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2020 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
2021 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2022 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
2023 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2024 ; AVX1-NEXT:    vmovd %xmm0, %eax
2025 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
2026 ; AVX1-NEXT:    retq
2028 ; AVX2-LABEL: PR66194:
2029 ; AVX2:       # %bb.0: # %entry
2030 ; AVX2-NEXT:    xorl %eax, %eax
2031 ; AVX2-NEXT:    xorl %ecx, %ecx
2032 ; AVX2-NEXT:    testb %dil, %dil
2033 ; AVX2-NEXT:    setne %al
2034 ; AVX2-NEXT:    sete %cl
2035 ; AVX2-NEXT:    vmovd %eax, %xmm0
2036 ; AVX2-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
2037 ; AVX2-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
2038 ; AVX2-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
2039 ; AVX2-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
2040 ; AVX2-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
2041 ; AVX2-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
2042 ; AVX2-NEXT:    vpinsrw $7, %ecx, %xmm0, %xmm0
2043 ; AVX2-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2044 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2045 ; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2046 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
2047 ; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2048 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
2049 ; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2050 ; AVX2-NEXT:    vmovd %xmm0, %eax
2051 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
2052 ; AVX2-NEXT:    retq
2054 ; AVX512-LABEL: PR66194:
2055 ; AVX512:       # %bb.0: # %entry
2056 ; AVX512-NEXT:    xorl %eax, %eax
2057 ; AVX512-NEXT:    xorl %ecx, %ecx
2058 ; AVX512-NEXT:    testb %dil, %dil
2059 ; AVX512-NEXT:    setne %al
2060 ; AVX512-NEXT:    sete %cl
2061 ; AVX512-NEXT:    vmovd %eax, %xmm0
2062 ; AVX512-NEXT:    vpinsrw $1, %ecx, %xmm0, %xmm0
2063 ; AVX512-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
2064 ; AVX512-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
2065 ; AVX512-NEXT:    vpinsrw $4, %ecx, %xmm0, %xmm0
2066 ; AVX512-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
2067 ; AVX512-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
2068 ; AVX512-NEXT:    vpinsrw $7, %ecx, %xmm0, %xmm0
2069 ; AVX512-NEXT:    vpaddw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2070 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2071 ; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2072 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
2073 ; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2074 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
2075 ; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
2076 ; AVX512-NEXT:    vmovd %xmm0, %eax
2077 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
2078 ; AVX512-NEXT:    retq
2079 entry:
2080   %cmp12.i.13 = icmp ne i8 %q, 0
2081   %cond.i15.13 = zext i1 %cmp12.i.13 to i16
2082   %tobool.not.i.13 = icmp eq i8 %q, 0
2083   %cond18.i.13 = zext i1 %tobool.not.i.13 to i16
2084   %0 = insertelement <16 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, i16 %cond.i15.13, i64 8
2085   %1 = insertelement <16 x i16> %0, i16 %cond18.i.13, i64 9
2086   %2 = insertelement <16 x i16> %1, i16 %cond.i15.13, i64 10
2087   %3 = insertelement <16 x i16> %2, i16 %cond.i15.13, i64 11
2088   %4 = insertelement <16 x i16> %3, i16 %cond18.i.13, i64 12
2089   %5 = insertelement <16 x i16> %4, i16 %cond.i15.13, i64 13
2090   %6 = insertelement <16 x i16> %5, i16 %cond.i15.13, i64 14
2091   %7 = insertelement <16 x i16> %6, i16 %cond18.i.13, i64 15
2092   %8 = tail call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %7)
2093   ret i16 %8
2095 declare i16 @llvm.vector.reduce.add.v16i16(<16 x i16>)
2097 ; Store merging must not infinitely fight store splitting.
2099 define void @store_merge_split(<8 x i32> %w1, <8 x i32> %w2, i64 %idx, ptr %p) align 2 {
2100 ; SSE2-LABEL: store_merge_split:
2101 ; SSE2:       # %bb.0:
2102 ; SSE2-NEXT:    pslld $16, %xmm1
2103 ; SSE2-NEXT:    psrad $16, %xmm1
2104 ; SSE2-NEXT:    pslld $16, %xmm0
2105 ; SSE2-NEXT:    psrad $16, %xmm0
2106 ; SSE2-NEXT:    packssdw %xmm1, %xmm0
2107 ; SSE2-NEXT:    pslld $16, %xmm3
2108 ; SSE2-NEXT:    psrad $16, %xmm3
2109 ; SSE2-NEXT:    pslld $16, %xmm2
2110 ; SSE2-NEXT:    psrad $16, %xmm2
2111 ; SSE2-NEXT:    packssdw %xmm3, %xmm2
2112 ; SSE2-NEXT:    shlq $4, %rdi
2113 ; SSE2-NEXT:    movdqu %xmm0, (%rsi,%rdi)
2114 ; SSE2-NEXT:    movdqu %xmm2, 16(%rsi,%rdi)
2115 ; SSE2-NEXT:    retq
2117 ; SSSE3-LABEL: store_merge_split:
2118 ; SSSE3:       # %bb.0:
2119 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2120 ; SSSE3-NEXT:    pshufb %xmm4, %xmm1
2121 ; SSSE3-NEXT:    pshufb %xmm4, %xmm0
2122 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2123 ; SSSE3-NEXT:    pshufb %xmm4, %xmm3
2124 ; SSSE3-NEXT:    pshufb %xmm4, %xmm2
2125 ; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
2126 ; SSSE3-NEXT:    shlq $4, %rdi
2127 ; SSSE3-NEXT:    movdqu %xmm0, (%rsi,%rdi)
2128 ; SSSE3-NEXT:    movdqu %xmm2, 16(%rsi,%rdi)
2129 ; SSSE3-NEXT:    retq
2131 ; SSE41-LABEL: store_merge_split:
2132 ; SSE41:       # %bb.0:
2133 ; SSE41-NEXT:    pxor %xmm4, %xmm4
2134 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]
2135 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]
2136 ; SSE41-NEXT:    packusdw %xmm1, %xmm0
2137 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1],xmm3[2],xmm4[3],xmm3[4],xmm4[5],xmm3[6],xmm4[7]
2138 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1],xmm2[2],xmm4[3],xmm2[4],xmm4[5],xmm2[6],xmm4[7]
2139 ; SSE41-NEXT:    packusdw %xmm3, %xmm2
2140 ; SSE41-NEXT:    shlq $4, %rdi
2141 ; SSE41-NEXT:    movdqu %xmm0, (%rsi,%rdi)
2142 ; SSE41-NEXT:    movdqu %xmm2, 16(%rsi,%rdi)
2143 ; SSE41-NEXT:    retq
2145 ; AVX1-LABEL: store_merge_split:
2146 ; AVX1:       # %bb.0:
2147 ; AVX1-NEXT:    vbroadcastss {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535]
2148 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
2149 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2150 ; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
2151 ; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
2152 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2153 ; AVX1-NEXT:    vpackusdw %xmm2, %xmm1, %xmm1
2154 ; AVX1-NEXT:    shlq $4, %rdi
2155 ; AVX1-NEXT:    vmovdqu %xmm0, (%rsi,%rdi)
2156 ; AVX1-NEXT:    vmovdqu %xmm1, 16(%rsi,%rdi)
2157 ; AVX1-NEXT:    vzeroupper
2158 ; AVX1-NEXT:    retq
2160 ; AVX2-LABEL: store_merge_split:
2161 ; AVX2:       # %bb.0:
2162 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [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]
2163 ; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2164 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2165 ; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2166 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
2167 ; AVX2-NEXT:    shlq $4, %rdi
2168 ; AVX2-NEXT:    vmovdqu %xmm0, (%rsi,%rdi)
2169 ; AVX2-NEXT:    vmovdqu %xmm1, 16(%rsi,%rdi)
2170 ; AVX2-NEXT:    vzeroupper
2171 ; AVX2-NEXT:    retq
2173 ; AVX512F-LABEL: store_merge_split:
2174 ; AVX512F:       # %bb.0:
2175 ; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2176 ; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2177 ; AVX512F-NEXT:    vpmovdw %zmm0, %ymm0
2178 ; AVX512F-NEXT:    vpmovdw %zmm1, %ymm1
2179 ; AVX512F-NEXT:    shlq $4, %rdi
2180 ; AVX512F-NEXT:    vmovdqu %xmm0, (%rsi,%rdi)
2181 ; AVX512F-NEXT:    vmovdqu %xmm1, 16(%rsi,%rdi)
2182 ; AVX512F-NEXT:    vzeroupper
2183 ; AVX512F-NEXT:    retq
2185 ; AVX512VL-LABEL: store_merge_split:
2186 ; AVX512VL:       # %bb.0:
2187 ; AVX512VL-NEXT:    shlq $4, %rdi
2188 ; AVX512VL-NEXT:    vpmovdw %ymm0, (%rsi,%rdi)
2189 ; AVX512VL-NEXT:    vpmovdw %ymm1, 16(%rsi,%rdi)
2190 ; AVX512VL-NEXT:    vzeroupper
2191 ; AVX512VL-NEXT:    retq
2193 ; AVX512BW-LABEL: store_merge_split:
2194 ; AVX512BW:       # %bb.0:
2195 ; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2196 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2197 ; AVX512BW-NEXT:    vpmovdw %zmm0, %ymm0
2198 ; AVX512BW-NEXT:    vpmovdw %zmm1, %ymm1
2199 ; AVX512BW-NEXT:    shlq $4, %rdi
2200 ; AVX512BW-NEXT:    vmovdqu %xmm0, (%rsi,%rdi)
2201 ; AVX512BW-NEXT:    vmovdqu %xmm1, 16(%rsi,%rdi)
2202 ; AVX512BW-NEXT:    vzeroupper
2203 ; AVX512BW-NEXT:    retq
2205 ; AVX512BWVL-LABEL: store_merge_split:
2206 ; AVX512BWVL:       # %bb.0:
2207 ; AVX512BWVL-NEXT:    shlq $4, %rdi
2208 ; AVX512BWVL-NEXT:    vpmovdw %ymm0, (%rsi,%rdi)
2209 ; AVX512BWVL-NEXT:    vpmovdw %ymm1, 16(%rsi,%rdi)
2210 ; AVX512BWVL-NEXT:    vzeroupper
2211 ; AVX512BWVL-NEXT:    retq
2212   %t1 = trunc <8 x i32> %w1 to <8 x i16>
2213   %t2 = trunc <8 x i32> %w2 to <8 x i16>
2214   %g1 = getelementptr inbounds <8 x i16>, ptr %p, i64 %idx
2215   %g2 = getelementptr inbounds <8 x i16>, ptr %g1, i64 1
2216   store <8 x i16> %t1, ptr %g1, align 2
2217   store <8 x i16> %t2, ptr %g2, align 2
2218   ret void