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-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s --check-prefix=SSE4
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=AVX,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=AVX,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl | FileCheck %s --check-prefix=AVX512VL
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=AVX512BW
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl,avx512bw | FileCheck %s --check-prefixes=AVX512VL,AVX512BWVL
11 define void @truncstore_v8i64_v8i32(<8 x i64> %x, ptr %p, <8 x i32> %mask) {
12 ; SSE2-LABEL: truncstore_v8i64_v8i32:
14 ; SSE2-NEXT: pxor %xmm6, %xmm6
15 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
16 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm5
17 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
18 ; SSE2-NEXT: packssdw %xmm5, %xmm4
19 ; SSE2-NEXT: packsswb %xmm4, %xmm4
20 ; SSE2-NEXT: pmovmskb %xmm4, %eax
21 ; SSE2-NEXT: notl %eax
22 ; SSE2-NEXT: testb $1, %al
23 ; SSE2-NEXT: jne .LBB0_1
24 ; SSE2-NEXT: # %bb.2: # %else
25 ; SSE2-NEXT: testb $2, %al
26 ; SSE2-NEXT: jne .LBB0_3
27 ; SSE2-NEXT: .LBB0_4: # %else2
28 ; SSE2-NEXT: testb $4, %al
29 ; SSE2-NEXT: jne .LBB0_5
30 ; SSE2-NEXT: .LBB0_6: # %else4
31 ; SSE2-NEXT: testb $8, %al
32 ; SSE2-NEXT: je .LBB0_8
33 ; SSE2-NEXT: .LBB0_7: # %cond.store5
34 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
35 ; SSE2-NEXT: movd %xmm0, 12(%rdi)
36 ; SSE2-NEXT: .LBB0_8: # %else6
37 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
38 ; SSE2-NEXT: testb $16, %al
39 ; SSE2-NEXT: jne .LBB0_9
40 ; SSE2-NEXT: # %bb.10: # %else8
41 ; SSE2-NEXT: testb $32, %al
42 ; SSE2-NEXT: jne .LBB0_11
43 ; SSE2-NEXT: .LBB0_12: # %else10
44 ; SSE2-NEXT: testb $64, %al
45 ; SSE2-NEXT: jne .LBB0_13
46 ; SSE2-NEXT: .LBB0_14: # %else12
47 ; SSE2-NEXT: testb $-128, %al
48 ; SSE2-NEXT: jne .LBB0_15
49 ; SSE2-NEXT: .LBB0_16: # %else14
51 ; SSE2-NEXT: .LBB0_1: # %cond.store
52 ; SSE2-NEXT: movd %xmm0, (%rdi)
53 ; SSE2-NEXT: testb $2, %al
54 ; SSE2-NEXT: je .LBB0_4
55 ; SSE2-NEXT: .LBB0_3: # %cond.store1
56 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
57 ; SSE2-NEXT: movd %xmm1, 4(%rdi)
58 ; SSE2-NEXT: testb $4, %al
59 ; SSE2-NEXT: je .LBB0_6
60 ; SSE2-NEXT: .LBB0_5: # %cond.store3
61 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
62 ; SSE2-NEXT: movd %xmm1, 8(%rdi)
63 ; SSE2-NEXT: testb $8, %al
64 ; SSE2-NEXT: jne .LBB0_7
65 ; SSE2-NEXT: jmp .LBB0_8
66 ; SSE2-NEXT: .LBB0_9: # %cond.store7
67 ; SSE2-NEXT: movss %xmm2, 16(%rdi)
68 ; SSE2-NEXT: testb $32, %al
69 ; SSE2-NEXT: je .LBB0_12
70 ; SSE2-NEXT: .LBB0_11: # %cond.store9
71 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
72 ; SSE2-NEXT: movd %xmm0, 20(%rdi)
73 ; SSE2-NEXT: testb $64, %al
74 ; SSE2-NEXT: je .LBB0_14
75 ; SSE2-NEXT: .LBB0_13: # %cond.store11
76 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
77 ; SSE2-NEXT: movd %xmm0, 24(%rdi)
78 ; SSE2-NEXT: testb $-128, %al
79 ; SSE2-NEXT: je .LBB0_16
80 ; SSE2-NEXT: .LBB0_15: # %cond.store13
81 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[3,3,3,3]
82 ; SSE2-NEXT: movd %xmm0, 28(%rdi)
85 ; SSE4-LABEL: truncstore_v8i64_v8i32:
87 ; SSE4-NEXT: pxor %xmm6, %xmm6
88 ; SSE4-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
89 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm5
90 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm4
91 ; SSE4-NEXT: packssdw %xmm5, %xmm4
92 ; SSE4-NEXT: packsswb %xmm4, %xmm4
93 ; SSE4-NEXT: pmovmskb %xmm4, %eax
94 ; SSE4-NEXT: notl %eax
95 ; SSE4-NEXT: testb $1, %al
96 ; SSE4-NEXT: jne .LBB0_1
97 ; SSE4-NEXT: # %bb.2: # %else
98 ; SSE4-NEXT: testb $2, %al
99 ; SSE4-NEXT: jne .LBB0_3
100 ; SSE4-NEXT: .LBB0_4: # %else2
101 ; SSE4-NEXT: testb $4, %al
102 ; SSE4-NEXT: jne .LBB0_5
103 ; SSE4-NEXT: .LBB0_6: # %else4
104 ; SSE4-NEXT: testb $8, %al
105 ; SSE4-NEXT: je .LBB0_8
106 ; SSE4-NEXT: .LBB0_7: # %cond.store5
107 ; SSE4-NEXT: pextrd $3, %xmm0, 12(%rdi)
108 ; SSE4-NEXT: .LBB0_8: # %else6
109 ; SSE4-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
110 ; SSE4-NEXT: testb $16, %al
111 ; SSE4-NEXT: jne .LBB0_9
112 ; SSE4-NEXT: # %bb.10: # %else8
113 ; SSE4-NEXT: testb $32, %al
114 ; SSE4-NEXT: jne .LBB0_11
115 ; SSE4-NEXT: .LBB0_12: # %else10
116 ; SSE4-NEXT: testb $64, %al
117 ; SSE4-NEXT: jne .LBB0_13
118 ; SSE4-NEXT: .LBB0_14: # %else12
119 ; SSE4-NEXT: testb $-128, %al
120 ; SSE4-NEXT: jne .LBB0_15
121 ; SSE4-NEXT: .LBB0_16: # %else14
123 ; SSE4-NEXT: .LBB0_1: # %cond.store
124 ; SSE4-NEXT: movd %xmm0, (%rdi)
125 ; SSE4-NEXT: testb $2, %al
126 ; SSE4-NEXT: je .LBB0_4
127 ; SSE4-NEXT: .LBB0_3: # %cond.store1
128 ; SSE4-NEXT: pextrd $1, %xmm0, 4(%rdi)
129 ; SSE4-NEXT: testb $4, %al
130 ; SSE4-NEXT: je .LBB0_6
131 ; SSE4-NEXT: .LBB0_5: # %cond.store3
132 ; SSE4-NEXT: pextrd $2, %xmm0, 8(%rdi)
133 ; SSE4-NEXT: testb $8, %al
134 ; SSE4-NEXT: jne .LBB0_7
135 ; SSE4-NEXT: jmp .LBB0_8
136 ; SSE4-NEXT: .LBB0_9: # %cond.store7
137 ; SSE4-NEXT: movss %xmm2, 16(%rdi)
138 ; SSE4-NEXT: testb $32, %al
139 ; SSE4-NEXT: je .LBB0_12
140 ; SSE4-NEXT: .LBB0_11: # %cond.store9
141 ; SSE4-NEXT: extractps $1, %xmm2, 20(%rdi)
142 ; SSE4-NEXT: testb $64, %al
143 ; SSE4-NEXT: je .LBB0_14
144 ; SSE4-NEXT: .LBB0_13: # %cond.store11
145 ; SSE4-NEXT: extractps $2, %xmm2, 24(%rdi)
146 ; SSE4-NEXT: testb $-128, %al
147 ; SSE4-NEXT: je .LBB0_16
148 ; SSE4-NEXT: .LBB0_15: # %cond.store13
149 ; SSE4-NEXT: extractps $3, %xmm2, 28(%rdi)
152 ; AVX1-LABEL: truncstore_v8i64_v8i32:
154 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
155 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
156 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3
157 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5
158 ; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3
159 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2
160 ; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2
161 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2
162 ; AVX1-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3],ymm1[2,3]
163 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
164 ; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
165 ; AVX1-NEXT: vmaskmovps %ymm0, %ymm2, (%rdi)
166 ; AVX1-NEXT: vzeroupper
169 ; AVX2-LABEL: truncstore_v8i64_v8i32:
171 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
172 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2
173 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3
174 ; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
175 ; AVX2-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3],ymm1[2,3]
176 ; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
177 ; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
178 ; AVX2-NEXT: vpmaskmovd %ymm0, %ymm2, (%rdi)
179 ; AVX2-NEXT: vzeroupper
182 ; AVX512F-LABEL: truncstore_v8i64_v8i32:
184 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
185 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k1
186 ; AVX512F-NEXT: vpmovqd %zmm0, (%rdi) {%k1}
187 ; AVX512F-NEXT: vzeroupper
190 ; AVX512VL-LABEL: truncstore_v8i64_v8i32:
192 ; AVX512VL-NEXT: vptestmd %ymm1, %ymm1, %k1
193 ; AVX512VL-NEXT: vpmovqd %zmm0, (%rdi) {%k1}
194 ; AVX512VL-NEXT: vzeroupper
195 ; AVX512VL-NEXT: retq
197 ; AVX512BW-LABEL: truncstore_v8i64_v8i32:
199 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
200 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1
201 ; AVX512BW-NEXT: vpmovqd %zmm0, (%rdi) {%k1}
202 ; AVX512BW-NEXT: vzeroupper
203 ; AVX512BW-NEXT: retq
204 %a = icmp ne <8 x i32> %mask, zeroinitializer
205 %b = trunc <8 x i64> %x to <8 x i32>
206 call void @llvm.masked.store.v8i32.p0(<8 x i32> %b, ptr %p, i32 1, <8 x i1> %a)
210 define void @truncstore_v8i64_v8i16(<8 x i64> %x, ptr %p, <8 x i32> %mask) {
211 ; SSE2-LABEL: truncstore_v8i64_v8i16:
213 ; SSE2-NEXT: pxor %xmm6, %xmm6
214 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
215 ; SSE2-NEXT: pslld $16, %xmm2
216 ; SSE2-NEXT: psrad $16, %xmm2
217 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
218 ; SSE2-NEXT: pslld $16, %xmm0
219 ; SSE2-NEXT: psrad $16, %xmm0
220 ; SSE2-NEXT: packssdw %xmm2, %xmm0
221 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm5
222 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
223 ; SSE2-NEXT: packssdw %xmm5, %xmm4
224 ; SSE2-NEXT: packsswb %xmm4, %xmm4
225 ; SSE2-NEXT: pmovmskb %xmm4, %eax
226 ; SSE2-NEXT: notl %eax
227 ; SSE2-NEXT: testb $1, %al
228 ; SSE2-NEXT: jne .LBB1_1
229 ; SSE2-NEXT: # %bb.2: # %else
230 ; SSE2-NEXT: testb $2, %al
231 ; SSE2-NEXT: jne .LBB1_3
232 ; SSE2-NEXT: .LBB1_4: # %else2
233 ; SSE2-NEXT: testb $4, %al
234 ; SSE2-NEXT: jne .LBB1_5
235 ; SSE2-NEXT: .LBB1_6: # %else4
236 ; SSE2-NEXT: testb $8, %al
237 ; SSE2-NEXT: jne .LBB1_7
238 ; SSE2-NEXT: .LBB1_8: # %else6
239 ; SSE2-NEXT: testb $16, %al
240 ; SSE2-NEXT: jne .LBB1_9
241 ; SSE2-NEXT: .LBB1_10: # %else8
242 ; SSE2-NEXT: testb $32, %al
243 ; SSE2-NEXT: jne .LBB1_11
244 ; SSE2-NEXT: .LBB1_12: # %else10
245 ; SSE2-NEXT: testb $64, %al
246 ; SSE2-NEXT: jne .LBB1_13
247 ; SSE2-NEXT: .LBB1_14: # %else12
248 ; SSE2-NEXT: testb $-128, %al
249 ; SSE2-NEXT: jne .LBB1_15
250 ; SSE2-NEXT: .LBB1_16: # %else14
252 ; SSE2-NEXT: .LBB1_1: # %cond.store
253 ; SSE2-NEXT: movd %xmm0, %ecx
254 ; SSE2-NEXT: movw %cx, (%rdi)
255 ; SSE2-NEXT: testb $2, %al
256 ; SSE2-NEXT: je .LBB1_4
257 ; SSE2-NEXT: .LBB1_3: # %cond.store1
258 ; SSE2-NEXT: pextrw $1, %xmm0, %ecx
259 ; SSE2-NEXT: movw %cx, 2(%rdi)
260 ; SSE2-NEXT: testb $4, %al
261 ; SSE2-NEXT: je .LBB1_6
262 ; SSE2-NEXT: .LBB1_5: # %cond.store3
263 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
264 ; SSE2-NEXT: movw %cx, 4(%rdi)
265 ; SSE2-NEXT: testb $8, %al
266 ; SSE2-NEXT: je .LBB1_8
267 ; SSE2-NEXT: .LBB1_7: # %cond.store5
268 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
269 ; SSE2-NEXT: movw %cx, 6(%rdi)
270 ; SSE2-NEXT: testb $16, %al
271 ; SSE2-NEXT: je .LBB1_10
272 ; SSE2-NEXT: .LBB1_9: # %cond.store7
273 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx
274 ; SSE2-NEXT: movw %cx, 8(%rdi)
275 ; SSE2-NEXT: testb $32, %al
276 ; SSE2-NEXT: je .LBB1_12
277 ; SSE2-NEXT: .LBB1_11: # %cond.store9
278 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx
279 ; SSE2-NEXT: movw %cx, 10(%rdi)
280 ; SSE2-NEXT: testb $64, %al
281 ; SSE2-NEXT: je .LBB1_14
282 ; SSE2-NEXT: .LBB1_13: # %cond.store11
283 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx
284 ; SSE2-NEXT: movw %cx, 12(%rdi)
285 ; SSE2-NEXT: testb $-128, %al
286 ; SSE2-NEXT: je .LBB1_16
287 ; SSE2-NEXT: .LBB1_15: # %cond.store13
288 ; SSE2-NEXT: pextrw $7, %xmm0, %eax
289 ; SSE2-NEXT: movw %ax, 14(%rdi)
292 ; SSE4-LABEL: truncstore_v8i64_v8i16:
294 ; SSE4-NEXT: pxor %xmm6, %xmm6
295 ; SSE4-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm6[1,2,3],xmm3[4],xmm6[5,6,7]
296 ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm6[1,2,3],xmm2[4],xmm6[5,6,7]
297 ; SSE4-NEXT: packusdw %xmm3, %xmm2
298 ; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm6[1,2,3],xmm1[4],xmm6[5,6,7]
299 ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm6[1,2,3],xmm0[4],xmm6[5,6,7]
300 ; SSE4-NEXT: packusdw %xmm1, %xmm0
301 ; SSE4-NEXT: packusdw %xmm2, %xmm0
302 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm5
303 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm4
304 ; SSE4-NEXT: packssdw %xmm5, %xmm4
305 ; SSE4-NEXT: packsswb %xmm4, %xmm4
306 ; SSE4-NEXT: pmovmskb %xmm4, %eax
307 ; SSE4-NEXT: notl %eax
308 ; SSE4-NEXT: testb $1, %al
309 ; SSE4-NEXT: jne .LBB1_1
310 ; SSE4-NEXT: # %bb.2: # %else
311 ; SSE4-NEXT: testb $2, %al
312 ; SSE4-NEXT: jne .LBB1_3
313 ; SSE4-NEXT: .LBB1_4: # %else2
314 ; SSE4-NEXT: testb $4, %al
315 ; SSE4-NEXT: jne .LBB1_5
316 ; SSE4-NEXT: .LBB1_6: # %else4
317 ; SSE4-NEXT: testb $8, %al
318 ; SSE4-NEXT: jne .LBB1_7
319 ; SSE4-NEXT: .LBB1_8: # %else6
320 ; SSE4-NEXT: testb $16, %al
321 ; SSE4-NEXT: jne .LBB1_9
322 ; SSE4-NEXT: .LBB1_10: # %else8
323 ; SSE4-NEXT: testb $32, %al
324 ; SSE4-NEXT: jne .LBB1_11
325 ; SSE4-NEXT: .LBB1_12: # %else10
326 ; SSE4-NEXT: testb $64, %al
327 ; SSE4-NEXT: jne .LBB1_13
328 ; SSE4-NEXT: .LBB1_14: # %else12
329 ; SSE4-NEXT: testb $-128, %al
330 ; SSE4-NEXT: jne .LBB1_15
331 ; SSE4-NEXT: .LBB1_16: # %else14
333 ; SSE4-NEXT: .LBB1_1: # %cond.store
334 ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi)
335 ; SSE4-NEXT: testb $2, %al
336 ; SSE4-NEXT: je .LBB1_4
337 ; SSE4-NEXT: .LBB1_3: # %cond.store1
338 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi)
339 ; SSE4-NEXT: testb $4, %al
340 ; SSE4-NEXT: je .LBB1_6
341 ; SSE4-NEXT: .LBB1_5: # %cond.store3
342 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi)
343 ; SSE4-NEXT: testb $8, %al
344 ; SSE4-NEXT: je .LBB1_8
345 ; SSE4-NEXT: .LBB1_7: # %cond.store5
346 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi)
347 ; SSE4-NEXT: testb $16, %al
348 ; SSE4-NEXT: je .LBB1_10
349 ; SSE4-NEXT: .LBB1_9: # %cond.store7
350 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi)
351 ; SSE4-NEXT: testb $32, %al
352 ; SSE4-NEXT: je .LBB1_12
353 ; SSE4-NEXT: .LBB1_11: # %cond.store9
354 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi)
355 ; SSE4-NEXT: testb $64, %al
356 ; SSE4-NEXT: je .LBB1_14
357 ; SSE4-NEXT: .LBB1_13: # %cond.store11
358 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi)
359 ; SSE4-NEXT: testb $-128, %al
360 ; SSE4-NEXT: je .LBB1_16
361 ; SSE4-NEXT: .LBB1_15: # %cond.store13
362 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi)
365 ; AVX1-LABEL: truncstore_v8i64_v8i16:
367 ; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm3 = [65535,65535,65535,65535]
368 ; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
369 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
370 ; AVX1-NEXT: vpackusdw %xmm4, %xmm1, %xmm1
371 ; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0
372 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
373 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
374 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
375 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm1
376 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
377 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
378 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2
379 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
380 ; AVX1-NEXT: vmovmskps %ymm1, %eax
381 ; AVX1-NEXT: notl %eax
382 ; AVX1-NEXT: testb $1, %al
383 ; AVX1-NEXT: jne .LBB1_1
384 ; AVX1-NEXT: # %bb.2: # %else
385 ; AVX1-NEXT: testb $2, %al
386 ; AVX1-NEXT: jne .LBB1_3
387 ; AVX1-NEXT: .LBB1_4: # %else2
388 ; AVX1-NEXT: testb $4, %al
389 ; AVX1-NEXT: jne .LBB1_5
390 ; AVX1-NEXT: .LBB1_6: # %else4
391 ; AVX1-NEXT: testb $8, %al
392 ; AVX1-NEXT: jne .LBB1_7
393 ; AVX1-NEXT: .LBB1_8: # %else6
394 ; AVX1-NEXT: testb $16, %al
395 ; AVX1-NEXT: jne .LBB1_9
396 ; AVX1-NEXT: .LBB1_10: # %else8
397 ; AVX1-NEXT: testb $32, %al
398 ; AVX1-NEXT: jne .LBB1_11
399 ; AVX1-NEXT: .LBB1_12: # %else10
400 ; AVX1-NEXT: testb $64, %al
401 ; AVX1-NEXT: jne .LBB1_13
402 ; AVX1-NEXT: .LBB1_14: # %else12
403 ; AVX1-NEXT: testb $-128, %al
404 ; AVX1-NEXT: jne .LBB1_15
405 ; AVX1-NEXT: .LBB1_16: # %else14
406 ; AVX1-NEXT: vzeroupper
408 ; AVX1-NEXT: .LBB1_1: # %cond.store
409 ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi)
410 ; AVX1-NEXT: testb $2, %al
411 ; AVX1-NEXT: je .LBB1_4
412 ; AVX1-NEXT: .LBB1_3: # %cond.store1
413 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi)
414 ; AVX1-NEXT: testb $4, %al
415 ; AVX1-NEXT: je .LBB1_6
416 ; AVX1-NEXT: .LBB1_5: # %cond.store3
417 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi)
418 ; AVX1-NEXT: testb $8, %al
419 ; AVX1-NEXT: je .LBB1_8
420 ; AVX1-NEXT: .LBB1_7: # %cond.store5
421 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi)
422 ; AVX1-NEXT: testb $16, %al
423 ; AVX1-NEXT: je .LBB1_10
424 ; AVX1-NEXT: .LBB1_9: # %cond.store7
425 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi)
426 ; AVX1-NEXT: testb $32, %al
427 ; AVX1-NEXT: je .LBB1_12
428 ; AVX1-NEXT: .LBB1_11: # %cond.store9
429 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi)
430 ; AVX1-NEXT: testb $64, %al
431 ; AVX1-NEXT: je .LBB1_14
432 ; AVX1-NEXT: .LBB1_13: # %cond.store11
433 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi)
434 ; AVX1-NEXT: testb $-128, %al
435 ; AVX1-NEXT: je .LBB1_16
436 ; AVX1-NEXT: .LBB1_15: # %cond.store13
437 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi)
438 ; AVX1-NEXT: vzeroupper
441 ; AVX2-LABEL: truncstore_v8i64_v8i16:
443 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
444 ; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm3[1,2,3],ymm1[4],ymm3[5,6,7],ymm1[8],ymm3[9,10,11],ymm1[12],ymm3[13,14,15]
445 ; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm3[1,2,3],ymm0[4],ymm3[5,6,7],ymm0[8],ymm3[9,10,11],ymm0[12],ymm3[13,14,15]
446 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
447 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
448 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
449 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
450 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm1
451 ; AVX2-NEXT: vmovmskps %ymm1, %eax
452 ; AVX2-NEXT: notl %eax
453 ; AVX2-NEXT: testb $1, %al
454 ; AVX2-NEXT: jne .LBB1_1
455 ; AVX2-NEXT: # %bb.2: # %else
456 ; AVX2-NEXT: testb $2, %al
457 ; AVX2-NEXT: jne .LBB1_3
458 ; AVX2-NEXT: .LBB1_4: # %else2
459 ; AVX2-NEXT: testb $4, %al
460 ; AVX2-NEXT: jne .LBB1_5
461 ; AVX2-NEXT: .LBB1_6: # %else4
462 ; AVX2-NEXT: testb $8, %al
463 ; AVX2-NEXT: jne .LBB1_7
464 ; AVX2-NEXT: .LBB1_8: # %else6
465 ; AVX2-NEXT: testb $16, %al
466 ; AVX2-NEXT: jne .LBB1_9
467 ; AVX2-NEXT: .LBB1_10: # %else8
468 ; AVX2-NEXT: testb $32, %al
469 ; AVX2-NEXT: jne .LBB1_11
470 ; AVX2-NEXT: .LBB1_12: # %else10
471 ; AVX2-NEXT: testb $64, %al
472 ; AVX2-NEXT: jne .LBB1_13
473 ; AVX2-NEXT: .LBB1_14: # %else12
474 ; AVX2-NEXT: testb $-128, %al
475 ; AVX2-NEXT: jne .LBB1_15
476 ; AVX2-NEXT: .LBB1_16: # %else14
477 ; AVX2-NEXT: vzeroupper
479 ; AVX2-NEXT: .LBB1_1: # %cond.store
480 ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi)
481 ; AVX2-NEXT: testb $2, %al
482 ; AVX2-NEXT: je .LBB1_4
483 ; AVX2-NEXT: .LBB1_3: # %cond.store1
484 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi)
485 ; AVX2-NEXT: testb $4, %al
486 ; AVX2-NEXT: je .LBB1_6
487 ; AVX2-NEXT: .LBB1_5: # %cond.store3
488 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi)
489 ; AVX2-NEXT: testb $8, %al
490 ; AVX2-NEXT: je .LBB1_8
491 ; AVX2-NEXT: .LBB1_7: # %cond.store5
492 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi)
493 ; AVX2-NEXT: testb $16, %al
494 ; AVX2-NEXT: je .LBB1_10
495 ; AVX2-NEXT: .LBB1_9: # %cond.store7
496 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi)
497 ; AVX2-NEXT: testb $32, %al
498 ; AVX2-NEXT: je .LBB1_12
499 ; AVX2-NEXT: .LBB1_11: # %cond.store9
500 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi)
501 ; AVX2-NEXT: testb $64, %al
502 ; AVX2-NEXT: je .LBB1_14
503 ; AVX2-NEXT: .LBB1_13: # %cond.store11
504 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi)
505 ; AVX2-NEXT: testb $-128, %al
506 ; AVX2-NEXT: je .LBB1_16
507 ; AVX2-NEXT: .LBB1_15: # %cond.store13
508 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi)
509 ; AVX2-NEXT: vzeroupper
512 ; AVX512F-LABEL: truncstore_v8i64_v8i16:
514 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
515 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
516 ; AVX512F-NEXT: vpmovqw %zmm0, %xmm0
517 ; AVX512F-NEXT: kmovw %k0, %eax
518 ; AVX512F-NEXT: testb $1, %al
519 ; AVX512F-NEXT: jne .LBB1_1
520 ; AVX512F-NEXT: # %bb.2: # %else
521 ; AVX512F-NEXT: testb $2, %al
522 ; AVX512F-NEXT: jne .LBB1_3
523 ; AVX512F-NEXT: .LBB1_4: # %else2
524 ; AVX512F-NEXT: testb $4, %al
525 ; AVX512F-NEXT: jne .LBB1_5
526 ; AVX512F-NEXT: .LBB1_6: # %else4
527 ; AVX512F-NEXT: testb $8, %al
528 ; AVX512F-NEXT: jne .LBB1_7
529 ; AVX512F-NEXT: .LBB1_8: # %else6
530 ; AVX512F-NEXT: testb $16, %al
531 ; AVX512F-NEXT: jne .LBB1_9
532 ; AVX512F-NEXT: .LBB1_10: # %else8
533 ; AVX512F-NEXT: testb $32, %al
534 ; AVX512F-NEXT: jne .LBB1_11
535 ; AVX512F-NEXT: .LBB1_12: # %else10
536 ; AVX512F-NEXT: testb $64, %al
537 ; AVX512F-NEXT: jne .LBB1_13
538 ; AVX512F-NEXT: .LBB1_14: # %else12
539 ; AVX512F-NEXT: testb $-128, %al
540 ; AVX512F-NEXT: jne .LBB1_15
541 ; AVX512F-NEXT: .LBB1_16: # %else14
542 ; AVX512F-NEXT: vzeroupper
544 ; AVX512F-NEXT: .LBB1_1: # %cond.store
545 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
546 ; AVX512F-NEXT: testb $2, %al
547 ; AVX512F-NEXT: je .LBB1_4
548 ; AVX512F-NEXT: .LBB1_3: # %cond.store1
549 ; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi)
550 ; AVX512F-NEXT: testb $4, %al
551 ; AVX512F-NEXT: je .LBB1_6
552 ; AVX512F-NEXT: .LBB1_5: # %cond.store3
553 ; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi)
554 ; AVX512F-NEXT: testb $8, %al
555 ; AVX512F-NEXT: je .LBB1_8
556 ; AVX512F-NEXT: .LBB1_7: # %cond.store5
557 ; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi)
558 ; AVX512F-NEXT: testb $16, %al
559 ; AVX512F-NEXT: je .LBB1_10
560 ; AVX512F-NEXT: .LBB1_9: # %cond.store7
561 ; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi)
562 ; AVX512F-NEXT: testb $32, %al
563 ; AVX512F-NEXT: je .LBB1_12
564 ; AVX512F-NEXT: .LBB1_11: # %cond.store9
565 ; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi)
566 ; AVX512F-NEXT: testb $64, %al
567 ; AVX512F-NEXT: je .LBB1_14
568 ; AVX512F-NEXT: .LBB1_13: # %cond.store11
569 ; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi)
570 ; AVX512F-NEXT: testb $-128, %al
571 ; AVX512F-NEXT: je .LBB1_16
572 ; AVX512F-NEXT: .LBB1_15: # %cond.store13
573 ; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi)
574 ; AVX512F-NEXT: vzeroupper
577 ; AVX512BW-LABEL: truncstore_v8i64_v8i16:
579 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
580 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1
581 ; AVX512BW-NEXT: vpmovqw %zmm0, (%rdi) {%k1}
582 ; AVX512BW-NEXT: vzeroupper
583 ; AVX512BW-NEXT: retq
585 ; AVX512BWVL-LABEL: truncstore_v8i64_v8i16:
586 ; AVX512BWVL: # %bb.0:
587 ; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1
588 ; AVX512BWVL-NEXT: vpmovqw %zmm0, (%rdi) {%k1}
589 ; AVX512BWVL-NEXT: vzeroupper
590 ; AVX512BWVL-NEXT: retq
591 %a = icmp ne <8 x i32> %mask, zeroinitializer
592 %b = trunc <8 x i64> %x to <8 x i16>
593 call void @llvm.masked.store.v8i16.p0(<8 x i16> %b, ptr %p, i32 1, <8 x i1> %a)
597 define void @truncstore_v8i64_v8i8(<8 x i64> %x, ptr %p, <8 x i32> %mask) {
598 ; SSE2-LABEL: truncstore_v8i64_v8i8:
600 ; SSE2-NEXT: pxor %xmm6, %xmm6
601 ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
602 ; SSE2-NEXT: pand %xmm7, %xmm3
603 ; SSE2-NEXT: pand %xmm7, %xmm2
604 ; SSE2-NEXT: packuswb %xmm3, %xmm2
605 ; SSE2-NEXT: pand %xmm7, %xmm1
606 ; SSE2-NEXT: pand %xmm7, %xmm0
607 ; SSE2-NEXT: packuswb %xmm1, %xmm0
608 ; SSE2-NEXT: packuswb %xmm2, %xmm0
609 ; SSE2-NEXT: packuswb %xmm0, %xmm0
610 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm5
611 ; SSE2-NEXT: pcmpeqd %xmm6, %xmm4
612 ; SSE2-NEXT: packssdw %xmm5, %xmm4
613 ; SSE2-NEXT: packsswb %xmm4, %xmm4
614 ; SSE2-NEXT: pmovmskb %xmm4, %eax
615 ; SSE2-NEXT: notl %eax
616 ; SSE2-NEXT: testb $1, %al
617 ; SSE2-NEXT: movd %xmm0, %ecx
618 ; SSE2-NEXT: jne .LBB2_1
619 ; SSE2-NEXT: # %bb.2: # %else
620 ; SSE2-NEXT: testb $2, %al
621 ; SSE2-NEXT: jne .LBB2_3
622 ; SSE2-NEXT: .LBB2_4: # %else2
623 ; SSE2-NEXT: testb $4, %al
624 ; SSE2-NEXT: jne .LBB2_5
625 ; SSE2-NEXT: .LBB2_6: # %else4
626 ; SSE2-NEXT: testb $8, %al
627 ; SSE2-NEXT: je .LBB2_8
628 ; SSE2-NEXT: .LBB2_7: # %cond.store5
629 ; SSE2-NEXT: shrl $24, %ecx
630 ; SSE2-NEXT: movb %cl, 3(%rdi)
631 ; SSE2-NEXT: .LBB2_8: # %else6
632 ; SSE2-NEXT: testb $16, %al
633 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
634 ; SSE2-NEXT: je .LBB2_10
635 ; SSE2-NEXT: # %bb.9: # %cond.store7
636 ; SSE2-NEXT: movb %cl, 4(%rdi)
637 ; SSE2-NEXT: .LBB2_10: # %else8
638 ; SSE2-NEXT: testb $32, %al
639 ; SSE2-NEXT: je .LBB2_12
640 ; SSE2-NEXT: # %bb.11: # %cond.store9
641 ; SSE2-NEXT: movb %ch, 5(%rdi)
642 ; SSE2-NEXT: .LBB2_12: # %else10
643 ; SSE2-NEXT: testb $64, %al
644 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
645 ; SSE2-NEXT: jne .LBB2_13
646 ; SSE2-NEXT: # %bb.14: # %else12
647 ; SSE2-NEXT: testb $-128, %al
648 ; SSE2-NEXT: jne .LBB2_15
649 ; SSE2-NEXT: .LBB2_16: # %else14
651 ; SSE2-NEXT: .LBB2_1: # %cond.store
652 ; SSE2-NEXT: movb %cl, (%rdi)
653 ; SSE2-NEXT: testb $2, %al
654 ; SSE2-NEXT: je .LBB2_4
655 ; SSE2-NEXT: .LBB2_3: # %cond.store1
656 ; SSE2-NEXT: movb %ch, 1(%rdi)
657 ; SSE2-NEXT: testb $4, %al
658 ; SSE2-NEXT: je .LBB2_6
659 ; SSE2-NEXT: .LBB2_5: # %cond.store3
660 ; SSE2-NEXT: movl %ecx, %edx
661 ; SSE2-NEXT: shrl $16, %edx
662 ; SSE2-NEXT: movb %dl, 2(%rdi)
663 ; SSE2-NEXT: testb $8, %al
664 ; SSE2-NEXT: jne .LBB2_7
665 ; SSE2-NEXT: jmp .LBB2_8
666 ; SSE2-NEXT: .LBB2_13: # %cond.store11
667 ; SSE2-NEXT: movb %cl, 6(%rdi)
668 ; SSE2-NEXT: testb $-128, %al
669 ; SSE2-NEXT: je .LBB2_16
670 ; SSE2-NEXT: .LBB2_15: # %cond.store13
671 ; SSE2-NEXT: movb %ch, 7(%rdi)
674 ; SSE4-LABEL: truncstore_v8i64_v8i8:
676 ; SSE4-NEXT: pxor %xmm6, %xmm6
677 ; SSE4-NEXT: pmovzxbq {{.*#+}} xmm7 = [255,255]
678 ; SSE4-NEXT: pand %xmm7, %xmm3
679 ; SSE4-NEXT: pand %xmm7, %xmm2
680 ; SSE4-NEXT: packusdw %xmm3, %xmm2
681 ; SSE4-NEXT: pand %xmm7, %xmm1
682 ; SSE4-NEXT: pand %xmm7, %xmm0
683 ; SSE4-NEXT: packusdw %xmm1, %xmm0
684 ; SSE4-NEXT: packusdw %xmm2, %xmm0
685 ; SSE4-NEXT: packuswb %xmm0, %xmm0
686 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm5
687 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm4
688 ; SSE4-NEXT: packssdw %xmm5, %xmm4
689 ; SSE4-NEXT: packsswb %xmm4, %xmm4
690 ; SSE4-NEXT: pmovmskb %xmm4, %eax
691 ; SSE4-NEXT: notl %eax
692 ; SSE4-NEXT: testb $1, %al
693 ; SSE4-NEXT: jne .LBB2_1
694 ; SSE4-NEXT: # %bb.2: # %else
695 ; SSE4-NEXT: testb $2, %al
696 ; SSE4-NEXT: jne .LBB2_3
697 ; SSE4-NEXT: .LBB2_4: # %else2
698 ; SSE4-NEXT: testb $4, %al
699 ; SSE4-NEXT: jne .LBB2_5
700 ; SSE4-NEXT: .LBB2_6: # %else4
701 ; SSE4-NEXT: testb $8, %al
702 ; SSE4-NEXT: jne .LBB2_7
703 ; SSE4-NEXT: .LBB2_8: # %else6
704 ; SSE4-NEXT: testb $16, %al
705 ; SSE4-NEXT: jne .LBB2_9
706 ; SSE4-NEXT: .LBB2_10: # %else8
707 ; SSE4-NEXT: testb $32, %al
708 ; SSE4-NEXT: jne .LBB2_11
709 ; SSE4-NEXT: .LBB2_12: # %else10
710 ; SSE4-NEXT: testb $64, %al
711 ; SSE4-NEXT: jne .LBB2_13
712 ; SSE4-NEXT: .LBB2_14: # %else12
713 ; SSE4-NEXT: testb $-128, %al
714 ; SSE4-NEXT: jne .LBB2_15
715 ; SSE4-NEXT: .LBB2_16: # %else14
717 ; SSE4-NEXT: .LBB2_1: # %cond.store
718 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
719 ; SSE4-NEXT: testb $2, %al
720 ; SSE4-NEXT: je .LBB2_4
721 ; SSE4-NEXT: .LBB2_3: # %cond.store1
722 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
723 ; SSE4-NEXT: testb $4, %al
724 ; SSE4-NEXT: je .LBB2_6
725 ; SSE4-NEXT: .LBB2_5: # %cond.store3
726 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi)
727 ; SSE4-NEXT: testb $8, %al
728 ; SSE4-NEXT: je .LBB2_8
729 ; SSE4-NEXT: .LBB2_7: # %cond.store5
730 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi)
731 ; SSE4-NEXT: testb $16, %al
732 ; SSE4-NEXT: je .LBB2_10
733 ; SSE4-NEXT: .LBB2_9: # %cond.store7
734 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi)
735 ; SSE4-NEXT: testb $32, %al
736 ; SSE4-NEXT: je .LBB2_12
737 ; SSE4-NEXT: .LBB2_11: # %cond.store9
738 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi)
739 ; SSE4-NEXT: testb $64, %al
740 ; SSE4-NEXT: je .LBB2_14
741 ; SSE4-NEXT: .LBB2_13: # %cond.store11
742 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi)
743 ; SSE4-NEXT: testb $-128, %al
744 ; SSE4-NEXT: je .LBB2_16
745 ; SSE4-NEXT: .LBB2_15: # %cond.store13
746 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi)
749 ; AVX1-LABEL: truncstore_v8i64_v8i8:
751 ; AVX1-NEXT: vbroadcastsd {{.*#+}} ymm3 = [255,255,255,255]
752 ; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
753 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
754 ; AVX1-NEXT: vpackusdw %xmm4, %xmm1, %xmm1
755 ; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0
756 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
757 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
758 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
759 ; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
760 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm1
761 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
762 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
763 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2
764 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1
765 ; AVX1-NEXT: vmovmskps %ymm1, %eax
766 ; AVX1-NEXT: notl %eax
767 ; AVX1-NEXT: testb $1, %al
768 ; AVX1-NEXT: jne .LBB2_1
769 ; AVX1-NEXT: # %bb.2: # %else
770 ; AVX1-NEXT: testb $2, %al
771 ; AVX1-NEXT: jne .LBB2_3
772 ; AVX1-NEXT: .LBB2_4: # %else2
773 ; AVX1-NEXT: testb $4, %al
774 ; AVX1-NEXT: jne .LBB2_5
775 ; AVX1-NEXT: .LBB2_6: # %else4
776 ; AVX1-NEXT: testb $8, %al
777 ; AVX1-NEXT: jne .LBB2_7
778 ; AVX1-NEXT: .LBB2_8: # %else6
779 ; AVX1-NEXT: testb $16, %al
780 ; AVX1-NEXT: jne .LBB2_9
781 ; AVX1-NEXT: .LBB2_10: # %else8
782 ; AVX1-NEXT: testb $32, %al
783 ; AVX1-NEXT: jne .LBB2_11
784 ; AVX1-NEXT: .LBB2_12: # %else10
785 ; AVX1-NEXT: testb $64, %al
786 ; AVX1-NEXT: jne .LBB2_13
787 ; AVX1-NEXT: .LBB2_14: # %else12
788 ; AVX1-NEXT: testb $-128, %al
789 ; AVX1-NEXT: jne .LBB2_15
790 ; AVX1-NEXT: .LBB2_16: # %else14
791 ; AVX1-NEXT: vzeroupper
793 ; AVX1-NEXT: .LBB2_1: # %cond.store
794 ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi)
795 ; AVX1-NEXT: testb $2, %al
796 ; AVX1-NEXT: je .LBB2_4
797 ; AVX1-NEXT: .LBB2_3: # %cond.store1
798 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi)
799 ; AVX1-NEXT: testb $4, %al
800 ; AVX1-NEXT: je .LBB2_6
801 ; AVX1-NEXT: .LBB2_5: # %cond.store3
802 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi)
803 ; AVX1-NEXT: testb $8, %al
804 ; AVX1-NEXT: je .LBB2_8
805 ; AVX1-NEXT: .LBB2_7: # %cond.store5
806 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi)
807 ; AVX1-NEXT: testb $16, %al
808 ; AVX1-NEXT: je .LBB2_10
809 ; AVX1-NEXT: .LBB2_9: # %cond.store7
810 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi)
811 ; AVX1-NEXT: testb $32, %al
812 ; AVX1-NEXT: je .LBB2_12
813 ; AVX1-NEXT: .LBB2_11: # %cond.store9
814 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi)
815 ; AVX1-NEXT: testb $64, %al
816 ; AVX1-NEXT: je .LBB2_14
817 ; AVX1-NEXT: .LBB2_13: # %cond.store11
818 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi)
819 ; AVX1-NEXT: testb $-128, %al
820 ; AVX1-NEXT: je .LBB2_16
821 ; AVX1-NEXT: .LBB2_15: # %cond.store13
822 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi)
823 ; AVX1-NEXT: vzeroupper
826 ; AVX2-LABEL: truncstore_v8i64_v8i8:
828 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
829 ; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [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]
830 ; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1
831 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
832 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
833 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
834 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
835 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
836 ; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0
837 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm1
838 ; AVX2-NEXT: vmovmskps %ymm1, %eax
839 ; AVX2-NEXT: notl %eax
840 ; AVX2-NEXT: testb $1, %al
841 ; AVX2-NEXT: jne .LBB2_1
842 ; AVX2-NEXT: # %bb.2: # %else
843 ; AVX2-NEXT: testb $2, %al
844 ; AVX2-NEXT: jne .LBB2_3
845 ; AVX2-NEXT: .LBB2_4: # %else2
846 ; AVX2-NEXT: testb $4, %al
847 ; AVX2-NEXT: jne .LBB2_5
848 ; AVX2-NEXT: .LBB2_6: # %else4
849 ; AVX2-NEXT: testb $8, %al
850 ; AVX2-NEXT: jne .LBB2_7
851 ; AVX2-NEXT: .LBB2_8: # %else6
852 ; AVX2-NEXT: testb $16, %al
853 ; AVX2-NEXT: jne .LBB2_9
854 ; AVX2-NEXT: .LBB2_10: # %else8
855 ; AVX2-NEXT: testb $32, %al
856 ; AVX2-NEXT: jne .LBB2_11
857 ; AVX2-NEXT: .LBB2_12: # %else10
858 ; AVX2-NEXT: testb $64, %al
859 ; AVX2-NEXT: jne .LBB2_13
860 ; AVX2-NEXT: .LBB2_14: # %else12
861 ; AVX2-NEXT: testb $-128, %al
862 ; AVX2-NEXT: jne .LBB2_15
863 ; AVX2-NEXT: .LBB2_16: # %else14
864 ; AVX2-NEXT: vzeroupper
866 ; AVX2-NEXT: .LBB2_1: # %cond.store
867 ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi)
868 ; AVX2-NEXT: testb $2, %al
869 ; AVX2-NEXT: je .LBB2_4
870 ; AVX2-NEXT: .LBB2_3: # %cond.store1
871 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi)
872 ; AVX2-NEXT: testb $4, %al
873 ; AVX2-NEXT: je .LBB2_6
874 ; AVX2-NEXT: .LBB2_5: # %cond.store3
875 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi)
876 ; AVX2-NEXT: testb $8, %al
877 ; AVX2-NEXT: je .LBB2_8
878 ; AVX2-NEXT: .LBB2_7: # %cond.store5
879 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi)
880 ; AVX2-NEXT: testb $16, %al
881 ; AVX2-NEXT: je .LBB2_10
882 ; AVX2-NEXT: .LBB2_9: # %cond.store7
883 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi)
884 ; AVX2-NEXT: testb $32, %al
885 ; AVX2-NEXT: je .LBB2_12
886 ; AVX2-NEXT: .LBB2_11: # %cond.store9
887 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi)
888 ; AVX2-NEXT: testb $64, %al
889 ; AVX2-NEXT: je .LBB2_14
890 ; AVX2-NEXT: .LBB2_13: # %cond.store11
891 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi)
892 ; AVX2-NEXT: testb $-128, %al
893 ; AVX2-NEXT: je .LBB2_16
894 ; AVX2-NEXT: .LBB2_15: # %cond.store13
895 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi)
896 ; AVX2-NEXT: vzeroupper
899 ; AVX512F-LABEL: truncstore_v8i64_v8i8:
901 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
902 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
903 ; AVX512F-NEXT: vpmovqb %zmm0, %xmm0
904 ; AVX512F-NEXT: kmovw %k0, %eax
905 ; AVX512F-NEXT: testb $1, %al
906 ; AVX512F-NEXT: jne .LBB2_1
907 ; AVX512F-NEXT: # %bb.2: # %else
908 ; AVX512F-NEXT: testb $2, %al
909 ; AVX512F-NEXT: jne .LBB2_3
910 ; AVX512F-NEXT: .LBB2_4: # %else2
911 ; AVX512F-NEXT: testb $4, %al
912 ; AVX512F-NEXT: jne .LBB2_5
913 ; AVX512F-NEXT: .LBB2_6: # %else4
914 ; AVX512F-NEXT: testb $8, %al
915 ; AVX512F-NEXT: jne .LBB2_7
916 ; AVX512F-NEXT: .LBB2_8: # %else6
917 ; AVX512F-NEXT: testb $16, %al
918 ; AVX512F-NEXT: jne .LBB2_9
919 ; AVX512F-NEXT: .LBB2_10: # %else8
920 ; AVX512F-NEXT: testb $32, %al
921 ; AVX512F-NEXT: jne .LBB2_11
922 ; AVX512F-NEXT: .LBB2_12: # %else10
923 ; AVX512F-NEXT: testb $64, %al
924 ; AVX512F-NEXT: jne .LBB2_13
925 ; AVX512F-NEXT: .LBB2_14: # %else12
926 ; AVX512F-NEXT: testb $-128, %al
927 ; AVX512F-NEXT: jne .LBB2_15
928 ; AVX512F-NEXT: .LBB2_16: # %else14
929 ; AVX512F-NEXT: vzeroupper
931 ; AVX512F-NEXT: .LBB2_1: # %cond.store
932 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
933 ; AVX512F-NEXT: testb $2, %al
934 ; AVX512F-NEXT: je .LBB2_4
935 ; AVX512F-NEXT: .LBB2_3: # %cond.store1
936 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
937 ; AVX512F-NEXT: testb $4, %al
938 ; AVX512F-NEXT: je .LBB2_6
939 ; AVX512F-NEXT: .LBB2_5: # %cond.store3
940 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi)
941 ; AVX512F-NEXT: testb $8, %al
942 ; AVX512F-NEXT: je .LBB2_8
943 ; AVX512F-NEXT: .LBB2_7: # %cond.store5
944 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi)
945 ; AVX512F-NEXT: testb $16, %al
946 ; AVX512F-NEXT: je .LBB2_10
947 ; AVX512F-NEXT: .LBB2_9: # %cond.store7
948 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi)
949 ; AVX512F-NEXT: testb $32, %al
950 ; AVX512F-NEXT: je .LBB2_12
951 ; AVX512F-NEXT: .LBB2_11: # %cond.store9
952 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi)
953 ; AVX512F-NEXT: testb $64, %al
954 ; AVX512F-NEXT: je .LBB2_14
955 ; AVX512F-NEXT: .LBB2_13: # %cond.store11
956 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi)
957 ; AVX512F-NEXT: testb $-128, %al
958 ; AVX512F-NEXT: je .LBB2_16
959 ; AVX512F-NEXT: .LBB2_15: # %cond.store13
960 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi)
961 ; AVX512F-NEXT: vzeroupper
964 ; AVX512BW-LABEL: truncstore_v8i64_v8i8:
966 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
967 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1
968 ; AVX512BW-NEXT: vpmovqb %zmm0, (%rdi) {%k1}
969 ; AVX512BW-NEXT: vzeroupper
970 ; AVX512BW-NEXT: retq
972 ; AVX512BWVL-LABEL: truncstore_v8i64_v8i8:
973 ; AVX512BWVL: # %bb.0:
974 ; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1
975 ; AVX512BWVL-NEXT: vpmovqb %zmm0, (%rdi) {%k1}
976 ; AVX512BWVL-NEXT: vzeroupper
977 ; AVX512BWVL-NEXT: retq
978 %a = icmp ne <8 x i32> %mask, zeroinitializer
979 %b = trunc <8 x i64> %x to <8 x i8>
980 call void @llvm.masked.store.v8i8.p0(<8 x i8> %b, ptr %p, i32 1, <8 x i1> %a)
984 define void @truncstore_v4i64_v4i32(<4 x i64> %x, ptr %p, <4 x i32> %mask) {
985 ; SSE2-LABEL: truncstore_v4i64_v4i32:
987 ; SSE2-NEXT: pxor %xmm3, %xmm3
988 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
989 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3
990 ; SSE2-NEXT: movmskps %xmm3, %eax
991 ; SSE2-NEXT: xorl $15, %eax
992 ; SSE2-NEXT: testb $1, %al
993 ; SSE2-NEXT: jne .LBB3_1
994 ; SSE2-NEXT: # %bb.2: # %else
995 ; SSE2-NEXT: testb $2, %al
996 ; SSE2-NEXT: jne .LBB3_3
997 ; SSE2-NEXT: .LBB3_4: # %else2
998 ; SSE2-NEXT: testb $4, %al
999 ; SSE2-NEXT: jne .LBB3_5
1000 ; SSE2-NEXT: .LBB3_6: # %else4
1001 ; SSE2-NEXT: testb $8, %al
1002 ; SSE2-NEXT: jne .LBB3_7
1003 ; SSE2-NEXT: .LBB3_8: # %else6
1005 ; SSE2-NEXT: .LBB3_1: # %cond.store
1006 ; SSE2-NEXT: movss %xmm0, (%rdi)
1007 ; SSE2-NEXT: testb $2, %al
1008 ; SSE2-NEXT: je .LBB3_4
1009 ; SSE2-NEXT: .LBB3_3: # %cond.store1
1010 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1011 ; SSE2-NEXT: movd %xmm1, 4(%rdi)
1012 ; SSE2-NEXT: testb $4, %al
1013 ; SSE2-NEXT: je .LBB3_6
1014 ; SSE2-NEXT: .LBB3_5: # %cond.store3
1015 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1016 ; SSE2-NEXT: movd %xmm1, 8(%rdi)
1017 ; SSE2-NEXT: testb $8, %al
1018 ; SSE2-NEXT: je .LBB3_8
1019 ; SSE2-NEXT: .LBB3_7: # %cond.store5
1020 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
1021 ; SSE2-NEXT: movd %xmm0, 12(%rdi)
1024 ; SSE4-LABEL: truncstore_v4i64_v4i32:
1026 ; SSE4-NEXT: pxor %xmm3, %xmm3
1027 ; SSE4-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1028 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm3
1029 ; SSE4-NEXT: movmskps %xmm3, %eax
1030 ; SSE4-NEXT: xorl $15, %eax
1031 ; SSE4-NEXT: testb $1, %al
1032 ; SSE4-NEXT: jne .LBB3_1
1033 ; SSE4-NEXT: # %bb.2: # %else
1034 ; SSE4-NEXT: testb $2, %al
1035 ; SSE4-NEXT: jne .LBB3_3
1036 ; SSE4-NEXT: .LBB3_4: # %else2
1037 ; SSE4-NEXT: testb $4, %al
1038 ; SSE4-NEXT: jne .LBB3_5
1039 ; SSE4-NEXT: .LBB3_6: # %else4
1040 ; SSE4-NEXT: testb $8, %al
1041 ; SSE4-NEXT: jne .LBB3_7
1042 ; SSE4-NEXT: .LBB3_8: # %else6
1044 ; SSE4-NEXT: .LBB3_1: # %cond.store
1045 ; SSE4-NEXT: movss %xmm0, (%rdi)
1046 ; SSE4-NEXT: testb $2, %al
1047 ; SSE4-NEXT: je .LBB3_4
1048 ; SSE4-NEXT: .LBB3_3: # %cond.store1
1049 ; SSE4-NEXT: extractps $1, %xmm0, 4(%rdi)
1050 ; SSE4-NEXT: testb $4, %al
1051 ; SSE4-NEXT: je .LBB3_6
1052 ; SSE4-NEXT: .LBB3_5: # %cond.store3
1053 ; SSE4-NEXT: extractps $2, %xmm0, 8(%rdi)
1054 ; SSE4-NEXT: testb $8, %al
1055 ; SSE4-NEXT: je .LBB3_8
1056 ; SSE4-NEXT: .LBB3_7: # %cond.store5
1057 ; SSE4-NEXT: extractps $3, %xmm0, 12(%rdi)
1060 ; AVX1-LABEL: truncstore_v4i64_v4i32:
1062 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1063 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
1064 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1065 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
1066 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1067 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
1068 ; AVX1-NEXT: vmaskmovps %xmm0, %xmm1, (%rdi)
1069 ; AVX1-NEXT: vzeroupper
1072 ; AVX2-LABEL: truncstore_v4i64_v4i32:
1074 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1075 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
1076 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1077 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
1078 ; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2
1079 ; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
1080 ; AVX2-NEXT: vpmaskmovd %xmm0, %xmm1, (%rdi)
1081 ; AVX2-NEXT: vzeroupper
1084 ; AVX512F-LABEL: truncstore_v4i64_v4i32:
1086 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1087 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1088 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
1089 ; AVX512F-NEXT: kshiftlw $12, %k0, %k0
1090 ; AVX512F-NEXT: kshiftrw $12, %k0, %k1
1091 ; AVX512F-NEXT: vpmovqd %zmm0, %ymm0
1092 ; AVX512F-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1}
1093 ; AVX512F-NEXT: vzeroupper
1094 ; AVX512F-NEXT: retq
1096 ; AVX512VL-LABEL: truncstore_v4i64_v4i32:
1097 ; AVX512VL: # %bb.0:
1098 ; AVX512VL-NEXT: vptestmd %xmm1, %xmm1, %k1
1099 ; AVX512VL-NEXT: vpmovqd %ymm0, (%rdi) {%k1}
1100 ; AVX512VL-NEXT: vzeroupper
1101 ; AVX512VL-NEXT: retq
1103 ; AVX512BW-LABEL: truncstore_v4i64_v4i32:
1104 ; AVX512BW: # %bb.0:
1105 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1106 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1107 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0
1108 ; AVX512BW-NEXT: kshiftlw $12, %k0, %k0
1109 ; AVX512BW-NEXT: kshiftrw $12, %k0, %k1
1110 ; AVX512BW-NEXT: vpmovqd %zmm0, %ymm0
1111 ; AVX512BW-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1}
1112 ; AVX512BW-NEXT: vzeroupper
1113 ; AVX512BW-NEXT: retq
1114 %a = icmp ne <4 x i32> %mask, zeroinitializer
1115 %b = trunc <4 x i64> %x to <4 x i32>
1116 call void @llvm.masked.store.v4i32.p0(<4 x i32> %b, ptr %p, i32 1, <4 x i1> %a)
1120 define void @truncstore_v4i64_v4i16(<4 x i64> %x, ptr %p, <4 x i32> %mask) {
1121 ; SSE2-LABEL: truncstore_v4i64_v4i16:
1123 ; SSE2-NEXT: pxor %xmm3, %xmm3
1124 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1125 ; SSE2-NEXT: pslld $16, %xmm0
1126 ; SSE2-NEXT: psrad $16, %xmm0
1127 ; SSE2-NEXT: packssdw %xmm3, %xmm0
1128 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1129 ; SSE2-NEXT: movmskps %xmm2, %eax
1130 ; SSE2-NEXT: xorl $15, %eax
1131 ; SSE2-NEXT: testb $1, %al
1132 ; SSE2-NEXT: jne .LBB4_1
1133 ; SSE2-NEXT: # %bb.2: # %else
1134 ; SSE2-NEXT: testb $2, %al
1135 ; SSE2-NEXT: jne .LBB4_3
1136 ; SSE2-NEXT: .LBB4_4: # %else2
1137 ; SSE2-NEXT: testb $4, %al
1138 ; SSE2-NEXT: jne .LBB4_5
1139 ; SSE2-NEXT: .LBB4_6: # %else4
1140 ; SSE2-NEXT: testb $8, %al
1141 ; SSE2-NEXT: jne .LBB4_7
1142 ; SSE2-NEXT: .LBB4_8: # %else6
1144 ; SSE2-NEXT: .LBB4_1: # %cond.store
1145 ; SSE2-NEXT: movd %xmm0, %ecx
1146 ; SSE2-NEXT: movw %cx, (%rdi)
1147 ; SSE2-NEXT: testb $2, %al
1148 ; SSE2-NEXT: je .LBB4_4
1149 ; SSE2-NEXT: .LBB4_3: # %cond.store1
1150 ; SSE2-NEXT: pextrw $1, %xmm0, %ecx
1151 ; SSE2-NEXT: movw %cx, 2(%rdi)
1152 ; SSE2-NEXT: testb $4, %al
1153 ; SSE2-NEXT: je .LBB4_6
1154 ; SSE2-NEXT: .LBB4_5: # %cond.store3
1155 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
1156 ; SSE2-NEXT: movw %cx, 4(%rdi)
1157 ; SSE2-NEXT: testb $8, %al
1158 ; SSE2-NEXT: je .LBB4_8
1159 ; SSE2-NEXT: .LBB4_7: # %cond.store5
1160 ; SSE2-NEXT: pextrw $3, %xmm0, %eax
1161 ; SSE2-NEXT: movw %ax, 6(%rdi)
1164 ; SSE4-LABEL: truncstore_v4i64_v4i16:
1166 ; SSE4-NEXT: pxor %xmm3, %xmm3
1167 ; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7]
1168 ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7]
1169 ; SSE4-NEXT: packusdw %xmm1, %xmm0
1170 ; SSE4-NEXT: packusdw %xmm3, %xmm0
1171 ; SSE4-NEXT: pcmpeqd %xmm3, %xmm2
1172 ; SSE4-NEXT: movmskps %xmm2, %eax
1173 ; SSE4-NEXT: xorl $15, %eax
1174 ; SSE4-NEXT: testb $1, %al
1175 ; SSE4-NEXT: jne .LBB4_1
1176 ; SSE4-NEXT: # %bb.2: # %else
1177 ; SSE4-NEXT: testb $2, %al
1178 ; SSE4-NEXT: jne .LBB4_3
1179 ; SSE4-NEXT: .LBB4_4: # %else2
1180 ; SSE4-NEXT: testb $4, %al
1181 ; SSE4-NEXT: jne .LBB4_5
1182 ; SSE4-NEXT: .LBB4_6: # %else4
1183 ; SSE4-NEXT: testb $8, %al
1184 ; SSE4-NEXT: jne .LBB4_7
1185 ; SSE4-NEXT: .LBB4_8: # %else6
1187 ; SSE4-NEXT: .LBB4_1: # %cond.store
1188 ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi)
1189 ; SSE4-NEXT: testb $2, %al
1190 ; SSE4-NEXT: je .LBB4_4
1191 ; SSE4-NEXT: .LBB4_3: # %cond.store1
1192 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi)
1193 ; SSE4-NEXT: testb $4, %al
1194 ; SSE4-NEXT: je .LBB4_6
1195 ; SSE4-NEXT: .LBB4_5: # %cond.store3
1196 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi)
1197 ; SSE4-NEXT: testb $8, %al
1198 ; SSE4-NEXT: je .LBB4_8
1199 ; SSE4-NEXT: .LBB4_7: # %cond.store5
1200 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi)
1203 ; AVX1-LABEL: truncstore_v4i64_v4i16:
1205 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1206 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1207 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1,2,3],xmm3[4],xmm2[5,6,7]
1208 ; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7]
1209 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
1210 ; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1211 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
1212 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1213 ; AVX1-NEXT: xorl $15, %eax
1214 ; AVX1-NEXT: testb $1, %al
1215 ; AVX1-NEXT: jne .LBB4_1
1216 ; AVX1-NEXT: # %bb.2: # %else
1217 ; AVX1-NEXT: testb $2, %al
1218 ; AVX1-NEXT: jne .LBB4_3
1219 ; AVX1-NEXT: .LBB4_4: # %else2
1220 ; AVX1-NEXT: testb $4, %al
1221 ; AVX1-NEXT: jne .LBB4_5
1222 ; AVX1-NEXT: .LBB4_6: # %else4
1223 ; AVX1-NEXT: testb $8, %al
1224 ; AVX1-NEXT: jne .LBB4_7
1225 ; AVX1-NEXT: .LBB4_8: # %else6
1226 ; AVX1-NEXT: vzeroupper
1228 ; AVX1-NEXT: .LBB4_1: # %cond.store
1229 ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi)
1230 ; AVX1-NEXT: testb $2, %al
1231 ; AVX1-NEXT: je .LBB4_4
1232 ; AVX1-NEXT: .LBB4_3: # %cond.store1
1233 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi)
1234 ; AVX1-NEXT: testb $4, %al
1235 ; AVX1-NEXT: je .LBB4_6
1236 ; AVX1-NEXT: .LBB4_5: # %cond.store3
1237 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi)
1238 ; AVX1-NEXT: testb $8, %al
1239 ; AVX1-NEXT: je .LBB4_8
1240 ; AVX1-NEXT: .LBB4_7: # %cond.store5
1241 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi)
1242 ; AVX1-NEXT: vzeroupper
1245 ; AVX2-LABEL: truncstore_v4i64_v4i16:
1247 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1248 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
1249 ; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm3[1,2,3],ymm0[4],ymm3[5,6,7],ymm0[8],ymm3[9,10,11],ymm0[12],ymm3[13,14,15]
1250 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
1251 ; AVX2-NEXT: vpackusdw %xmm3, %xmm0, %xmm0
1252 ; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0
1253 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
1254 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1255 ; AVX2-NEXT: xorl $15, %eax
1256 ; AVX2-NEXT: testb $1, %al
1257 ; AVX2-NEXT: jne .LBB4_1
1258 ; AVX2-NEXT: # %bb.2: # %else
1259 ; AVX2-NEXT: testb $2, %al
1260 ; AVX2-NEXT: jne .LBB4_3
1261 ; AVX2-NEXT: .LBB4_4: # %else2
1262 ; AVX2-NEXT: testb $4, %al
1263 ; AVX2-NEXT: jne .LBB4_5
1264 ; AVX2-NEXT: .LBB4_6: # %else4
1265 ; AVX2-NEXT: testb $8, %al
1266 ; AVX2-NEXT: jne .LBB4_7
1267 ; AVX2-NEXT: .LBB4_8: # %else6
1268 ; AVX2-NEXT: vzeroupper
1270 ; AVX2-NEXT: .LBB4_1: # %cond.store
1271 ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi)
1272 ; AVX2-NEXT: testb $2, %al
1273 ; AVX2-NEXT: je .LBB4_4
1274 ; AVX2-NEXT: .LBB4_3: # %cond.store1
1275 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi)
1276 ; AVX2-NEXT: testb $4, %al
1277 ; AVX2-NEXT: je .LBB4_6
1278 ; AVX2-NEXT: .LBB4_5: # %cond.store3
1279 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi)
1280 ; AVX2-NEXT: testb $8, %al
1281 ; AVX2-NEXT: je .LBB4_8
1282 ; AVX2-NEXT: .LBB4_7: # %cond.store5
1283 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi)
1284 ; AVX2-NEXT: vzeroupper
1287 ; AVX512F-LABEL: truncstore_v4i64_v4i16:
1289 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1290 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1291 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
1292 ; AVX512F-NEXT: vpmovqw %zmm0, %xmm0
1293 ; AVX512F-NEXT: kmovw %k0, %eax
1294 ; AVX512F-NEXT: testb $1, %al
1295 ; AVX512F-NEXT: jne .LBB4_1
1296 ; AVX512F-NEXT: # %bb.2: # %else
1297 ; AVX512F-NEXT: testb $2, %al
1298 ; AVX512F-NEXT: jne .LBB4_3
1299 ; AVX512F-NEXT: .LBB4_4: # %else2
1300 ; AVX512F-NEXT: testb $4, %al
1301 ; AVX512F-NEXT: jne .LBB4_5
1302 ; AVX512F-NEXT: .LBB4_6: # %else4
1303 ; AVX512F-NEXT: testb $8, %al
1304 ; AVX512F-NEXT: jne .LBB4_7
1305 ; AVX512F-NEXT: .LBB4_8: # %else6
1306 ; AVX512F-NEXT: vzeroupper
1307 ; AVX512F-NEXT: retq
1308 ; AVX512F-NEXT: .LBB4_1: # %cond.store
1309 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
1310 ; AVX512F-NEXT: testb $2, %al
1311 ; AVX512F-NEXT: je .LBB4_4
1312 ; AVX512F-NEXT: .LBB4_3: # %cond.store1
1313 ; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi)
1314 ; AVX512F-NEXT: testb $4, %al
1315 ; AVX512F-NEXT: je .LBB4_6
1316 ; AVX512F-NEXT: .LBB4_5: # %cond.store3
1317 ; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi)
1318 ; AVX512F-NEXT: testb $8, %al
1319 ; AVX512F-NEXT: je .LBB4_8
1320 ; AVX512F-NEXT: .LBB4_7: # %cond.store5
1321 ; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi)
1322 ; AVX512F-NEXT: vzeroupper
1323 ; AVX512F-NEXT: retq
1325 ; AVX512BW-LABEL: truncstore_v4i64_v4i16:
1326 ; AVX512BW: # %bb.0:
1327 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1328 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1329 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0
1330 ; AVX512BW-NEXT: kshiftld $28, %k0, %k0
1331 ; AVX512BW-NEXT: kshiftrd $28, %k0, %k1
1332 ; AVX512BW-NEXT: vpmovqw %zmm0, %xmm0
1333 ; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1}
1334 ; AVX512BW-NEXT: vzeroupper
1335 ; AVX512BW-NEXT: retq
1337 ; AVX512BWVL-LABEL: truncstore_v4i64_v4i16:
1338 ; AVX512BWVL: # %bb.0:
1339 ; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1
1340 ; AVX512BWVL-NEXT: vpmovqw %ymm0, (%rdi) {%k1}
1341 ; AVX512BWVL-NEXT: vzeroupper
1342 ; AVX512BWVL-NEXT: retq
1343 %a = icmp ne <4 x i32> %mask, zeroinitializer
1344 %b = trunc <4 x i64> %x to <4 x i16>
1345 call void @llvm.masked.store.v4i16.p0(<4 x i16> %b, ptr %p, i32 1, <4 x i1> %a)
1349 define void @truncstore_v4i64_v4i8(<4 x i64> %x, ptr %p, <4 x i32> %mask) {
1350 ; SSE2-LABEL: truncstore_v4i64_v4i8:
1352 ; SSE2-NEXT: pxor %xmm3, %xmm3
1353 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1354 ; SSE2-NEXT: pand %xmm4, %xmm1
1355 ; SSE2-NEXT: pand %xmm4, %xmm0
1356 ; SSE2-NEXT: packuswb %xmm1, %xmm0
1357 ; SSE2-NEXT: packuswb %xmm3, %xmm0
1358 ; SSE2-NEXT: packuswb %xmm3, %xmm0
1359 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2
1360 ; SSE2-NEXT: movmskps %xmm2, %ecx
1361 ; SSE2-NEXT: xorl $15, %ecx
1362 ; SSE2-NEXT: testb $1, %cl
1363 ; SSE2-NEXT: movd %xmm0, %eax
1364 ; SSE2-NEXT: jne .LBB5_1
1365 ; SSE2-NEXT: # %bb.2: # %else
1366 ; SSE2-NEXT: testb $2, %cl
1367 ; SSE2-NEXT: jne .LBB5_3
1368 ; SSE2-NEXT: .LBB5_4: # %else2
1369 ; SSE2-NEXT: testb $4, %cl
1370 ; SSE2-NEXT: jne .LBB5_5
1371 ; SSE2-NEXT: .LBB5_6: # %else4
1372 ; SSE2-NEXT: testb $8, %cl
1373 ; SSE2-NEXT: jne .LBB5_7
1374 ; SSE2-NEXT: .LBB5_8: # %else6
1376 ; SSE2-NEXT: .LBB5_1: # %cond.store
1377 ; SSE2-NEXT: movb %al, (%rdi)
1378 ; SSE2-NEXT: testb $2, %cl
1379 ; SSE2-NEXT: je .LBB5_4
1380 ; SSE2-NEXT: .LBB5_3: # %cond.store1
1381 ; SSE2-NEXT: movb %ah, 1(%rdi)
1382 ; SSE2-NEXT: testb $4, %cl
1383 ; SSE2-NEXT: je .LBB5_6
1384 ; SSE2-NEXT: .LBB5_5: # %cond.store3
1385 ; SSE2-NEXT: movl %eax, %edx
1386 ; SSE2-NEXT: shrl $16, %edx
1387 ; SSE2-NEXT: movb %dl, 2(%rdi)
1388 ; SSE2-NEXT: testb $8, %cl
1389 ; SSE2-NEXT: je .LBB5_8
1390 ; SSE2-NEXT: .LBB5_7: # %cond.store5
1391 ; SSE2-NEXT: shrl $24, %eax
1392 ; SSE2-NEXT: movb %al, 3(%rdi)
1395 ; SSE4-LABEL: truncstore_v4i64_v4i8:
1397 ; SSE4-NEXT: pxor %xmm3, %xmm3
1398 ; SSE4-NEXT: movd {{.*#+}} xmm4 = [0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1399 ; SSE4-NEXT: pshufb %xmm4, %xmm1
1400 ; SSE4-NEXT: pshufb %xmm4, %xmm0
1401 ; SSE4-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1402 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm3
1403 ; SSE4-NEXT: movmskps %xmm3, %eax
1404 ; SSE4-NEXT: xorl $15, %eax
1405 ; SSE4-NEXT: testb $1, %al
1406 ; SSE4-NEXT: jne .LBB5_1
1407 ; SSE4-NEXT: # %bb.2: # %else
1408 ; SSE4-NEXT: testb $2, %al
1409 ; SSE4-NEXT: jne .LBB5_3
1410 ; SSE4-NEXT: .LBB5_4: # %else2
1411 ; SSE4-NEXT: testb $4, %al
1412 ; SSE4-NEXT: jne .LBB5_5
1413 ; SSE4-NEXT: .LBB5_6: # %else4
1414 ; SSE4-NEXT: testb $8, %al
1415 ; SSE4-NEXT: jne .LBB5_7
1416 ; SSE4-NEXT: .LBB5_8: # %else6
1418 ; SSE4-NEXT: .LBB5_1: # %cond.store
1419 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
1420 ; SSE4-NEXT: testb $2, %al
1421 ; SSE4-NEXT: je .LBB5_4
1422 ; SSE4-NEXT: .LBB5_3: # %cond.store1
1423 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
1424 ; SSE4-NEXT: testb $4, %al
1425 ; SSE4-NEXT: je .LBB5_6
1426 ; SSE4-NEXT: .LBB5_5: # %cond.store3
1427 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi)
1428 ; SSE4-NEXT: testb $8, %al
1429 ; SSE4-NEXT: je .LBB5_8
1430 ; SSE4-NEXT: .LBB5_7: # %cond.store5
1431 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi)
1434 ; AVX1-LABEL: truncstore_v4i64_v4i8:
1436 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1437 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
1438 ; AVX1-NEXT: vmovd {{.*#+}} xmm4 = [0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
1439 ; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3
1440 ; AVX1-NEXT: vpshufb %xmm4, %xmm0, %xmm0
1441 ; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1442 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
1443 ; AVX1-NEXT: vmovmskps %xmm1, %eax
1444 ; AVX1-NEXT: xorl $15, %eax
1445 ; AVX1-NEXT: testb $1, %al
1446 ; AVX1-NEXT: jne .LBB5_1
1447 ; AVX1-NEXT: # %bb.2: # %else
1448 ; AVX1-NEXT: testb $2, %al
1449 ; AVX1-NEXT: jne .LBB5_3
1450 ; AVX1-NEXT: .LBB5_4: # %else2
1451 ; AVX1-NEXT: testb $4, %al
1452 ; AVX1-NEXT: jne .LBB5_5
1453 ; AVX1-NEXT: .LBB5_6: # %else4
1454 ; AVX1-NEXT: testb $8, %al
1455 ; AVX1-NEXT: jne .LBB5_7
1456 ; AVX1-NEXT: .LBB5_8: # %else6
1457 ; AVX1-NEXT: vzeroupper
1459 ; AVX1-NEXT: .LBB5_1: # %cond.store
1460 ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi)
1461 ; AVX1-NEXT: testb $2, %al
1462 ; AVX1-NEXT: je .LBB5_4
1463 ; AVX1-NEXT: .LBB5_3: # %cond.store1
1464 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi)
1465 ; AVX1-NEXT: testb $4, %al
1466 ; AVX1-NEXT: je .LBB5_6
1467 ; AVX1-NEXT: .LBB5_5: # %cond.store3
1468 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi)
1469 ; AVX1-NEXT: testb $8, %al
1470 ; AVX1-NEXT: je .LBB5_8
1471 ; AVX1-NEXT: .LBB5_7: # %cond.store5
1472 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi)
1473 ; AVX1-NEXT: vzeroupper
1476 ; AVX2-LABEL: truncstore_v4i64_v4i8:
1478 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1479 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
1480 ; AVX2-NEXT: vpbroadcastw {{.*#+}} xmm4 = [0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8]
1481 ; AVX2-NEXT: vpshufb %xmm4, %xmm3, %xmm3
1482 ; AVX2-NEXT: vpshufb %xmm4, %xmm0, %xmm0
1483 ; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
1484 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
1485 ; AVX2-NEXT: vmovmskps %xmm1, %eax
1486 ; AVX2-NEXT: xorl $15, %eax
1487 ; AVX2-NEXT: testb $1, %al
1488 ; AVX2-NEXT: jne .LBB5_1
1489 ; AVX2-NEXT: # %bb.2: # %else
1490 ; AVX2-NEXT: testb $2, %al
1491 ; AVX2-NEXT: jne .LBB5_3
1492 ; AVX2-NEXT: .LBB5_4: # %else2
1493 ; AVX2-NEXT: testb $4, %al
1494 ; AVX2-NEXT: jne .LBB5_5
1495 ; AVX2-NEXT: .LBB5_6: # %else4
1496 ; AVX2-NEXT: testb $8, %al
1497 ; AVX2-NEXT: jne .LBB5_7
1498 ; AVX2-NEXT: .LBB5_8: # %else6
1499 ; AVX2-NEXT: vzeroupper
1501 ; AVX2-NEXT: .LBB5_1: # %cond.store
1502 ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi)
1503 ; AVX2-NEXT: testb $2, %al
1504 ; AVX2-NEXT: je .LBB5_4
1505 ; AVX2-NEXT: .LBB5_3: # %cond.store1
1506 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi)
1507 ; AVX2-NEXT: testb $4, %al
1508 ; AVX2-NEXT: je .LBB5_6
1509 ; AVX2-NEXT: .LBB5_5: # %cond.store3
1510 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi)
1511 ; AVX2-NEXT: testb $8, %al
1512 ; AVX2-NEXT: je .LBB5_8
1513 ; AVX2-NEXT: .LBB5_7: # %cond.store5
1514 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi)
1515 ; AVX2-NEXT: vzeroupper
1518 ; AVX512F-LABEL: truncstore_v4i64_v4i8:
1520 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1521 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1522 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
1523 ; AVX512F-NEXT: vpmovqb %zmm0, %xmm0
1524 ; AVX512F-NEXT: kmovw %k0, %eax
1525 ; AVX512F-NEXT: testb $1, %al
1526 ; AVX512F-NEXT: jne .LBB5_1
1527 ; AVX512F-NEXT: # %bb.2: # %else
1528 ; AVX512F-NEXT: testb $2, %al
1529 ; AVX512F-NEXT: jne .LBB5_3
1530 ; AVX512F-NEXT: .LBB5_4: # %else2
1531 ; AVX512F-NEXT: testb $4, %al
1532 ; AVX512F-NEXT: jne .LBB5_5
1533 ; AVX512F-NEXT: .LBB5_6: # %else4
1534 ; AVX512F-NEXT: testb $8, %al
1535 ; AVX512F-NEXT: jne .LBB5_7
1536 ; AVX512F-NEXT: .LBB5_8: # %else6
1537 ; AVX512F-NEXT: vzeroupper
1538 ; AVX512F-NEXT: retq
1539 ; AVX512F-NEXT: .LBB5_1: # %cond.store
1540 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
1541 ; AVX512F-NEXT: testb $2, %al
1542 ; AVX512F-NEXT: je .LBB5_4
1543 ; AVX512F-NEXT: .LBB5_3: # %cond.store1
1544 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
1545 ; AVX512F-NEXT: testb $4, %al
1546 ; AVX512F-NEXT: je .LBB5_6
1547 ; AVX512F-NEXT: .LBB5_5: # %cond.store3
1548 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi)
1549 ; AVX512F-NEXT: testb $8, %al
1550 ; AVX512F-NEXT: je .LBB5_8
1551 ; AVX512F-NEXT: .LBB5_7: # %cond.store5
1552 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi)
1553 ; AVX512F-NEXT: vzeroupper
1554 ; AVX512F-NEXT: retq
1556 ; AVX512BW-LABEL: truncstore_v4i64_v4i8:
1557 ; AVX512BW: # %bb.0:
1558 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1559 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
1560 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0
1561 ; AVX512BW-NEXT: kshiftlq $60, %k0, %k0
1562 ; AVX512BW-NEXT: kshiftrq $60, %k0, %k1
1563 ; AVX512BW-NEXT: vpmovqb %zmm0, %xmm0
1564 ; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1}
1565 ; AVX512BW-NEXT: vzeroupper
1566 ; AVX512BW-NEXT: retq
1568 ; AVX512BWVL-LABEL: truncstore_v4i64_v4i8:
1569 ; AVX512BWVL: # %bb.0:
1570 ; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1
1571 ; AVX512BWVL-NEXT: vpmovqb %ymm0, (%rdi) {%k1}
1572 ; AVX512BWVL-NEXT: vzeroupper
1573 ; AVX512BWVL-NEXT: retq
1574 %a = icmp ne <4 x i32> %mask, zeroinitializer
1575 %b = trunc <4 x i64> %x to <4 x i8>
1576 call void @llvm.masked.store.v4i8.p0(<4 x i8> %b, ptr %p, i32 1, <4 x i1> %a)
1580 define void @truncstore_v2i64_v2i32(<2 x i64> %x, ptr %p, <2 x i64> %mask) {
1581 ; SSE2-LABEL: truncstore_v2i64_v2i32:
1583 ; SSE2-NEXT: pxor %xmm2, %xmm2
1584 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1585 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
1586 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
1587 ; SSE2-NEXT: pand %xmm2, %xmm1
1588 ; SSE2-NEXT: movmskpd %xmm1, %eax
1589 ; SSE2-NEXT: xorl $3, %eax
1590 ; SSE2-NEXT: testb $1, %al
1591 ; SSE2-NEXT: jne .LBB6_1
1592 ; SSE2-NEXT: # %bb.2: # %else
1593 ; SSE2-NEXT: testb $2, %al
1594 ; SSE2-NEXT: jne .LBB6_3
1595 ; SSE2-NEXT: .LBB6_4: # %else2
1597 ; SSE2-NEXT: .LBB6_1: # %cond.store
1598 ; SSE2-NEXT: movd %xmm0, (%rdi)
1599 ; SSE2-NEXT: testb $2, %al
1600 ; SSE2-NEXT: je .LBB6_4
1601 ; SSE2-NEXT: .LBB6_3: # %cond.store1
1602 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
1603 ; SSE2-NEXT: movd %xmm0, 4(%rdi)
1606 ; SSE4-LABEL: truncstore_v2i64_v2i32:
1608 ; SSE4-NEXT: pxor %xmm2, %xmm2
1609 ; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1610 ; SSE4-NEXT: pcmpeqq %xmm1, %xmm2
1611 ; SSE4-NEXT: movmskpd %xmm2, %eax
1612 ; SSE4-NEXT: xorl $3, %eax
1613 ; SSE4-NEXT: testb $1, %al
1614 ; SSE4-NEXT: jne .LBB6_1
1615 ; SSE4-NEXT: # %bb.2: # %else
1616 ; SSE4-NEXT: testb $2, %al
1617 ; SSE4-NEXT: jne .LBB6_3
1618 ; SSE4-NEXT: .LBB6_4: # %else2
1620 ; SSE4-NEXT: .LBB6_1: # %cond.store
1621 ; SSE4-NEXT: movd %xmm0, (%rdi)
1622 ; SSE4-NEXT: testb $2, %al
1623 ; SSE4-NEXT: je .LBB6_4
1624 ; SSE4-NEXT: .LBB6_3: # %cond.store1
1625 ; SSE4-NEXT: pextrd $1, %xmm0, 4(%rdi)
1628 ; AVX1-LABEL: truncstore_v2i64_v2i32:
1630 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
1631 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
1632 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1633 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
1634 ; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero
1635 ; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2,2,3]
1636 ; AVX1-NEXT: vmaskmovps %xmm0, %xmm1, (%rdi)
1639 ; AVX2-LABEL: truncstore_v2i64_v2i32:
1641 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
1642 ; AVX2-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
1643 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2
1644 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
1645 ; AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero
1646 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1647 ; AVX2-NEXT: vpmaskmovd %xmm0, %xmm1, (%rdi)
1650 ; AVX512F-LABEL: truncstore_v2i64_v2i32:
1652 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1653 ; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0
1654 ; AVX512F-NEXT: kshiftlw $14, %k0, %k0
1655 ; AVX512F-NEXT: kshiftrw $14, %k0, %k1
1656 ; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1657 ; AVX512F-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1}
1658 ; AVX512F-NEXT: vzeroupper
1659 ; AVX512F-NEXT: retq
1661 ; AVX512VL-LABEL: truncstore_v2i64_v2i32:
1662 ; AVX512VL: # %bb.0:
1663 ; AVX512VL-NEXT: vptestmq %xmm1, %xmm1, %k1
1664 ; AVX512VL-NEXT: vpmovqd %xmm0, (%rdi) {%k1}
1665 ; AVX512VL-NEXT: retq
1667 ; AVX512BW-LABEL: truncstore_v2i64_v2i32:
1668 ; AVX512BW: # %bb.0:
1669 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1670 ; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0
1671 ; AVX512BW-NEXT: kshiftlw $14, %k0, %k0
1672 ; AVX512BW-NEXT: kshiftrw $14, %k0, %k1
1673 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1674 ; AVX512BW-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1}
1675 ; AVX512BW-NEXT: vzeroupper
1676 ; AVX512BW-NEXT: retq
1677 %a = icmp ne <2 x i64> %mask, zeroinitializer
1678 %b = trunc <2 x i64> %x to <2 x i32>
1679 call void @llvm.masked.store.v2i32.p0(<2 x i32> %b, ptr %p, i32 1, <2 x i1> %a)
1683 define void @truncstore_v2i64_v2i16(<2 x i64> %x, ptr %p, <2 x i64> %mask) {
1684 ; SSE2-LABEL: truncstore_v2i64_v2i16:
1686 ; SSE2-NEXT: pxor %xmm2, %xmm2
1687 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1688 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1689 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
1690 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
1691 ; SSE2-NEXT: pand %xmm2, %xmm1
1692 ; SSE2-NEXT: movmskpd %xmm1, %eax
1693 ; SSE2-NEXT: xorl $3, %eax
1694 ; SSE2-NEXT: testb $1, %al
1695 ; SSE2-NEXT: jne .LBB7_1
1696 ; SSE2-NEXT: # %bb.2: # %else
1697 ; SSE2-NEXT: testb $2, %al
1698 ; SSE2-NEXT: jne .LBB7_3
1699 ; SSE2-NEXT: .LBB7_4: # %else2
1701 ; SSE2-NEXT: .LBB7_1: # %cond.store
1702 ; SSE2-NEXT: movd %xmm0, %ecx
1703 ; SSE2-NEXT: movw %cx, (%rdi)
1704 ; SSE2-NEXT: testb $2, %al
1705 ; SSE2-NEXT: je .LBB7_4
1706 ; SSE2-NEXT: .LBB7_3: # %cond.store1
1707 ; SSE2-NEXT: pextrw $1, %xmm0, %eax
1708 ; SSE2-NEXT: movw %ax, 2(%rdi)
1711 ; SSE4-LABEL: truncstore_v2i64_v2i16:
1713 ; SSE4-NEXT: pxor %xmm2, %xmm2
1714 ; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1715 ; SSE4-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1716 ; SSE4-NEXT: pcmpeqq %xmm1, %xmm2
1717 ; SSE4-NEXT: movmskpd %xmm2, %eax
1718 ; SSE4-NEXT: xorl $3, %eax
1719 ; SSE4-NEXT: testb $1, %al
1720 ; SSE4-NEXT: jne .LBB7_1
1721 ; SSE4-NEXT: # %bb.2: # %else
1722 ; SSE4-NEXT: testb $2, %al
1723 ; SSE4-NEXT: jne .LBB7_3
1724 ; SSE4-NEXT: .LBB7_4: # %else2
1726 ; SSE4-NEXT: .LBB7_1: # %cond.store
1727 ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi)
1728 ; SSE4-NEXT: testb $2, %al
1729 ; SSE4-NEXT: je .LBB7_4
1730 ; SSE4-NEXT: .LBB7_3: # %cond.store1
1731 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi)
1734 ; AVX-LABEL: truncstore_v2i64_v2i16:
1736 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
1737 ; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1738 ; AVX-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1739 ; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
1740 ; AVX-NEXT: vmovmskpd %xmm1, %eax
1741 ; AVX-NEXT: xorl $3, %eax
1742 ; AVX-NEXT: testb $1, %al
1743 ; AVX-NEXT: jne .LBB7_1
1744 ; AVX-NEXT: # %bb.2: # %else
1745 ; AVX-NEXT: testb $2, %al
1746 ; AVX-NEXT: jne .LBB7_3
1747 ; AVX-NEXT: .LBB7_4: # %else2
1749 ; AVX-NEXT: .LBB7_1: # %cond.store
1750 ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)
1751 ; AVX-NEXT: testb $2, %al
1752 ; AVX-NEXT: je .LBB7_4
1753 ; AVX-NEXT: .LBB7_3: # %cond.store1
1754 ; AVX-NEXT: vpextrw $1, %xmm0, 2(%rdi)
1757 ; AVX512F-LABEL: truncstore_v2i64_v2i16:
1759 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1760 ; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0
1761 ; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1762 ; AVX512F-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1763 ; AVX512F-NEXT: kmovw %k0, %eax
1764 ; AVX512F-NEXT: testb $1, %al
1765 ; AVX512F-NEXT: jne .LBB7_1
1766 ; AVX512F-NEXT: # %bb.2: # %else
1767 ; AVX512F-NEXT: testb $2, %al
1768 ; AVX512F-NEXT: jne .LBB7_3
1769 ; AVX512F-NEXT: .LBB7_4: # %else2
1770 ; AVX512F-NEXT: vzeroupper
1771 ; AVX512F-NEXT: retq
1772 ; AVX512F-NEXT: .LBB7_1: # %cond.store
1773 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
1774 ; AVX512F-NEXT: testb $2, %al
1775 ; AVX512F-NEXT: je .LBB7_4
1776 ; AVX512F-NEXT: .LBB7_3: # %cond.store1
1777 ; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi)
1778 ; AVX512F-NEXT: vzeroupper
1779 ; AVX512F-NEXT: retq
1781 ; AVX512BW-LABEL: truncstore_v2i64_v2i16:
1782 ; AVX512BW: # %bb.0:
1783 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1784 ; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0
1785 ; AVX512BW-NEXT: kshiftld $30, %k0, %k0
1786 ; AVX512BW-NEXT: kshiftrd $30, %k0, %k1
1787 ; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1788 ; AVX512BW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
1789 ; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1}
1790 ; AVX512BW-NEXT: vzeroupper
1791 ; AVX512BW-NEXT: retq
1793 ; AVX512BWVL-LABEL: truncstore_v2i64_v2i16:
1794 ; AVX512BWVL: # %bb.0:
1795 ; AVX512BWVL-NEXT: vptestmq %xmm1, %xmm1, %k1
1796 ; AVX512BWVL-NEXT: vpmovqw %xmm0, (%rdi) {%k1}
1797 ; AVX512BWVL-NEXT: retq
1798 %a = icmp ne <2 x i64> %mask, zeroinitializer
1799 %b = trunc <2 x i64> %x to <2 x i16>
1800 call void @llvm.masked.store.v2i16.p0(<2 x i16> %b, ptr %p, i32 1, <2 x i1> %a)
1804 define void @truncstore_v2i64_v2i8(<2 x i64> %x, ptr %p, <2 x i64> %mask) {
1805 ; SSE2-LABEL: truncstore_v2i64_v2i8:
1807 ; SSE2-NEXT: pxor %xmm2, %xmm2
1808 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1809 ; SSE2-NEXT: packuswb %xmm0, %xmm0
1810 ; SSE2-NEXT: packuswb %xmm0, %xmm0
1811 ; SSE2-NEXT: packuswb %xmm0, %xmm0
1812 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
1813 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
1814 ; SSE2-NEXT: pand %xmm2, %xmm1
1815 ; SSE2-NEXT: movmskpd %xmm1, %eax
1816 ; SSE2-NEXT: xorl $3, %eax
1817 ; SSE2-NEXT: testb $1, %al
1818 ; SSE2-NEXT: movd %xmm0, %ecx
1819 ; SSE2-NEXT: jne .LBB8_1
1820 ; SSE2-NEXT: # %bb.2: # %else
1821 ; SSE2-NEXT: testb $2, %al
1822 ; SSE2-NEXT: jne .LBB8_3
1823 ; SSE2-NEXT: .LBB8_4: # %else2
1825 ; SSE2-NEXT: .LBB8_1: # %cond.store
1826 ; SSE2-NEXT: movb %cl, (%rdi)
1827 ; SSE2-NEXT: testb $2, %al
1828 ; SSE2-NEXT: je .LBB8_4
1829 ; SSE2-NEXT: .LBB8_3: # %cond.store1
1830 ; SSE2-NEXT: movb %ch, 1(%rdi)
1833 ; SSE4-LABEL: truncstore_v2i64_v2i8:
1835 ; SSE4-NEXT: pxor %xmm2, %xmm2
1836 ; SSE4-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1837 ; SSE4-NEXT: pcmpeqq %xmm1, %xmm2
1838 ; SSE4-NEXT: movmskpd %xmm2, %eax
1839 ; SSE4-NEXT: xorl $3, %eax
1840 ; SSE4-NEXT: testb $1, %al
1841 ; SSE4-NEXT: jne .LBB8_1
1842 ; SSE4-NEXT: # %bb.2: # %else
1843 ; SSE4-NEXT: testb $2, %al
1844 ; SSE4-NEXT: jne .LBB8_3
1845 ; SSE4-NEXT: .LBB8_4: # %else2
1847 ; SSE4-NEXT: .LBB8_1: # %cond.store
1848 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
1849 ; SSE4-NEXT: testb $2, %al
1850 ; SSE4-NEXT: je .LBB8_4
1851 ; SSE4-NEXT: .LBB8_3: # %cond.store1
1852 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
1855 ; AVX-LABEL: truncstore_v2i64_v2i8:
1857 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
1858 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1859 ; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1
1860 ; AVX-NEXT: vmovmskpd %xmm1, %eax
1861 ; AVX-NEXT: xorl $3, %eax
1862 ; AVX-NEXT: testb $1, %al
1863 ; AVX-NEXT: jne .LBB8_1
1864 ; AVX-NEXT: # %bb.2: # %else
1865 ; AVX-NEXT: testb $2, %al
1866 ; AVX-NEXT: jne .LBB8_3
1867 ; AVX-NEXT: .LBB8_4: # %else2
1869 ; AVX-NEXT: .LBB8_1: # %cond.store
1870 ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi)
1871 ; AVX-NEXT: testb $2, %al
1872 ; AVX-NEXT: je .LBB8_4
1873 ; AVX-NEXT: .LBB8_3: # %cond.store1
1874 ; AVX-NEXT: vpextrb $1, %xmm0, 1(%rdi)
1877 ; AVX512F-LABEL: truncstore_v2i64_v2i8:
1879 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1880 ; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0
1881 ; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1882 ; AVX512F-NEXT: kmovw %k0, %eax
1883 ; AVX512F-NEXT: testb $1, %al
1884 ; AVX512F-NEXT: jne .LBB8_1
1885 ; AVX512F-NEXT: # %bb.2: # %else
1886 ; AVX512F-NEXT: testb $2, %al
1887 ; AVX512F-NEXT: jne .LBB8_3
1888 ; AVX512F-NEXT: .LBB8_4: # %else2
1889 ; AVX512F-NEXT: vzeroupper
1890 ; AVX512F-NEXT: retq
1891 ; AVX512F-NEXT: .LBB8_1: # %cond.store
1892 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
1893 ; AVX512F-NEXT: testb $2, %al
1894 ; AVX512F-NEXT: je .LBB8_4
1895 ; AVX512F-NEXT: .LBB8_3: # %cond.store1
1896 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
1897 ; AVX512F-NEXT: vzeroupper
1898 ; AVX512F-NEXT: retq
1900 ; AVX512BW-LABEL: truncstore_v2i64_v2i8:
1901 ; AVX512BW: # %bb.0:
1902 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
1903 ; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0
1904 ; AVX512BW-NEXT: kshiftlq $62, %k0, %k0
1905 ; AVX512BW-NEXT: kshiftrq $62, %k0, %k1
1906 ; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
1907 ; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1}
1908 ; AVX512BW-NEXT: vzeroupper
1909 ; AVX512BW-NEXT: retq
1911 ; AVX512BWVL-LABEL: truncstore_v2i64_v2i8:
1912 ; AVX512BWVL: # %bb.0:
1913 ; AVX512BWVL-NEXT: vptestmq %xmm1, %xmm1, %k1
1914 ; AVX512BWVL-NEXT: vpmovqb %xmm0, (%rdi) {%k1}
1915 ; AVX512BWVL-NEXT: retq
1916 %a = icmp ne <2 x i64> %mask, zeroinitializer
1917 %b = trunc <2 x i64> %x to <2 x i8>
1918 call void @llvm.masked.store.v2i8.p0(<2 x i8> %b, ptr %p, i32 1, <2 x i1> %a)
1922 define void @truncstore_v16i32_v16i16(<16 x i32> %x, ptr %p, <16 x i32> %mask) {
1923 ; SSE2-LABEL: truncstore_v16i32_v16i16:
1925 ; SSE2-NEXT: pxor %xmm8, %xmm8
1926 ; SSE2-NEXT: pslld $16, %xmm1
1927 ; SSE2-NEXT: psrad $16, %xmm1
1928 ; SSE2-NEXT: pslld $16, %xmm0
1929 ; SSE2-NEXT: psrad $16, %xmm0
1930 ; SSE2-NEXT: packssdw %xmm1, %xmm0
1931 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm7
1932 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm6
1933 ; SSE2-NEXT: packssdw %xmm7, %xmm6
1934 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm5
1935 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm4
1936 ; SSE2-NEXT: packssdw %xmm5, %xmm4
1937 ; SSE2-NEXT: packsswb %xmm6, %xmm4
1938 ; SSE2-NEXT: pmovmskb %xmm4, %eax
1939 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
1940 ; SSE2-NEXT: testb $1, %al
1941 ; SSE2-NEXT: jne .LBB9_1
1942 ; SSE2-NEXT: # %bb.2: # %else
1943 ; SSE2-NEXT: testb $2, %al
1944 ; SSE2-NEXT: jne .LBB9_3
1945 ; SSE2-NEXT: .LBB9_4: # %else2
1946 ; SSE2-NEXT: testb $4, %al
1947 ; SSE2-NEXT: jne .LBB9_5
1948 ; SSE2-NEXT: .LBB9_6: # %else4
1949 ; SSE2-NEXT: testb $8, %al
1950 ; SSE2-NEXT: jne .LBB9_7
1951 ; SSE2-NEXT: .LBB9_8: # %else6
1952 ; SSE2-NEXT: testb $16, %al
1953 ; SSE2-NEXT: jne .LBB9_9
1954 ; SSE2-NEXT: .LBB9_10: # %else8
1955 ; SSE2-NEXT: testb $32, %al
1956 ; SSE2-NEXT: je .LBB9_12
1957 ; SSE2-NEXT: .LBB9_11: # %cond.store9
1958 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx
1959 ; SSE2-NEXT: movw %cx, 10(%rdi)
1960 ; SSE2-NEXT: .LBB9_12: # %else10
1961 ; SSE2-NEXT: pslld $16, %xmm3
1962 ; SSE2-NEXT: pslld $16, %xmm2
1963 ; SSE2-NEXT: testb $64, %al
1964 ; SSE2-NEXT: je .LBB9_14
1965 ; SSE2-NEXT: # %bb.13: # %cond.store11
1966 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx
1967 ; SSE2-NEXT: movw %cx, 12(%rdi)
1968 ; SSE2-NEXT: .LBB9_14: # %else12
1969 ; SSE2-NEXT: psrad $16, %xmm3
1970 ; SSE2-NEXT: psrad $16, %xmm2
1971 ; SSE2-NEXT: testb %al, %al
1972 ; SSE2-NEXT: jns .LBB9_16
1973 ; SSE2-NEXT: # %bb.15: # %cond.store13
1974 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx
1975 ; SSE2-NEXT: movw %cx, 14(%rdi)
1976 ; SSE2-NEXT: .LBB9_16: # %else14
1977 ; SSE2-NEXT: packssdw %xmm3, %xmm2
1978 ; SSE2-NEXT: testl $256, %eax # imm = 0x100
1979 ; SSE2-NEXT: jne .LBB9_17
1980 ; SSE2-NEXT: # %bb.18: # %else16
1981 ; SSE2-NEXT: testl $512, %eax # imm = 0x200
1982 ; SSE2-NEXT: jne .LBB9_19
1983 ; SSE2-NEXT: .LBB9_20: # %else18
1984 ; SSE2-NEXT: testl $1024, %eax # imm = 0x400
1985 ; SSE2-NEXT: jne .LBB9_21
1986 ; SSE2-NEXT: .LBB9_22: # %else20
1987 ; SSE2-NEXT: testl $2048, %eax # imm = 0x800
1988 ; SSE2-NEXT: jne .LBB9_23
1989 ; SSE2-NEXT: .LBB9_24: # %else22
1990 ; SSE2-NEXT: testl $4096, %eax # imm = 0x1000
1991 ; SSE2-NEXT: jne .LBB9_25
1992 ; SSE2-NEXT: .LBB9_26: # %else24
1993 ; SSE2-NEXT: testl $8192, %eax # imm = 0x2000
1994 ; SSE2-NEXT: jne .LBB9_27
1995 ; SSE2-NEXT: .LBB9_28: # %else26
1996 ; SSE2-NEXT: testl $16384, %eax # imm = 0x4000
1997 ; SSE2-NEXT: jne .LBB9_29
1998 ; SSE2-NEXT: .LBB9_30: # %else28
1999 ; SSE2-NEXT: testl $32768, %eax # imm = 0x8000
2000 ; SSE2-NEXT: jne .LBB9_31
2001 ; SSE2-NEXT: .LBB9_32: # %else30
2003 ; SSE2-NEXT: .LBB9_1: # %cond.store
2004 ; SSE2-NEXT: movd %xmm0, %ecx
2005 ; SSE2-NEXT: movw %cx, (%rdi)
2006 ; SSE2-NEXT: testb $2, %al
2007 ; SSE2-NEXT: je .LBB9_4
2008 ; SSE2-NEXT: .LBB9_3: # %cond.store1
2009 ; SSE2-NEXT: pextrw $1, %xmm0, %ecx
2010 ; SSE2-NEXT: movw %cx, 2(%rdi)
2011 ; SSE2-NEXT: testb $4, %al
2012 ; SSE2-NEXT: je .LBB9_6
2013 ; SSE2-NEXT: .LBB9_5: # %cond.store3
2014 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
2015 ; SSE2-NEXT: movw %cx, 4(%rdi)
2016 ; SSE2-NEXT: testb $8, %al
2017 ; SSE2-NEXT: je .LBB9_8
2018 ; SSE2-NEXT: .LBB9_7: # %cond.store5
2019 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
2020 ; SSE2-NEXT: movw %cx, 6(%rdi)
2021 ; SSE2-NEXT: testb $16, %al
2022 ; SSE2-NEXT: je .LBB9_10
2023 ; SSE2-NEXT: .LBB9_9: # %cond.store7
2024 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx
2025 ; SSE2-NEXT: movw %cx, 8(%rdi)
2026 ; SSE2-NEXT: testb $32, %al
2027 ; SSE2-NEXT: jne .LBB9_11
2028 ; SSE2-NEXT: jmp .LBB9_12
2029 ; SSE2-NEXT: .LBB9_17: # %cond.store15
2030 ; SSE2-NEXT: movd %xmm2, %ecx
2031 ; SSE2-NEXT: movw %cx, 16(%rdi)
2032 ; SSE2-NEXT: testl $512, %eax # imm = 0x200
2033 ; SSE2-NEXT: je .LBB9_20
2034 ; SSE2-NEXT: .LBB9_19: # %cond.store17
2035 ; SSE2-NEXT: pextrw $1, %xmm2, %ecx
2036 ; SSE2-NEXT: movw %cx, 18(%rdi)
2037 ; SSE2-NEXT: testl $1024, %eax # imm = 0x400
2038 ; SSE2-NEXT: je .LBB9_22
2039 ; SSE2-NEXT: .LBB9_21: # %cond.store19
2040 ; SSE2-NEXT: pextrw $2, %xmm2, %ecx
2041 ; SSE2-NEXT: movw %cx, 20(%rdi)
2042 ; SSE2-NEXT: testl $2048, %eax # imm = 0x800
2043 ; SSE2-NEXT: je .LBB9_24
2044 ; SSE2-NEXT: .LBB9_23: # %cond.store21
2045 ; SSE2-NEXT: pextrw $3, %xmm2, %ecx
2046 ; SSE2-NEXT: movw %cx, 22(%rdi)
2047 ; SSE2-NEXT: testl $4096, %eax # imm = 0x1000
2048 ; SSE2-NEXT: je .LBB9_26
2049 ; SSE2-NEXT: .LBB9_25: # %cond.store23
2050 ; SSE2-NEXT: pextrw $4, %xmm2, %ecx
2051 ; SSE2-NEXT: movw %cx, 24(%rdi)
2052 ; SSE2-NEXT: testl $8192, %eax # imm = 0x2000
2053 ; SSE2-NEXT: je .LBB9_28
2054 ; SSE2-NEXT: .LBB9_27: # %cond.store25
2055 ; SSE2-NEXT: pextrw $5, %xmm2, %ecx
2056 ; SSE2-NEXT: movw %cx, 26(%rdi)
2057 ; SSE2-NEXT: testl $16384, %eax # imm = 0x4000
2058 ; SSE2-NEXT: je .LBB9_30
2059 ; SSE2-NEXT: .LBB9_29: # %cond.store27
2060 ; SSE2-NEXT: pextrw $6, %xmm2, %ecx
2061 ; SSE2-NEXT: movw %cx, 28(%rdi)
2062 ; SSE2-NEXT: testl $32768, %eax # imm = 0x8000
2063 ; SSE2-NEXT: je .LBB9_32
2064 ; SSE2-NEXT: .LBB9_31: # %cond.store29
2065 ; SSE2-NEXT: pextrw $7, %xmm2, %eax
2066 ; SSE2-NEXT: movw %ax, 30(%rdi)
2069 ; SSE4-LABEL: truncstore_v16i32_v16i16:
2071 ; SSE4-NEXT: pxor %xmm8, %xmm8
2072 ; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm8[1],xmm1[2],xmm8[3],xmm1[4],xmm8[5],xmm1[6],xmm8[7]
2073 ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm8[1],xmm0[2],xmm8[3],xmm0[4],xmm8[5],xmm0[6],xmm8[7]
2074 ; SSE4-NEXT: packusdw %xmm1, %xmm0
2075 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm7
2076 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm6
2077 ; SSE4-NEXT: packssdw %xmm7, %xmm6
2078 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm5
2079 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm4
2080 ; SSE4-NEXT: packssdw %xmm5, %xmm4
2081 ; SSE4-NEXT: packsswb %xmm6, %xmm4
2082 ; SSE4-NEXT: pmovmskb %xmm4, %eax
2083 ; SSE4-NEXT: xorl $65535, %eax # imm = 0xFFFF
2084 ; SSE4-NEXT: testb $1, %al
2085 ; SSE4-NEXT: jne .LBB9_1
2086 ; SSE4-NEXT: # %bb.2: # %else
2087 ; SSE4-NEXT: testb $2, %al
2088 ; SSE4-NEXT: jne .LBB9_3
2089 ; SSE4-NEXT: .LBB9_4: # %else2
2090 ; SSE4-NEXT: testb $4, %al
2091 ; SSE4-NEXT: jne .LBB9_5
2092 ; SSE4-NEXT: .LBB9_6: # %else4
2093 ; SSE4-NEXT: testb $8, %al
2094 ; SSE4-NEXT: jne .LBB9_7
2095 ; SSE4-NEXT: .LBB9_8: # %else6
2096 ; SSE4-NEXT: testb $16, %al
2097 ; SSE4-NEXT: jne .LBB9_9
2098 ; SSE4-NEXT: .LBB9_10: # %else8
2099 ; SSE4-NEXT: testb $32, %al
2100 ; SSE4-NEXT: jne .LBB9_11
2101 ; SSE4-NEXT: .LBB9_12: # %else10
2102 ; SSE4-NEXT: testb $64, %al
2103 ; SSE4-NEXT: je .LBB9_14
2104 ; SSE4-NEXT: .LBB9_13: # %cond.store11
2105 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi)
2106 ; SSE4-NEXT: .LBB9_14: # %else12
2107 ; SSE4-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm8[1],xmm3[2],xmm8[3],xmm3[4],xmm8[5],xmm3[6],xmm8[7]
2108 ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm8[1],xmm2[2],xmm8[3],xmm2[4],xmm8[5],xmm2[6],xmm8[7]
2109 ; SSE4-NEXT: testb %al, %al
2110 ; SSE4-NEXT: jns .LBB9_16
2111 ; SSE4-NEXT: # %bb.15: # %cond.store13
2112 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi)
2113 ; SSE4-NEXT: .LBB9_16: # %else14
2114 ; SSE4-NEXT: packusdw %xmm3, %xmm2
2115 ; SSE4-NEXT: testl $256, %eax # imm = 0x100
2116 ; SSE4-NEXT: jne .LBB9_17
2117 ; SSE4-NEXT: # %bb.18: # %else16
2118 ; SSE4-NEXT: testl $512, %eax # imm = 0x200
2119 ; SSE4-NEXT: jne .LBB9_19
2120 ; SSE4-NEXT: .LBB9_20: # %else18
2121 ; SSE4-NEXT: testl $1024, %eax # imm = 0x400
2122 ; SSE4-NEXT: jne .LBB9_21
2123 ; SSE4-NEXT: .LBB9_22: # %else20
2124 ; SSE4-NEXT: testl $2048, %eax # imm = 0x800
2125 ; SSE4-NEXT: jne .LBB9_23
2126 ; SSE4-NEXT: .LBB9_24: # %else22
2127 ; SSE4-NEXT: testl $4096, %eax # imm = 0x1000
2128 ; SSE4-NEXT: jne .LBB9_25
2129 ; SSE4-NEXT: .LBB9_26: # %else24
2130 ; SSE4-NEXT: testl $8192, %eax # imm = 0x2000
2131 ; SSE4-NEXT: jne .LBB9_27
2132 ; SSE4-NEXT: .LBB9_28: # %else26
2133 ; SSE4-NEXT: testl $16384, %eax # imm = 0x4000
2134 ; SSE4-NEXT: jne .LBB9_29
2135 ; SSE4-NEXT: .LBB9_30: # %else28
2136 ; SSE4-NEXT: testl $32768, %eax # imm = 0x8000
2137 ; SSE4-NEXT: jne .LBB9_31
2138 ; SSE4-NEXT: .LBB9_32: # %else30
2140 ; SSE4-NEXT: .LBB9_1: # %cond.store
2141 ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi)
2142 ; SSE4-NEXT: testb $2, %al
2143 ; SSE4-NEXT: je .LBB9_4
2144 ; SSE4-NEXT: .LBB9_3: # %cond.store1
2145 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi)
2146 ; SSE4-NEXT: testb $4, %al
2147 ; SSE4-NEXT: je .LBB9_6
2148 ; SSE4-NEXT: .LBB9_5: # %cond.store3
2149 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi)
2150 ; SSE4-NEXT: testb $8, %al
2151 ; SSE4-NEXT: je .LBB9_8
2152 ; SSE4-NEXT: .LBB9_7: # %cond.store5
2153 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi)
2154 ; SSE4-NEXT: testb $16, %al
2155 ; SSE4-NEXT: je .LBB9_10
2156 ; SSE4-NEXT: .LBB9_9: # %cond.store7
2157 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi)
2158 ; SSE4-NEXT: testb $32, %al
2159 ; SSE4-NEXT: je .LBB9_12
2160 ; SSE4-NEXT: .LBB9_11: # %cond.store9
2161 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi)
2162 ; SSE4-NEXT: testb $64, %al
2163 ; SSE4-NEXT: jne .LBB9_13
2164 ; SSE4-NEXT: jmp .LBB9_14
2165 ; SSE4-NEXT: .LBB9_17: # %cond.store15
2166 ; SSE4-NEXT: pextrw $0, %xmm2, 16(%rdi)
2167 ; SSE4-NEXT: testl $512, %eax # imm = 0x200
2168 ; SSE4-NEXT: je .LBB9_20
2169 ; SSE4-NEXT: .LBB9_19: # %cond.store17
2170 ; SSE4-NEXT: pextrw $1, %xmm2, 18(%rdi)
2171 ; SSE4-NEXT: testl $1024, %eax # imm = 0x400
2172 ; SSE4-NEXT: je .LBB9_22
2173 ; SSE4-NEXT: .LBB9_21: # %cond.store19
2174 ; SSE4-NEXT: pextrw $2, %xmm2, 20(%rdi)
2175 ; SSE4-NEXT: testl $2048, %eax # imm = 0x800
2176 ; SSE4-NEXT: je .LBB9_24
2177 ; SSE4-NEXT: .LBB9_23: # %cond.store21
2178 ; SSE4-NEXT: pextrw $3, %xmm2, 22(%rdi)
2179 ; SSE4-NEXT: testl $4096, %eax # imm = 0x1000
2180 ; SSE4-NEXT: je .LBB9_26
2181 ; SSE4-NEXT: .LBB9_25: # %cond.store23
2182 ; SSE4-NEXT: pextrw $4, %xmm2, 24(%rdi)
2183 ; SSE4-NEXT: testl $8192, %eax # imm = 0x2000
2184 ; SSE4-NEXT: je .LBB9_28
2185 ; SSE4-NEXT: .LBB9_27: # %cond.store25
2186 ; SSE4-NEXT: pextrw $5, %xmm2, 26(%rdi)
2187 ; SSE4-NEXT: testl $16384, %eax # imm = 0x4000
2188 ; SSE4-NEXT: je .LBB9_30
2189 ; SSE4-NEXT: .LBB9_29: # %cond.store27
2190 ; SSE4-NEXT: pextrw $6, %xmm2, 28(%rdi)
2191 ; SSE4-NEXT: testl $32768, %eax # imm = 0x8000
2192 ; SSE4-NEXT: je .LBB9_32
2193 ; SSE4-NEXT: .LBB9_31: # %cond.store29
2194 ; SSE4-NEXT: pextrw $7, %xmm2, 30(%rdi)
2197 ; AVX1-LABEL: truncstore_v16i32_v16i16:
2199 ; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [65535,65535,65535,65535,65535,65535,65535,65535]
2200 ; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1
2201 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
2202 ; AVX1-NEXT: vpackusdw %xmm5, %xmm1, %xmm1
2203 ; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0
2204 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
2205 ; AVX1-NEXT: vpackusdw %xmm4, %xmm0, %xmm0
2206 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
2207 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
2208 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
2209 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm1, %xmm1
2210 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3
2211 ; AVX1-NEXT: vpackssdw %xmm1, %xmm3, %xmm1
2212 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
2213 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3
2214 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2
2215 ; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
2216 ; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1
2217 ; AVX1-NEXT: vpmovmskb %xmm1, %eax
2218 ; AVX1-NEXT: xorl $65535, %eax # imm = 0xFFFF
2219 ; AVX1-NEXT: testb $1, %al
2220 ; AVX1-NEXT: jne .LBB9_1
2221 ; AVX1-NEXT: # %bb.2: # %else
2222 ; AVX1-NEXT: testb $2, %al
2223 ; AVX1-NEXT: jne .LBB9_3
2224 ; AVX1-NEXT: .LBB9_4: # %else2
2225 ; AVX1-NEXT: testb $4, %al
2226 ; AVX1-NEXT: jne .LBB9_5
2227 ; AVX1-NEXT: .LBB9_6: # %else4
2228 ; AVX1-NEXT: testb $8, %al
2229 ; AVX1-NEXT: jne .LBB9_7
2230 ; AVX1-NEXT: .LBB9_8: # %else6
2231 ; AVX1-NEXT: testb $16, %al
2232 ; AVX1-NEXT: jne .LBB9_9
2233 ; AVX1-NEXT: .LBB9_10: # %else8
2234 ; AVX1-NEXT: testb $32, %al
2235 ; AVX1-NEXT: jne .LBB9_11
2236 ; AVX1-NEXT: .LBB9_12: # %else10
2237 ; AVX1-NEXT: testb $64, %al
2238 ; AVX1-NEXT: jne .LBB9_13
2239 ; AVX1-NEXT: .LBB9_14: # %else12
2240 ; AVX1-NEXT: testb %al, %al
2241 ; AVX1-NEXT: jns .LBB9_16
2242 ; AVX1-NEXT: .LBB9_15: # %cond.store13
2243 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi)
2244 ; AVX1-NEXT: .LBB9_16: # %else14
2245 ; AVX1-NEXT: testl $256, %eax # imm = 0x100
2246 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
2247 ; AVX1-NEXT: jne .LBB9_17
2248 ; AVX1-NEXT: # %bb.18: # %else16
2249 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
2250 ; AVX1-NEXT: jne .LBB9_19
2251 ; AVX1-NEXT: .LBB9_20: # %else18
2252 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
2253 ; AVX1-NEXT: jne .LBB9_21
2254 ; AVX1-NEXT: .LBB9_22: # %else20
2255 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
2256 ; AVX1-NEXT: jne .LBB9_23
2257 ; AVX1-NEXT: .LBB9_24: # %else22
2258 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
2259 ; AVX1-NEXT: jne .LBB9_25
2260 ; AVX1-NEXT: .LBB9_26: # %else24
2261 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
2262 ; AVX1-NEXT: jne .LBB9_27
2263 ; AVX1-NEXT: .LBB9_28: # %else26
2264 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
2265 ; AVX1-NEXT: jne .LBB9_29
2266 ; AVX1-NEXT: .LBB9_30: # %else28
2267 ; AVX1-NEXT: testl $32768, %eax # imm = 0x8000
2268 ; AVX1-NEXT: jne .LBB9_31
2269 ; AVX1-NEXT: .LBB9_32: # %else30
2270 ; AVX1-NEXT: vzeroupper
2272 ; AVX1-NEXT: .LBB9_1: # %cond.store
2273 ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi)
2274 ; AVX1-NEXT: testb $2, %al
2275 ; AVX1-NEXT: je .LBB9_4
2276 ; AVX1-NEXT: .LBB9_3: # %cond.store1
2277 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi)
2278 ; AVX1-NEXT: testb $4, %al
2279 ; AVX1-NEXT: je .LBB9_6
2280 ; AVX1-NEXT: .LBB9_5: # %cond.store3
2281 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi)
2282 ; AVX1-NEXT: testb $8, %al
2283 ; AVX1-NEXT: je .LBB9_8
2284 ; AVX1-NEXT: .LBB9_7: # %cond.store5
2285 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi)
2286 ; AVX1-NEXT: testb $16, %al
2287 ; AVX1-NEXT: je .LBB9_10
2288 ; AVX1-NEXT: .LBB9_9: # %cond.store7
2289 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi)
2290 ; AVX1-NEXT: testb $32, %al
2291 ; AVX1-NEXT: je .LBB9_12
2292 ; AVX1-NEXT: .LBB9_11: # %cond.store9
2293 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi)
2294 ; AVX1-NEXT: testb $64, %al
2295 ; AVX1-NEXT: je .LBB9_14
2296 ; AVX1-NEXT: .LBB9_13: # %cond.store11
2297 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi)
2298 ; AVX1-NEXT: testb %al, %al
2299 ; AVX1-NEXT: js .LBB9_15
2300 ; AVX1-NEXT: jmp .LBB9_16
2301 ; AVX1-NEXT: .LBB9_17: # %cond.store15
2302 ; AVX1-NEXT: vpextrw $0, %xmm0, 16(%rdi)
2303 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
2304 ; AVX1-NEXT: je .LBB9_20
2305 ; AVX1-NEXT: .LBB9_19: # %cond.store17
2306 ; AVX1-NEXT: vpextrw $1, %xmm0, 18(%rdi)
2307 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
2308 ; AVX1-NEXT: je .LBB9_22
2309 ; AVX1-NEXT: .LBB9_21: # %cond.store19
2310 ; AVX1-NEXT: vpextrw $2, %xmm0, 20(%rdi)
2311 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
2312 ; AVX1-NEXT: je .LBB9_24
2313 ; AVX1-NEXT: .LBB9_23: # %cond.store21
2314 ; AVX1-NEXT: vpextrw $3, %xmm0, 22(%rdi)
2315 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
2316 ; AVX1-NEXT: je .LBB9_26
2317 ; AVX1-NEXT: .LBB9_25: # %cond.store23
2318 ; AVX1-NEXT: vpextrw $4, %xmm0, 24(%rdi)
2319 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
2320 ; AVX1-NEXT: je .LBB9_28
2321 ; AVX1-NEXT: .LBB9_27: # %cond.store25
2322 ; AVX1-NEXT: vpextrw $5, %xmm0, 26(%rdi)
2323 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
2324 ; AVX1-NEXT: je .LBB9_30
2325 ; AVX1-NEXT: .LBB9_29: # %cond.store27
2326 ; AVX1-NEXT: vpextrw $6, %xmm0, 28(%rdi)
2327 ; AVX1-NEXT: testl $32768, %eax # imm = 0x8000
2328 ; AVX1-NEXT: je .LBB9_32
2329 ; AVX1-NEXT: .LBB9_31: # %cond.store29
2330 ; AVX1-NEXT: vpextrw $7, %xmm0, 30(%rdi)
2331 ; AVX1-NEXT: vzeroupper
2334 ; AVX2-LABEL: truncstore_v16i32_v16i16:
2336 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
2337 ; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm4[1],ymm1[2],ymm4[3],ymm1[4],ymm4[5],ymm1[6],ymm4[7],ymm1[8],ymm4[9],ymm1[10],ymm4[11],ymm1[12],ymm4[13],ymm1[14],ymm4[15]
2338 ; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm4[1],ymm0[2],ymm4[3],ymm0[4],ymm4[5],ymm0[6],ymm4[7],ymm0[8],ymm4[9],ymm0[10],ymm4[11],ymm0[12],ymm4[13],ymm0[14],ymm4[15]
2339 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
2340 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
2341 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm1
2342 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm2
2343 ; AVX2-NEXT: vpackssdw %ymm1, %ymm2, %ymm1
2344 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
2345 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
2346 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
2347 ; AVX2-NEXT: vpacksswb %xmm2, %xmm1, %xmm1
2348 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
2349 ; AVX2-NEXT: vpmovmskb %xmm1, %eax
2350 ; AVX2-NEXT: testb $1, %al
2351 ; AVX2-NEXT: jne .LBB9_1
2352 ; AVX2-NEXT: # %bb.2: # %else
2353 ; AVX2-NEXT: testb $2, %al
2354 ; AVX2-NEXT: jne .LBB9_3
2355 ; AVX2-NEXT: .LBB9_4: # %else2
2356 ; AVX2-NEXT: testb $4, %al
2357 ; AVX2-NEXT: jne .LBB9_5
2358 ; AVX2-NEXT: .LBB9_6: # %else4
2359 ; AVX2-NEXT: testb $8, %al
2360 ; AVX2-NEXT: jne .LBB9_7
2361 ; AVX2-NEXT: .LBB9_8: # %else6
2362 ; AVX2-NEXT: testb $16, %al
2363 ; AVX2-NEXT: jne .LBB9_9
2364 ; AVX2-NEXT: .LBB9_10: # %else8
2365 ; AVX2-NEXT: testb $32, %al
2366 ; AVX2-NEXT: jne .LBB9_11
2367 ; AVX2-NEXT: .LBB9_12: # %else10
2368 ; AVX2-NEXT: testb $64, %al
2369 ; AVX2-NEXT: jne .LBB9_13
2370 ; AVX2-NEXT: .LBB9_14: # %else12
2371 ; AVX2-NEXT: testb %al, %al
2372 ; AVX2-NEXT: jns .LBB9_16
2373 ; AVX2-NEXT: .LBB9_15: # %cond.store13
2374 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi)
2375 ; AVX2-NEXT: .LBB9_16: # %else14
2376 ; AVX2-NEXT: testl $256, %eax # imm = 0x100
2377 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
2378 ; AVX2-NEXT: jne .LBB9_17
2379 ; AVX2-NEXT: # %bb.18: # %else16
2380 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
2381 ; AVX2-NEXT: jne .LBB9_19
2382 ; AVX2-NEXT: .LBB9_20: # %else18
2383 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
2384 ; AVX2-NEXT: jne .LBB9_21
2385 ; AVX2-NEXT: .LBB9_22: # %else20
2386 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
2387 ; AVX2-NEXT: jne .LBB9_23
2388 ; AVX2-NEXT: .LBB9_24: # %else22
2389 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
2390 ; AVX2-NEXT: jne .LBB9_25
2391 ; AVX2-NEXT: .LBB9_26: # %else24
2392 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
2393 ; AVX2-NEXT: jne .LBB9_27
2394 ; AVX2-NEXT: .LBB9_28: # %else26
2395 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
2396 ; AVX2-NEXT: jne .LBB9_29
2397 ; AVX2-NEXT: .LBB9_30: # %else28
2398 ; AVX2-NEXT: testl $32768, %eax # imm = 0x8000
2399 ; AVX2-NEXT: jne .LBB9_31
2400 ; AVX2-NEXT: .LBB9_32: # %else30
2401 ; AVX2-NEXT: vzeroupper
2403 ; AVX2-NEXT: .LBB9_1: # %cond.store
2404 ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi)
2405 ; AVX2-NEXT: testb $2, %al
2406 ; AVX2-NEXT: je .LBB9_4
2407 ; AVX2-NEXT: .LBB9_3: # %cond.store1
2408 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi)
2409 ; AVX2-NEXT: testb $4, %al
2410 ; AVX2-NEXT: je .LBB9_6
2411 ; AVX2-NEXT: .LBB9_5: # %cond.store3
2412 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi)
2413 ; AVX2-NEXT: testb $8, %al
2414 ; AVX2-NEXT: je .LBB9_8
2415 ; AVX2-NEXT: .LBB9_7: # %cond.store5
2416 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi)
2417 ; AVX2-NEXT: testb $16, %al
2418 ; AVX2-NEXT: je .LBB9_10
2419 ; AVX2-NEXT: .LBB9_9: # %cond.store7
2420 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi)
2421 ; AVX2-NEXT: testb $32, %al
2422 ; AVX2-NEXT: je .LBB9_12
2423 ; AVX2-NEXT: .LBB9_11: # %cond.store9
2424 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi)
2425 ; AVX2-NEXT: testb $64, %al
2426 ; AVX2-NEXT: je .LBB9_14
2427 ; AVX2-NEXT: .LBB9_13: # %cond.store11
2428 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi)
2429 ; AVX2-NEXT: testb %al, %al
2430 ; AVX2-NEXT: js .LBB9_15
2431 ; AVX2-NEXT: jmp .LBB9_16
2432 ; AVX2-NEXT: .LBB9_17: # %cond.store15
2433 ; AVX2-NEXT: vpextrw $0, %xmm0, 16(%rdi)
2434 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
2435 ; AVX2-NEXT: je .LBB9_20
2436 ; AVX2-NEXT: .LBB9_19: # %cond.store17
2437 ; AVX2-NEXT: vpextrw $1, %xmm0, 18(%rdi)
2438 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
2439 ; AVX2-NEXT: je .LBB9_22
2440 ; AVX2-NEXT: .LBB9_21: # %cond.store19
2441 ; AVX2-NEXT: vpextrw $2, %xmm0, 20(%rdi)
2442 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
2443 ; AVX2-NEXT: je .LBB9_24
2444 ; AVX2-NEXT: .LBB9_23: # %cond.store21
2445 ; AVX2-NEXT: vpextrw $3, %xmm0, 22(%rdi)
2446 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
2447 ; AVX2-NEXT: je .LBB9_26
2448 ; AVX2-NEXT: .LBB9_25: # %cond.store23
2449 ; AVX2-NEXT: vpextrw $4, %xmm0, 24(%rdi)
2450 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
2451 ; AVX2-NEXT: je .LBB9_28
2452 ; AVX2-NEXT: .LBB9_27: # %cond.store25
2453 ; AVX2-NEXT: vpextrw $5, %xmm0, 26(%rdi)
2454 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
2455 ; AVX2-NEXT: je .LBB9_30
2456 ; AVX2-NEXT: .LBB9_29: # %cond.store27
2457 ; AVX2-NEXT: vpextrw $6, %xmm0, 28(%rdi)
2458 ; AVX2-NEXT: testl $32768, %eax # imm = 0x8000
2459 ; AVX2-NEXT: je .LBB9_32
2460 ; AVX2-NEXT: .LBB9_31: # %cond.store29
2461 ; AVX2-NEXT: vpextrw $7, %xmm0, 30(%rdi)
2462 ; AVX2-NEXT: vzeroupper
2465 ; AVX512F-LABEL: truncstore_v16i32_v16i16:
2467 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
2468 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
2469 ; AVX512F-NEXT: kmovw %k0, %eax
2470 ; AVX512F-NEXT: testb $1, %al
2471 ; AVX512F-NEXT: jne .LBB9_1
2472 ; AVX512F-NEXT: # %bb.2: # %else
2473 ; AVX512F-NEXT: testb $2, %al
2474 ; AVX512F-NEXT: jne .LBB9_3
2475 ; AVX512F-NEXT: .LBB9_4: # %else2
2476 ; AVX512F-NEXT: testb $4, %al
2477 ; AVX512F-NEXT: jne .LBB9_5
2478 ; AVX512F-NEXT: .LBB9_6: # %else4
2479 ; AVX512F-NEXT: testb $8, %al
2480 ; AVX512F-NEXT: jne .LBB9_7
2481 ; AVX512F-NEXT: .LBB9_8: # %else6
2482 ; AVX512F-NEXT: testb $16, %al
2483 ; AVX512F-NEXT: jne .LBB9_9
2484 ; AVX512F-NEXT: .LBB9_10: # %else8
2485 ; AVX512F-NEXT: testb $32, %al
2486 ; AVX512F-NEXT: jne .LBB9_11
2487 ; AVX512F-NEXT: .LBB9_12: # %else10
2488 ; AVX512F-NEXT: testb $64, %al
2489 ; AVX512F-NEXT: jne .LBB9_13
2490 ; AVX512F-NEXT: .LBB9_14: # %else12
2491 ; AVX512F-NEXT: testb %al, %al
2492 ; AVX512F-NEXT: jns .LBB9_16
2493 ; AVX512F-NEXT: .LBB9_15: # %cond.store13
2494 ; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi)
2495 ; AVX512F-NEXT: .LBB9_16: # %else14
2496 ; AVX512F-NEXT: testl $256, %eax # imm = 0x100
2497 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0
2498 ; AVX512F-NEXT: jne .LBB9_17
2499 ; AVX512F-NEXT: # %bb.18: # %else16
2500 ; AVX512F-NEXT: testl $512, %eax # imm = 0x200
2501 ; AVX512F-NEXT: jne .LBB9_19
2502 ; AVX512F-NEXT: .LBB9_20: # %else18
2503 ; AVX512F-NEXT: testl $1024, %eax # imm = 0x400
2504 ; AVX512F-NEXT: jne .LBB9_21
2505 ; AVX512F-NEXT: .LBB9_22: # %else20
2506 ; AVX512F-NEXT: testl $2048, %eax # imm = 0x800
2507 ; AVX512F-NEXT: jne .LBB9_23
2508 ; AVX512F-NEXT: .LBB9_24: # %else22
2509 ; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000
2510 ; AVX512F-NEXT: jne .LBB9_25
2511 ; AVX512F-NEXT: .LBB9_26: # %else24
2512 ; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000
2513 ; AVX512F-NEXT: jne .LBB9_27
2514 ; AVX512F-NEXT: .LBB9_28: # %else26
2515 ; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000
2516 ; AVX512F-NEXT: jne .LBB9_29
2517 ; AVX512F-NEXT: .LBB9_30: # %else28
2518 ; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000
2519 ; AVX512F-NEXT: jne .LBB9_31
2520 ; AVX512F-NEXT: .LBB9_32: # %else30
2521 ; AVX512F-NEXT: vzeroupper
2522 ; AVX512F-NEXT: retq
2523 ; AVX512F-NEXT: .LBB9_1: # %cond.store
2524 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
2525 ; AVX512F-NEXT: testb $2, %al
2526 ; AVX512F-NEXT: je .LBB9_4
2527 ; AVX512F-NEXT: .LBB9_3: # %cond.store1
2528 ; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi)
2529 ; AVX512F-NEXT: testb $4, %al
2530 ; AVX512F-NEXT: je .LBB9_6
2531 ; AVX512F-NEXT: .LBB9_5: # %cond.store3
2532 ; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi)
2533 ; AVX512F-NEXT: testb $8, %al
2534 ; AVX512F-NEXT: je .LBB9_8
2535 ; AVX512F-NEXT: .LBB9_7: # %cond.store5
2536 ; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi)
2537 ; AVX512F-NEXT: testb $16, %al
2538 ; AVX512F-NEXT: je .LBB9_10
2539 ; AVX512F-NEXT: .LBB9_9: # %cond.store7
2540 ; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi)
2541 ; AVX512F-NEXT: testb $32, %al
2542 ; AVX512F-NEXT: je .LBB9_12
2543 ; AVX512F-NEXT: .LBB9_11: # %cond.store9
2544 ; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi)
2545 ; AVX512F-NEXT: testb $64, %al
2546 ; AVX512F-NEXT: je .LBB9_14
2547 ; AVX512F-NEXT: .LBB9_13: # %cond.store11
2548 ; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi)
2549 ; AVX512F-NEXT: testb %al, %al
2550 ; AVX512F-NEXT: js .LBB9_15
2551 ; AVX512F-NEXT: jmp .LBB9_16
2552 ; AVX512F-NEXT: .LBB9_17: # %cond.store15
2553 ; AVX512F-NEXT: vpextrw $0, %xmm0, 16(%rdi)
2554 ; AVX512F-NEXT: testl $512, %eax # imm = 0x200
2555 ; AVX512F-NEXT: je .LBB9_20
2556 ; AVX512F-NEXT: .LBB9_19: # %cond.store17
2557 ; AVX512F-NEXT: vpextrw $1, %xmm0, 18(%rdi)
2558 ; AVX512F-NEXT: testl $1024, %eax # imm = 0x400
2559 ; AVX512F-NEXT: je .LBB9_22
2560 ; AVX512F-NEXT: .LBB9_21: # %cond.store19
2561 ; AVX512F-NEXT: vpextrw $2, %xmm0, 20(%rdi)
2562 ; AVX512F-NEXT: testl $2048, %eax # imm = 0x800
2563 ; AVX512F-NEXT: je .LBB9_24
2564 ; AVX512F-NEXT: .LBB9_23: # %cond.store21
2565 ; AVX512F-NEXT: vpextrw $3, %xmm0, 22(%rdi)
2566 ; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000
2567 ; AVX512F-NEXT: je .LBB9_26
2568 ; AVX512F-NEXT: .LBB9_25: # %cond.store23
2569 ; AVX512F-NEXT: vpextrw $4, %xmm0, 24(%rdi)
2570 ; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000
2571 ; AVX512F-NEXT: je .LBB9_28
2572 ; AVX512F-NEXT: .LBB9_27: # %cond.store25
2573 ; AVX512F-NEXT: vpextrw $5, %xmm0, 26(%rdi)
2574 ; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000
2575 ; AVX512F-NEXT: je .LBB9_30
2576 ; AVX512F-NEXT: .LBB9_29: # %cond.store27
2577 ; AVX512F-NEXT: vpextrw $6, %xmm0, 28(%rdi)
2578 ; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000
2579 ; AVX512F-NEXT: je .LBB9_32
2580 ; AVX512F-NEXT: .LBB9_31: # %cond.store29
2581 ; AVX512F-NEXT: vpextrw $7, %xmm0, 30(%rdi)
2582 ; AVX512F-NEXT: vzeroupper
2583 ; AVX512F-NEXT: retq
2585 ; AVX512BW-LABEL: truncstore_v16i32_v16i16:
2586 ; AVX512BW: # %bb.0:
2587 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1
2588 ; AVX512BW-NEXT: vpmovdw %zmm0, (%rdi) {%k1}
2589 ; AVX512BW-NEXT: vzeroupper
2590 ; AVX512BW-NEXT: retq
2592 ; AVX512BWVL-LABEL: truncstore_v16i32_v16i16:
2593 ; AVX512BWVL: # %bb.0:
2594 ; AVX512BWVL-NEXT: vptestmd %zmm1, %zmm1, %k1
2595 ; AVX512BWVL-NEXT: vpmovdw %zmm0, (%rdi) {%k1}
2596 ; AVX512BWVL-NEXT: vzeroupper
2597 ; AVX512BWVL-NEXT: retq
2598 %a = icmp ne <16 x i32> %mask, zeroinitializer
2599 %b = trunc <16 x i32> %x to <16 x i16>
2600 call void @llvm.masked.store.v16i16.p0(<16 x i16> %b, ptr %p, i32 1, <16 x i1> %a)
2604 define void @truncstore_v16i32_v16i8(<16 x i32> %x, ptr %p, <16 x i32> %mask) {
2605 ; SSE2-LABEL: truncstore_v16i32_v16i8:
2607 ; SSE2-NEXT: pxor %xmm8, %xmm8
2608 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
2609 ; SSE2-NEXT: pand %xmm9, %xmm3
2610 ; SSE2-NEXT: pand %xmm9, %xmm2
2611 ; SSE2-NEXT: packuswb %xmm3, %xmm2
2612 ; SSE2-NEXT: pand %xmm9, %xmm1
2613 ; SSE2-NEXT: pand %xmm9, %xmm0
2614 ; SSE2-NEXT: packuswb %xmm1, %xmm0
2615 ; SSE2-NEXT: packuswb %xmm2, %xmm0
2616 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm7
2617 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm6
2618 ; SSE2-NEXT: packssdw %xmm7, %xmm6
2619 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm5
2620 ; SSE2-NEXT: pcmpeqd %xmm8, %xmm4
2621 ; SSE2-NEXT: packssdw %xmm5, %xmm4
2622 ; SSE2-NEXT: packsswb %xmm6, %xmm4
2623 ; SSE2-NEXT: pmovmskb %xmm4, %eax
2624 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
2625 ; SSE2-NEXT: testb $1, %al
2626 ; SSE2-NEXT: movd %xmm0, %ecx
2627 ; SSE2-NEXT: jne .LBB10_1
2628 ; SSE2-NEXT: # %bb.2: # %else
2629 ; SSE2-NEXT: testb $2, %al
2630 ; SSE2-NEXT: jne .LBB10_3
2631 ; SSE2-NEXT: .LBB10_4: # %else2
2632 ; SSE2-NEXT: testb $4, %al
2633 ; SSE2-NEXT: jne .LBB10_5
2634 ; SSE2-NEXT: .LBB10_6: # %else4
2635 ; SSE2-NEXT: testb $8, %al
2636 ; SSE2-NEXT: je .LBB10_8
2637 ; SSE2-NEXT: .LBB10_7: # %cond.store5
2638 ; SSE2-NEXT: shrl $24, %ecx
2639 ; SSE2-NEXT: movb %cl, 3(%rdi)
2640 ; SSE2-NEXT: .LBB10_8: # %else6
2641 ; SSE2-NEXT: testb $16, %al
2642 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
2643 ; SSE2-NEXT: je .LBB10_10
2644 ; SSE2-NEXT: # %bb.9: # %cond.store7
2645 ; SSE2-NEXT: movb %cl, 4(%rdi)
2646 ; SSE2-NEXT: .LBB10_10: # %else8
2647 ; SSE2-NEXT: testb $32, %al
2648 ; SSE2-NEXT: je .LBB10_12
2649 ; SSE2-NEXT: # %bb.11: # %cond.store9
2650 ; SSE2-NEXT: movb %ch, 5(%rdi)
2651 ; SSE2-NEXT: .LBB10_12: # %else10
2652 ; SSE2-NEXT: testb $64, %al
2653 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
2654 ; SSE2-NEXT: je .LBB10_14
2655 ; SSE2-NEXT: # %bb.13: # %cond.store11
2656 ; SSE2-NEXT: movb %cl, 6(%rdi)
2657 ; SSE2-NEXT: .LBB10_14: # %else12
2658 ; SSE2-NEXT: testb %al, %al
2659 ; SSE2-NEXT: jns .LBB10_16
2660 ; SSE2-NEXT: # %bb.15: # %cond.store13
2661 ; SSE2-NEXT: movb %ch, 7(%rdi)
2662 ; SSE2-NEXT: .LBB10_16: # %else14
2663 ; SSE2-NEXT: testl $256, %eax # imm = 0x100
2664 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx
2665 ; SSE2-NEXT: je .LBB10_18
2666 ; SSE2-NEXT: # %bb.17: # %cond.store15
2667 ; SSE2-NEXT: movb %cl, 8(%rdi)
2668 ; SSE2-NEXT: .LBB10_18: # %else16
2669 ; SSE2-NEXT: testl $512, %eax # imm = 0x200
2670 ; SSE2-NEXT: je .LBB10_20
2671 ; SSE2-NEXT: # %bb.19: # %cond.store17
2672 ; SSE2-NEXT: movb %ch, 9(%rdi)
2673 ; SSE2-NEXT: .LBB10_20: # %else18
2674 ; SSE2-NEXT: testl $1024, %eax # imm = 0x400
2675 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx
2676 ; SSE2-NEXT: je .LBB10_22
2677 ; SSE2-NEXT: # %bb.21: # %cond.store19
2678 ; SSE2-NEXT: movb %cl, 10(%rdi)
2679 ; SSE2-NEXT: .LBB10_22: # %else20
2680 ; SSE2-NEXT: testl $2048, %eax # imm = 0x800
2681 ; SSE2-NEXT: je .LBB10_24
2682 ; SSE2-NEXT: # %bb.23: # %cond.store21
2683 ; SSE2-NEXT: movb %ch, 11(%rdi)
2684 ; SSE2-NEXT: .LBB10_24: # %else22
2685 ; SSE2-NEXT: testl $4096, %eax # imm = 0x1000
2686 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx
2687 ; SSE2-NEXT: je .LBB10_26
2688 ; SSE2-NEXT: # %bb.25: # %cond.store23
2689 ; SSE2-NEXT: movb %cl, 12(%rdi)
2690 ; SSE2-NEXT: .LBB10_26: # %else24
2691 ; SSE2-NEXT: testl $8192, %eax # imm = 0x2000
2692 ; SSE2-NEXT: je .LBB10_28
2693 ; SSE2-NEXT: # %bb.27: # %cond.store25
2694 ; SSE2-NEXT: movb %ch, 13(%rdi)
2695 ; SSE2-NEXT: .LBB10_28: # %else26
2696 ; SSE2-NEXT: testl $16384, %eax # imm = 0x4000
2697 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx
2698 ; SSE2-NEXT: jne .LBB10_29
2699 ; SSE2-NEXT: # %bb.30: # %else28
2700 ; SSE2-NEXT: testl $32768, %eax # imm = 0x8000
2701 ; SSE2-NEXT: jne .LBB10_31
2702 ; SSE2-NEXT: .LBB10_32: # %else30
2704 ; SSE2-NEXT: .LBB10_1: # %cond.store
2705 ; SSE2-NEXT: movb %cl, (%rdi)
2706 ; SSE2-NEXT: testb $2, %al
2707 ; SSE2-NEXT: je .LBB10_4
2708 ; SSE2-NEXT: .LBB10_3: # %cond.store1
2709 ; SSE2-NEXT: movb %ch, 1(%rdi)
2710 ; SSE2-NEXT: testb $4, %al
2711 ; SSE2-NEXT: je .LBB10_6
2712 ; SSE2-NEXT: .LBB10_5: # %cond.store3
2713 ; SSE2-NEXT: movl %ecx, %edx
2714 ; SSE2-NEXT: shrl $16, %edx
2715 ; SSE2-NEXT: movb %dl, 2(%rdi)
2716 ; SSE2-NEXT: testb $8, %al
2717 ; SSE2-NEXT: jne .LBB10_7
2718 ; SSE2-NEXT: jmp .LBB10_8
2719 ; SSE2-NEXT: .LBB10_29: # %cond.store27
2720 ; SSE2-NEXT: movb %cl, 14(%rdi)
2721 ; SSE2-NEXT: testl $32768, %eax # imm = 0x8000
2722 ; SSE2-NEXT: je .LBB10_32
2723 ; SSE2-NEXT: .LBB10_31: # %cond.store29
2724 ; SSE2-NEXT: movb %ch, 15(%rdi)
2727 ; SSE4-LABEL: truncstore_v16i32_v16i8:
2729 ; SSE4-NEXT: pxor %xmm8, %xmm8
2730 ; SSE4-NEXT: pmovzxbd {{.*#+}} xmm9 = [255,255,255,255]
2731 ; SSE4-NEXT: pand %xmm9, %xmm3
2732 ; SSE4-NEXT: pand %xmm9, %xmm2
2733 ; SSE4-NEXT: packusdw %xmm3, %xmm2
2734 ; SSE4-NEXT: pand %xmm9, %xmm1
2735 ; SSE4-NEXT: pand %xmm9, %xmm0
2736 ; SSE4-NEXT: packusdw %xmm1, %xmm0
2737 ; SSE4-NEXT: packuswb %xmm2, %xmm0
2738 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm7
2739 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm6
2740 ; SSE4-NEXT: packssdw %xmm7, %xmm6
2741 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm5
2742 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm4
2743 ; SSE4-NEXT: packssdw %xmm5, %xmm4
2744 ; SSE4-NEXT: packsswb %xmm6, %xmm4
2745 ; SSE4-NEXT: pmovmskb %xmm4, %eax
2746 ; SSE4-NEXT: xorl $65535, %eax # imm = 0xFFFF
2747 ; SSE4-NEXT: testb $1, %al
2748 ; SSE4-NEXT: jne .LBB10_1
2749 ; SSE4-NEXT: # %bb.2: # %else
2750 ; SSE4-NEXT: testb $2, %al
2751 ; SSE4-NEXT: jne .LBB10_3
2752 ; SSE4-NEXT: .LBB10_4: # %else2
2753 ; SSE4-NEXT: testb $4, %al
2754 ; SSE4-NEXT: jne .LBB10_5
2755 ; SSE4-NEXT: .LBB10_6: # %else4
2756 ; SSE4-NEXT: testb $8, %al
2757 ; SSE4-NEXT: jne .LBB10_7
2758 ; SSE4-NEXT: .LBB10_8: # %else6
2759 ; SSE4-NEXT: testb $16, %al
2760 ; SSE4-NEXT: jne .LBB10_9
2761 ; SSE4-NEXT: .LBB10_10: # %else8
2762 ; SSE4-NEXT: testb $32, %al
2763 ; SSE4-NEXT: jne .LBB10_11
2764 ; SSE4-NEXT: .LBB10_12: # %else10
2765 ; SSE4-NEXT: testb $64, %al
2766 ; SSE4-NEXT: jne .LBB10_13
2767 ; SSE4-NEXT: .LBB10_14: # %else12
2768 ; SSE4-NEXT: testb %al, %al
2769 ; SSE4-NEXT: js .LBB10_15
2770 ; SSE4-NEXT: .LBB10_16: # %else14
2771 ; SSE4-NEXT: testl $256, %eax # imm = 0x100
2772 ; SSE4-NEXT: jne .LBB10_17
2773 ; SSE4-NEXT: .LBB10_18: # %else16
2774 ; SSE4-NEXT: testl $512, %eax # imm = 0x200
2775 ; SSE4-NEXT: jne .LBB10_19
2776 ; SSE4-NEXT: .LBB10_20: # %else18
2777 ; SSE4-NEXT: testl $1024, %eax # imm = 0x400
2778 ; SSE4-NEXT: jne .LBB10_21
2779 ; SSE4-NEXT: .LBB10_22: # %else20
2780 ; SSE4-NEXT: testl $2048, %eax # imm = 0x800
2781 ; SSE4-NEXT: jne .LBB10_23
2782 ; SSE4-NEXT: .LBB10_24: # %else22
2783 ; SSE4-NEXT: testl $4096, %eax # imm = 0x1000
2784 ; SSE4-NEXT: jne .LBB10_25
2785 ; SSE4-NEXT: .LBB10_26: # %else24
2786 ; SSE4-NEXT: testl $8192, %eax # imm = 0x2000
2787 ; SSE4-NEXT: jne .LBB10_27
2788 ; SSE4-NEXT: .LBB10_28: # %else26
2789 ; SSE4-NEXT: testl $16384, %eax # imm = 0x4000
2790 ; SSE4-NEXT: jne .LBB10_29
2791 ; SSE4-NEXT: .LBB10_30: # %else28
2792 ; SSE4-NEXT: testl $32768, %eax # imm = 0x8000
2793 ; SSE4-NEXT: jne .LBB10_31
2794 ; SSE4-NEXT: .LBB10_32: # %else30
2796 ; SSE4-NEXT: .LBB10_1: # %cond.store
2797 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
2798 ; SSE4-NEXT: testb $2, %al
2799 ; SSE4-NEXT: je .LBB10_4
2800 ; SSE4-NEXT: .LBB10_3: # %cond.store1
2801 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
2802 ; SSE4-NEXT: testb $4, %al
2803 ; SSE4-NEXT: je .LBB10_6
2804 ; SSE4-NEXT: .LBB10_5: # %cond.store3
2805 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi)
2806 ; SSE4-NEXT: testb $8, %al
2807 ; SSE4-NEXT: je .LBB10_8
2808 ; SSE4-NEXT: .LBB10_7: # %cond.store5
2809 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi)
2810 ; SSE4-NEXT: testb $16, %al
2811 ; SSE4-NEXT: je .LBB10_10
2812 ; SSE4-NEXT: .LBB10_9: # %cond.store7
2813 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi)
2814 ; SSE4-NEXT: testb $32, %al
2815 ; SSE4-NEXT: je .LBB10_12
2816 ; SSE4-NEXT: .LBB10_11: # %cond.store9
2817 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi)
2818 ; SSE4-NEXT: testb $64, %al
2819 ; SSE4-NEXT: je .LBB10_14
2820 ; SSE4-NEXT: .LBB10_13: # %cond.store11
2821 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi)
2822 ; SSE4-NEXT: testb %al, %al
2823 ; SSE4-NEXT: jns .LBB10_16
2824 ; SSE4-NEXT: .LBB10_15: # %cond.store13
2825 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi)
2826 ; SSE4-NEXT: testl $256, %eax # imm = 0x100
2827 ; SSE4-NEXT: je .LBB10_18
2828 ; SSE4-NEXT: .LBB10_17: # %cond.store15
2829 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi)
2830 ; SSE4-NEXT: testl $512, %eax # imm = 0x200
2831 ; SSE4-NEXT: je .LBB10_20
2832 ; SSE4-NEXT: .LBB10_19: # %cond.store17
2833 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi)
2834 ; SSE4-NEXT: testl $1024, %eax # imm = 0x400
2835 ; SSE4-NEXT: je .LBB10_22
2836 ; SSE4-NEXT: .LBB10_21: # %cond.store19
2837 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi)
2838 ; SSE4-NEXT: testl $2048, %eax # imm = 0x800
2839 ; SSE4-NEXT: je .LBB10_24
2840 ; SSE4-NEXT: .LBB10_23: # %cond.store21
2841 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi)
2842 ; SSE4-NEXT: testl $4096, %eax # imm = 0x1000
2843 ; SSE4-NEXT: je .LBB10_26
2844 ; SSE4-NEXT: .LBB10_25: # %cond.store23
2845 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi)
2846 ; SSE4-NEXT: testl $8192, %eax # imm = 0x2000
2847 ; SSE4-NEXT: je .LBB10_28
2848 ; SSE4-NEXT: .LBB10_27: # %cond.store25
2849 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi)
2850 ; SSE4-NEXT: testl $16384, %eax # imm = 0x4000
2851 ; SSE4-NEXT: je .LBB10_30
2852 ; SSE4-NEXT: .LBB10_29: # %cond.store27
2853 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi)
2854 ; SSE4-NEXT: testl $32768, %eax # imm = 0x8000
2855 ; SSE4-NEXT: je .LBB10_32
2856 ; SSE4-NEXT: .LBB10_31: # %cond.store29
2857 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi)
2860 ; AVX1-LABEL: truncstore_v16i32_v16i8:
2862 ; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255]
2863 ; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1
2864 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
2865 ; AVX1-NEXT: vpackusdw %xmm5, %xmm1, %xmm1
2866 ; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0
2867 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
2868 ; AVX1-NEXT: vpackusdw %xmm4, %xmm0, %xmm0
2869 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
2870 ; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1
2871 ; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4
2872 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm1, %xmm1
2873 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3
2874 ; AVX1-NEXT: vpackssdw %xmm1, %xmm3, %xmm1
2875 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
2876 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3
2877 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2
2878 ; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2
2879 ; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1
2880 ; AVX1-NEXT: vpmovmskb %xmm1, %eax
2881 ; AVX1-NEXT: xorl $65535, %eax # imm = 0xFFFF
2882 ; AVX1-NEXT: testb $1, %al
2883 ; AVX1-NEXT: jne .LBB10_1
2884 ; AVX1-NEXT: # %bb.2: # %else
2885 ; AVX1-NEXT: testb $2, %al
2886 ; AVX1-NEXT: jne .LBB10_3
2887 ; AVX1-NEXT: .LBB10_4: # %else2
2888 ; AVX1-NEXT: testb $4, %al
2889 ; AVX1-NEXT: jne .LBB10_5
2890 ; AVX1-NEXT: .LBB10_6: # %else4
2891 ; AVX1-NEXT: testb $8, %al
2892 ; AVX1-NEXT: jne .LBB10_7
2893 ; AVX1-NEXT: .LBB10_8: # %else6
2894 ; AVX1-NEXT: testb $16, %al
2895 ; AVX1-NEXT: jne .LBB10_9
2896 ; AVX1-NEXT: .LBB10_10: # %else8
2897 ; AVX1-NEXT: testb $32, %al
2898 ; AVX1-NEXT: jne .LBB10_11
2899 ; AVX1-NEXT: .LBB10_12: # %else10
2900 ; AVX1-NEXT: testb $64, %al
2901 ; AVX1-NEXT: jne .LBB10_13
2902 ; AVX1-NEXT: .LBB10_14: # %else12
2903 ; AVX1-NEXT: testb %al, %al
2904 ; AVX1-NEXT: js .LBB10_15
2905 ; AVX1-NEXT: .LBB10_16: # %else14
2906 ; AVX1-NEXT: testl $256, %eax # imm = 0x100
2907 ; AVX1-NEXT: jne .LBB10_17
2908 ; AVX1-NEXT: .LBB10_18: # %else16
2909 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
2910 ; AVX1-NEXT: jne .LBB10_19
2911 ; AVX1-NEXT: .LBB10_20: # %else18
2912 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
2913 ; AVX1-NEXT: jne .LBB10_21
2914 ; AVX1-NEXT: .LBB10_22: # %else20
2915 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
2916 ; AVX1-NEXT: jne .LBB10_23
2917 ; AVX1-NEXT: .LBB10_24: # %else22
2918 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
2919 ; AVX1-NEXT: jne .LBB10_25
2920 ; AVX1-NEXT: .LBB10_26: # %else24
2921 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
2922 ; AVX1-NEXT: jne .LBB10_27
2923 ; AVX1-NEXT: .LBB10_28: # %else26
2924 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
2925 ; AVX1-NEXT: jne .LBB10_29
2926 ; AVX1-NEXT: .LBB10_30: # %else28
2927 ; AVX1-NEXT: testl $32768, %eax # imm = 0x8000
2928 ; AVX1-NEXT: jne .LBB10_31
2929 ; AVX1-NEXT: .LBB10_32: # %else30
2930 ; AVX1-NEXT: vzeroupper
2932 ; AVX1-NEXT: .LBB10_1: # %cond.store
2933 ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi)
2934 ; AVX1-NEXT: testb $2, %al
2935 ; AVX1-NEXT: je .LBB10_4
2936 ; AVX1-NEXT: .LBB10_3: # %cond.store1
2937 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi)
2938 ; AVX1-NEXT: testb $4, %al
2939 ; AVX1-NEXT: je .LBB10_6
2940 ; AVX1-NEXT: .LBB10_5: # %cond.store3
2941 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi)
2942 ; AVX1-NEXT: testb $8, %al
2943 ; AVX1-NEXT: je .LBB10_8
2944 ; AVX1-NEXT: .LBB10_7: # %cond.store5
2945 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi)
2946 ; AVX1-NEXT: testb $16, %al
2947 ; AVX1-NEXT: je .LBB10_10
2948 ; AVX1-NEXT: .LBB10_9: # %cond.store7
2949 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi)
2950 ; AVX1-NEXT: testb $32, %al
2951 ; AVX1-NEXT: je .LBB10_12
2952 ; AVX1-NEXT: .LBB10_11: # %cond.store9
2953 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi)
2954 ; AVX1-NEXT: testb $64, %al
2955 ; AVX1-NEXT: je .LBB10_14
2956 ; AVX1-NEXT: .LBB10_13: # %cond.store11
2957 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi)
2958 ; AVX1-NEXT: testb %al, %al
2959 ; AVX1-NEXT: jns .LBB10_16
2960 ; AVX1-NEXT: .LBB10_15: # %cond.store13
2961 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi)
2962 ; AVX1-NEXT: testl $256, %eax # imm = 0x100
2963 ; AVX1-NEXT: je .LBB10_18
2964 ; AVX1-NEXT: .LBB10_17: # %cond.store15
2965 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi)
2966 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
2967 ; AVX1-NEXT: je .LBB10_20
2968 ; AVX1-NEXT: .LBB10_19: # %cond.store17
2969 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi)
2970 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
2971 ; AVX1-NEXT: je .LBB10_22
2972 ; AVX1-NEXT: .LBB10_21: # %cond.store19
2973 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi)
2974 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
2975 ; AVX1-NEXT: je .LBB10_24
2976 ; AVX1-NEXT: .LBB10_23: # %cond.store21
2977 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi)
2978 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
2979 ; AVX1-NEXT: je .LBB10_26
2980 ; AVX1-NEXT: .LBB10_25: # %cond.store23
2981 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi)
2982 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
2983 ; AVX1-NEXT: je .LBB10_28
2984 ; AVX1-NEXT: .LBB10_27: # %cond.store25
2985 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi)
2986 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
2987 ; AVX1-NEXT: je .LBB10_30
2988 ; AVX1-NEXT: .LBB10_29: # %cond.store27
2989 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi)
2990 ; AVX1-NEXT: testl $32768, %eax # imm = 0x8000
2991 ; AVX1-NEXT: je .LBB10_32
2992 ; AVX1-NEXT: .LBB10_31: # %cond.store29
2993 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi)
2994 ; AVX1-NEXT: vzeroupper
2997 ; AVX2-LABEL: truncstore_v16i32_v16i8:
2999 ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4
3000 ; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [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]
3001 ; AVX2-NEXT: vpand %ymm5, %ymm1, %ymm1
3002 ; AVX2-NEXT: vpand %ymm5, %ymm0, %ymm0
3003 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0
3004 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
3005 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
3006 ; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3007 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm1
3008 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm2
3009 ; AVX2-NEXT: vpackssdw %ymm1, %ymm2, %ymm1
3010 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2
3011 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
3012 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2
3013 ; AVX2-NEXT: vpacksswb %xmm2, %xmm1, %xmm1
3014 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
3015 ; AVX2-NEXT: vpmovmskb %xmm1, %eax
3016 ; AVX2-NEXT: testb $1, %al
3017 ; AVX2-NEXT: jne .LBB10_1
3018 ; AVX2-NEXT: # %bb.2: # %else
3019 ; AVX2-NEXT: testb $2, %al
3020 ; AVX2-NEXT: jne .LBB10_3
3021 ; AVX2-NEXT: .LBB10_4: # %else2
3022 ; AVX2-NEXT: testb $4, %al
3023 ; AVX2-NEXT: jne .LBB10_5
3024 ; AVX2-NEXT: .LBB10_6: # %else4
3025 ; AVX2-NEXT: testb $8, %al
3026 ; AVX2-NEXT: jne .LBB10_7
3027 ; AVX2-NEXT: .LBB10_8: # %else6
3028 ; AVX2-NEXT: testb $16, %al
3029 ; AVX2-NEXT: jne .LBB10_9
3030 ; AVX2-NEXT: .LBB10_10: # %else8
3031 ; AVX2-NEXT: testb $32, %al
3032 ; AVX2-NEXT: jne .LBB10_11
3033 ; AVX2-NEXT: .LBB10_12: # %else10
3034 ; AVX2-NEXT: testb $64, %al
3035 ; AVX2-NEXT: jne .LBB10_13
3036 ; AVX2-NEXT: .LBB10_14: # %else12
3037 ; AVX2-NEXT: testb %al, %al
3038 ; AVX2-NEXT: js .LBB10_15
3039 ; AVX2-NEXT: .LBB10_16: # %else14
3040 ; AVX2-NEXT: testl $256, %eax # imm = 0x100
3041 ; AVX2-NEXT: jne .LBB10_17
3042 ; AVX2-NEXT: .LBB10_18: # %else16
3043 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
3044 ; AVX2-NEXT: jne .LBB10_19
3045 ; AVX2-NEXT: .LBB10_20: # %else18
3046 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
3047 ; AVX2-NEXT: jne .LBB10_21
3048 ; AVX2-NEXT: .LBB10_22: # %else20
3049 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
3050 ; AVX2-NEXT: jne .LBB10_23
3051 ; AVX2-NEXT: .LBB10_24: # %else22
3052 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
3053 ; AVX2-NEXT: jne .LBB10_25
3054 ; AVX2-NEXT: .LBB10_26: # %else24
3055 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
3056 ; AVX2-NEXT: jne .LBB10_27
3057 ; AVX2-NEXT: .LBB10_28: # %else26
3058 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
3059 ; AVX2-NEXT: jne .LBB10_29
3060 ; AVX2-NEXT: .LBB10_30: # %else28
3061 ; AVX2-NEXT: testl $32768, %eax # imm = 0x8000
3062 ; AVX2-NEXT: jne .LBB10_31
3063 ; AVX2-NEXT: .LBB10_32: # %else30
3064 ; AVX2-NEXT: vzeroupper
3066 ; AVX2-NEXT: .LBB10_1: # %cond.store
3067 ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi)
3068 ; AVX2-NEXT: testb $2, %al
3069 ; AVX2-NEXT: je .LBB10_4
3070 ; AVX2-NEXT: .LBB10_3: # %cond.store1
3071 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi)
3072 ; AVX2-NEXT: testb $4, %al
3073 ; AVX2-NEXT: je .LBB10_6
3074 ; AVX2-NEXT: .LBB10_5: # %cond.store3
3075 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi)
3076 ; AVX2-NEXT: testb $8, %al
3077 ; AVX2-NEXT: je .LBB10_8
3078 ; AVX2-NEXT: .LBB10_7: # %cond.store5
3079 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi)
3080 ; AVX2-NEXT: testb $16, %al
3081 ; AVX2-NEXT: je .LBB10_10
3082 ; AVX2-NEXT: .LBB10_9: # %cond.store7
3083 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi)
3084 ; AVX2-NEXT: testb $32, %al
3085 ; AVX2-NEXT: je .LBB10_12
3086 ; AVX2-NEXT: .LBB10_11: # %cond.store9
3087 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi)
3088 ; AVX2-NEXT: testb $64, %al
3089 ; AVX2-NEXT: je .LBB10_14
3090 ; AVX2-NEXT: .LBB10_13: # %cond.store11
3091 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi)
3092 ; AVX2-NEXT: testb %al, %al
3093 ; AVX2-NEXT: jns .LBB10_16
3094 ; AVX2-NEXT: .LBB10_15: # %cond.store13
3095 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi)
3096 ; AVX2-NEXT: testl $256, %eax # imm = 0x100
3097 ; AVX2-NEXT: je .LBB10_18
3098 ; AVX2-NEXT: .LBB10_17: # %cond.store15
3099 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi)
3100 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
3101 ; AVX2-NEXT: je .LBB10_20
3102 ; AVX2-NEXT: .LBB10_19: # %cond.store17
3103 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi)
3104 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
3105 ; AVX2-NEXT: je .LBB10_22
3106 ; AVX2-NEXT: .LBB10_21: # %cond.store19
3107 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi)
3108 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
3109 ; AVX2-NEXT: je .LBB10_24
3110 ; AVX2-NEXT: .LBB10_23: # %cond.store21
3111 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi)
3112 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
3113 ; AVX2-NEXT: je .LBB10_26
3114 ; AVX2-NEXT: .LBB10_25: # %cond.store23
3115 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi)
3116 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
3117 ; AVX2-NEXT: je .LBB10_28
3118 ; AVX2-NEXT: .LBB10_27: # %cond.store25
3119 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi)
3120 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
3121 ; AVX2-NEXT: je .LBB10_30
3122 ; AVX2-NEXT: .LBB10_29: # %cond.store27
3123 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi)
3124 ; AVX2-NEXT: testl $32768, %eax # imm = 0x8000
3125 ; AVX2-NEXT: je .LBB10_32
3126 ; AVX2-NEXT: .LBB10_31: # %cond.store29
3127 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi)
3128 ; AVX2-NEXT: vzeroupper
3131 ; AVX512F-LABEL: truncstore_v16i32_v16i8:
3133 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
3134 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
3135 ; AVX512F-NEXT: kmovw %k0, %eax
3136 ; AVX512F-NEXT: testb $1, %al
3137 ; AVX512F-NEXT: jne .LBB10_1
3138 ; AVX512F-NEXT: # %bb.2: # %else
3139 ; AVX512F-NEXT: testb $2, %al
3140 ; AVX512F-NEXT: jne .LBB10_3
3141 ; AVX512F-NEXT: .LBB10_4: # %else2
3142 ; AVX512F-NEXT: testb $4, %al
3143 ; AVX512F-NEXT: jne .LBB10_5
3144 ; AVX512F-NEXT: .LBB10_6: # %else4
3145 ; AVX512F-NEXT: testb $8, %al
3146 ; AVX512F-NEXT: jne .LBB10_7
3147 ; AVX512F-NEXT: .LBB10_8: # %else6
3148 ; AVX512F-NEXT: testb $16, %al
3149 ; AVX512F-NEXT: jne .LBB10_9
3150 ; AVX512F-NEXT: .LBB10_10: # %else8
3151 ; AVX512F-NEXT: testb $32, %al
3152 ; AVX512F-NEXT: jne .LBB10_11
3153 ; AVX512F-NEXT: .LBB10_12: # %else10
3154 ; AVX512F-NEXT: testb $64, %al
3155 ; AVX512F-NEXT: jne .LBB10_13
3156 ; AVX512F-NEXT: .LBB10_14: # %else12
3157 ; AVX512F-NEXT: testb %al, %al
3158 ; AVX512F-NEXT: js .LBB10_15
3159 ; AVX512F-NEXT: .LBB10_16: # %else14
3160 ; AVX512F-NEXT: testl $256, %eax # imm = 0x100
3161 ; AVX512F-NEXT: jne .LBB10_17
3162 ; AVX512F-NEXT: .LBB10_18: # %else16
3163 ; AVX512F-NEXT: testl $512, %eax # imm = 0x200
3164 ; AVX512F-NEXT: jne .LBB10_19
3165 ; AVX512F-NEXT: .LBB10_20: # %else18
3166 ; AVX512F-NEXT: testl $1024, %eax # imm = 0x400
3167 ; AVX512F-NEXT: jne .LBB10_21
3168 ; AVX512F-NEXT: .LBB10_22: # %else20
3169 ; AVX512F-NEXT: testl $2048, %eax # imm = 0x800
3170 ; AVX512F-NEXT: jne .LBB10_23
3171 ; AVX512F-NEXT: .LBB10_24: # %else22
3172 ; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000
3173 ; AVX512F-NEXT: jne .LBB10_25
3174 ; AVX512F-NEXT: .LBB10_26: # %else24
3175 ; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000
3176 ; AVX512F-NEXT: jne .LBB10_27
3177 ; AVX512F-NEXT: .LBB10_28: # %else26
3178 ; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000
3179 ; AVX512F-NEXT: jne .LBB10_29
3180 ; AVX512F-NEXT: .LBB10_30: # %else28
3181 ; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000
3182 ; AVX512F-NEXT: jne .LBB10_31
3183 ; AVX512F-NEXT: .LBB10_32: # %else30
3184 ; AVX512F-NEXT: vzeroupper
3185 ; AVX512F-NEXT: retq
3186 ; AVX512F-NEXT: .LBB10_1: # %cond.store
3187 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
3188 ; AVX512F-NEXT: testb $2, %al
3189 ; AVX512F-NEXT: je .LBB10_4
3190 ; AVX512F-NEXT: .LBB10_3: # %cond.store1
3191 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
3192 ; AVX512F-NEXT: testb $4, %al
3193 ; AVX512F-NEXT: je .LBB10_6
3194 ; AVX512F-NEXT: .LBB10_5: # %cond.store3
3195 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi)
3196 ; AVX512F-NEXT: testb $8, %al
3197 ; AVX512F-NEXT: je .LBB10_8
3198 ; AVX512F-NEXT: .LBB10_7: # %cond.store5
3199 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi)
3200 ; AVX512F-NEXT: testb $16, %al
3201 ; AVX512F-NEXT: je .LBB10_10
3202 ; AVX512F-NEXT: .LBB10_9: # %cond.store7
3203 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi)
3204 ; AVX512F-NEXT: testb $32, %al
3205 ; AVX512F-NEXT: je .LBB10_12
3206 ; AVX512F-NEXT: .LBB10_11: # %cond.store9
3207 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi)
3208 ; AVX512F-NEXT: testb $64, %al
3209 ; AVX512F-NEXT: je .LBB10_14
3210 ; AVX512F-NEXT: .LBB10_13: # %cond.store11
3211 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi)
3212 ; AVX512F-NEXT: testb %al, %al
3213 ; AVX512F-NEXT: jns .LBB10_16
3214 ; AVX512F-NEXT: .LBB10_15: # %cond.store13
3215 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi)
3216 ; AVX512F-NEXT: testl $256, %eax # imm = 0x100
3217 ; AVX512F-NEXT: je .LBB10_18
3218 ; AVX512F-NEXT: .LBB10_17: # %cond.store15
3219 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi)
3220 ; AVX512F-NEXT: testl $512, %eax # imm = 0x200
3221 ; AVX512F-NEXT: je .LBB10_20
3222 ; AVX512F-NEXT: .LBB10_19: # %cond.store17
3223 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi)
3224 ; AVX512F-NEXT: testl $1024, %eax # imm = 0x400
3225 ; AVX512F-NEXT: je .LBB10_22
3226 ; AVX512F-NEXT: .LBB10_21: # %cond.store19
3227 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi)
3228 ; AVX512F-NEXT: testl $2048, %eax # imm = 0x800
3229 ; AVX512F-NEXT: je .LBB10_24
3230 ; AVX512F-NEXT: .LBB10_23: # %cond.store21
3231 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi)
3232 ; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000
3233 ; AVX512F-NEXT: je .LBB10_26
3234 ; AVX512F-NEXT: .LBB10_25: # %cond.store23
3235 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi)
3236 ; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000
3237 ; AVX512F-NEXT: je .LBB10_28
3238 ; AVX512F-NEXT: .LBB10_27: # %cond.store25
3239 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi)
3240 ; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000
3241 ; AVX512F-NEXT: je .LBB10_30
3242 ; AVX512F-NEXT: .LBB10_29: # %cond.store27
3243 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi)
3244 ; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000
3245 ; AVX512F-NEXT: je .LBB10_32
3246 ; AVX512F-NEXT: .LBB10_31: # %cond.store29
3247 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi)
3248 ; AVX512F-NEXT: vzeroupper
3249 ; AVX512F-NEXT: retq
3251 ; AVX512BW-LABEL: truncstore_v16i32_v16i8:
3252 ; AVX512BW: # %bb.0:
3253 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1
3254 ; AVX512BW-NEXT: vpmovdb %zmm0, (%rdi) {%k1}
3255 ; AVX512BW-NEXT: vzeroupper
3256 ; AVX512BW-NEXT: retq
3258 ; AVX512BWVL-LABEL: truncstore_v16i32_v16i8:
3259 ; AVX512BWVL: # %bb.0:
3260 ; AVX512BWVL-NEXT: vptestmd %zmm1, %zmm1, %k1
3261 ; AVX512BWVL-NEXT: vpmovdb %zmm0, (%rdi) {%k1}
3262 ; AVX512BWVL-NEXT: vzeroupper
3263 ; AVX512BWVL-NEXT: retq
3264 %a = icmp ne <16 x i32> %mask, zeroinitializer
3265 %b = trunc <16 x i32> %x to <16 x i8>
3266 call void @llvm.masked.store.v16i8.p0(<16 x i8> %b, ptr %p, i32 1, <16 x i1> %a)
3270 define void @truncstore_v8i32_v8i16(<8 x i32> %x, ptr %p, <8 x i32> %mask) {
3271 ; SSE2-LABEL: truncstore_v8i32_v8i16:
3273 ; SSE2-NEXT: pxor %xmm4, %xmm4
3274 ; SSE2-NEXT: pslld $16, %xmm1
3275 ; SSE2-NEXT: psrad $16, %xmm1
3276 ; SSE2-NEXT: pslld $16, %xmm0
3277 ; SSE2-NEXT: psrad $16, %xmm0
3278 ; SSE2-NEXT: packssdw %xmm1, %xmm0
3279 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm3
3280 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm2
3281 ; SSE2-NEXT: packssdw %xmm3, %xmm2
3282 ; SSE2-NEXT: packsswb %xmm2, %xmm2
3283 ; SSE2-NEXT: pmovmskb %xmm2, %eax
3284 ; SSE2-NEXT: notl %eax
3285 ; SSE2-NEXT: testb $1, %al
3286 ; SSE2-NEXT: jne .LBB11_1
3287 ; SSE2-NEXT: # %bb.2: # %else
3288 ; SSE2-NEXT: testb $2, %al
3289 ; SSE2-NEXT: jne .LBB11_3
3290 ; SSE2-NEXT: .LBB11_4: # %else2
3291 ; SSE2-NEXT: testb $4, %al
3292 ; SSE2-NEXT: jne .LBB11_5
3293 ; SSE2-NEXT: .LBB11_6: # %else4
3294 ; SSE2-NEXT: testb $8, %al
3295 ; SSE2-NEXT: jne .LBB11_7
3296 ; SSE2-NEXT: .LBB11_8: # %else6
3297 ; SSE2-NEXT: testb $16, %al
3298 ; SSE2-NEXT: jne .LBB11_9
3299 ; SSE2-NEXT: .LBB11_10: # %else8
3300 ; SSE2-NEXT: testb $32, %al
3301 ; SSE2-NEXT: jne .LBB11_11
3302 ; SSE2-NEXT: .LBB11_12: # %else10
3303 ; SSE2-NEXT: testb $64, %al
3304 ; SSE2-NEXT: jne .LBB11_13
3305 ; SSE2-NEXT: .LBB11_14: # %else12
3306 ; SSE2-NEXT: testb $-128, %al
3307 ; SSE2-NEXT: jne .LBB11_15
3308 ; SSE2-NEXT: .LBB11_16: # %else14
3310 ; SSE2-NEXT: .LBB11_1: # %cond.store
3311 ; SSE2-NEXT: movd %xmm0, %ecx
3312 ; SSE2-NEXT: movw %cx, (%rdi)
3313 ; SSE2-NEXT: testb $2, %al
3314 ; SSE2-NEXT: je .LBB11_4
3315 ; SSE2-NEXT: .LBB11_3: # %cond.store1
3316 ; SSE2-NEXT: pextrw $1, %xmm0, %ecx
3317 ; SSE2-NEXT: movw %cx, 2(%rdi)
3318 ; SSE2-NEXT: testb $4, %al
3319 ; SSE2-NEXT: je .LBB11_6
3320 ; SSE2-NEXT: .LBB11_5: # %cond.store3
3321 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
3322 ; SSE2-NEXT: movw %cx, 4(%rdi)
3323 ; SSE2-NEXT: testb $8, %al
3324 ; SSE2-NEXT: je .LBB11_8
3325 ; SSE2-NEXT: .LBB11_7: # %cond.store5
3326 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
3327 ; SSE2-NEXT: movw %cx, 6(%rdi)
3328 ; SSE2-NEXT: testb $16, %al
3329 ; SSE2-NEXT: je .LBB11_10
3330 ; SSE2-NEXT: .LBB11_9: # %cond.store7
3331 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx
3332 ; SSE2-NEXT: movw %cx, 8(%rdi)
3333 ; SSE2-NEXT: testb $32, %al
3334 ; SSE2-NEXT: je .LBB11_12
3335 ; SSE2-NEXT: .LBB11_11: # %cond.store9
3336 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx
3337 ; SSE2-NEXT: movw %cx, 10(%rdi)
3338 ; SSE2-NEXT: testb $64, %al
3339 ; SSE2-NEXT: je .LBB11_14
3340 ; SSE2-NEXT: .LBB11_13: # %cond.store11
3341 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx
3342 ; SSE2-NEXT: movw %cx, 12(%rdi)
3343 ; SSE2-NEXT: testb $-128, %al
3344 ; SSE2-NEXT: je .LBB11_16
3345 ; SSE2-NEXT: .LBB11_15: # %cond.store13
3346 ; SSE2-NEXT: pextrw $7, %xmm0, %eax
3347 ; SSE2-NEXT: movw %ax, 14(%rdi)
3350 ; SSE4-LABEL: truncstore_v8i32_v8i16:
3352 ; SSE4-NEXT: pxor %xmm4, %xmm4
3353 ; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7]
3354 ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7]
3355 ; SSE4-NEXT: packusdw %xmm1, %xmm0
3356 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm3
3357 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm2
3358 ; SSE4-NEXT: packssdw %xmm3, %xmm2
3359 ; SSE4-NEXT: packsswb %xmm2, %xmm2
3360 ; SSE4-NEXT: pmovmskb %xmm2, %eax
3361 ; SSE4-NEXT: notl %eax
3362 ; SSE4-NEXT: testb $1, %al
3363 ; SSE4-NEXT: jne .LBB11_1
3364 ; SSE4-NEXT: # %bb.2: # %else
3365 ; SSE4-NEXT: testb $2, %al
3366 ; SSE4-NEXT: jne .LBB11_3
3367 ; SSE4-NEXT: .LBB11_4: # %else2
3368 ; SSE4-NEXT: testb $4, %al
3369 ; SSE4-NEXT: jne .LBB11_5
3370 ; SSE4-NEXT: .LBB11_6: # %else4
3371 ; SSE4-NEXT: testb $8, %al
3372 ; SSE4-NEXT: jne .LBB11_7
3373 ; SSE4-NEXT: .LBB11_8: # %else6
3374 ; SSE4-NEXT: testb $16, %al
3375 ; SSE4-NEXT: jne .LBB11_9
3376 ; SSE4-NEXT: .LBB11_10: # %else8
3377 ; SSE4-NEXT: testb $32, %al
3378 ; SSE4-NEXT: jne .LBB11_11
3379 ; SSE4-NEXT: .LBB11_12: # %else10
3380 ; SSE4-NEXT: testb $64, %al
3381 ; SSE4-NEXT: jne .LBB11_13
3382 ; SSE4-NEXT: .LBB11_14: # %else12
3383 ; SSE4-NEXT: testb $-128, %al
3384 ; SSE4-NEXT: jne .LBB11_15
3385 ; SSE4-NEXT: .LBB11_16: # %else14
3387 ; SSE4-NEXT: .LBB11_1: # %cond.store
3388 ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi)
3389 ; SSE4-NEXT: testb $2, %al
3390 ; SSE4-NEXT: je .LBB11_4
3391 ; SSE4-NEXT: .LBB11_3: # %cond.store1
3392 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi)
3393 ; SSE4-NEXT: testb $4, %al
3394 ; SSE4-NEXT: je .LBB11_6
3395 ; SSE4-NEXT: .LBB11_5: # %cond.store3
3396 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi)
3397 ; SSE4-NEXT: testb $8, %al
3398 ; SSE4-NEXT: je .LBB11_8
3399 ; SSE4-NEXT: .LBB11_7: # %cond.store5
3400 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi)
3401 ; SSE4-NEXT: testb $16, %al
3402 ; SSE4-NEXT: je .LBB11_10
3403 ; SSE4-NEXT: .LBB11_9: # %cond.store7
3404 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi)
3405 ; SSE4-NEXT: testb $32, %al
3406 ; SSE4-NEXT: je .LBB11_12
3407 ; SSE4-NEXT: .LBB11_11: # %cond.store9
3408 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi)
3409 ; SSE4-NEXT: testb $64, %al
3410 ; SSE4-NEXT: je .LBB11_14
3411 ; SSE4-NEXT: .LBB11_13: # %cond.store11
3412 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi)
3413 ; SSE4-NEXT: testb $-128, %al
3414 ; SSE4-NEXT: je .LBB11_16
3415 ; SSE4-NEXT: .LBB11_15: # %cond.store13
3416 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi)
3419 ; AVX1-LABEL: truncstore_v8i32_v8i16:
3421 ; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
3422 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
3423 ; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0
3424 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
3425 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
3426 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2
3427 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
3428 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
3429 ; AVX1-NEXT: vmovmskps %ymm1, %eax
3430 ; AVX1-NEXT: notl %eax
3431 ; AVX1-NEXT: testb $1, %al
3432 ; AVX1-NEXT: jne .LBB11_1
3433 ; AVX1-NEXT: # %bb.2: # %else
3434 ; AVX1-NEXT: testb $2, %al
3435 ; AVX1-NEXT: jne .LBB11_3
3436 ; AVX1-NEXT: .LBB11_4: # %else2
3437 ; AVX1-NEXT: testb $4, %al
3438 ; AVX1-NEXT: jne .LBB11_5
3439 ; AVX1-NEXT: .LBB11_6: # %else4
3440 ; AVX1-NEXT: testb $8, %al
3441 ; AVX1-NEXT: jne .LBB11_7
3442 ; AVX1-NEXT: .LBB11_8: # %else6
3443 ; AVX1-NEXT: testb $16, %al
3444 ; AVX1-NEXT: jne .LBB11_9
3445 ; AVX1-NEXT: .LBB11_10: # %else8
3446 ; AVX1-NEXT: testb $32, %al
3447 ; AVX1-NEXT: jne .LBB11_11
3448 ; AVX1-NEXT: .LBB11_12: # %else10
3449 ; AVX1-NEXT: testb $64, %al
3450 ; AVX1-NEXT: jne .LBB11_13
3451 ; AVX1-NEXT: .LBB11_14: # %else12
3452 ; AVX1-NEXT: testb $-128, %al
3453 ; AVX1-NEXT: jne .LBB11_15
3454 ; AVX1-NEXT: .LBB11_16: # %else14
3455 ; AVX1-NEXT: vzeroupper
3457 ; AVX1-NEXT: .LBB11_1: # %cond.store
3458 ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi)
3459 ; AVX1-NEXT: testb $2, %al
3460 ; AVX1-NEXT: je .LBB11_4
3461 ; AVX1-NEXT: .LBB11_3: # %cond.store1
3462 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi)
3463 ; AVX1-NEXT: testb $4, %al
3464 ; AVX1-NEXT: je .LBB11_6
3465 ; AVX1-NEXT: .LBB11_5: # %cond.store3
3466 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi)
3467 ; AVX1-NEXT: testb $8, %al
3468 ; AVX1-NEXT: je .LBB11_8
3469 ; AVX1-NEXT: .LBB11_7: # %cond.store5
3470 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi)
3471 ; AVX1-NEXT: testb $16, %al
3472 ; AVX1-NEXT: je .LBB11_10
3473 ; AVX1-NEXT: .LBB11_9: # %cond.store7
3474 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi)
3475 ; AVX1-NEXT: testb $32, %al
3476 ; AVX1-NEXT: je .LBB11_12
3477 ; AVX1-NEXT: .LBB11_11: # %cond.store9
3478 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi)
3479 ; AVX1-NEXT: testb $64, %al
3480 ; AVX1-NEXT: je .LBB11_14
3481 ; AVX1-NEXT: .LBB11_13: # %cond.store11
3482 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi)
3483 ; AVX1-NEXT: testb $-128, %al
3484 ; AVX1-NEXT: je .LBB11_16
3485 ; AVX1-NEXT: .LBB11_15: # %cond.store13
3486 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi)
3487 ; AVX1-NEXT: vzeroupper
3490 ; AVX2-LABEL: truncstore_v8i32_v8i16:
3492 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
3493 ; 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]
3494 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3495 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1
3496 ; AVX2-NEXT: vmovmskps %ymm1, %eax
3497 ; AVX2-NEXT: notl %eax
3498 ; AVX2-NEXT: testb $1, %al
3499 ; AVX2-NEXT: jne .LBB11_1
3500 ; AVX2-NEXT: # %bb.2: # %else
3501 ; AVX2-NEXT: testb $2, %al
3502 ; AVX2-NEXT: jne .LBB11_3
3503 ; AVX2-NEXT: .LBB11_4: # %else2
3504 ; AVX2-NEXT: testb $4, %al
3505 ; AVX2-NEXT: jne .LBB11_5
3506 ; AVX2-NEXT: .LBB11_6: # %else4
3507 ; AVX2-NEXT: testb $8, %al
3508 ; AVX2-NEXT: jne .LBB11_7
3509 ; AVX2-NEXT: .LBB11_8: # %else6
3510 ; AVX2-NEXT: testb $16, %al
3511 ; AVX2-NEXT: jne .LBB11_9
3512 ; AVX2-NEXT: .LBB11_10: # %else8
3513 ; AVX2-NEXT: testb $32, %al
3514 ; AVX2-NEXT: jne .LBB11_11
3515 ; AVX2-NEXT: .LBB11_12: # %else10
3516 ; AVX2-NEXT: testb $64, %al
3517 ; AVX2-NEXT: jne .LBB11_13
3518 ; AVX2-NEXT: .LBB11_14: # %else12
3519 ; AVX2-NEXT: testb $-128, %al
3520 ; AVX2-NEXT: jne .LBB11_15
3521 ; AVX2-NEXT: .LBB11_16: # %else14
3522 ; AVX2-NEXT: vzeroupper
3524 ; AVX2-NEXT: .LBB11_1: # %cond.store
3525 ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi)
3526 ; AVX2-NEXT: testb $2, %al
3527 ; AVX2-NEXT: je .LBB11_4
3528 ; AVX2-NEXT: .LBB11_3: # %cond.store1
3529 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi)
3530 ; AVX2-NEXT: testb $4, %al
3531 ; AVX2-NEXT: je .LBB11_6
3532 ; AVX2-NEXT: .LBB11_5: # %cond.store3
3533 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi)
3534 ; AVX2-NEXT: testb $8, %al
3535 ; AVX2-NEXT: je .LBB11_8
3536 ; AVX2-NEXT: .LBB11_7: # %cond.store5
3537 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi)
3538 ; AVX2-NEXT: testb $16, %al
3539 ; AVX2-NEXT: je .LBB11_10
3540 ; AVX2-NEXT: .LBB11_9: # %cond.store7
3541 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi)
3542 ; AVX2-NEXT: testb $32, %al
3543 ; AVX2-NEXT: je .LBB11_12
3544 ; AVX2-NEXT: .LBB11_11: # %cond.store9
3545 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi)
3546 ; AVX2-NEXT: testb $64, %al
3547 ; AVX2-NEXT: je .LBB11_14
3548 ; AVX2-NEXT: .LBB11_13: # %cond.store11
3549 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi)
3550 ; AVX2-NEXT: testb $-128, %al
3551 ; AVX2-NEXT: je .LBB11_16
3552 ; AVX2-NEXT: .LBB11_15: # %cond.store13
3553 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi)
3554 ; AVX2-NEXT: vzeroupper
3557 ; AVX512F-LABEL: truncstore_v8i32_v8i16:
3559 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
3560 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3561 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
3562 ; AVX512F-NEXT: vpmovdw %zmm0, %ymm0
3563 ; AVX512F-NEXT: kmovw %k0, %eax
3564 ; AVX512F-NEXT: testb $1, %al
3565 ; AVX512F-NEXT: jne .LBB11_1
3566 ; AVX512F-NEXT: # %bb.2: # %else
3567 ; AVX512F-NEXT: testb $2, %al
3568 ; AVX512F-NEXT: jne .LBB11_3
3569 ; AVX512F-NEXT: .LBB11_4: # %else2
3570 ; AVX512F-NEXT: testb $4, %al
3571 ; AVX512F-NEXT: jne .LBB11_5
3572 ; AVX512F-NEXT: .LBB11_6: # %else4
3573 ; AVX512F-NEXT: testb $8, %al
3574 ; AVX512F-NEXT: jne .LBB11_7
3575 ; AVX512F-NEXT: .LBB11_8: # %else6
3576 ; AVX512F-NEXT: testb $16, %al
3577 ; AVX512F-NEXT: jne .LBB11_9
3578 ; AVX512F-NEXT: .LBB11_10: # %else8
3579 ; AVX512F-NEXT: testb $32, %al
3580 ; AVX512F-NEXT: jne .LBB11_11
3581 ; AVX512F-NEXT: .LBB11_12: # %else10
3582 ; AVX512F-NEXT: testb $64, %al
3583 ; AVX512F-NEXT: jne .LBB11_13
3584 ; AVX512F-NEXT: .LBB11_14: # %else12
3585 ; AVX512F-NEXT: testb $-128, %al
3586 ; AVX512F-NEXT: jne .LBB11_15
3587 ; AVX512F-NEXT: .LBB11_16: # %else14
3588 ; AVX512F-NEXT: vzeroupper
3589 ; AVX512F-NEXT: retq
3590 ; AVX512F-NEXT: .LBB11_1: # %cond.store
3591 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
3592 ; AVX512F-NEXT: testb $2, %al
3593 ; AVX512F-NEXT: je .LBB11_4
3594 ; AVX512F-NEXT: .LBB11_3: # %cond.store1
3595 ; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi)
3596 ; AVX512F-NEXT: testb $4, %al
3597 ; AVX512F-NEXT: je .LBB11_6
3598 ; AVX512F-NEXT: .LBB11_5: # %cond.store3
3599 ; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi)
3600 ; AVX512F-NEXT: testb $8, %al
3601 ; AVX512F-NEXT: je .LBB11_8
3602 ; AVX512F-NEXT: .LBB11_7: # %cond.store5
3603 ; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi)
3604 ; AVX512F-NEXT: testb $16, %al
3605 ; AVX512F-NEXT: je .LBB11_10
3606 ; AVX512F-NEXT: .LBB11_9: # %cond.store7
3607 ; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi)
3608 ; AVX512F-NEXT: testb $32, %al
3609 ; AVX512F-NEXT: je .LBB11_12
3610 ; AVX512F-NEXT: .LBB11_11: # %cond.store9
3611 ; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi)
3612 ; AVX512F-NEXT: testb $64, %al
3613 ; AVX512F-NEXT: je .LBB11_14
3614 ; AVX512F-NEXT: .LBB11_13: # %cond.store11
3615 ; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi)
3616 ; AVX512F-NEXT: testb $-128, %al
3617 ; AVX512F-NEXT: je .LBB11_16
3618 ; AVX512F-NEXT: .LBB11_15: # %cond.store13
3619 ; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi)
3620 ; AVX512F-NEXT: vzeroupper
3621 ; AVX512F-NEXT: retq
3623 ; AVX512BW-LABEL: truncstore_v8i32_v8i16:
3624 ; AVX512BW: # %bb.0:
3625 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
3626 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3627 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0
3628 ; AVX512BW-NEXT: kshiftld $24, %k0, %k0
3629 ; AVX512BW-NEXT: kshiftrd $24, %k0, %k1
3630 ; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0
3631 ; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1}
3632 ; AVX512BW-NEXT: vzeroupper
3633 ; AVX512BW-NEXT: retq
3635 ; AVX512BWVL-LABEL: truncstore_v8i32_v8i16:
3636 ; AVX512BWVL: # %bb.0:
3637 ; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1
3638 ; AVX512BWVL-NEXT: vpmovdw %ymm0, (%rdi) {%k1}
3639 ; AVX512BWVL-NEXT: vzeroupper
3640 ; AVX512BWVL-NEXT: retq
3641 %a = icmp ne <8 x i32> %mask, zeroinitializer
3642 %b = trunc <8 x i32> %x to <8 x i16>
3643 call void @llvm.masked.store.v8i16.p0(<8 x i16> %b, ptr %p, i32 1, <8 x i1> %a)
3647 define void @truncstore_v8i32_v8i8(<8 x i32> %x, ptr %p, <8 x i32> %mask) {
3648 ; SSE2-LABEL: truncstore_v8i32_v8i8:
3650 ; SSE2-NEXT: pxor %xmm4, %xmm4
3651 ; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
3652 ; SSE2-NEXT: pand %xmm5, %xmm1
3653 ; SSE2-NEXT: pand %xmm5, %xmm0
3654 ; SSE2-NEXT: packuswb %xmm1, %xmm0
3655 ; SSE2-NEXT: packuswb %xmm0, %xmm0
3656 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm3
3657 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm2
3658 ; SSE2-NEXT: packssdw %xmm3, %xmm2
3659 ; SSE2-NEXT: packsswb %xmm2, %xmm2
3660 ; SSE2-NEXT: pmovmskb %xmm2, %eax
3661 ; SSE2-NEXT: notl %eax
3662 ; SSE2-NEXT: testb $1, %al
3663 ; SSE2-NEXT: movd %xmm0, %ecx
3664 ; SSE2-NEXT: jne .LBB12_1
3665 ; SSE2-NEXT: # %bb.2: # %else
3666 ; SSE2-NEXT: testb $2, %al
3667 ; SSE2-NEXT: jne .LBB12_3
3668 ; SSE2-NEXT: .LBB12_4: # %else2
3669 ; SSE2-NEXT: testb $4, %al
3670 ; SSE2-NEXT: jne .LBB12_5
3671 ; SSE2-NEXT: .LBB12_6: # %else4
3672 ; SSE2-NEXT: testb $8, %al
3673 ; SSE2-NEXT: je .LBB12_8
3674 ; SSE2-NEXT: .LBB12_7: # %cond.store5
3675 ; SSE2-NEXT: shrl $24, %ecx
3676 ; SSE2-NEXT: movb %cl, 3(%rdi)
3677 ; SSE2-NEXT: .LBB12_8: # %else6
3678 ; SSE2-NEXT: testb $16, %al
3679 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
3680 ; SSE2-NEXT: je .LBB12_10
3681 ; SSE2-NEXT: # %bb.9: # %cond.store7
3682 ; SSE2-NEXT: movb %cl, 4(%rdi)
3683 ; SSE2-NEXT: .LBB12_10: # %else8
3684 ; SSE2-NEXT: testb $32, %al
3685 ; SSE2-NEXT: je .LBB12_12
3686 ; SSE2-NEXT: # %bb.11: # %cond.store9
3687 ; SSE2-NEXT: movb %ch, 5(%rdi)
3688 ; SSE2-NEXT: .LBB12_12: # %else10
3689 ; SSE2-NEXT: testb $64, %al
3690 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
3691 ; SSE2-NEXT: jne .LBB12_13
3692 ; SSE2-NEXT: # %bb.14: # %else12
3693 ; SSE2-NEXT: testb $-128, %al
3694 ; SSE2-NEXT: jne .LBB12_15
3695 ; SSE2-NEXT: .LBB12_16: # %else14
3697 ; SSE2-NEXT: .LBB12_1: # %cond.store
3698 ; SSE2-NEXT: movb %cl, (%rdi)
3699 ; SSE2-NEXT: testb $2, %al
3700 ; SSE2-NEXT: je .LBB12_4
3701 ; SSE2-NEXT: .LBB12_3: # %cond.store1
3702 ; SSE2-NEXT: movb %ch, 1(%rdi)
3703 ; SSE2-NEXT: testb $4, %al
3704 ; SSE2-NEXT: je .LBB12_6
3705 ; SSE2-NEXT: .LBB12_5: # %cond.store3
3706 ; SSE2-NEXT: movl %ecx, %edx
3707 ; SSE2-NEXT: shrl $16, %edx
3708 ; SSE2-NEXT: movb %dl, 2(%rdi)
3709 ; SSE2-NEXT: testb $8, %al
3710 ; SSE2-NEXT: jne .LBB12_7
3711 ; SSE2-NEXT: jmp .LBB12_8
3712 ; SSE2-NEXT: .LBB12_13: # %cond.store11
3713 ; SSE2-NEXT: movb %cl, 6(%rdi)
3714 ; SSE2-NEXT: testb $-128, %al
3715 ; SSE2-NEXT: je .LBB12_16
3716 ; SSE2-NEXT: .LBB12_15: # %cond.store13
3717 ; SSE2-NEXT: movb %ch, 7(%rdi)
3720 ; SSE4-LABEL: truncstore_v8i32_v8i8:
3722 ; SSE4-NEXT: pxor %xmm4, %xmm4
3723 ; SSE4-NEXT: pmovzxbd {{.*#+}} xmm5 = [255,255,255,255]
3724 ; SSE4-NEXT: pand %xmm5, %xmm1
3725 ; SSE4-NEXT: pand %xmm5, %xmm0
3726 ; SSE4-NEXT: packusdw %xmm1, %xmm0
3727 ; SSE4-NEXT: packuswb %xmm4, %xmm0
3728 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm3
3729 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm2
3730 ; SSE4-NEXT: packssdw %xmm3, %xmm2
3731 ; SSE4-NEXT: packsswb %xmm2, %xmm2
3732 ; SSE4-NEXT: pmovmskb %xmm2, %eax
3733 ; SSE4-NEXT: notl %eax
3734 ; SSE4-NEXT: testb $1, %al
3735 ; SSE4-NEXT: jne .LBB12_1
3736 ; SSE4-NEXT: # %bb.2: # %else
3737 ; SSE4-NEXT: testb $2, %al
3738 ; SSE4-NEXT: jne .LBB12_3
3739 ; SSE4-NEXT: .LBB12_4: # %else2
3740 ; SSE4-NEXT: testb $4, %al
3741 ; SSE4-NEXT: jne .LBB12_5
3742 ; SSE4-NEXT: .LBB12_6: # %else4
3743 ; SSE4-NEXT: testb $8, %al
3744 ; SSE4-NEXT: jne .LBB12_7
3745 ; SSE4-NEXT: .LBB12_8: # %else6
3746 ; SSE4-NEXT: testb $16, %al
3747 ; SSE4-NEXT: jne .LBB12_9
3748 ; SSE4-NEXT: .LBB12_10: # %else8
3749 ; SSE4-NEXT: testb $32, %al
3750 ; SSE4-NEXT: jne .LBB12_11
3751 ; SSE4-NEXT: .LBB12_12: # %else10
3752 ; SSE4-NEXT: testb $64, %al
3753 ; SSE4-NEXT: jne .LBB12_13
3754 ; SSE4-NEXT: .LBB12_14: # %else12
3755 ; SSE4-NEXT: testb $-128, %al
3756 ; SSE4-NEXT: jne .LBB12_15
3757 ; SSE4-NEXT: .LBB12_16: # %else14
3759 ; SSE4-NEXT: .LBB12_1: # %cond.store
3760 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
3761 ; SSE4-NEXT: testb $2, %al
3762 ; SSE4-NEXT: je .LBB12_4
3763 ; SSE4-NEXT: .LBB12_3: # %cond.store1
3764 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
3765 ; SSE4-NEXT: testb $4, %al
3766 ; SSE4-NEXT: je .LBB12_6
3767 ; SSE4-NEXT: .LBB12_5: # %cond.store3
3768 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi)
3769 ; SSE4-NEXT: testb $8, %al
3770 ; SSE4-NEXT: je .LBB12_8
3771 ; SSE4-NEXT: .LBB12_7: # %cond.store5
3772 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi)
3773 ; SSE4-NEXT: testb $16, %al
3774 ; SSE4-NEXT: je .LBB12_10
3775 ; SSE4-NEXT: .LBB12_9: # %cond.store7
3776 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi)
3777 ; SSE4-NEXT: testb $32, %al
3778 ; SSE4-NEXT: je .LBB12_12
3779 ; SSE4-NEXT: .LBB12_11: # %cond.store9
3780 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi)
3781 ; SSE4-NEXT: testb $64, %al
3782 ; SSE4-NEXT: je .LBB12_14
3783 ; SSE4-NEXT: .LBB12_13: # %cond.store11
3784 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi)
3785 ; SSE4-NEXT: testb $-128, %al
3786 ; SSE4-NEXT: je .LBB12_16
3787 ; SSE4-NEXT: .LBB12_15: # %cond.store13
3788 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi)
3791 ; AVX1-LABEL: truncstore_v8i32_v8i8:
3793 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
3794 ; AVX1-NEXT: vmovd {{.*#+}} xmm3 = [0,4,8,12,0,0,0,0,0,0,0,0,0,0,0,0]
3795 ; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2
3796 ; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0
3797 ; AVX1-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
3798 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
3799 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3
3800 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2
3801 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
3802 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1
3803 ; AVX1-NEXT: vmovmskps %ymm1, %eax
3804 ; AVX1-NEXT: notl %eax
3805 ; AVX1-NEXT: testb $1, %al
3806 ; AVX1-NEXT: jne .LBB12_1
3807 ; AVX1-NEXT: # %bb.2: # %else
3808 ; AVX1-NEXT: testb $2, %al
3809 ; AVX1-NEXT: jne .LBB12_3
3810 ; AVX1-NEXT: .LBB12_4: # %else2
3811 ; AVX1-NEXT: testb $4, %al
3812 ; AVX1-NEXT: jne .LBB12_5
3813 ; AVX1-NEXT: .LBB12_6: # %else4
3814 ; AVX1-NEXT: testb $8, %al
3815 ; AVX1-NEXT: jne .LBB12_7
3816 ; AVX1-NEXT: .LBB12_8: # %else6
3817 ; AVX1-NEXT: testb $16, %al
3818 ; AVX1-NEXT: jne .LBB12_9
3819 ; AVX1-NEXT: .LBB12_10: # %else8
3820 ; AVX1-NEXT: testb $32, %al
3821 ; AVX1-NEXT: jne .LBB12_11
3822 ; AVX1-NEXT: .LBB12_12: # %else10
3823 ; AVX1-NEXT: testb $64, %al
3824 ; AVX1-NEXT: jne .LBB12_13
3825 ; AVX1-NEXT: .LBB12_14: # %else12
3826 ; AVX1-NEXT: testb $-128, %al
3827 ; AVX1-NEXT: jne .LBB12_15
3828 ; AVX1-NEXT: .LBB12_16: # %else14
3829 ; AVX1-NEXT: vzeroupper
3831 ; AVX1-NEXT: .LBB12_1: # %cond.store
3832 ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi)
3833 ; AVX1-NEXT: testb $2, %al
3834 ; AVX1-NEXT: je .LBB12_4
3835 ; AVX1-NEXT: .LBB12_3: # %cond.store1
3836 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi)
3837 ; AVX1-NEXT: testb $4, %al
3838 ; AVX1-NEXT: je .LBB12_6
3839 ; AVX1-NEXT: .LBB12_5: # %cond.store3
3840 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi)
3841 ; AVX1-NEXT: testb $8, %al
3842 ; AVX1-NEXT: je .LBB12_8
3843 ; AVX1-NEXT: .LBB12_7: # %cond.store5
3844 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi)
3845 ; AVX1-NEXT: testb $16, %al
3846 ; AVX1-NEXT: je .LBB12_10
3847 ; AVX1-NEXT: .LBB12_9: # %cond.store7
3848 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi)
3849 ; AVX1-NEXT: testb $32, %al
3850 ; AVX1-NEXT: je .LBB12_12
3851 ; AVX1-NEXT: .LBB12_11: # %cond.store9
3852 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi)
3853 ; AVX1-NEXT: testb $64, %al
3854 ; AVX1-NEXT: je .LBB12_14
3855 ; AVX1-NEXT: .LBB12_13: # %cond.store11
3856 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi)
3857 ; AVX1-NEXT: testb $-128, %al
3858 ; AVX1-NEXT: je .LBB12_16
3859 ; AVX1-NEXT: .LBB12_15: # %cond.store13
3860 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi)
3861 ; AVX1-NEXT: vzeroupper
3864 ; AVX2-LABEL: truncstore_v8i32_v8i8:
3866 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
3867 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
3868 ; AVX2-NEXT: vmovd {{.*#+}} xmm4 = [0,4,8,12,0,0,0,0,0,0,0,0,0,0,0,0]
3869 ; AVX2-NEXT: vpshufb %xmm4, %xmm3, %xmm3
3870 ; AVX2-NEXT: vpshufb %xmm4, %xmm0, %xmm0
3871 ; AVX2-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
3872 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1
3873 ; AVX2-NEXT: vmovmskps %ymm1, %eax
3874 ; AVX2-NEXT: notl %eax
3875 ; AVX2-NEXT: testb $1, %al
3876 ; AVX2-NEXT: jne .LBB12_1
3877 ; AVX2-NEXT: # %bb.2: # %else
3878 ; AVX2-NEXT: testb $2, %al
3879 ; AVX2-NEXT: jne .LBB12_3
3880 ; AVX2-NEXT: .LBB12_4: # %else2
3881 ; AVX2-NEXT: testb $4, %al
3882 ; AVX2-NEXT: jne .LBB12_5
3883 ; AVX2-NEXT: .LBB12_6: # %else4
3884 ; AVX2-NEXT: testb $8, %al
3885 ; AVX2-NEXT: jne .LBB12_7
3886 ; AVX2-NEXT: .LBB12_8: # %else6
3887 ; AVX2-NEXT: testb $16, %al
3888 ; AVX2-NEXT: jne .LBB12_9
3889 ; AVX2-NEXT: .LBB12_10: # %else8
3890 ; AVX2-NEXT: testb $32, %al
3891 ; AVX2-NEXT: jne .LBB12_11
3892 ; AVX2-NEXT: .LBB12_12: # %else10
3893 ; AVX2-NEXT: testb $64, %al
3894 ; AVX2-NEXT: jne .LBB12_13
3895 ; AVX2-NEXT: .LBB12_14: # %else12
3896 ; AVX2-NEXT: testb $-128, %al
3897 ; AVX2-NEXT: jne .LBB12_15
3898 ; AVX2-NEXT: .LBB12_16: # %else14
3899 ; AVX2-NEXT: vzeroupper
3901 ; AVX2-NEXT: .LBB12_1: # %cond.store
3902 ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi)
3903 ; AVX2-NEXT: testb $2, %al
3904 ; AVX2-NEXT: je .LBB12_4
3905 ; AVX2-NEXT: .LBB12_3: # %cond.store1
3906 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi)
3907 ; AVX2-NEXT: testb $4, %al
3908 ; AVX2-NEXT: je .LBB12_6
3909 ; AVX2-NEXT: .LBB12_5: # %cond.store3
3910 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi)
3911 ; AVX2-NEXT: testb $8, %al
3912 ; AVX2-NEXT: je .LBB12_8
3913 ; AVX2-NEXT: .LBB12_7: # %cond.store5
3914 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi)
3915 ; AVX2-NEXT: testb $16, %al
3916 ; AVX2-NEXT: je .LBB12_10
3917 ; AVX2-NEXT: .LBB12_9: # %cond.store7
3918 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi)
3919 ; AVX2-NEXT: testb $32, %al
3920 ; AVX2-NEXT: je .LBB12_12
3921 ; AVX2-NEXT: .LBB12_11: # %cond.store9
3922 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi)
3923 ; AVX2-NEXT: testb $64, %al
3924 ; AVX2-NEXT: je .LBB12_14
3925 ; AVX2-NEXT: .LBB12_13: # %cond.store11
3926 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi)
3927 ; AVX2-NEXT: testb $-128, %al
3928 ; AVX2-NEXT: je .LBB12_16
3929 ; AVX2-NEXT: .LBB12_15: # %cond.store13
3930 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi)
3931 ; AVX2-NEXT: vzeroupper
3934 ; AVX512F-LABEL: truncstore_v8i32_v8i8:
3936 ; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
3937 ; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
3938 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
3939 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
3940 ; AVX512F-NEXT: kmovw %k0, %eax
3941 ; AVX512F-NEXT: testb $1, %al
3942 ; AVX512F-NEXT: jne .LBB12_1
3943 ; AVX512F-NEXT: # %bb.2: # %else
3944 ; AVX512F-NEXT: testb $2, %al
3945 ; AVX512F-NEXT: jne .LBB12_3
3946 ; AVX512F-NEXT: .LBB12_4: # %else2
3947 ; AVX512F-NEXT: testb $4, %al
3948 ; AVX512F-NEXT: jne .LBB12_5
3949 ; AVX512F-NEXT: .LBB12_6: # %else4
3950 ; AVX512F-NEXT: testb $8, %al
3951 ; AVX512F-NEXT: jne .LBB12_7
3952 ; AVX512F-NEXT: .LBB12_8: # %else6
3953 ; AVX512F-NEXT: testb $16, %al
3954 ; AVX512F-NEXT: jne .LBB12_9
3955 ; AVX512F-NEXT: .LBB12_10: # %else8
3956 ; AVX512F-NEXT: testb $32, %al
3957 ; AVX512F-NEXT: jne .LBB12_11
3958 ; AVX512F-NEXT: .LBB12_12: # %else10
3959 ; AVX512F-NEXT: testb $64, %al
3960 ; AVX512F-NEXT: jne .LBB12_13
3961 ; AVX512F-NEXT: .LBB12_14: # %else12
3962 ; AVX512F-NEXT: testb $-128, %al
3963 ; AVX512F-NEXT: jne .LBB12_15
3964 ; AVX512F-NEXT: .LBB12_16: # %else14
3965 ; AVX512F-NEXT: vzeroupper
3966 ; AVX512F-NEXT: retq
3967 ; AVX512F-NEXT: .LBB12_1: # %cond.store
3968 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
3969 ; AVX512F-NEXT: testb $2, %al
3970 ; AVX512F-NEXT: je .LBB12_4
3971 ; AVX512F-NEXT: .LBB12_3: # %cond.store1
3972 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
3973 ; AVX512F-NEXT: testb $4, %al
3974 ; AVX512F-NEXT: je .LBB12_6
3975 ; AVX512F-NEXT: .LBB12_5: # %cond.store3
3976 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi)
3977 ; AVX512F-NEXT: testb $8, %al
3978 ; AVX512F-NEXT: je .LBB12_8
3979 ; AVX512F-NEXT: .LBB12_7: # %cond.store5
3980 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi)
3981 ; AVX512F-NEXT: testb $16, %al
3982 ; AVX512F-NEXT: je .LBB12_10
3983 ; AVX512F-NEXT: .LBB12_9: # %cond.store7
3984 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi)
3985 ; AVX512F-NEXT: testb $32, %al
3986 ; AVX512F-NEXT: je .LBB12_12
3987 ; AVX512F-NEXT: .LBB12_11: # %cond.store9
3988 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi)
3989 ; AVX512F-NEXT: testb $64, %al
3990 ; AVX512F-NEXT: je .LBB12_14
3991 ; AVX512F-NEXT: .LBB12_13: # %cond.store11
3992 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi)
3993 ; AVX512F-NEXT: testb $-128, %al
3994 ; AVX512F-NEXT: je .LBB12_16
3995 ; AVX512F-NEXT: .LBB12_15: # %cond.store13
3996 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi)
3997 ; AVX512F-NEXT: vzeroupper
3998 ; AVX512F-NEXT: retq
4000 ; AVX512BW-LABEL: truncstore_v8i32_v8i8:
4001 ; AVX512BW: # %bb.0:
4002 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
4003 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
4004 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0
4005 ; AVX512BW-NEXT: kshiftlq $56, %k0, %k0
4006 ; AVX512BW-NEXT: kshiftrq $56, %k0, %k1
4007 ; AVX512BW-NEXT: vpmovdb %zmm0, %xmm0
4008 ; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1}
4009 ; AVX512BW-NEXT: vzeroupper
4010 ; AVX512BW-NEXT: retq
4012 ; AVX512BWVL-LABEL: truncstore_v8i32_v8i8:
4013 ; AVX512BWVL: # %bb.0:
4014 ; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1
4015 ; AVX512BWVL-NEXT: vpmovdb %ymm0, (%rdi) {%k1}
4016 ; AVX512BWVL-NEXT: vzeroupper
4017 ; AVX512BWVL-NEXT: retq
4018 %a = icmp ne <8 x i32> %mask, zeroinitializer
4019 %b = trunc <8 x i32> %x to <8 x i8>
4020 call void @llvm.masked.store.v8i8.p0(<8 x i8> %b, ptr %p, i32 1, <8 x i1> %a)
4024 define void @truncstore_v4i32_v4i16(<4 x i32> %x, ptr %p, <4 x i32> %mask) {
4025 ; SSE2-LABEL: truncstore_v4i32_v4i16:
4027 ; SSE2-NEXT: pxor %xmm2, %xmm2
4028 ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
4029 ; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7]
4030 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
4031 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
4032 ; SSE2-NEXT: movmskps %xmm2, %eax
4033 ; SSE2-NEXT: xorl $15, %eax
4034 ; SSE2-NEXT: testb $1, %al
4035 ; SSE2-NEXT: jne .LBB13_1
4036 ; SSE2-NEXT: # %bb.2: # %else
4037 ; SSE2-NEXT: testb $2, %al
4038 ; SSE2-NEXT: jne .LBB13_3
4039 ; SSE2-NEXT: .LBB13_4: # %else2
4040 ; SSE2-NEXT: testb $4, %al
4041 ; SSE2-NEXT: jne .LBB13_5
4042 ; SSE2-NEXT: .LBB13_6: # %else4
4043 ; SSE2-NEXT: testb $8, %al
4044 ; SSE2-NEXT: jne .LBB13_7
4045 ; SSE2-NEXT: .LBB13_8: # %else6
4047 ; SSE2-NEXT: .LBB13_1: # %cond.store
4048 ; SSE2-NEXT: movd %xmm0, %ecx
4049 ; SSE2-NEXT: movw %cx, (%rdi)
4050 ; SSE2-NEXT: testb $2, %al
4051 ; SSE2-NEXT: je .LBB13_4
4052 ; SSE2-NEXT: .LBB13_3: # %cond.store1
4053 ; SSE2-NEXT: pextrw $1, %xmm0, %ecx
4054 ; SSE2-NEXT: movw %cx, 2(%rdi)
4055 ; SSE2-NEXT: testb $4, %al
4056 ; SSE2-NEXT: je .LBB13_6
4057 ; SSE2-NEXT: .LBB13_5: # %cond.store3
4058 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
4059 ; SSE2-NEXT: movw %cx, 4(%rdi)
4060 ; SSE2-NEXT: testb $8, %al
4061 ; SSE2-NEXT: je .LBB13_8
4062 ; SSE2-NEXT: .LBB13_7: # %cond.store5
4063 ; SSE2-NEXT: pextrw $3, %xmm0, %eax
4064 ; SSE2-NEXT: movw %ax, 6(%rdi)
4067 ; SSE4-LABEL: truncstore_v4i32_v4i16:
4069 ; SSE4-NEXT: pxor %xmm2, %xmm2
4070 ; SSE4-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
4071 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2
4072 ; SSE4-NEXT: movmskps %xmm2, %eax
4073 ; SSE4-NEXT: xorl $15, %eax
4074 ; SSE4-NEXT: testb $1, %al
4075 ; SSE4-NEXT: jne .LBB13_1
4076 ; SSE4-NEXT: # %bb.2: # %else
4077 ; SSE4-NEXT: testb $2, %al
4078 ; SSE4-NEXT: jne .LBB13_3
4079 ; SSE4-NEXT: .LBB13_4: # %else2
4080 ; SSE4-NEXT: testb $4, %al
4081 ; SSE4-NEXT: jne .LBB13_5
4082 ; SSE4-NEXT: .LBB13_6: # %else4
4083 ; SSE4-NEXT: testb $8, %al
4084 ; SSE4-NEXT: jne .LBB13_7
4085 ; SSE4-NEXT: .LBB13_8: # %else6
4087 ; SSE4-NEXT: .LBB13_1: # %cond.store
4088 ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi)
4089 ; SSE4-NEXT: testb $2, %al
4090 ; SSE4-NEXT: je .LBB13_4
4091 ; SSE4-NEXT: .LBB13_3: # %cond.store1
4092 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi)
4093 ; SSE4-NEXT: testb $4, %al
4094 ; SSE4-NEXT: je .LBB13_6
4095 ; SSE4-NEXT: .LBB13_5: # %cond.store3
4096 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi)
4097 ; SSE4-NEXT: testb $8, %al
4098 ; SSE4-NEXT: je .LBB13_8
4099 ; SSE4-NEXT: .LBB13_7: # %cond.store5
4100 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi)
4103 ; AVX-LABEL: truncstore_v4i32_v4i16:
4105 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
4106 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
4107 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
4108 ; AVX-NEXT: vmovmskps %xmm1, %eax
4109 ; AVX-NEXT: xorl $15, %eax
4110 ; AVX-NEXT: testb $1, %al
4111 ; AVX-NEXT: jne .LBB13_1
4112 ; AVX-NEXT: # %bb.2: # %else
4113 ; AVX-NEXT: testb $2, %al
4114 ; AVX-NEXT: jne .LBB13_3
4115 ; AVX-NEXT: .LBB13_4: # %else2
4116 ; AVX-NEXT: testb $4, %al
4117 ; AVX-NEXT: jne .LBB13_5
4118 ; AVX-NEXT: .LBB13_6: # %else4
4119 ; AVX-NEXT: testb $8, %al
4120 ; AVX-NEXT: jne .LBB13_7
4121 ; AVX-NEXT: .LBB13_8: # %else6
4123 ; AVX-NEXT: .LBB13_1: # %cond.store
4124 ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi)
4125 ; AVX-NEXT: testb $2, %al
4126 ; AVX-NEXT: je .LBB13_4
4127 ; AVX-NEXT: .LBB13_3: # %cond.store1
4128 ; AVX-NEXT: vpextrw $1, %xmm0, 2(%rdi)
4129 ; AVX-NEXT: testb $4, %al
4130 ; AVX-NEXT: je .LBB13_6
4131 ; AVX-NEXT: .LBB13_5: # %cond.store3
4132 ; AVX-NEXT: vpextrw $2, %xmm0, 4(%rdi)
4133 ; AVX-NEXT: testb $8, %al
4134 ; AVX-NEXT: je .LBB13_8
4135 ; AVX-NEXT: .LBB13_7: # %cond.store5
4136 ; AVX-NEXT: vpextrw $3, %xmm0, 6(%rdi)
4139 ; AVX512F-LABEL: truncstore_v4i32_v4i16:
4141 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
4142 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
4143 ; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
4144 ; AVX512F-NEXT: kmovw %k0, %eax
4145 ; AVX512F-NEXT: testb $1, %al
4146 ; AVX512F-NEXT: jne .LBB13_1
4147 ; AVX512F-NEXT: # %bb.2: # %else
4148 ; AVX512F-NEXT: testb $2, %al
4149 ; AVX512F-NEXT: jne .LBB13_3
4150 ; AVX512F-NEXT: .LBB13_4: # %else2
4151 ; AVX512F-NEXT: testb $4, %al
4152 ; AVX512F-NEXT: jne .LBB13_5
4153 ; AVX512F-NEXT: .LBB13_6: # %else4
4154 ; AVX512F-NEXT: testb $8, %al
4155 ; AVX512F-NEXT: jne .LBB13_7
4156 ; AVX512F-NEXT: .LBB13_8: # %else6
4157 ; AVX512F-NEXT: vzeroupper
4158 ; AVX512F-NEXT: retq
4159 ; AVX512F-NEXT: .LBB13_1: # %cond.store
4160 ; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi)
4161 ; AVX512F-NEXT: testb $2, %al
4162 ; AVX512F-NEXT: je .LBB13_4
4163 ; AVX512F-NEXT: .LBB13_3: # %cond.store1
4164 ; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi)
4165 ; AVX512F-NEXT: testb $4, %al
4166 ; AVX512F-NEXT: je .LBB13_6
4167 ; AVX512F-NEXT: .LBB13_5: # %cond.store3
4168 ; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi)
4169 ; AVX512F-NEXT: testb $8, %al
4170 ; AVX512F-NEXT: je .LBB13_8
4171 ; AVX512F-NEXT: .LBB13_7: # %cond.store5
4172 ; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi)
4173 ; AVX512F-NEXT: vzeroupper
4174 ; AVX512F-NEXT: retq
4176 ; AVX512BW-LABEL: truncstore_v4i32_v4i16:
4177 ; AVX512BW: # %bb.0:
4178 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
4179 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0
4180 ; AVX512BW-NEXT: kshiftld $28, %k0, %k0
4181 ; AVX512BW-NEXT: kshiftrd $28, %k0, %k1
4182 ; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
4183 ; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1}
4184 ; AVX512BW-NEXT: vzeroupper
4185 ; AVX512BW-NEXT: retq
4187 ; AVX512BWVL-LABEL: truncstore_v4i32_v4i16:
4188 ; AVX512BWVL: # %bb.0:
4189 ; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1
4190 ; AVX512BWVL-NEXT: vpmovdw %xmm0, (%rdi) {%k1}
4191 ; AVX512BWVL-NEXT: retq
4192 %a = icmp ne <4 x i32> %mask, zeroinitializer
4193 %b = trunc <4 x i32> %x to <4 x i16>
4194 call void @llvm.masked.store.v4i16.p0(<4 x i16> %b, ptr %p, i32 1, <4 x i1> %a)
4198 define void @truncstore_v4i32_v4i8(<4 x i32> %x, ptr %p, <4 x i32> %mask) {
4199 ; SSE2-LABEL: truncstore_v4i32_v4i8:
4201 ; SSE2-NEXT: pxor %xmm2, %xmm2
4202 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
4203 ; SSE2-NEXT: packuswb %xmm0, %xmm0
4204 ; SSE2-NEXT: packuswb %xmm0, %xmm0
4205 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2
4206 ; SSE2-NEXT: movmskps %xmm2, %ecx
4207 ; SSE2-NEXT: xorl $15, %ecx
4208 ; SSE2-NEXT: testb $1, %cl
4209 ; SSE2-NEXT: movd %xmm0, %eax
4210 ; SSE2-NEXT: jne .LBB14_1
4211 ; SSE2-NEXT: # %bb.2: # %else
4212 ; SSE2-NEXT: testb $2, %cl
4213 ; SSE2-NEXT: jne .LBB14_3
4214 ; SSE2-NEXT: .LBB14_4: # %else2
4215 ; SSE2-NEXT: testb $4, %cl
4216 ; SSE2-NEXT: jne .LBB14_5
4217 ; SSE2-NEXT: .LBB14_6: # %else4
4218 ; SSE2-NEXT: testb $8, %cl
4219 ; SSE2-NEXT: jne .LBB14_7
4220 ; SSE2-NEXT: .LBB14_8: # %else6
4222 ; SSE2-NEXT: .LBB14_1: # %cond.store
4223 ; SSE2-NEXT: movb %al, (%rdi)
4224 ; SSE2-NEXT: testb $2, %cl
4225 ; SSE2-NEXT: je .LBB14_4
4226 ; SSE2-NEXT: .LBB14_3: # %cond.store1
4227 ; SSE2-NEXT: movb %ah, 1(%rdi)
4228 ; SSE2-NEXT: testb $4, %cl
4229 ; SSE2-NEXT: je .LBB14_6
4230 ; SSE2-NEXT: .LBB14_5: # %cond.store3
4231 ; SSE2-NEXT: movl %eax, %edx
4232 ; SSE2-NEXT: shrl $16, %edx
4233 ; SSE2-NEXT: movb %dl, 2(%rdi)
4234 ; SSE2-NEXT: testb $8, %cl
4235 ; SSE2-NEXT: je .LBB14_8
4236 ; SSE2-NEXT: .LBB14_7: # %cond.store5
4237 ; SSE2-NEXT: shrl $24, %eax
4238 ; SSE2-NEXT: movb %al, 3(%rdi)
4241 ; SSE4-LABEL: truncstore_v4i32_v4i8:
4243 ; SSE4-NEXT: pxor %xmm2, %xmm2
4244 ; SSE4-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
4245 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2
4246 ; SSE4-NEXT: movmskps %xmm2, %eax
4247 ; SSE4-NEXT: xorl $15, %eax
4248 ; SSE4-NEXT: testb $1, %al
4249 ; SSE4-NEXT: jne .LBB14_1
4250 ; SSE4-NEXT: # %bb.2: # %else
4251 ; SSE4-NEXT: testb $2, %al
4252 ; SSE4-NEXT: jne .LBB14_3
4253 ; SSE4-NEXT: .LBB14_4: # %else2
4254 ; SSE4-NEXT: testb $4, %al
4255 ; SSE4-NEXT: jne .LBB14_5
4256 ; SSE4-NEXT: .LBB14_6: # %else4
4257 ; SSE4-NEXT: testb $8, %al
4258 ; SSE4-NEXT: jne .LBB14_7
4259 ; SSE4-NEXT: .LBB14_8: # %else6
4261 ; SSE4-NEXT: .LBB14_1: # %cond.store
4262 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
4263 ; SSE4-NEXT: testb $2, %al
4264 ; SSE4-NEXT: je .LBB14_4
4265 ; SSE4-NEXT: .LBB14_3: # %cond.store1
4266 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
4267 ; SSE4-NEXT: testb $4, %al
4268 ; SSE4-NEXT: je .LBB14_6
4269 ; SSE4-NEXT: .LBB14_5: # %cond.store3
4270 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi)
4271 ; SSE4-NEXT: testb $8, %al
4272 ; SSE4-NEXT: je .LBB14_8
4273 ; SSE4-NEXT: .LBB14_7: # %cond.store5
4274 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi)
4277 ; AVX-LABEL: truncstore_v4i32_v4i8:
4279 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
4280 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
4281 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1
4282 ; AVX-NEXT: vmovmskps %xmm1, %eax
4283 ; AVX-NEXT: xorl $15, %eax
4284 ; AVX-NEXT: testb $1, %al
4285 ; AVX-NEXT: jne .LBB14_1
4286 ; AVX-NEXT: # %bb.2: # %else
4287 ; AVX-NEXT: testb $2, %al
4288 ; AVX-NEXT: jne .LBB14_3
4289 ; AVX-NEXT: .LBB14_4: # %else2
4290 ; AVX-NEXT: testb $4, %al
4291 ; AVX-NEXT: jne .LBB14_5
4292 ; AVX-NEXT: .LBB14_6: # %else4
4293 ; AVX-NEXT: testb $8, %al
4294 ; AVX-NEXT: jne .LBB14_7
4295 ; AVX-NEXT: .LBB14_8: # %else6
4297 ; AVX-NEXT: .LBB14_1: # %cond.store
4298 ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi)
4299 ; AVX-NEXT: testb $2, %al
4300 ; AVX-NEXT: je .LBB14_4
4301 ; AVX-NEXT: .LBB14_3: # %cond.store1
4302 ; AVX-NEXT: vpextrb $1, %xmm0, 1(%rdi)
4303 ; AVX-NEXT: testb $4, %al
4304 ; AVX-NEXT: je .LBB14_6
4305 ; AVX-NEXT: .LBB14_5: # %cond.store3
4306 ; AVX-NEXT: vpextrb $2, %xmm0, 2(%rdi)
4307 ; AVX-NEXT: testb $8, %al
4308 ; AVX-NEXT: je .LBB14_8
4309 ; AVX-NEXT: .LBB14_7: # %cond.store5
4310 ; AVX-NEXT: vpextrb $3, %xmm0, 3(%rdi)
4313 ; AVX512F-LABEL: truncstore_v4i32_v4i8:
4315 ; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
4316 ; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0
4317 ; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
4318 ; AVX512F-NEXT: kmovw %k0, %eax
4319 ; AVX512F-NEXT: testb $1, %al
4320 ; AVX512F-NEXT: jne .LBB14_1
4321 ; AVX512F-NEXT: # %bb.2: # %else
4322 ; AVX512F-NEXT: testb $2, %al
4323 ; AVX512F-NEXT: jne .LBB14_3
4324 ; AVX512F-NEXT: .LBB14_4: # %else2
4325 ; AVX512F-NEXT: testb $4, %al
4326 ; AVX512F-NEXT: jne .LBB14_5
4327 ; AVX512F-NEXT: .LBB14_6: # %else4
4328 ; AVX512F-NEXT: testb $8, %al
4329 ; AVX512F-NEXT: jne .LBB14_7
4330 ; AVX512F-NEXT: .LBB14_8: # %else6
4331 ; AVX512F-NEXT: vzeroupper
4332 ; AVX512F-NEXT: retq
4333 ; AVX512F-NEXT: .LBB14_1: # %cond.store
4334 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
4335 ; AVX512F-NEXT: testb $2, %al
4336 ; AVX512F-NEXT: je .LBB14_4
4337 ; AVX512F-NEXT: .LBB14_3: # %cond.store1
4338 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
4339 ; AVX512F-NEXT: testb $4, %al
4340 ; AVX512F-NEXT: je .LBB14_6
4341 ; AVX512F-NEXT: .LBB14_5: # %cond.store3
4342 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi)
4343 ; AVX512F-NEXT: testb $8, %al
4344 ; AVX512F-NEXT: je .LBB14_8
4345 ; AVX512F-NEXT: .LBB14_7: # %cond.store5
4346 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi)
4347 ; AVX512F-NEXT: vzeroupper
4348 ; AVX512F-NEXT: retq
4350 ; AVX512BW-LABEL: truncstore_v4i32_v4i8:
4351 ; AVX512BW: # %bb.0:
4352 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
4353 ; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0
4354 ; AVX512BW-NEXT: kshiftlq $60, %k0, %k0
4355 ; AVX512BW-NEXT: kshiftrq $60, %k0, %k1
4356 ; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u]
4357 ; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1}
4358 ; AVX512BW-NEXT: vzeroupper
4359 ; AVX512BW-NEXT: retq
4361 ; AVX512BWVL-LABEL: truncstore_v4i32_v4i8:
4362 ; AVX512BWVL: # %bb.0:
4363 ; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1
4364 ; AVX512BWVL-NEXT: vpmovdb %xmm0, (%rdi) {%k1}
4365 ; AVX512BWVL-NEXT: retq
4366 %a = icmp ne <4 x i32> %mask, zeroinitializer
4367 %b = trunc <4 x i32> %x to <4 x i8>
4368 call void @llvm.masked.store.v4i8.p0(<4 x i8> %b, ptr %p, i32 1, <4 x i1> %a)
4372 define void @truncstore_v32i16_v32i8(<32 x i16> %x, ptr %p, <32 x i8> %mask) {
4373 ; SSE2-LABEL: truncstore_v32i16_v32i8:
4375 ; SSE2-NEXT: pxor %xmm7, %xmm7
4376 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
4377 ; SSE2-NEXT: pand %xmm6, %xmm1
4378 ; SSE2-NEXT: pand %xmm6, %xmm0
4379 ; SSE2-NEXT: packuswb %xmm1, %xmm0
4380 ; SSE2-NEXT: pcmpeqb %xmm7, %xmm4
4381 ; SSE2-NEXT: pmovmskb %xmm4, %ecx
4382 ; SSE2-NEXT: xorl $65535, %ecx # imm = 0xFFFF
4383 ; SSE2-NEXT: pcmpeqb %xmm7, %xmm5
4384 ; SSE2-NEXT: pmovmskb %xmm5, %eax
4385 ; SSE2-NEXT: notl %eax
4386 ; SSE2-NEXT: shll $16, %eax
4387 ; SSE2-NEXT: orl %ecx, %eax
4388 ; SSE2-NEXT: testb $1, %al
4389 ; SSE2-NEXT: movd %xmm0, %ecx
4390 ; SSE2-NEXT: jne .LBB15_1
4391 ; SSE2-NEXT: # %bb.2: # %else
4392 ; SSE2-NEXT: testb $2, %al
4393 ; SSE2-NEXT: jne .LBB15_3
4394 ; SSE2-NEXT: .LBB15_4: # %else2
4395 ; SSE2-NEXT: testb $4, %al
4396 ; SSE2-NEXT: jne .LBB15_5
4397 ; SSE2-NEXT: .LBB15_6: # %else4
4398 ; SSE2-NEXT: testb $8, %al
4399 ; SSE2-NEXT: je .LBB15_8
4400 ; SSE2-NEXT: .LBB15_7: # %cond.store5
4401 ; SSE2-NEXT: shrl $24, %ecx
4402 ; SSE2-NEXT: movb %cl, 3(%rdi)
4403 ; SSE2-NEXT: .LBB15_8: # %else6
4404 ; SSE2-NEXT: testb $16, %al
4405 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
4406 ; SSE2-NEXT: je .LBB15_10
4407 ; SSE2-NEXT: # %bb.9: # %cond.store7
4408 ; SSE2-NEXT: movb %cl, 4(%rdi)
4409 ; SSE2-NEXT: .LBB15_10: # %else8
4410 ; SSE2-NEXT: testb $32, %al
4411 ; SSE2-NEXT: je .LBB15_12
4412 ; SSE2-NEXT: # %bb.11: # %cond.store9
4413 ; SSE2-NEXT: movb %ch, 5(%rdi)
4414 ; SSE2-NEXT: .LBB15_12: # %else10
4415 ; SSE2-NEXT: testb $64, %al
4416 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
4417 ; SSE2-NEXT: je .LBB15_14
4418 ; SSE2-NEXT: # %bb.13: # %cond.store11
4419 ; SSE2-NEXT: movb %cl, 6(%rdi)
4420 ; SSE2-NEXT: .LBB15_14: # %else12
4421 ; SSE2-NEXT: testb %al, %al
4422 ; SSE2-NEXT: jns .LBB15_16
4423 ; SSE2-NEXT: # %bb.15: # %cond.store13
4424 ; SSE2-NEXT: movb %ch, 7(%rdi)
4425 ; SSE2-NEXT: .LBB15_16: # %else14
4426 ; SSE2-NEXT: testl $256, %eax # imm = 0x100
4427 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx
4428 ; SSE2-NEXT: je .LBB15_18
4429 ; SSE2-NEXT: # %bb.17: # %cond.store15
4430 ; SSE2-NEXT: movb %cl, 8(%rdi)
4431 ; SSE2-NEXT: .LBB15_18: # %else16
4432 ; SSE2-NEXT: testl $512, %eax # imm = 0x200
4433 ; SSE2-NEXT: je .LBB15_20
4434 ; SSE2-NEXT: # %bb.19: # %cond.store17
4435 ; SSE2-NEXT: movb %ch, 9(%rdi)
4436 ; SSE2-NEXT: .LBB15_20: # %else18
4437 ; SSE2-NEXT: testl $1024, %eax # imm = 0x400
4438 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx
4439 ; SSE2-NEXT: je .LBB15_22
4440 ; SSE2-NEXT: # %bb.21: # %cond.store19
4441 ; SSE2-NEXT: movb %cl, 10(%rdi)
4442 ; SSE2-NEXT: .LBB15_22: # %else20
4443 ; SSE2-NEXT: testl $2048, %eax # imm = 0x800
4444 ; SSE2-NEXT: je .LBB15_24
4445 ; SSE2-NEXT: # %bb.23: # %cond.store21
4446 ; SSE2-NEXT: movb %ch, 11(%rdi)
4447 ; SSE2-NEXT: .LBB15_24: # %else22
4448 ; SSE2-NEXT: testl $4096, %eax # imm = 0x1000
4449 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx
4450 ; SSE2-NEXT: je .LBB15_26
4451 ; SSE2-NEXT: # %bb.25: # %cond.store23
4452 ; SSE2-NEXT: movb %cl, 12(%rdi)
4453 ; SSE2-NEXT: .LBB15_26: # %else24
4454 ; SSE2-NEXT: testl $8192, %eax # imm = 0x2000
4455 ; SSE2-NEXT: je .LBB15_28
4456 ; SSE2-NEXT: # %bb.27: # %cond.store25
4457 ; SSE2-NEXT: movb %ch, 13(%rdi)
4458 ; SSE2-NEXT: .LBB15_28: # %else26
4459 ; SSE2-NEXT: pand %xmm6, %xmm3
4460 ; SSE2-NEXT: pand %xmm6, %xmm2
4461 ; SSE2-NEXT: testl $16384, %eax # imm = 0x4000
4462 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx
4463 ; SSE2-NEXT: je .LBB15_30
4464 ; SSE2-NEXT: # %bb.29: # %cond.store27
4465 ; SSE2-NEXT: movb %cl, 14(%rdi)
4466 ; SSE2-NEXT: .LBB15_30: # %else28
4467 ; SSE2-NEXT: packuswb %xmm3, %xmm2
4468 ; SSE2-NEXT: testw %ax, %ax
4469 ; SSE2-NEXT: jns .LBB15_32
4470 ; SSE2-NEXT: # %bb.31: # %cond.store29
4471 ; SSE2-NEXT: movb %ch, 15(%rdi)
4472 ; SSE2-NEXT: .LBB15_32: # %else30
4473 ; SSE2-NEXT: testl $65536, %eax # imm = 0x10000
4474 ; SSE2-NEXT: movd %xmm2, %ecx
4475 ; SSE2-NEXT: jne .LBB15_33
4476 ; SSE2-NEXT: # %bb.34: # %else32
4477 ; SSE2-NEXT: testl $131072, %eax # imm = 0x20000
4478 ; SSE2-NEXT: jne .LBB15_35
4479 ; SSE2-NEXT: .LBB15_36: # %else34
4480 ; SSE2-NEXT: testl $262144, %eax # imm = 0x40000
4481 ; SSE2-NEXT: jne .LBB15_37
4482 ; SSE2-NEXT: .LBB15_38: # %else36
4483 ; SSE2-NEXT: testl $524288, %eax # imm = 0x80000
4484 ; SSE2-NEXT: je .LBB15_40
4485 ; SSE2-NEXT: .LBB15_39: # %cond.store37
4486 ; SSE2-NEXT: shrl $24, %ecx
4487 ; SSE2-NEXT: movb %cl, 19(%rdi)
4488 ; SSE2-NEXT: .LBB15_40: # %else38
4489 ; SSE2-NEXT: testl $1048576, %eax # imm = 0x100000
4490 ; SSE2-NEXT: pextrw $2, %xmm2, %ecx
4491 ; SSE2-NEXT: je .LBB15_42
4492 ; SSE2-NEXT: # %bb.41: # %cond.store39
4493 ; SSE2-NEXT: movb %cl, 20(%rdi)
4494 ; SSE2-NEXT: .LBB15_42: # %else40
4495 ; SSE2-NEXT: testl $2097152, %eax # imm = 0x200000
4496 ; SSE2-NEXT: je .LBB15_44
4497 ; SSE2-NEXT: # %bb.43: # %cond.store41
4498 ; SSE2-NEXT: movb %ch, 21(%rdi)
4499 ; SSE2-NEXT: .LBB15_44: # %else42
4500 ; SSE2-NEXT: testl $4194304, %eax # imm = 0x400000
4501 ; SSE2-NEXT: pextrw $3, %xmm2, %ecx
4502 ; SSE2-NEXT: je .LBB15_46
4503 ; SSE2-NEXT: # %bb.45: # %cond.store43
4504 ; SSE2-NEXT: movb %cl, 22(%rdi)
4505 ; SSE2-NEXT: .LBB15_46: # %else44
4506 ; SSE2-NEXT: testl $8388608, %eax # imm = 0x800000
4507 ; SSE2-NEXT: je .LBB15_48
4508 ; SSE2-NEXT: # %bb.47: # %cond.store45
4509 ; SSE2-NEXT: movb %ch, 23(%rdi)
4510 ; SSE2-NEXT: .LBB15_48: # %else46
4511 ; SSE2-NEXT: testl $16777216, %eax # imm = 0x1000000
4512 ; SSE2-NEXT: pextrw $4, %xmm2, %ecx
4513 ; SSE2-NEXT: je .LBB15_50
4514 ; SSE2-NEXT: # %bb.49: # %cond.store47
4515 ; SSE2-NEXT: movb %cl, 24(%rdi)
4516 ; SSE2-NEXT: .LBB15_50: # %else48
4517 ; SSE2-NEXT: testl $33554432, %eax # imm = 0x2000000
4518 ; SSE2-NEXT: je .LBB15_52
4519 ; SSE2-NEXT: # %bb.51: # %cond.store49
4520 ; SSE2-NEXT: movb %ch, 25(%rdi)
4521 ; SSE2-NEXT: .LBB15_52: # %else50
4522 ; SSE2-NEXT: testl $67108864, %eax # imm = 0x4000000
4523 ; SSE2-NEXT: pextrw $5, %xmm2, %ecx
4524 ; SSE2-NEXT: je .LBB15_54
4525 ; SSE2-NEXT: # %bb.53: # %cond.store51
4526 ; SSE2-NEXT: movb %cl, 26(%rdi)
4527 ; SSE2-NEXT: .LBB15_54: # %else52
4528 ; SSE2-NEXT: testl $134217728, %eax # imm = 0x8000000
4529 ; SSE2-NEXT: je .LBB15_56
4530 ; SSE2-NEXT: # %bb.55: # %cond.store53
4531 ; SSE2-NEXT: movb %ch, 27(%rdi)
4532 ; SSE2-NEXT: .LBB15_56: # %else54
4533 ; SSE2-NEXT: testl $268435456, %eax # imm = 0x10000000
4534 ; SSE2-NEXT: pextrw $6, %xmm2, %ecx
4535 ; SSE2-NEXT: je .LBB15_58
4536 ; SSE2-NEXT: # %bb.57: # %cond.store55
4537 ; SSE2-NEXT: movb %cl, 28(%rdi)
4538 ; SSE2-NEXT: .LBB15_58: # %else56
4539 ; SSE2-NEXT: testl $536870912, %eax # imm = 0x20000000
4540 ; SSE2-NEXT: je .LBB15_60
4541 ; SSE2-NEXT: # %bb.59: # %cond.store57
4542 ; SSE2-NEXT: movb %ch, 29(%rdi)
4543 ; SSE2-NEXT: .LBB15_60: # %else58
4544 ; SSE2-NEXT: testl $1073741824, %eax # imm = 0x40000000
4545 ; SSE2-NEXT: pextrw $7, %xmm2, %ecx
4546 ; SSE2-NEXT: jne .LBB15_61
4547 ; SSE2-NEXT: # %bb.62: # %else60
4548 ; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000
4549 ; SSE2-NEXT: jne .LBB15_63
4550 ; SSE2-NEXT: .LBB15_64: # %else62
4552 ; SSE2-NEXT: .LBB15_1: # %cond.store
4553 ; SSE2-NEXT: movb %cl, (%rdi)
4554 ; SSE2-NEXT: testb $2, %al
4555 ; SSE2-NEXT: je .LBB15_4
4556 ; SSE2-NEXT: .LBB15_3: # %cond.store1
4557 ; SSE2-NEXT: movb %ch, 1(%rdi)
4558 ; SSE2-NEXT: testb $4, %al
4559 ; SSE2-NEXT: je .LBB15_6
4560 ; SSE2-NEXT: .LBB15_5: # %cond.store3
4561 ; SSE2-NEXT: movl %ecx, %edx
4562 ; SSE2-NEXT: shrl $16, %edx
4563 ; SSE2-NEXT: movb %dl, 2(%rdi)
4564 ; SSE2-NEXT: testb $8, %al
4565 ; SSE2-NEXT: jne .LBB15_7
4566 ; SSE2-NEXT: jmp .LBB15_8
4567 ; SSE2-NEXT: .LBB15_33: # %cond.store31
4568 ; SSE2-NEXT: movb %cl, 16(%rdi)
4569 ; SSE2-NEXT: testl $131072, %eax # imm = 0x20000
4570 ; SSE2-NEXT: je .LBB15_36
4571 ; SSE2-NEXT: .LBB15_35: # %cond.store33
4572 ; SSE2-NEXT: movb %ch, 17(%rdi)
4573 ; SSE2-NEXT: testl $262144, %eax # imm = 0x40000
4574 ; SSE2-NEXT: je .LBB15_38
4575 ; SSE2-NEXT: .LBB15_37: # %cond.store35
4576 ; SSE2-NEXT: movl %ecx, %edx
4577 ; SSE2-NEXT: shrl $16, %edx
4578 ; SSE2-NEXT: movb %dl, 18(%rdi)
4579 ; SSE2-NEXT: testl $524288, %eax # imm = 0x80000
4580 ; SSE2-NEXT: jne .LBB15_39
4581 ; SSE2-NEXT: jmp .LBB15_40
4582 ; SSE2-NEXT: .LBB15_61: # %cond.store59
4583 ; SSE2-NEXT: movb %cl, 30(%rdi)
4584 ; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000
4585 ; SSE2-NEXT: je .LBB15_64
4586 ; SSE2-NEXT: .LBB15_63: # %cond.store61
4587 ; SSE2-NEXT: movb %ch, 31(%rdi)
4590 ; SSE4-LABEL: truncstore_v32i16_v32i8:
4592 ; SSE4-NEXT: pxor %xmm7, %xmm7
4593 ; SSE4-NEXT: pmovzxbw {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
4594 ; SSE4-NEXT: pand %xmm6, %xmm1
4595 ; SSE4-NEXT: pand %xmm6, %xmm0
4596 ; SSE4-NEXT: packuswb %xmm1, %xmm0
4597 ; SSE4-NEXT: pcmpeqb %xmm7, %xmm4
4598 ; SSE4-NEXT: pmovmskb %xmm4, %ecx
4599 ; SSE4-NEXT: xorl $65535, %ecx # imm = 0xFFFF
4600 ; SSE4-NEXT: pcmpeqb %xmm7, %xmm5
4601 ; SSE4-NEXT: pmovmskb %xmm5, %eax
4602 ; SSE4-NEXT: notl %eax
4603 ; SSE4-NEXT: shll $16, %eax
4604 ; SSE4-NEXT: orl %ecx, %eax
4605 ; SSE4-NEXT: testb $1, %al
4606 ; SSE4-NEXT: jne .LBB15_1
4607 ; SSE4-NEXT: # %bb.2: # %else
4608 ; SSE4-NEXT: testb $2, %al
4609 ; SSE4-NEXT: jne .LBB15_3
4610 ; SSE4-NEXT: .LBB15_4: # %else2
4611 ; SSE4-NEXT: testb $4, %al
4612 ; SSE4-NEXT: jne .LBB15_5
4613 ; SSE4-NEXT: .LBB15_6: # %else4
4614 ; SSE4-NEXT: testb $8, %al
4615 ; SSE4-NEXT: jne .LBB15_7
4616 ; SSE4-NEXT: .LBB15_8: # %else6
4617 ; SSE4-NEXT: testb $16, %al
4618 ; SSE4-NEXT: jne .LBB15_9
4619 ; SSE4-NEXT: .LBB15_10: # %else8
4620 ; SSE4-NEXT: testb $32, %al
4621 ; SSE4-NEXT: jne .LBB15_11
4622 ; SSE4-NEXT: .LBB15_12: # %else10
4623 ; SSE4-NEXT: testb $64, %al
4624 ; SSE4-NEXT: jne .LBB15_13
4625 ; SSE4-NEXT: .LBB15_14: # %else12
4626 ; SSE4-NEXT: testb %al, %al
4627 ; SSE4-NEXT: js .LBB15_15
4628 ; SSE4-NEXT: .LBB15_16: # %else14
4629 ; SSE4-NEXT: testl $256, %eax # imm = 0x100
4630 ; SSE4-NEXT: jne .LBB15_17
4631 ; SSE4-NEXT: .LBB15_18: # %else16
4632 ; SSE4-NEXT: testl $512, %eax # imm = 0x200
4633 ; SSE4-NEXT: jne .LBB15_19
4634 ; SSE4-NEXT: .LBB15_20: # %else18
4635 ; SSE4-NEXT: testl $1024, %eax # imm = 0x400
4636 ; SSE4-NEXT: jne .LBB15_21
4637 ; SSE4-NEXT: .LBB15_22: # %else20
4638 ; SSE4-NEXT: testl $2048, %eax # imm = 0x800
4639 ; SSE4-NEXT: jne .LBB15_23
4640 ; SSE4-NEXT: .LBB15_24: # %else22
4641 ; SSE4-NEXT: testl $4096, %eax # imm = 0x1000
4642 ; SSE4-NEXT: jne .LBB15_25
4643 ; SSE4-NEXT: .LBB15_26: # %else24
4644 ; SSE4-NEXT: testl $8192, %eax # imm = 0x2000
4645 ; SSE4-NEXT: jne .LBB15_27
4646 ; SSE4-NEXT: .LBB15_28: # %else26
4647 ; SSE4-NEXT: testl $16384, %eax # imm = 0x4000
4648 ; SSE4-NEXT: je .LBB15_30
4649 ; SSE4-NEXT: .LBB15_29: # %cond.store27
4650 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi)
4651 ; SSE4-NEXT: .LBB15_30: # %else28
4652 ; SSE4-NEXT: pand %xmm6, %xmm3
4653 ; SSE4-NEXT: pand %xmm6, %xmm2
4654 ; SSE4-NEXT: testw %ax, %ax
4655 ; SSE4-NEXT: jns .LBB15_32
4656 ; SSE4-NEXT: # %bb.31: # %cond.store29
4657 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi)
4658 ; SSE4-NEXT: .LBB15_32: # %else30
4659 ; SSE4-NEXT: packuswb %xmm3, %xmm2
4660 ; SSE4-NEXT: testl $65536, %eax # imm = 0x10000
4661 ; SSE4-NEXT: jne .LBB15_33
4662 ; SSE4-NEXT: # %bb.34: # %else32
4663 ; SSE4-NEXT: testl $131072, %eax # imm = 0x20000
4664 ; SSE4-NEXT: jne .LBB15_35
4665 ; SSE4-NEXT: .LBB15_36: # %else34
4666 ; SSE4-NEXT: testl $262144, %eax # imm = 0x40000
4667 ; SSE4-NEXT: jne .LBB15_37
4668 ; SSE4-NEXT: .LBB15_38: # %else36
4669 ; SSE4-NEXT: testl $524288, %eax # imm = 0x80000
4670 ; SSE4-NEXT: jne .LBB15_39
4671 ; SSE4-NEXT: .LBB15_40: # %else38
4672 ; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000
4673 ; SSE4-NEXT: jne .LBB15_41
4674 ; SSE4-NEXT: .LBB15_42: # %else40
4675 ; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000
4676 ; SSE4-NEXT: jne .LBB15_43
4677 ; SSE4-NEXT: .LBB15_44: # %else42
4678 ; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000
4679 ; SSE4-NEXT: jne .LBB15_45
4680 ; SSE4-NEXT: .LBB15_46: # %else44
4681 ; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000
4682 ; SSE4-NEXT: jne .LBB15_47
4683 ; SSE4-NEXT: .LBB15_48: # %else46
4684 ; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000
4685 ; SSE4-NEXT: jne .LBB15_49
4686 ; SSE4-NEXT: .LBB15_50: # %else48
4687 ; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000
4688 ; SSE4-NEXT: jne .LBB15_51
4689 ; SSE4-NEXT: .LBB15_52: # %else50
4690 ; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000
4691 ; SSE4-NEXT: jne .LBB15_53
4692 ; SSE4-NEXT: .LBB15_54: # %else52
4693 ; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000
4694 ; SSE4-NEXT: jne .LBB15_55
4695 ; SSE4-NEXT: .LBB15_56: # %else54
4696 ; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000
4697 ; SSE4-NEXT: jne .LBB15_57
4698 ; SSE4-NEXT: .LBB15_58: # %else56
4699 ; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000
4700 ; SSE4-NEXT: jne .LBB15_59
4701 ; SSE4-NEXT: .LBB15_60: # %else58
4702 ; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000
4703 ; SSE4-NEXT: jne .LBB15_61
4704 ; SSE4-NEXT: .LBB15_62: # %else60
4705 ; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000
4706 ; SSE4-NEXT: jne .LBB15_63
4707 ; SSE4-NEXT: .LBB15_64: # %else62
4709 ; SSE4-NEXT: .LBB15_1: # %cond.store
4710 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
4711 ; SSE4-NEXT: testb $2, %al
4712 ; SSE4-NEXT: je .LBB15_4
4713 ; SSE4-NEXT: .LBB15_3: # %cond.store1
4714 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
4715 ; SSE4-NEXT: testb $4, %al
4716 ; SSE4-NEXT: je .LBB15_6
4717 ; SSE4-NEXT: .LBB15_5: # %cond.store3
4718 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi)
4719 ; SSE4-NEXT: testb $8, %al
4720 ; SSE4-NEXT: je .LBB15_8
4721 ; SSE4-NEXT: .LBB15_7: # %cond.store5
4722 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi)
4723 ; SSE4-NEXT: testb $16, %al
4724 ; SSE4-NEXT: je .LBB15_10
4725 ; SSE4-NEXT: .LBB15_9: # %cond.store7
4726 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi)
4727 ; SSE4-NEXT: testb $32, %al
4728 ; SSE4-NEXT: je .LBB15_12
4729 ; SSE4-NEXT: .LBB15_11: # %cond.store9
4730 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi)
4731 ; SSE4-NEXT: testb $64, %al
4732 ; SSE4-NEXT: je .LBB15_14
4733 ; SSE4-NEXT: .LBB15_13: # %cond.store11
4734 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi)
4735 ; SSE4-NEXT: testb %al, %al
4736 ; SSE4-NEXT: jns .LBB15_16
4737 ; SSE4-NEXT: .LBB15_15: # %cond.store13
4738 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi)
4739 ; SSE4-NEXT: testl $256, %eax # imm = 0x100
4740 ; SSE4-NEXT: je .LBB15_18
4741 ; SSE4-NEXT: .LBB15_17: # %cond.store15
4742 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi)
4743 ; SSE4-NEXT: testl $512, %eax # imm = 0x200
4744 ; SSE4-NEXT: je .LBB15_20
4745 ; SSE4-NEXT: .LBB15_19: # %cond.store17
4746 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi)
4747 ; SSE4-NEXT: testl $1024, %eax # imm = 0x400
4748 ; SSE4-NEXT: je .LBB15_22
4749 ; SSE4-NEXT: .LBB15_21: # %cond.store19
4750 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi)
4751 ; SSE4-NEXT: testl $2048, %eax # imm = 0x800
4752 ; SSE4-NEXT: je .LBB15_24
4753 ; SSE4-NEXT: .LBB15_23: # %cond.store21
4754 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi)
4755 ; SSE4-NEXT: testl $4096, %eax # imm = 0x1000
4756 ; SSE4-NEXT: je .LBB15_26
4757 ; SSE4-NEXT: .LBB15_25: # %cond.store23
4758 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi)
4759 ; SSE4-NEXT: testl $8192, %eax # imm = 0x2000
4760 ; SSE4-NEXT: je .LBB15_28
4761 ; SSE4-NEXT: .LBB15_27: # %cond.store25
4762 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi)
4763 ; SSE4-NEXT: testl $16384, %eax # imm = 0x4000
4764 ; SSE4-NEXT: jne .LBB15_29
4765 ; SSE4-NEXT: jmp .LBB15_30
4766 ; SSE4-NEXT: .LBB15_33: # %cond.store31
4767 ; SSE4-NEXT: pextrb $0, %xmm2, 16(%rdi)
4768 ; SSE4-NEXT: testl $131072, %eax # imm = 0x20000
4769 ; SSE4-NEXT: je .LBB15_36
4770 ; SSE4-NEXT: .LBB15_35: # %cond.store33
4771 ; SSE4-NEXT: pextrb $1, %xmm2, 17(%rdi)
4772 ; SSE4-NEXT: testl $262144, %eax # imm = 0x40000
4773 ; SSE4-NEXT: je .LBB15_38
4774 ; SSE4-NEXT: .LBB15_37: # %cond.store35
4775 ; SSE4-NEXT: pextrb $2, %xmm2, 18(%rdi)
4776 ; SSE4-NEXT: testl $524288, %eax # imm = 0x80000
4777 ; SSE4-NEXT: je .LBB15_40
4778 ; SSE4-NEXT: .LBB15_39: # %cond.store37
4779 ; SSE4-NEXT: pextrb $3, %xmm2, 19(%rdi)
4780 ; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000
4781 ; SSE4-NEXT: je .LBB15_42
4782 ; SSE4-NEXT: .LBB15_41: # %cond.store39
4783 ; SSE4-NEXT: pextrb $4, %xmm2, 20(%rdi)
4784 ; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000
4785 ; SSE4-NEXT: je .LBB15_44
4786 ; SSE4-NEXT: .LBB15_43: # %cond.store41
4787 ; SSE4-NEXT: pextrb $5, %xmm2, 21(%rdi)
4788 ; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000
4789 ; SSE4-NEXT: je .LBB15_46
4790 ; SSE4-NEXT: .LBB15_45: # %cond.store43
4791 ; SSE4-NEXT: pextrb $6, %xmm2, 22(%rdi)
4792 ; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000
4793 ; SSE4-NEXT: je .LBB15_48
4794 ; SSE4-NEXT: .LBB15_47: # %cond.store45
4795 ; SSE4-NEXT: pextrb $7, %xmm2, 23(%rdi)
4796 ; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000
4797 ; SSE4-NEXT: je .LBB15_50
4798 ; SSE4-NEXT: .LBB15_49: # %cond.store47
4799 ; SSE4-NEXT: pextrb $8, %xmm2, 24(%rdi)
4800 ; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000
4801 ; SSE4-NEXT: je .LBB15_52
4802 ; SSE4-NEXT: .LBB15_51: # %cond.store49
4803 ; SSE4-NEXT: pextrb $9, %xmm2, 25(%rdi)
4804 ; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000
4805 ; SSE4-NEXT: je .LBB15_54
4806 ; SSE4-NEXT: .LBB15_53: # %cond.store51
4807 ; SSE4-NEXT: pextrb $10, %xmm2, 26(%rdi)
4808 ; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000
4809 ; SSE4-NEXT: je .LBB15_56
4810 ; SSE4-NEXT: .LBB15_55: # %cond.store53
4811 ; SSE4-NEXT: pextrb $11, %xmm2, 27(%rdi)
4812 ; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000
4813 ; SSE4-NEXT: je .LBB15_58
4814 ; SSE4-NEXT: .LBB15_57: # %cond.store55
4815 ; SSE4-NEXT: pextrb $12, %xmm2, 28(%rdi)
4816 ; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000
4817 ; SSE4-NEXT: je .LBB15_60
4818 ; SSE4-NEXT: .LBB15_59: # %cond.store57
4819 ; SSE4-NEXT: pextrb $13, %xmm2, 29(%rdi)
4820 ; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000
4821 ; SSE4-NEXT: je .LBB15_62
4822 ; SSE4-NEXT: .LBB15_61: # %cond.store59
4823 ; SSE4-NEXT: pextrb $14, %xmm2, 30(%rdi)
4824 ; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000
4825 ; SSE4-NEXT: je .LBB15_64
4826 ; SSE4-NEXT: .LBB15_63: # %cond.store61
4827 ; SSE4-NEXT: pextrb $15, %xmm2, 31(%rdi)
4830 ; AVX1-LABEL: truncstore_v32i16_v32i8:
4832 ; AVX1-NEXT: vbroadcastss {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
4833 ; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
4834 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4
4835 ; AVX1-NEXT: vpackuswb %xmm4, %xmm1, %xmm1
4836 ; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0
4837 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
4838 ; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0
4839 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
4840 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
4841 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm3
4842 ; AVX1-NEXT: vpmovmskb %xmm3, %ecx
4843 ; AVX1-NEXT: xorl $65535, %ecx # imm = 0xFFFF
4844 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
4845 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1
4846 ; AVX1-NEXT: vpmovmskb %xmm1, %eax
4847 ; AVX1-NEXT: notl %eax
4848 ; AVX1-NEXT: shll $16, %eax
4849 ; AVX1-NEXT: orl %ecx, %eax
4850 ; AVX1-NEXT: testb $1, %al
4851 ; AVX1-NEXT: jne .LBB15_1
4852 ; AVX1-NEXT: # %bb.2: # %else
4853 ; AVX1-NEXT: testb $2, %al
4854 ; AVX1-NEXT: jne .LBB15_3
4855 ; AVX1-NEXT: .LBB15_4: # %else2
4856 ; AVX1-NEXT: testb $4, %al
4857 ; AVX1-NEXT: jne .LBB15_5
4858 ; AVX1-NEXT: .LBB15_6: # %else4
4859 ; AVX1-NEXT: testb $8, %al
4860 ; AVX1-NEXT: jne .LBB15_7
4861 ; AVX1-NEXT: .LBB15_8: # %else6
4862 ; AVX1-NEXT: testb $16, %al
4863 ; AVX1-NEXT: jne .LBB15_9
4864 ; AVX1-NEXT: .LBB15_10: # %else8
4865 ; AVX1-NEXT: testb $32, %al
4866 ; AVX1-NEXT: jne .LBB15_11
4867 ; AVX1-NEXT: .LBB15_12: # %else10
4868 ; AVX1-NEXT: testb $64, %al
4869 ; AVX1-NEXT: jne .LBB15_13
4870 ; AVX1-NEXT: .LBB15_14: # %else12
4871 ; AVX1-NEXT: testb %al, %al
4872 ; AVX1-NEXT: js .LBB15_15
4873 ; AVX1-NEXT: .LBB15_16: # %else14
4874 ; AVX1-NEXT: testl $256, %eax # imm = 0x100
4875 ; AVX1-NEXT: jne .LBB15_17
4876 ; AVX1-NEXT: .LBB15_18: # %else16
4877 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
4878 ; AVX1-NEXT: jne .LBB15_19
4879 ; AVX1-NEXT: .LBB15_20: # %else18
4880 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
4881 ; AVX1-NEXT: jne .LBB15_21
4882 ; AVX1-NEXT: .LBB15_22: # %else20
4883 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
4884 ; AVX1-NEXT: jne .LBB15_23
4885 ; AVX1-NEXT: .LBB15_24: # %else22
4886 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
4887 ; AVX1-NEXT: jne .LBB15_25
4888 ; AVX1-NEXT: .LBB15_26: # %else24
4889 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
4890 ; AVX1-NEXT: jne .LBB15_27
4891 ; AVX1-NEXT: .LBB15_28: # %else26
4892 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
4893 ; AVX1-NEXT: jne .LBB15_29
4894 ; AVX1-NEXT: .LBB15_30: # %else28
4895 ; AVX1-NEXT: testw %ax, %ax
4896 ; AVX1-NEXT: jns .LBB15_32
4897 ; AVX1-NEXT: .LBB15_31: # %cond.store29
4898 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi)
4899 ; AVX1-NEXT: .LBB15_32: # %else30
4900 ; AVX1-NEXT: testl $65536, %eax # imm = 0x10000
4901 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
4902 ; AVX1-NEXT: jne .LBB15_33
4903 ; AVX1-NEXT: # %bb.34: # %else32
4904 ; AVX1-NEXT: testl $131072, %eax # imm = 0x20000
4905 ; AVX1-NEXT: jne .LBB15_35
4906 ; AVX1-NEXT: .LBB15_36: # %else34
4907 ; AVX1-NEXT: testl $262144, %eax # imm = 0x40000
4908 ; AVX1-NEXT: jne .LBB15_37
4909 ; AVX1-NEXT: .LBB15_38: # %else36
4910 ; AVX1-NEXT: testl $524288, %eax # imm = 0x80000
4911 ; AVX1-NEXT: jne .LBB15_39
4912 ; AVX1-NEXT: .LBB15_40: # %else38
4913 ; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000
4914 ; AVX1-NEXT: jne .LBB15_41
4915 ; AVX1-NEXT: .LBB15_42: # %else40
4916 ; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000
4917 ; AVX1-NEXT: jne .LBB15_43
4918 ; AVX1-NEXT: .LBB15_44: # %else42
4919 ; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000
4920 ; AVX1-NEXT: jne .LBB15_45
4921 ; AVX1-NEXT: .LBB15_46: # %else44
4922 ; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000
4923 ; AVX1-NEXT: jne .LBB15_47
4924 ; AVX1-NEXT: .LBB15_48: # %else46
4925 ; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000
4926 ; AVX1-NEXT: jne .LBB15_49
4927 ; AVX1-NEXT: .LBB15_50: # %else48
4928 ; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000
4929 ; AVX1-NEXT: jne .LBB15_51
4930 ; AVX1-NEXT: .LBB15_52: # %else50
4931 ; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000
4932 ; AVX1-NEXT: jne .LBB15_53
4933 ; AVX1-NEXT: .LBB15_54: # %else52
4934 ; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000
4935 ; AVX1-NEXT: jne .LBB15_55
4936 ; AVX1-NEXT: .LBB15_56: # %else54
4937 ; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000
4938 ; AVX1-NEXT: jne .LBB15_57
4939 ; AVX1-NEXT: .LBB15_58: # %else56
4940 ; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000
4941 ; AVX1-NEXT: jne .LBB15_59
4942 ; AVX1-NEXT: .LBB15_60: # %else58
4943 ; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000
4944 ; AVX1-NEXT: jne .LBB15_61
4945 ; AVX1-NEXT: .LBB15_62: # %else60
4946 ; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000
4947 ; AVX1-NEXT: jne .LBB15_63
4948 ; AVX1-NEXT: .LBB15_64: # %else62
4949 ; AVX1-NEXT: vzeroupper
4951 ; AVX1-NEXT: .LBB15_1: # %cond.store
4952 ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi)
4953 ; AVX1-NEXT: testb $2, %al
4954 ; AVX1-NEXT: je .LBB15_4
4955 ; AVX1-NEXT: .LBB15_3: # %cond.store1
4956 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi)
4957 ; AVX1-NEXT: testb $4, %al
4958 ; AVX1-NEXT: je .LBB15_6
4959 ; AVX1-NEXT: .LBB15_5: # %cond.store3
4960 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi)
4961 ; AVX1-NEXT: testb $8, %al
4962 ; AVX1-NEXT: je .LBB15_8
4963 ; AVX1-NEXT: .LBB15_7: # %cond.store5
4964 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi)
4965 ; AVX1-NEXT: testb $16, %al
4966 ; AVX1-NEXT: je .LBB15_10
4967 ; AVX1-NEXT: .LBB15_9: # %cond.store7
4968 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi)
4969 ; AVX1-NEXT: testb $32, %al
4970 ; AVX1-NEXT: je .LBB15_12
4971 ; AVX1-NEXT: .LBB15_11: # %cond.store9
4972 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi)
4973 ; AVX1-NEXT: testb $64, %al
4974 ; AVX1-NEXT: je .LBB15_14
4975 ; AVX1-NEXT: .LBB15_13: # %cond.store11
4976 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi)
4977 ; AVX1-NEXT: testb %al, %al
4978 ; AVX1-NEXT: jns .LBB15_16
4979 ; AVX1-NEXT: .LBB15_15: # %cond.store13
4980 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi)
4981 ; AVX1-NEXT: testl $256, %eax # imm = 0x100
4982 ; AVX1-NEXT: je .LBB15_18
4983 ; AVX1-NEXT: .LBB15_17: # %cond.store15
4984 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi)
4985 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
4986 ; AVX1-NEXT: je .LBB15_20
4987 ; AVX1-NEXT: .LBB15_19: # %cond.store17
4988 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi)
4989 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
4990 ; AVX1-NEXT: je .LBB15_22
4991 ; AVX1-NEXT: .LBB15_21: # %cond.store19
4992 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi)
4993 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
4994 ; AVX1-NEXT: je .LBB15_24
4995 ; AVX1-NEXT: .LBB15_23: # %cond.store21
4996 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi)
4997 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
4998 ; AVX1-NEXT: je .LBB15_26
4999 ; AVX1-NEXT: .LBB15_25: # %cond.store23
5000 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi)
5001 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
5002 ; AVX1-NEXT: je .LBB15_28
5003 ; AVX1-NEXT: .LBB15_27: # %cond.store25
5004 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi)
5005 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
5006 ; AVX1-NEXT: je .LBB15_30
5007 ; AVX1-NEXT: .LBB15_29: # %cond.store27
5008 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi)
5009 ; AVX1-NEXT: testw %ax, %ax
5010 ; AVX1-NEXT: js .LBB15_31
5011 ; AVX1-NEXT: jmp .LBB15_32
5012 ; AVX1-NEXT: .LBB15_33: # %cond.store31
5013 ; AVX1-NEXT: vpextrb $0, %xmm0, 16(%rdi)
5014 ; AVX1-NEXT: testl $131072, %eax # imm = 0x20000
5015 ; AVX1-NEXT: je .LBB15_36
5016 ; AVX1-NEXT: .LBB15_35: # %cond.store33
5017 ; AVX1-NEXT: vpextrb $1, %xmm0, 17(%rdi)
5018 ; AVX1-NEXT: testl $262144, %eax # imm = 0x40000
5019 ; AVX1-NEXT: je .LBB15_38
5020 ; AVX1-NEXT: .LBB15_37: # %cond.store35
5021 ; AVX1-NEXT: vpextrb $2, %xmm0, 18(%rdi)
5022 ; AVX1-NEXT: testl $524288, %eax # imm = 0x80000
5023 ; AVX1-NEXT: je .LBB15_40
5024 ; AVX1-NEXT: .LBB15_39: # %cond.store37
5025 ; AVX1-NEXT: vpextrb $3, %xmm0, 19(%rdi)
5026 ; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000
5027 ; AVX1-NEXT: je .LBB15_42
5028 ; AVX1-NEXT: .LBB15_41: # %cond.store39
5029 ; AVX1-NEXT: vpextrb $4, %xmm0, 20(%rdi)
5030 ; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000
5031 ; AVX1-NEXT: je .LBB15_44
5032 ; AVX1-NEXT: .LBB15_43: # %cond.store41
5033 ; AVX1-NEXT: vpextrb $5, %xmm0, 21(%rdi)
5034 ; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000
5035 ; AVX1-NEXT: je .LBB15_46
5036 ; AVX1-NEXT: .LBB15_45: # %cond.store43
5037 ; AVX1-NEXT: vpextrb $6, %xmm0, 22(%rdi)
5038 ; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000
5039 ; AVX1-NEXT: je .LBB15_48
5040 ; AVX1-NEXT: .LBB15_47: # %cond.store45
5041 ; AVX1-NEXT: vpextrb $7, %xmm0, 23(%rdi)
5042 ; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000
5043 ; AVX1-NEXT: je .LBB15_50
5044 ; AVX1-NEXT: .LBB15_49: # %cond.store47
5045 ; AVX1-NEXT: vpextrb $8, %xmm0, 24(%rdi)
5046 ; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000
5047 ; AVX1-NEXT: je .LBB15_52
5048 ; AVX1-NEXT: .LBB15_51: # %cond.store49
5049 ; AVX1-NEXT: vpextrb $9, %xmm0, 25(%rdi)
5050 ; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000
5051 ; AVX1-NEXT: je .LBB15_54
5052 ; AVX1-NEXT: .LBB15_53: # %cond.store51
5053 ; AVX1-NEXT: vpextrb $10, %xmm0, 26(%rdi)
5054 ; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000
5055 ; AVX1-NEXT: je .LBB15_56
5056 ; AVX1-NEXT: .LBB15_55: # %cond.store53
5057 ; AVX1-NEXT: vpextrb $11, %xmm0, 27(%rdi)
5058 ; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000
5059 ; AVX1-NEXT: je .LBB15_58
5060 ; AVX1-NEXT: .LBB15_57: # %cond.store55
5061 ; AVX1-NEXT: vpextrb $12, %xmm0, 28(%rdi)
5062 ; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000
5063 ; AVX1-NEXT: je .LBB15_60
5064 ; AVX1-NEXT: .LBB15_59: # %cond.store57
5065 ; AVX1-NEXT: vpextrb $13, %xmm0, 29(%rdi)
5066 ; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000
5067 ; AVX1-NEXT: je .LBB15_62
5068 ; AVX1-NEXT: .LBB15_61: # %cond.store59
5069 ; AVX1-NEXT: vpextrb $14, %xmm0, 30(%rdi)
5070 ; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000
5071 ; AVX1-NEXT: je .LBB15_64
5072 ; AVX1-NEXT: .LBB15_63: # %cond.store61
5073 ; AVX1-NEXT: vpextrb $15, %xmm0, 31(%rdi)
5074 ; AVX1-NEXT: vzeroupper
5077 ; AVX2-LABEL: truncstore_v32i16_v32i8:
5079 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3
5080 ; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [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]
5081 ; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1
5082 ; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0
5083 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0
5084 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
5085 ; AVX2-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm1
5086 ; AVX2-NEXT: vpmovmskb %ymm1, %eax
5087 ; AVX2-NEXT: notl %eax
5088 ; AVX2-NEXT: testb $1, %al
5089 ; AVX2-NEXT: jne .LBB15_1
5090 ; AVX2-NEXT: # %bb.2: # %else
5091 ; AVX2-NEXT: testb $2, %al
5092 ; AVX2-NEXT: jne .LBB15_3
5093 ; AVX2-NEXT: .LBB15_4: # %else2
5094 ; AVX2-NEXT: testb $4, %al
5095 ; AVX2-NEXT: jne .LBB15_5
5096 ; AVX2-NEXT: .LBB15_6: # %else4
5097 ; AVX2-NEXT: testb $8, %al
5098 ; AVX2-NEXT: jne .LBB15_7
5099 ; AVX2-NEXT: .LBB15_8: # %else6
5100 ; AVX2-NEXT: testb $16, %al
5101 ; AVX2-NEXT: jne .LBB15_9
5102 ; AVX2-NEXT: .LBB15_10: # %else8
5103 ; AVX2-NEXT: testb $32, %al
5104 ; AVX2-NEXT: jne .LBB15_11
5105 ; AVX2-NEXT: .LBB15_12: # %else10
5106 ; AVX2-NEXT: testb $64, %al
5107 ; AVX2-NEXT: jne .LBB15_13
5108 ; AVX2-NEXT: .LBB15_14: # %else12
5109 ; AVX2-NEXT: testb %al, %al
5110 ; AVX2-NEXT: js .LBB15_15
5111 ; AVX2-NEXT: .LBB15_16: # %else14
5112 ; AVX2-NEXT: testl $256, %eax # imm = 0x100
5113 ; AVX2-NEXT: jne .LBB15_17
5114 ; AVX2-NEXT: .LBB15_18: # %else16
5115 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
5116 ; AVX2-NEXT: jne .LBB15_19
5117 ; AVX2-NEXT: .LBB15_20: # %else18
5118 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
5119 ; AVX2-NEXT: jne .LBB15_21
5120 ; AVX2-NEXT: .LBB15_22: # %else20
5121 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
5122 ; AVX2-NEXT: jne .LBB15_23
5123 ; AVX2-NEXT: .LBB15_24: # %else22
5124 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
5125 ; AVX2-NEXT: jne .LBB15_25
5126 ; AVX2-NEXT: .LBB15_26: # %else24
5127 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
5128 ; AVX2-NEXT: jne .LBB15_27
5129 ; AVX2-NEXT: .LBB15_28: # %else26
5130 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
5131 ; AVX2-NEXT: jne .LBB15_29
5132 ; AVX2-NEXT: .LBB15_30: # %else28
5133 ; AVX2-NEXT: testw %ax, %ax
5134 ; AVX2-NEXT: jns .LBB15_32
5135 ; AVX2-NEXT: .LBB15_31: # %cond.store29
5136 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi)
5137 ; AVX2-NEXT: .LBB15_32: # %else30
5138 ; AVX2-NEXT: testl $65536, %eax # imm = 0x10000
5139 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
5140 ; AVX2-NEXT: jne .LBB15_33
5141 ; AVX2-NEXT: # %bb.34: # %else32
5142 ; AVX2-NEXT: testl $131072, %eax # imm = 0x20000
5143 ; AVX2-NEXT: jne .LBB15_35
5144 ; AVX2-NEXT: .LBB15_36: # %else34
5145 ; AVX2-NEXT: testl $262144, %eax # imm = 0x40000
5146 ; AVX2-NEXT: jne .LBB15_37
5147 ; AVX2-NEXT: .LBB15_38: # %else36
5148 ; AVX2-NEXT: testl $524288, %eax # imm = 0x80000
5149 ; AVX2-NEXT: jne .LBB15_39
5150 ; AVX2-NEXT: .LBB15_40: # %else38
5151 ; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000
5152 ; AVX2-NEXT: jne .LBB15_41
5153 ; AVX2-NEXT: .LBB15_42: # %else40
5154 ; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000
5155 ; AVX2-NEXT: jne .LBB15_43
5156 ; AVX2-NEXT: .LBB15_44: # %else42
5157 ; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000
5158 ; AVX2-NEXT: jne .LBB15_45
5159 ; AVX2-NEXT: .LBB15_46: # %else44
5160 ; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000
5161 ; AVX2-NEXT: jne .LBB15_47
5162 ; AVX2-NEXT: .LBB15_48: # %else46
5163 ; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000
5164 ; AVX2-NEXT: jne .LBB15_49
5165 ; AVX2-NEXT: .LBB15_50: # %else48
5166 ; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000
5167 ; AVX2-NEXT: jne .LBB15_51
5168 ; AVX2-NEXT: .LBB15_52: # %else50
5169 ; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000
5170 ; AVX2-NEXT: jne .LBB15_53
5171 ; AVX2-NEXT: .LBB15_54: # %else52
5172 ; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000
5173 ; AVX2-NEXT: jne .LBB15_55
5174 ; AVX2-NEXT: .LBB15_56: # %else54
5175 ; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000
5176 ; AVX2-NEXT: jne .LBB15_57
5177 ; AVX2-NEXT: .LBB15_58: # %else56
5178 ; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000
5179 ; AVX2-NEXT: jne .LBB15_59
5180 ; AVX2-NEXT: .LBB15_60: # %else58
5181 ; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000
5182 ; AVX2-NEXT: jne .LBB15_61
5183 ; AVX2-NEXT: .LBB15_62: # %else60
5184 ; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000
5185 ; AVX2-NEXT: jne .LBB15_63
5186 ; AVX2-NEXT: .LBB15_64: # %else62
5187 ; AVX2-NEXT: vzeroupper
5189 ; AVX2-NEXT: .LBB15_1: # %cond.store
5190 ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi)
5191 ; AVX2-NEXT: testb $2, %al
5192 ; AVX2-NEXT: je .LBB15_4
5193 ; AVX2-NEXT: .LBB15_3: # %cond.store1
5194 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi)
5195 ; AVX2-NEXT: testb $4, %al
5196 ; AVX2-NEXT: je .LBB15_6
5197 ; AVX2-NEXT: .LBB15_5: # %cond.store3
5198 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi)
5199 ; AVX2-NEXT: testb $8, %al
5200 ; AVX2-NEXT: je .LBB15_8
5201 ; AVX2-NEXT: .LBB15_7: # %cond.store5
5202 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi)
5203 ; AVX2-NEXT: testb $16, %al
5204 ; AVX2-NEXT: je .LBB15_10
5205 ; AVX2-NEXT: .LBB15_9: # %cond.store7
5206 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi)
5207 ; AVX2-NEXT: testb $32, %al
5208 ; AVX2-NEXT: je .LBB15_12
5209 ; AVX2-NEXT: .LBB15_11: # %cond.store9
5210 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi)
5211 ; AVX2-NEXT: testb $64, %al
5212 ; AVX2-NEXT: je .LBB15_14
5213 ; AVX2-NEXT: .LBB15_13: # %cond.store11
5214 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi)
5215 ; AVX2-NEXT: testb %al, %al
5216 ; AVX2-NEXT: jns .LBB15_16
5217 ; AVX2-NEXT: .LBB15_15: # %cond.store13
5218 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi)
5219 ; AVX2-NEXT: testl $256, %eax # imm = 0x100
5220 ; AVX2-NEXT: je .LBB15_18
5221 ; AVX2-NEXT: .LBB15_17: # %cond.store15
5222 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi)
5223 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
5224 ; AVX2-NEXT: je .LBB15_20
5225 ; AVX2-NEXT: .LBB15_19: # %cond.store17
5226 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi)
5227 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
5228 ; AVX2-NEXT: je .LBB15_22
5229 ; AVX2-NEXT: .LBB15_21: # %cond.store19
5230 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi)
5231 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
5232 ; AVX2-NEXT: je .LBB15_24
5233 ; AVX2-NEXT: .LBB15_23: # %cond.store21
5234 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi)
5235 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
5236 ; AVX2-NEXT: je .LBB15_26
5237 ; AVX2-NEXT: .LBB15_25: # %cond.store23
5238 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi)
5239 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
5240 ; AVX2-NEXT: je .LBB15_28
5241 ; AVX2-NEXT: .LBB15_27: # %cond.store25
5242 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi)
5243 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
5244 ; AVX2-NEXT: je .LBB15_30
5245 ; AVX2-NEXT: .LBB15_29: # %cond.store27
5246 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi)
5247 ; AVX2-NEXT: testw %ax, %ax
5248 ; AVX2-NEXT: js .LBB15_31
5249 ; AVX2-NEXT: jmp .LBB15_32
5250 ; AVX2-NEXT: .LBB15_33: # %cond.store31
5251 ; AVX2-NEXT: vpextrb $0, %xmm0, 16(%rdi)
5252 ; AVX2-NEXT: testl $131072, %eax # imm = 0x20000
5253 ; AVX2-NEXT: je .LBB15_36
5254 ; AVX2-NEXT: .LBB15_35: # %cond.store33
5255 ; AVX2-NEXT: vpextrb $1, %xmm0, 17(%rdi)
5256 ; AVX2-NEXT: testl $262144, %eax # imm = 0x40000
5257 ; AVX2-NEXT: je .LBB15_38
5258 ; AVX2-NEXT: .LBB15_37: # %cond.store35
5259 ; AVX2-NEXT: vpextrb $2, %xmm0, 18(%rdi)
5260 ; AVX2-NEXT: testl $524288, %eax # imm = 0x80000
5261 ; AVX2-NEXT: je .LBB15_40
5262 ; AVX2-NEXT: .LBB15_39: # %cond.store37
5263 ; AVX2-NEXT: vpextrb $3, %xmm0, 19(%rdi)
5264 ; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000
5265 ; AVX2-NEXT: je .LBB15_42
5266 ; AVX2-NEXT: .LBB15_41: # %cond.store39
5267 ; AVX2-NEXT: vpextrb $4, %xmm0, 20(%rdi)
5268 ; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000
5269 ; AVX2-NEXT: je .LBB15_44
5270 ; AVX2-NEXT: .LBB15_43: # %cond.store41
5271 ; AVX2-NEXT: vpextrb $5, %xmm0, 21(%rdi)
5272 ; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000
5273 ; AVX2-NEXT: je .LBB15_46
5274 ; AVX2-NEXT: .LBB15_45: # %cond.store43
5275 ; AVX2-NEXT: vpextrb $6, %xmm0, 22(%rdi)
5276 ; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000
5277 ; AVX2-NEXT: je .LBB15_48
5278 ; AVX2-NEXT: .LBB15_47: # %cond.store45
5279 ; AVX2-NEXT: vpextrb $7, %xmm0, 23(%rdi)
5280 ; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000
5281 ; AVX2-NEXT: je .LBB15_50
5282 ; AVX2-NEXT: .LBB15_49: # %cond.store47
5283 ; AVX2-NEXT: vpextrb $8, %xmm0, 24(%rdi)
5284 ; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000
5285 ; AVX2-NEXT: je .LBB15_52
5286 ; AVX2-NEXT: .LBB15_51: # %cond.store49
5287 ; AVX2-NEXT: vpextrb $9, %xmm0, 25(%rdi)
5288 ; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000
5289 ; AVX2-NEXT: je .LBB15_54
5290 ; AVX2-NEXT: .LBB15_53: # %cond.store51
5291 ; AVX2-NEXT: vpextrb $10, %xmm0, 26(%rdi)
5292 ; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000
5293 ; AVX2-NEXT: je .LBB15_56
5294 ; AVX2-NEXT: .LBB15_55: # %cond.store53
5295 ; AVX2-NEXT: vpextrb $11, %xmm0, 27(%rdi)
5296 ; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000
5297 ; AVX2-NEXT: je .LBB15_58
5298 ; AVX2-NEXT: .LBB15_57: # %cond.store55
5299 ; AVX2-NEXT: vpextrb $12, %xmm0, 28(%rdi)
5300 ; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000
5301 ; AVX2-NEXT: je .LBB15_60
5302 ; AVX2-NEXT: .LBB15_59: # %cond.store57
5303 ; AVX2-NEXT: vpextrb $13, %xmm0, 29(%rdi)
5304 ; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000
5305 ; AVX2-NEXT: je .LBB15_62
5306 ; AVX2-NEXT: .LBB15_61: # %cond.store59
5307 ; AVX2-NEXT: vpextrb $14, %xmm0, 30(%rdi)
5308 ; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000
5309 ; AVX2-NEXT: je .LBB15_64
5310 ; AVX2-NEXT: .LBB15_63: # %cond.store61
5311 ; AVX2-NEXT: vpextrb $15, %xmm0, 31(%rdi)
5312 ; AVX2-NEXT: vzeroupper
5315 ; AVX512F-LABEL: truncstore_v32i16_v32i8:
5317 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2
5318 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1
5319 ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm2 = 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
5320 ; AVX512F-NEXT: vpmovdb %zmm2, %xmm2
5321 ; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm0
5322 ; 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
5323 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
5324 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm2, %ymm0
5325 ; AVX512F-NEXT: vpmovmskb %ymm1, %eax
5326 ; AVX512F-NEXT: notl %eax
5327 ; AVX512F-NEXT: testb $1, %al
5328 ; AVX512F-NEXT: jne .LBB15_1
5329 ; AVX512F-NEXT: # %bb.2: # %else
5330 ; AVX512F-NEXT: testb $2, %al
5331 ; AVX512F-NEXT: jne .LBB15_3
5332 ; AVX512F-NEXT: .LBB15_4: # %else2
5333 ; AVX512F-NEXT: testb $4, %al
5334 ; AVX512F-NEXT: jne .LBB15_5
5335 ; AVX512F-NEXT: .LBB15_6: # %else4
5336 ; AVX512F-NEXT: testb $8, %al
5337 ; AVX512F-NEXT: jne .LBB15_7
5338 ; AVX512F-NEXT: .LBB15_8: # %else6
5339 ; AVX512F-NEXT: testb $16, %al
5340 ; AVX512F-NEXT: jne .LBB15_9
5341 ; AVX512F-NEXT: .LBB15_10: # %else8
5342 ; AVX512F-NEXT: testb $32, %al
5343 ; AVX512F-NEXT: jne .LBB15_11
5344 ; AVX512F-NEXT: .LBB15_12: # %else10
5345 ; AVX512F-NEXT: testb $64, %al
5346 ; AVX512F-NEXT: jne .LBB15_13
5347 ; AVX512F-NEXT: .LBB15_14: # %else12
5348 ; AVX512F-NEXT: testb %al, %al
5349 ; AVX512F-NEXT: js .LBB15_15
5350 ; AVX512F-NEXT: .LBB15_16: # %else14
5351 ; AVX512F-NEXT: testl $256, %eax # imm = 0x100
5352 ; AVX512F-NEXT: jne .LBB15_17
5353 ; AVX512F-NEXT: .LBB15_18: # %else16
5354 ; AVX512F-NEXT: testl $512, %eax # imm = 0x200
5355 ; AVX512F-NEXT: jne .LBB15_19
5356 ; AVX512F-NEXT: .LBB15_20: # %else18
5357 ; AVX512F-NEXT: testl $1024, %eax # imm = 0x400
5358 ; AVX512F-NEXT: jne .LBB15_21
5359 ; AVX512F-NEXT: .LBB15_22: # %else20
5360 ; AVX512F-NEXT: testl $2048, %eax # imm = 0x800
5361 ; AVX512F-NEXT: jne .LBB15_23
5362 ; AVX512F-NEXT: .LBB15_24: # %else22
5363 ; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000
5364 ; AVX512F-NEXT: jne .LBB15_25
5365 ; AVX512F-NEXT: .LBB15_26: # %else24
5366 ; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000
5367 ; AVX512F-NEXT: jne .LBB15_27
5368 ; AVX512F-NEXT: .LBB15_28: # %else26
5369 ; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000
5370 ; AVX512F-NEXT: jne .LBB15_29
5371 ; AVX512F-NEXT: .LBB15_30: # %else28
5372 ; AVX512F-NEXT: testw %ax, %ax
5373 ; AVX512F-NEXT: jns .LBB15_32
5374 ; AVX512F-NEXT: .LBB15_31: # %cond.store29
5375 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi)
5376 ; AVX512F-NEXT: .LBB15_32: # %else30
5377 ; AVX512F-NEXT: testl $65536, %eax # imm = 0x10000
5378 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0
5379 ; AVX512F-NEXT: jne .LBB15_33
5380 ; AVX512F-NEXT: # %bb.34: # %else32
5381 ; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000
5382 ; AVX512F-NEXT: jne .LBB15_35
5383 ; AVX512F-NEXT: .LBB15_36: # %else34
5384 ; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000
5385 ; AVX512F-NEXT: jne .LBB15_37
5386 ; AVX512F-NEXT: .LBB15_38: # %else36
5387 ; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000
5388 ; AVX512F-NEXT: jne .LBB15_39
5389 ; AVX512F-NEXT: .LBB15_40: # %else38
5390 ; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000
5391 ; AVX512F-NEXT: jne .LBB15_41
5392 ; AVX512F-NEXT: .LBB15_42: # %else40
5393 ; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000
5394 ; AVX512F-NEXT: jne .LBB15_43
5395 ; AVX512F-NEXT: .LBB15_44: # %else42
5396 ; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000
5397 ; AVX512F-NEXT: jne .LBB15_45
5398 ; AVX512F-NEXT: .LBB15_46: # %else44
5399 ; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000
5400 ; AVX512F-NEXT: jne .LBB15_47
5401 ; AVX512F-NEXT: .LBB15_48: # %else46
5402 ; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000
5403 ; AVX512F-NEXT: jne .LBB15_49
5404 ; AVX512F-NEXT: .LBB15_50: # %else48
5405 ; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000
5406 ; AVX512F-NEXT: jne .LBB15_51
5407 ; AVX512F-NEXT: .LBB15_52: # %else50
5408 ; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000
5409 ; AVX512F-NEXT: jne .LBB15_53
5410 ; AVX512F-NEXT: .LBB15_54: # %else52
5411 ; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000
5412 ; AVX512F-NEXT: jne .LBB15_55
5413 ; AVX512F-NEXT: .LBB15_56: # %else54
5414 ; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000
5415 ; AVX512F-NEXT: jne .LBB15_57
5416 ; AVX512F-NEXT: .LBB15_58: # %else56
5417 ; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000
5418 ; AVX512F-NEXT: jne .LBB15_59
5419 ; AVX512F-NEXT: .LBB15_60: # %else58
5420 ; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000
5421 ; AVX512F-NEXT: jne .LBB15_61
5422 ; AVX512F-NEXT: .LBB15_62: # %else60
5423 ; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000
5424 ; AVX512F-NEXT: jne .LBB15_63
5425 ; AVX512F-NEXT: .LBB15_64: # %else62
5426 ; AVX512F-NEXT: vzeroupper
5427 ; AVX512F-NEXT: retq
5428 ; AVX512F-NEXT: .LBB15_1: # %cond.store
5429 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
5430 ; AVX512F-NEXT: testb $2, %al
5431 ; AVX512F-NEXT: je .LBB15_4
5432 ; AVX512F-NEXT: .LBB15_3: # %cond.store1
5433 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
5434 ; AVX512F-NEXT: testb $4, %al
5435 ; AVX512F-NEXT: je .LBB15_6
5436 ; AVX512F-NEXT: .LBB15_5: # %cond.store3
5437 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi)
5438 ; AVX512F-NEXT: testb $8, %al
5439 ; AVX512F-NEXT: je .LBB15_8
5440 ; AVX512F-NEXT: .LBB15_7: # %cond.store5
5441 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi)
5442 ; AVX512F-NEXT: testb $16, %al
5443 ; AVX512F-NEXT: je .LBB15_10
5444 ; AVX512F-NEXT: .LBB15_9: # %cond.store7
5445 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi)
5446 ; AVX512F-NEXT: testb $32, %al
5447 ; AVX512F-NEXT: je .LBB15_12
5448 ; AVX512F-NEXT: .LBB15_11: # %cond.store9
5449 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi)
5450 ; AVX512F-NEXT: testb $64, %al
5451 ; AVX512F-NEXT: je .LBB15_14
5452 ; AVX512F-NEXT: .LBB15_13: # %cond.store11
5453 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi)
5454 ; AVX512F-NEXT: testb %al, %al
5455 ; AVX512F-NEXT: jns .LBB15_16
5456 ; AVX512F-NEXT: .LBB15_15: # %cond.store13
5457 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi)
5458 ; AVX512F-NEXT: testl $256, %eax # imm = 0x100
5459 ; AVX512F-NEXT: je .LBB15_18
5460 ; AVX512F-NEXT: .LBB15_17: # %cond.store15
5461 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi)
5462 ; AVX512F-NEXT: testl $512, %eax # imm = 0x200
5463 ; AVX512F-NEXT: je .LBB15_20
5464 ; AVX512F-NEXT: .LBB15_19: # %cond.store17
5465 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi)
5466 ; AVX512F-NEXT: testl $1024, %eax # imm = 0x400
5467 ; AVX512F-NEXT: je .LBB15_22
5468 ; AVX512F-NEXT: .LBB15_21: # %cond.store19
5469 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi)
5470 ; AVX512F-NEXT: testl $2048, %eax # imm = 0x800
5471 ; AVX512F-NEXT: je .LBB15_24
5472 ; AVX512F-NEXT: .LBB15_23: # %cond.store21
5473 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi)
5474 ; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000
5475 ; AVX512F-NEXT: je .LBB15_26
5476 ; AVX512F-NEXT: .LBB15_25: # %cond.store23
5477 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi)
5478 ; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000
5479 ; AVX512F-NEXT: je .LBB15_28
5480 ; AVX512F-NEXT: .LBB15_27: # %cond.store25
5481 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi)
5482 ; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000
5483 ; AVX512F-NEXT: je .LBB15_30
5484 ; AVX512F-NEXT: .LBB15_29: # %cond.store27
5485 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi)
5486 ; AVX512F-NEXT: testw %ax, %ax
5487 ; AVX512F-NEXT: js .LBB15_31
5488 ; AVX512F-NEXT: jmp .LBB15_32
5489 ; AVX512F-NEXT: .LBB15_33: # %cond.store31
5490 ; AVX512F-NEXT: vpextrb $0, %xmm0, 16(%rdi)
5491 ; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000
5492 ; AVX512F-NEXT: je .LBB15_36
5493 ; AVX512F-NEXT: .LBB15_35: # %cond.store33
5494 ; AVX512F-NEXT: vpextrb $1, %xmm0, 17(%rdi)
5495 ; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000
5496 ; AVX512F-NEXT: je .LBB15_38
5497 ; AVX512F-NEXT: .LBB15_37: # %cond.store35
5498 ; AVX512F-NEXT: vpextrb $2, %xmm0, 18(%rdi)
5499 ; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000
5500 ; AVX512F-NEXT: je .LBB15_40
5501 ; AVX512F-NEXT: .LBB15_39: # %cond.store37
5502 ; AVX512F-NEXT: vpextrb $3, %xmm0, 19(%rdi)
5503 ; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000
5504 ; AVX512F-NEXT: je .LBB15_42
5505 ; AVX512F-NEXT: .LBB15_41: # %cond.store39
5506 ; AVX512F-NEXT: vpextrb $4, %xmm0, 20(%rdi)
5507 ; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000
5508 ; AVX512F-NEXT: je .LBB15_44
5509 ; AVX512F-NEXT: .LBB15_43: # %cond.store41
5510 ; AVX512F-NEXT: vpextrb $5, %xmm0, 21(%rdi)
5511 ; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000
5512 ; AVX512F-NEXT: je .LBB15_46
5513 ; AVX512F-NEXT: .LBB15_45: # %cond.store43
5514 ; AVX512F-NEXT: vpextrb $6, %xmm0, 22(%rdi)
5515 ; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000
5516 ; AVX512F-NEXT: je .LBB15_48
5517 ; AVX512F-NEXT: .LBB15_47: # %cond.store45
5518 ; AVX512F-NEXT: vpextrb $7, %xmm0, 23(%rdi)
5519 ; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000
5520 ; AVX512F-NEXT: je .LBB15_50
5521 ; AVX512F-NEXT: .LBB15_49: # %cond.store47
5522 ; AVX512F-NEXT: vpextrb $8, %xmm0, 24(%rdi)
5523 ; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000
5524 ; AVX512F-NEXT: je .LBB15_52
5525 ; AVX512F-NEXT: .LBB15_51: # %cond.store49
5526 ; AVX512F-NEXT: vpextrb $9, %xmm0, 25(%rdi)
5527 ; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000
5528 ; AVX512F-NEXT: je .LBB15_54
5529 ; AVX512F-NEXT: .LBB15_53: # %cond.store51
5530 ; AVX512F-NEXT: vpextrb $10, %xmm0, 26(%rdi)
5531 ; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000
5532 ; AVX512F-NEXT: je .LBB15_56
5533 ; AVX512F-NEXT: .LBB15_55: # %cond.store53
5534 ; AVX512F-NEXT: vpextrb $11, %xmm0, 27(%rdi)
5535 ; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000
5536 ; AVX512F-NEXT: je .LBB15_58
5537 ; AVX512F-NEXT: .LBB15_57: # %cond.store55
5538 ; AVX512F-NEXT: vpextrb $12, %xmm0, 28(%rdi)
5539 ; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000
5540 ; AVX512F-NEXT: je .LBB15_60
5541 ; AVX512F-NEXT: .LBB15_59: # %cond.store57
5542 ; AVX512F-NEXT: vpextrb $13, %xmm0, 29(%rdi)
5543 ; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000
5544 ; AVX512F-NEXT: je .LBB15_62
5545 ; AVX512F-NEXT: .LBB15_61: # %cond.store59
5546 ; AVX512F-NEXT: vpextrb $14, %xmm0, 30(%rdi)
5547 ; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000
5548 ; AVX512F-NEXT: je .LBB15_64
5549 ; AVX512F-NEXT: .LBB15_63: # %cond.store61
5550 ; AVX512F-NEXT: vpextrb $15, %xmm0, 31(%rdi)
5551 ; AVX512F-NEXT: vzeroupper
5552 ; AVX512F-NEXT: retq
5554 ; AVX512BW-LABEL: truncstore_v32i16_v32i8:
5555 ; AVX512BW: # %bb.0:
5556 ; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1
5557 ; AVX512BW-NEXT: vptestmb %zmm1, %zmm1, %k1
5558 ; AVX512BW-NEXT: vpmovwb %zmm0, (%rdi) {%k1}
5559 ; AVX512BW-NEXT: vzeroupper
5560 ; AVX512BW-NEXT: retq
5562 ; AVX512BWVL-LABEL: truncstore_v32i16_v32i8:
5563 ; AVX512BWVL: # %bb.0:
5564 ; AVX512BWVL-NEXT: vptestmb %ymm1, %ymm1, %k1
5565 ; AVX512BWVL-NEXT: vpmovwb %zmm0, (%rdi) {%k1}
5566 ; AVX512BWVL-NEXT: vzeroupper
5567 ; AVX512BWVL-NEXT: retq
5568 %a = icmp ne <32 x i8> %mask, zeroinitializer
5569 %b = trunc <32 x i16> %x to <32 x i8>
5570 call void @llvm.masked.store.v32i8.p0(<32 x i8> %b, ptr %p, i32 1, <32 x i1> %a)
5574 define void @truncstore_v16i16_v16i8(<16 x i16> %x, ptr %p, <16 x i8> %mask) {
5575 ; SSE2-LABEL: truncstore_v16i16_v16i8:
5577 ; SSE2-NEXT: pxor %xmm3, %xmm3
5578 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
5579 ; SSE2-NEXT: pand %xmm4, %xmm1
5580 ; SSE2-NEXT: pand %xmm4, %xmm0
5581 ; SSE2-NEXT: packuswb %xmm1, %xmm0
5582 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm3
5583 ; SSE2-NEXT: pmovmskb %xmm3, %eax
5584 ; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
5585 ; SSE2-NEXT: testb $1, %al
5586 ; SSE2-NEXT: movd %xmm0, %ecx
5587 ; SSE2-NEXT: jne .LBB16_1
5588 ; SSE2-NEXT: # %bb.2: # %else
5589 ; SSE2-NEXT: testb $2, %al
5590 ; SSE2-NEXT: jne .LBB16_3
5591 ; SSE2-NEXT: .LBB16_4: # %else2
5592 ; SSE2-NEXT: testb $4, %al
5593 ; SSE2-NEXT: jne .LBB16_5
5594 ; SSE2-NEXT: .LBB16_6: # %else4
5595 ; SSE2-NEXT: testb $8, %al
5596 ; SSE2-NEXT: je .LBB16_8
5597 ; SSE2-NEXT: .LBB16_7: # %cond.store5
5598 ; SSE2-NEXT: shrl $24, %ecx
5599 ; SSE2-NEXT: movb %cl, 3(%rdi)
5600 ; SSE2-NEXT: .LBB16_8: # %else6
5601 ; SSE2-NEXT: testb $16, %al
5602 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
5603 ; SSE2-NEXT: je .LBB16_10
5604 ; SSE2-NEXT: # %bb.9: # %cond.store7
5605 ; SSE2-NEXT: movb %cl, 4(%rdi)
5606 ; SSE2-NEXT: .LBB16_10: # %else8
5607 ; SSE2-NEXT: testb $32, %al
5608 ; SSE2-NEXT: je .LBB16_12
5609 ; SSE2-NEXT: # %bb.11: # %cond.store9
5610 ; SSE2-NEXT: movb %ch, 5(%rdi)
5611 ; SSE2-NEXT: .LBB16_12: # %else10
5612 ; SSE2-NEXT: testb $64, %al
5613 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
5614 ; SSE2-NEXT: je .LBB16_14
5615 ; SSE2-NEXT: # %bb.13: # %cond.store11
5616 ; SSE2-NEXT: movb %cl, 6(%rdi)
5617 ; SSE2-NEXT: .LBB16_14: # %else12
5618 ; SSE2-NEXT: testb %al, %al
5619 ; SSE2-NEXT: jns .LBB16_16
5620 ; SSE2-NEXT: # %bb.15: # %cond.store13
5621 ; SSE2-NEXT: movb %ch, 7(%rdi)
5622 ; SSE2-NEXT: .LBB16_16: # %else14
5623 ; SSE2-NEXT: testl $256, %eax # imm = 0x100
5624 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx
5625 ; SSE2-NEXT: je .LBB16_18
5626 ; SSE2-NEXT: # %bb.17: # %cond.store15
5627 ; SSE2-NEXT: movb %cl, 8(%rdi)
5628 ; SSE2-NEXT: .LBB16_18: # %else16
5629 ; SSE2-NEXT: testl $512, %eax # imm = 0x200
5630 ; SSE2-NEXT: je .LBB16_20
5631 ; SSE2-NEXT: # %bb.19: # %cond.store17
5632 ; SSE2-NEXT: movb %ch, 9(%rdi)
5633 ; SSE2-NEXT: .LBB16_20: # %else18
5634 ; SSE2-NEXT: testl $1024, %eax # imm = 0x400
5635 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx
5636 ; SSE2-NEXT: je .LBB16_22
5637 ; SSE2-NEXT: # %bb.21: # %cond.store19
5638 ; SSE2-NEXT: movb %cl, 10(%rdi)
5639 ; SSE2-NEXT: .LBB16_22: # %else20
5640 ; SSE2-NEXT: testl $2048, %eax # imm = 0x800
5641 ; SSE2-NEXT: je .LBB16_24
5642 ; SSE2-NEXT: # %bb.23: # %cond.store21
5643 ; SSE2-NEXT: movb %ch, 11(%rdi)
5644 ; SSE2-NEXT: .LBB16_24: # %else22
5645 ; SSE2-NEXT: testl $4096, %eax # imm = 0x1000
5646 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx
5647 ; SSE2-NEXT: je .LBB16_26
5648 ; SSE2-NEXT: # %bb.25: # %cond.store23
5649 ; SSE2-NEXT: movb %cl, 12(%rdi)
5650 ; SSE2-NEXT: .LBB16_26: # %else24
5651 ; SSE2-NEXT: testl $8192, %eax # imm = 0x2000
5652 ; SSE2-NEXT: je .LBB16_28
5653 ; SSE2-NEXT: # %bb.27: # %cond.store25
5654 ; SSE2-NEXT: movb %ch, 13(%rdi)
5655 ; SSE2-NEXT: .LBB16_28: # %else26
5656 ; SSE2-NEXT: testl $16384, %eax # imm = 0x4000
5657 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx
5658 ; SSE2-NEXT: jne .LBB16_29
5659 ; SSE2-NEXT: # %bb.30: # %else28
5660 ; SSE2-NEXT: testl $32768, %eax # imm = 0x8000
5661 ; SSE2-NEXT: jne .LBB16_31
5662 ; SSE2-NEXT: .LBB16_32: # %else30
5664 ; SSE2-NEXT: .LBB16_1: # %cond.store
5665 ; SSE2-NEXT: movb %cl, (%rdi)
5666 ; SSE2-NEXT: testb $2, %al
5667 ; SSE2-NEXT: je .LBB16_4
5668 ; SSE2-NEXT: .LBB16_3: # %cond.store1
5669 ; SSE2-NEXT: movb %ch, 1(%rdi)
5670 ; SSE2-NEXT: testb $4, %al
5671 ; SSE2-NEXT: je .LBB16_6
5672 ; SSE2-NEXT: .LBB16_5: # %cond.store3
5673 ; SSE2-NEXT: movl %ecx, %edx
5674 ; SSE2-NEXT: shrl $16, %edx
5675 ; SSE2-NEXT: movb %dl, 2(%rdi)
5676 ; SSE2-NEXT: testb $8, %al
5677 ; SSE2-NEXT: jne .LBB16_7
5678 ; SSE2-NEXT: jmp .LBB16_8
5679 ; SSE2-NEXT: .LBB16_29: # %cond.store27
5680 ; SSE2-NEXT: movb %cl, 14(%rdi)
5681 ; SSE2-NEXT: testl $32768, %eax # imm = 0x8000
5682 ; SSE2-NEXT: je .LBB16_32
5683 ; SSE2-NEXT: .LBB16_31: # %cond.store29
5684 ; SSE2-NEXT: movb %ch, 15(%rdi)
5687 ; SSE4-LABEL: truncstore_v16i16_v16i8:
5689 ; SSE4-NEXT: pxor %xmm3, %xmm3
5690 ; SSE4-NEXT: pmovzxbw {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
5691 ; SSE4-NEXT: pand %xmm4, %xmm1
5692 ; SSE4-NEXT: pand %xmm4, %xmm0
5693 ; SSE4-NEXT: packuswb %xmm1, %xmm0
5694 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm3
5695 ; SSE4-NEXT: pmovmskb %xmm3, %eax
5696 ; SSE4-NEXT: xorl $65535, %eax # imm = 0xFFFF
5697 ; SSE4-NEXT: testb $1, %al
5698 ; SSE4-NEXT: jne .LBB16_1
5699 ; SSE4-NEXT: # %bb.2: # %else
5700 ; SSE4-NEXT: testb $2, %al
5701 ; SSE4-NEXT: jne .LBB16_3
5702 ; SSE4-NEXT: .LBB16_4: # %else2
5703 ; SSE4-NEXT: testb $4, %al
5704 ; SSE4-NEXT: jne .LBB16_5
5705 ; SSE4-NEXT: .LBB16_6: # %else4
5706 ; SSE4-NEXT: testb $8, %al
5707 ; SSE4-NEXT: jne .LBB16_7
5708 ; SSE4-NEXT: .LBB16_8: # %else6
5709 ; SSE4-NEXT: testb $16, %al
5710 ; SSE4-NEXT: jne .LBB16_9
5711 ; SSE4-NEXT: .LBB16_10: # %else8
5712 ; SSE4-NEXT: testb $32, %al
5713 ; SSE4-NEXT: jne .LBB16_11
5714 ; SSE4-NEXT: .LBB16_12: # %else10
5715 ; SSE4-NEXT: testb $64, %al
5716 ; SSE4-NEXT: jne .LBB16_13
5717 ; SSE4-NEXT: .LBB16_14: # %else12
5718 ; SSE4-NEXT: testb %al, %al
5719 ; SSE4-NEXT: js .LBB16_15
5720 ; SSE4-NEXT: .LBB16_16: # %else14
5721 ; SSE4-NEXT: testl $256, %eax # imm = 0x100
5722 ; SSE4-NEXT: jne .LBB16_17
5723 ; SSE4-NEXT: .LBB16_18: # %else16
5724 ; SSE4-NEXT: testl $512, %eax # imm = 0x200
5725 ; SSE4-NEXT: jne .LBB16_19
5726 ; SSE4-NEXT: .LBB16_20: # %else18
5727 ; SSE4-NEXT: testl $1024, %eax # imm = 0x400
5728 ; SSE4-NEXT: jne .LBB16_21
5729 ; SSE4-NEXT: .LBB16_22: # %else20
5730 ; SSE4-NEXT: testl $2048, %eax # imm = 0x800
5731 ; SSE4-NEXT: jne .LBB16_23
5732 ; SSE4-NEXT: .LBB16_24: # %else22
5733 ; SSE4-NEXT: testl $4096, %eax # imm = 0x1000
5734 ; SSE4-NEXT: jne .LBB16_25
5735 ; SSE4-NEXT: .LBB16_26: # %else24
5736 ; SSE4-NEXT: testl $8192, %eax # imm = 0x2000
5737 ; SSE4-NEXT: jne .LBB16_27
5738 ; SSE4-NEXT: .LBB16_28: # %else26
5739 ; SSE4-NEXT: testl $16384, %eax # imm = 0x4000
5740 ; SSE4-NEXT: jne .LBB16_29
5741 ; SSE4-NEXT: .LBB16_30: # %else28
5742 ; SSE4-NEXT: testl $32768, %eax # imm = 0x8000
5743 ; SSE4-NEXT: jne .LBB16_31
5744 ; SSE4-NEXT: .LBB16_32: # %else30
5746 ; SSE4-NEXT: .LBB16_1: # %cond.store
5747 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
5748 ; SSE4-NEXT: testb $2, %al
5749 ; SSE4-NEXT: je .LBB16_4
5750 ; SSE4-NEXT: .LBB16_3: # %cond.store1
5751 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
5752 ; SSE4-NEXT: testb $4, %al
5753 ; SSE4-NEXT: je .LBB16_6
5754 ; SSE4-NEXT: .LBB16_5: # %cond.store3
5755 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi)
5756 ; SSE4-NEXT: testb $8, %al
5757 ; SSE4-NEXT: je .LBB16_8
5758 ; SSE4-NEXT: .LBB16_7: # %cond.store5
5759 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi)
5760 ; SSE4-NEXT: testb $16, %al
5761 ; SSE4-NEXT: je .LBB16_10
5762 ; SSE4-NEXT: .LBB16_9: # %cond.store7
5763 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi)
5764 ; SSE4-NEXT: testb $32, %al
5765 ; SSE4-NEXT: je .LBB16_12
5766 ; SSE4-NEXT: .LBB16_11: # %cond.store9
5767 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi)
5768 ; SSE4-NEXT: testb $64, %al
5769 ; SSE4-NEXT: je .LBB16_14
5770 ; SSE4-NEXT: .LBB16_13: # %cond.store11
5771 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi)
5772 ; SSE4-NEXT: testb %al, %al
5773 ; SSE4-NEXT: jns .LBB16_16
5774 ; SSE4-NEXT: .LBB16_15: # %cond.store13
5775 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi)
5776 ; SSE4-NEXT: testl $256, %eax # imm = 0x100
5777 ; SSE4-NEXT: je .LBB16_18
5778 ; SSE4-NEXT: .LBB16_17: # %cond.store15
5779 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi)
5780 ; SSE4-NEXT: testl $512, %eax # imm = 0x200
5781 ; SSE4-NEXT: je .LBB16_20
5782 ; SSE4-NEXT: .LBB16_19: # %cond.store17
5783 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi)
5784 ; SSE4-NEXT: testl $1024, %eax # imm = 0x400
5785 ; SSE4-NEXT: je .LBB16_22
5786 ; SSE4-NEXT: .LBB16_21: # %cond.store19
5787 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi)
5788 ; SSE4-NEXT: testl $2048, %eax # imm = 0x800
5789 ; SSE4-NEXT: je .LBB16_24
5790 ; SSE4-NEXT: .LBB16_23: # %cond.store21
5791 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi)
5792 ; SSE4-NEXT: testl $4096, %eax # imm = 0x1000
5793 ; SSE4-NEXT: je .LBB16_26
5794 ; SSE4-NEXT: .LBB16_25: # %cond.store23
5795 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi)
5796 ; SSE4-NEXT: testl $8192, %eax # imm = 0x2000
5797 ; SSE4-NEXT: je .LBB16_28
5798 ; SSE4-NEXT: .LBB16_27: # %cond.store25
5799 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi)
5800 ; SSE4-NEXT: testl $16384, %eax # imm = 0x4000
5801 ; SSE4-NEXT: je .LBB16_30
5802 ; SSE4-NEXT: .LBB16_29: # %cond.store27
5803 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi)
5804 ; SSE4-NEXT: testl $32768, %eax # imm = 0x8000
5805 ; SSE4-NEXT: je .LBB16_32
5806 ; SSE4-NEXT: .LBB16_31: # %cond.store29
5807 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi)
5810 ; AVX1-LABEL: truncstore_v16i16_v16i8:
5812 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
5813 ; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
5814 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
5815 ; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0
5816 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
5817 ; AVX1-NEXT: vpmovmskb %xmm1, %eax
5818 ; AVX1-NEXT: xorl $65535, %eax # imm = 0xFFFF
5819 ; AVX1-NEXT: testb $1, %al
5820 ; AVX1-NEXT: jne .LBB16_1
5821 ; AVX1-NEXT: # %bb.2: # %else
5822 ; AVX1-NEXT: testb $2, %al
5823 ; AVX1-NEXT: jne .LBB16_3
5824 ; AVX1-NEXT: .LBB16_4: # %else2
5825 ; AVX1-NEXT: testb $4, %al
5826 ; AVX1-NEXT: jne .LBB16_5
5827 ; AVX1-NEXT: .LBB16_6: # %else4
5828 ; AVX1-NEXT: testb $8, %al
5829 ; AVX1-NEXT: jne .LBB16_7
5830 ; AVX1-NEXT: .LBB16_8: # %else6
5831 ; AVX1-NEXT: testb $16, %al
5832 ; AVX1-NEXT: jne .LBB16_9
5833 ; AVX1-NEXT: .LBB16_10: # %else8
5834 ; AVX1-NEXT: testb $32, %al
5835 ; AVX1-NEXT: jne .LBB16_11
5836 ; AVX1-NEXT: .LBB16_12: # %else10
5837 ; AVX1-NEXT: testb $64, %al
5838 ; AVX1-NEXT: jne .LBB16_13
5839 ; AVX1-NEXT: .LBB16_14: # %else12
5840 ; AVX1-NEXT: testb %al, %al
5841 ; AVX1-NEXT: js .LBB16_15
5842 ; AVX1-NEXT: .LBB16_16: # %else14
5843 ; AVX1-NEXT: testl $256, %eax # imm = 0x100
5844 ; AVX1-NEXT: jne .LBB16_17
5845 ; AVX1-NEXT: .LBB16_18: # %else16
5846 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
5847 ; AVX1-NEXT: jne .LBB16_19
5848 ; AVX1-NEXT: .LBB16_20: # %else18
5849 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
5850 ; AVX1-NEXT: jne .LBB16_21
5851 ; AVX1-NEXT: .LBB16_22: # %else20
5852 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
5853 ; AVX1-NEXT: jne .LBB16_23
5854 ; AVX1-NEXT: .LBB16_24: # %else22
5855 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
5856 ; AVX1-NEXT: jne .LBB16_25
5857 ; AVX1-NEXT: .LBB16_26: # %else24
5858 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
5859 ; AVX1-NEXT: jne .LBB16_27
5860 ; AVX1-NEXT: .LBB16_28: # %else26
5861 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
5862 ; AVX1-NEXT: jne .LBB16_29
5863 ; AVX1-NEXT: .LBB16_30: # %else28
5864 ; AVX1-NEXT: testl $32768, %eax # imm = 0x8000
5865 ; AVX1-NEXT: jne .LBB16_31
5866 ; AVX1-NEXT: .LBB16_32: # %else30
5867 ; AVX1-NEXT: vzeroupper
5869 ; AVX1-NEXT: .LBB16_1: # %cond.store
5870 ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi)
5871 ; AVX1-NEXT: testb $2, %al
5872 ; AVX1-NEXT: je .LBB16_4
5873 ; AVX1-NEXT: .LBB16_3: # %cond.store1
5874 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi)
5875 ; AVX1-NEXT: testb $4, %al
5876 ; AVX1-NEXT: je .LBB16_6
5877 ; AVX1-NEXT: .LBB16_5: # %cond.store3
5878 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi)
5879 ; AVX1-NEXT: testb $8, %al
5880 ; AVX1-NEXT: je .LBB16_8
5881 ; AVX1-NEXT: .LBB16_7: # %cond.store5
5882 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi)
5883 ; AVX1-NEXT: testb $16, %al
5884 ; AVX1-NEXT: je .LBB16_10
5885 ; AVX1-NEXT: .LBB16_9: # %cond.store7
5886 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi)
5887 ; AVX1-NEXT: testb $32, %al
5888 ; AVX1-NEXT: je .LBB16_12
5889 ; AVX1-NEXT: .LBB16_11: # %cond.store9
5890 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi)
5891 ; AVX1-NEXT: testb $64, %al
5892 ; AVX1-NEXT: je .LBB16_14
5893 ; AVX1-NEXT: .LBB16_13: # %cond.store11
5894 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi)
5895 ; AVX1-NEXT: testb %al, %al
5896 ; AVX1-NEXT: jns .LBB16_16
5897 ; AVX1-NEXT: .LBB16_15: # %cond.store13
5898 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi)
5899 ; AVX1-NEXT: testl $256, %eax # imm = 0x100
5900 ; AVX1-NEXT: je .LBB16_18
5901 ; AVX1-NEXT: .LBB16_17: # %cond.store15
5902 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi)
5903 ; AVX1-NEXT: testl $512, %eax # imm = 0x200
5904 ; AVX1-NEXT: je .LBB16_20
5905 ; AVX1-NEXT: .LBB16_19: # %cond.store17
5906 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi)
5907 ; AVX1-NEXT: testl $1024, %eax # imm = 0x400
5908 ; AVX1-NEXT: je .LBB16_22
5909 ; AVX1-NEXT: .LBB16_21: # %cond.store19
5910 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi)
5911 ; AVX1-NEXT: testl $2048, %eax # imm = 0x800
5912 ; AVX1-NEXT: je .LBB16_24
5913 ; AVX1-NEXT: .LBB16_23: # %cond.store21
5914 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi)
5915 ; AVX1-NEXT: testl $4096, %eax # imm = 0x1000
5916 ; AVX1-NEXT: je .LBB16_26
5917 ; AVX1-NEXT: .LBB16_25: # %cond.store23
5918 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi)
5919 ; AVX1-NEXT: testl $8192, %eax # imm = 0x2000
5920 ; AVX1-NEXT: je .LBB16_28
5921 ; AVX1-NEXT: .LBB16_27: # %cond.store25
5922 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi)
5923 ; AVX1-NEXT: testl $16384, %eax # imm = 0x4000
5924 ; AVX1-NEXT: je .LBB16_30
5925 ; AVX1-NEXT: .LBB16_29: # %cond.store27
5926 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi)
5927 ; AVX1-NEXT: testl $32768, %eax # imm = 0x8000
5928 ; AVX1-NEXT: je .LBB16_32
5929 ; AVX1-NEXT: .LBB16_31: # %cond.store29
5930 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi)
5931 ; AVX1-NEXT: vzeroupper
5934 ; AVX2-LABEL: truncstore_v16i16_v16i8:
5936 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2
5937 ; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
5938 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3
5939 ; AVX2-NEXT: vpackuswb %xmm3, %xmm0, %xmm0
5940 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
5941 ; AVX2-NEXT: vpmovmskb %xmm1, %eax
5942 ; AVX2-NEXT: xorl $65535, %eax # imm = 0xFFFF
5943 ; AVX2-NEXT: testb $1, %al
5944 ; AVX2-NEXT: jne .LBB16_1
5945 ; AVX2-NEXT: # %bb.2: # %else
5946 ; AVX2-NEXT: testb $2, %al
5947 ; AVX2-NEXT: jne .LBB16_3
5948 ; AVX2-NEXT: .LBB16_4: # %else2
5949 ; AVX2-NEXT: testb $4, %al
5950 ; AVX2-NEXT: jne .LBB16_5
5951 ; AVX2-NEXT: .LBB16_6: # %else4
5952 ; AVX2-NEXT: testb $8, %al
5953 ; AVX2-NEXT: jne .LBB16_7
5954 ; AVX2-NEXT: .LBB16_8: # %else6
5955 ; AVX2-NEXT: testb $16, %al
5956 ; AVX2-NEXT: jne .LBB16_9
5957 ; AVX2-NEXT: .LBB16_10: # %else8
5958 ; AVX2-NEXT: testb $32, %al
5959 ; AVX2-NEXT: jne .LBB16_11
5960 ; AVX2-NEXT: .LBB16_12: # %else10
5961 ; AVX2-NEXT: testb $64, %al
5962 ; AVX2-NEXT: jne .LBB16_13
5963 ; AVX2-NEXT: .LBB16_14: # %else12
5964 ; AVX2-NEXT: testb %al, %al
5965 ; AVX2-NEXT: js .LBB16_15
5966 ; AVX2-NEXT: .LBB16_16: # %else14
5967 ; AVX2-NEXT: testl $256, %eax # imm = 0x100
5968 ; AVX2-NEXT: jne .LBB16_17
5969 ; AVX2-NEXT: .LBB16_18: # %else16
5970 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
5971 ; AVX2-NEXT: jne .LBB16_19
5972 ; AVX2-NEXT: .LBB16_20: # %else18
5973 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
5974 ; AVX2-NEXT: jne .LBB16_21
5975 ; AVX2-NEXT: .LBB16_22: # %else20
5976 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
5977 ; AVX2-NEXT: jne .LBB16_23
5978 ; AVX2-NEXT: .LBB16_24: # %else22
5979 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
5980 ; AVX2-NEXT: jne .LBB16_25
5981 ; AVX2-NEXT: .LBB16_26: # %else24
5982 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
5983 ; AVX2-NEXT: jne .LBB16_27
5984 ; AVX2-NEXT: .LBB16_28: # %else26
5985 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
5986 ; AVX2-NEXT: jne .LBB16_29
5987 ; AVX2-NEXT: .LBB16_30: # %else28
5988 ; AVX2-NEXT: testl $32768, %eax # imm = 0x8000
5989 ; AVX2-NEXT: jne .LBB16_31
5990 ; AVX2-NEXT: .LBB16_32: # %else30
5991 ; AVX2-NEXT: vzeroupper
5993 ; AVX2-NEXT: .LBB16_1: # %cond.store
5994 ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi)
5995 ; AVX2-NEXT: testb $2, %al
5996 ; AVX2-NEXT: je .LBB16_4
5997 ; AVX2-NEXT: .LBB16_3: # %cond.store1
5998 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi)
5999 ; AVX2-NEXT: testb $4, %al
6000 ; AVX2-NEXT: je .LBB16_6
6001 ; AVX2-NEXT: .LBB16_5: # %cond.store3
6002 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi)
6003 ; AVX2-NEXT: testb $8, %al
6004 ; AVX2-NEXT: je .LBB16_8
6005 ; AVX2-NEXT: .LBB16_7: # %cond.store5
6006 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi)
6007 ; AVX2-NEXT: testb $16, %al
6008 ; AVX2-NEXT: je .LBB16_10
6009 ; AVX2-NEXT: .LBB16_9: # %cond.store7
6010 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi)
6011 ; AVX2-NEXT: testb $32, %al
6012 ; AVX2-NEXT: je .LBB16_12
6013 ; AVX2-NEXT: .LBB16_11: # %cond.store9
6014 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi)
6015 ; AVX2-NEXT: testb $64, %al
6016 ; AVX2-NEXT: je .LBB16_14
6017 ; AVX2-NEXT: .LBB16_13: # %cond.store11
6018 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi)
6019 ; AVX2-NEXT: testb %al, %al
6020 ; AVX2-NEXT: jns .LBB16_16
6021 ; AVX2-NEXT: .LBB16_15: # %cond.store13
6022 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi)
6023 ; AVX2-NEXT: testl $256, %eax # imm = 0x100
6024 ; AVX2-NEXT: je .LBB16_18
6025 ; AVX2-NEXT: .LBB16_17: # %cond.store15
6026 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi)
6027 ; AVX2-NEXT: testl $512, %eax # imm = 0x200
6028 ; AVX2-NEXT: je .LBB16_20
6029 ; AVX2-NEXT: .LBB16_19: # %cond.store17
6030 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi)
6031 ; AVX2-NEXT: testl $1024, %eax # imm = 0x400
6032 ; AVX2-NEXT: je .LBB16_22
6033 ; AVX2-NEXT: .LBB16_21: # %cond.store19
6034 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi)
6035 ; AVX2-NEXT: testl $2048, %eax # imm = 0x800
6036 ; AVX2-NEXT: je .LBB16_24
6037 ; AVX2-NEXT: .LBB16_23: # %cond.store21
6038 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi)
6039 ; AVX2-NEXT: testl $4096, %eax # imm = 0x1000
6040 ; AVX2-NEXT: je .LBB16_26
6041 ; AVX2-NEXT: .LBB16_25: # %cond.store23
6042 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi)
6043 ; AVX2-NEXT: testl $8192, %eax # imm = 0x2000
6044 ; AVX2-NEXT: je .LBB16_28
6045 ; AVX2-NEXT: .LBB16_27: # %cond.store25
6046 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi)
6047 ; AVX2-NEXT: testl $16384, %eax # imm = 0x4000
6048 ; AVX2-NEXT: je .LBB16_30
6049 ; AVX2-NEXT: .LBB16_29: # %cond.store27
6050 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi)
6051 ; AVX2-NEXT: testl $32768, %eax # imm = 0x8000
6052 ; AVX2-NEXT: je .LBB16_32
6053 ; AVX2-NEXT: .LBB16_31: # %cond.store29
6054 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi)
6055 ; AVX2-NEXT: vzeroupper
6058 ; AVX512F-LABEL: truncstore_v16i16_v16i8:
6060 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2
6061 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1
6062 ; 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
6063 ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0
6064 ; AVX512F-NEXT: vpmovmskb %xmm1, %eax
6065 ; AVX512F-NEXT: xorl $65535, %eax # imm = 0xFFFF
6066 ; AVX512F-NEXT: testb $1, %al
6067 ; AVX512F-NEXT: jne .LBB16_1
6068 ; AVX512F-NEXT: # %bb.2: # %else
6069 ; AVX512F-NEXT: testb $2, %al
6070 ; AVX512F-NEXT: jne .LBB16_3
6071 ; AVX512F-NEXT: .LBB16_4: # %else2
6072 ; AVX512F-NEXT: testb $4, %al
6073 ; AVX512F-NEXT: jne .LBB16_5
6074 ; AVX512F-NEXT: .LBB16_6: # %else4
6075 ; AVX512F-NEXT: testb $8, %al
6076 ; AVX512F-NEXT: jne .LBB16_7
6077 ; AVX512F-NEXT: .LBB16_8: # %else6
6078 ; AVX512F-NEXT: testb $16, %al
6079 ; AVX512F-NEXT: jne .LBB16_9
6080 ; AVX512F-NEXT: .LBB16_10: # %else8
6081 ; AVX512F-NEXT: testb $32, %al
6082 ; AVX512F-NEXT: jne .LBB16_11
6083 ; AVX512F-NEXT: .LBB16_12: # %else10
6084 ; AVX512F-NEXT: testb $64, %al
6085 ; AVX512F-NEXT: jne .LBB16_13
6086 ; AVX512F-NEXT: .LBB16_14: # %else12
6087 ; AVX512F-NEXT: testb %al, %al
6088 ; AVX512F-NEXT: js .LBB16_15
6089 ; AVX512F-NEXT: .LBB16_16: # %else14
6090 ; AVX512F-NEXT: testl $256, %eax # imm = 0x100
6091 ; AVX512F-NEXT: jne .LBB16_17
6092 ; AVX512F-NEXT: .LBB16_18: # %else16
6093 ; AVX512F-NEXT: testl $512, %eax # imm = 0x200
6094 ; AVX512F-NEXT: jne .LBB16_19
6095 ; AVX512F-NEXT: .LBB16_20: # %else18
6096 ; AVX512F-NEXT: testl $1024, %eax # imm = 0x400
6097 ; AVX512F-NEXT: jne .LBB16_21
6098 ; AVX512F-NEXT: .LBB16_22: # %else20
6099 ; AVX512F-NEXT: testl $2048, %eax # imm = 0x800
6100 ; AVX512F-NEXT: jne .LBB16_23
6101 ; AVX512F-NEXT: .LBB16_24: # %else22
6102 ; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000
6103 ; AVX512F-NEXT: jne .LBB16_25
6104 ; AVX512F-NEXT: .LBB16_26: # %else24
6105 ; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000
6106 ; AVX512F-NEXT: jne .LBB16_27
6107 ; AVX512F-NEXT: .LBB16_28: # %else26
6108 ; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000
6109 ; AVX512F-NEXT: jne .LBB16_29
6110 ; AVX512F-NEXT: .LBB16_30: # %else28
6111 ; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000
6112 ; AVX512F-NEXT: jne .LBB16_31
6113 ; AVX512F-NEXT: .LBB16_32: # %else30
6114 ; AVX512F-NEXT: vzeroupper
6115 ; AVX512F-NEXT: retq
6116 ; AVX512F-NEXT: .LBB16_1: # %cond.store
6117 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
6118 ; AVX512F-NEXT: testb $2, %al
6119 ; AVX512F-NEXT: je .LBB16_4
6120 ; AVX512F-NEXT: .LBB16_3: # %cond.store1
6121 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
6122 ; AVX512F-NEXT: testb $4, %al
6123 ; AVX512F-NEXT: je .LBB16_6
6124 ; AVX512F-NEXT: .LBB16_5: # %cond.store3
6125 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi)
6126 ; AVX512F-NEXT: testb $8, %al
6127 ; AVX512F-NEXT: je .LBB16_8
6128 ; AVX512F-NEXT: .LBB16_7: # %cond.store5
6129 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi)
6130 ; AVX512F-NEXT: testb $16, %al
6131 ; AVX512F-NEXT: je .LBB16_10
6132 ; AVX512F-NEXT: .LBB16_9: # %cond.store7
6133 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi)
6134 ; AVX512F-NEXT: testb $32, %al
6135 ; AVX512F-NEXT: je .LBB16_12
6136 ; AVX512F-NEXT: .LBB16_11: # %cond.store9
6137 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi)
6138 ; AVX512F-NEXT: testb $64, %al
6139 ; AVX512F-NEXT: je .LBB16_14
6140 ; AVX512F-NEXT: .LBB16_13: # %cond.store11
6141 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi)
6142 ; AVX512F-NEXT: testb %al, %al
6143 ; AVX512F-NEXT: jns .LBB16_16
6144 ; AVX512F-NEXT: .LBB16_15: # %cond.store13
6145 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi)
6146 ; AVX512F-NEXT: testl $256, %eax # imm = 0x100
6147 ; AVX512F-NEXT: je .LBB16_18
6148 ; AVX512F-NEXT: .LBB16_17: # %cond.store15
6149 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi)
6150 ; AVX512F-NEXT: testl $512, %eax # imm = 0x200
6151 ; AVX512F-NEXT: je .LBB16_20
6152 ; AVX512F-NEXT: .LBB16_19: # %cond.store17
6153 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi)
6154 ; AVX512F-NEXT: testl $1024, %eax # imm = 0x400
6155 ; AVX512F-NEXT: je .LBB16_22
6156 ; AVX512F-NEXT: .LBB16_21: # %cond.store19
6157 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi)
6158 ; AVX512F-NEXT: testl $2048, %eax # imm = 0x800
6159 ; AVX512F-NEXT: je .LBB16_24
6160 ; AVX512F-NEXT: .LBB16_23: # %cond.store21
6161 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi)
6162 ; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000
6163 ; AVX512F-NEXT: je .LBB16_26
6164 ; AVX512F-NEXT: .LBB16_25: # %cond.store23
6165 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi)
6166 ; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000
6167 ; AVX512F-NEXT: je .LBB16_28
6168 ; AVX512F-NEXT: .LBB16_27: # %cond.store25
6169 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi)
6170 ; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000
6171 ; AVX512F-NEXT: je .LBB16_30
6172 ; AVX512F-NEXT: .LBB16_29: # %cond.store27
6173 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi)
6174 ; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000
6175 ; AVX512F-NEXT: je .LBB16_32
6176 ; AVX512F-NEXT: .LBB16_31: # %cond.store29
6177 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi)
6178 ; AVX512F-NEXT: vzeroupper
6179 ; AVX512F-NEXT: retq
6181 ; AVX512BW-LABEL: truncstore_v16i16_v16i8:
6182 ; AVX512BW: # %bb.0:
6183 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
6184 ; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0
6185 ; AVX512BW-NEXT: vptestmb %zmm1, %zmm1, %k0
6186 ; AVX512BW-NEXT: kmovw %k0, %k1
6187 ; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0
6188 ; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1}
6189 ; AVX512BW-NEXT: vzeroupper
6190 ; AVX512BW-NEXT: retq
6192 ; AVX512BWVL-LABEL: truncstore_v16i16_v16i8:
6193 ; AVX512BWVL: # %bb.0:
6194 ; AVX512BWVL-NEXT: vptestmb %xmm1, %xmm1, %k1
6195 ; AVX512BWVL-NEXT: vpmovwb %ymm0, (%rdi) {%k1}
6196 ; AVX512BWVL-NEXT: vzeroupper
6197 ; AVX512BWVL-NEXT: retq
6198 %a = icmp ne <16 x i8> %mask, zeroinitializer
6199 %b = trunc <16 x i16> %x to <16 x i8>
6200 call void @llvm.masked.store.v16i8.p0(<16 x i8> %b, ptr %p, i32 1, <16 x i1> %a)
6204 define void @truncstore_v8i16_v8i8(<8 x i16> %x, ptr %p, <8 x i16> %mask) {
6205 ; SSE2-LABEL: truncstore_v8i16_v8i8:
6207 ; SSE2-NEXT: pxor %xmm2, %xmm2
6208 ; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
6209 ; SSE2-NEXT: packuswb %xmm0, %xmm0
6210 ; SSE2-NEXT: pcmpeqw %xmm1, %xmm2
6211 ; SSE2-NEXT: packsswb %xmm2, %xmm2
6212 ; SSE2-NEXT: pmovmskb %xmm2, %eax
6213 ; SSE2-NEXT: notl %eax
6214 ; SSE2-NEXT: testb $1, %al
6215 ; SSE2-NEXT: movd %xmm0, %ecx
6216 ; SSE2-NEXT: jne .LBB17_1
6217 ; SSE2-NEXT: # %bb.2: # %else
6218 ; SSE2-NEXT: testb $2, %al
6219 ; SSE2-NEXT: jne .LBB17_3
6220 ; SSE2-NEXT: .LBB17_4: # %else2
6221 ; SSE2-NEXT: testb $4, %al
6222 ; SSE2-NEXT: jne .LBB17_5
6223 ; SSE2-NEXT: .LBB17_6: # %else4
6224 ; SSE2-NEXT: testb $8, %al
6225 ; SSE2-NEXT: je .LBB17_8
6226 ; SSE2-NEXT: .LBB17_7: # %cond.store5
6227 ; SSE2-NEXT: shrl $24, %ecx
6228 ; SSE2-NEXT: movb %cl, 3(%rdi)
6229 ; SSE2-NEXT: .LBB17_8: # %else6
6230 ; SSE2-NEXT: testb $16, %al
6231 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx
6232 ; SSE2-NEXT: je .LBB17_10
6233 ; SSE2-NEXT: # %bb.9: # %cond.store7
6234 ; SSE2-NEXT: movb %cl, 4(%rdi)
6235 ; SSE2-NEXT: .LBB17_10: # %else8
6236 ; SSE2-NEXT: testb $32, %al
6237 ; SSE2-NEXT: je .LBB17_12
6238 ; SSE2-NEXT: # %bb.11: # %cond.store9
6239 ; SSE2-NEXT: movb %ch, 5(%rdi)
6240 ; SSE2-NEXT: .LBB17_12: # %else10
6241 ; SSE2-NEXT: testb $64, %al
6242 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx
6243 ; SSE2-NEXT: jne .LBB17_13
6244 ; SSE2-NEXT: # %bb.14: # %else12
6245 ; SSE2-NEXT: testb $-128, %al
6246 ; SSE2-NEXT: jne .LBB17_15
6247 ; SSE2-NEXT: .LBB17_16: # %else14
6249 ; SSE2-NEXT: .LBB17_1: # %cond.store
6250 ; SSE2-NEXT: movb %cl, (%rdi)
6251 ; SSE2-NEXT: testb $2, %al
6252 ; SSE2-NEXT: je .LBB17_4
6253 ; SSE2-NEXT: .LBB17_3: # %cond.store1
6254 ; SSE2-NEXT: movb %ch, 1(%rdi)
6255 ; SSE2-NEXT: testb $4, %al
6256 ; SSE2-NEXT: je .LBB17_6
6257 ; SSE2-NEXT: .LBB17_5: # %cond.store3
6258 ; SSE2-NEXT: movl %ecx, %edx
6259 ; SSE2-NEXT: shrl $16, %edx
6260 ; SSE2-NEXT: movb %dl, 2(%rdi)
6261 ; SSE2-NEXT: testb $8, %al
6262 ; SSE2-NEXT: jne .LBB17_7
6263 ; SSE2-NEXT: jmp .LBB17_8
6264 ; SSE2-NEXT: .LBB17_13: # %cond.store11
6265 ; SSE2-NEXT: movb %cl, 6(%rdi)
6266 ; SSE2-NEXT: testb $-128, %al
6267 ; SSE2-NEXT: je .LBB17_16
6268 ; SSE2-NEXT: .LBB17_15: # %cond.store13
6269 ; SSE2-NEXT: movb %ch, 7(%rdi)
6272 ; SSE4-LABEL: truncstore_v8i16_v8i8:
6274 ; SSE4-NEXT: pxor %xmm2, %xmm2
6275 ; SSE4-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
6276 ; SSE4-NEXT: pcmpeqw %xmm1, %xmm2
6277 ; SSE4-NEXT: packsswb %xmm2, %xmm2
6278 ; SSE4-NEXT: pmovmskb %xmm2, %eax
6279 ; SSE4-NEXT: notl %eax
6280 ; SSE4-NEXT: testb $1, %al
6281 ; SSE4-NEXT: jne .LBB17_1
6282 ; SSE4-NEXT: # %bb.2: # %else
6283 ; SSE4-NEXT: testb $2, %al
6284 ; SSE4-NEXT: jne .LBB17_3
6285 ; SSE4-NEXT: .LBB17_4: # %else2
6286 ; SSE4-NEXT: testb $4, %al
6287 ; SSE4-NEXT: jne .LBB17_5
6288 ; SSE4-NEXT: .LBB17_6: # %else4
6289 ; SSE4-NEXT: testb $8, %al
6290 ; SSE4-NEXT: jne .LBB17_7
6291 ; SSE4-NEXT: .LBB17_8: # %else6
6292 ; SSE4-NEXT: testb $16, %al
6293 ; SSE4-NEXT: jne .LBB17_9
6294 ; SSE4-NEXT: .LBB17_10: # %else8
6295 ; SSE4-NEXT: testb $32, %al
6296 ; SSE4-NEXT: jne .LBB17_11
6297 ; SSE4-NEXT: .LBB17_12: # %else10
6298 ; SSE4-NEXT: testb $64, %al
6299 ; SSE4-NEXT: jne .LBB17_13
6300 ; SSE4-NEXT: .LBB17_14: # %else12
6301 ; SSE4-NEXT: testb $-128, %al
6302 ; SSE4-NEXT: jne .LBB17_15
6303 ; SSE4-NEXT: .LBB17_16: # %else14
6305 ; SSE4-NEXT: .LBB17_1: # %cond.store
6306 ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi)
6307 ; SSE4-NEXT: testb $2, %al
6308 ; SSE4-NEXT: je .LBB17_4
6309 ; SSE4-NEXT: .LBB17_3: # %cond.store1
6310 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi)
6311 ; SSE4-NEXT: testb $4, %al
6312 ; SSE4-NEXT: je .LBB17_6
6313 ; SSE4-NEXT: .LBB17_5: # %cond.store3
6314 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi)
6315 ; SSE4-NEXT: testb $8, %al
6316 ; SSE4-NEXT: je .LBB17_8
6317 ; SSE4-NEXT: .LBB17_7: # %cond.store5
6318 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi)
6319 ; SSE4-NEXT: testb $16, %al
6320 ; SSE4-NEXT: je .LBB17_10
6321 ; SSE4-NEXT: .LBB17_9: # %cond.store7
6322 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi)
6323 ; SSE4-NEXT: testb $32, %al
6324 ; SSE4-NEXT: je .LBB17_12
6325 ; SSE4-NEXT: .LBB17_11: # %cond.store9
6326 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi)
6327 ; SSE4-NEXT: testb $64, %al
6328 ; SSE4-NEXT: je .LBB17_14
6329 ; SSE4-NEXT: .LBB17_13: # %cond.store11
6330 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi)
6331 ; SSE4-NEXT: testb $-128, %al
6332 ; SSE4-NEXT: je .LBB17_16
6333 ; SSE4-NEXT: .LBB17_15: # %cond.store13
6334 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi)
6337 ; AVX-LABEL: truncstore_v8i16_v8i8:
6339 ; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2
6340 ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
6341 ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1
6342 ; AVX-NEXT: vpacksswb %xmm1, %xmm1, %xmm1
6343 ; AVX-NEXT: vpmovmskb %xmm1, %eax
6344 ; AVX-NEXT: notl %eax
6345 ; AVX-NEXT: testb $1, %al
6346 ; AVX-NEXT: jne .LBB17_1
6347 ; AVX-NEXT: # %bb.2: # %else
6348 ; AVX-NEXT: testb $2, %al
6349 ; AVX-NEXT: jne .LBB17_3
6350 ; AVX-NEXT: .LBB17_4: # %else2
6351 ; AVX-NEXT: testb $4, %al
6352 ; AVX-NEXT: jne .LBB17_5
6353 ; AVX-NEXT: .LBB17_6: # %else4
6354 ; AVX-NEXT: testb $8, %al
6355 ; AVX-NEXT: jne .LBB17_7
6356 ; AVX-NEXT: .LBB17_8: # %else6
6357 ; AVX-NEXT: testb $16, %al
6358 ; AVX-NEXT: jne .LBB17_9
6359 ; AVX-NEXT: .LBB17_10: # %else8
6360 ; AVX-NEXT: testb $32, %al
6361 ; AVX-NEXT: jne .LBB17_11
6362 ; AVX-NEXT: .LBB17_12: # %else10
6363 ; AVX-NEXT: testb $64, %al
6364 ; AVX-NEXT: jne .LBB17_13
6365 ; AVX-NEXT: .LBB17_14: # %else12
6366 ; AVX-NEXT: testb $-128, %al
6367 ; AVX-NEXT: jne .LBB17_15
6368 ; AVX-NEXT: .LBB17_16: # %else14
6370 ; AVX-NEXT: .LBB17_1: # %cond.store
6371 ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi)
6372 ; AVX-NEXT: testb $2, %al
6373 ; AVX-NEXT: je .LBB17_4
6374 ; AVX-NEXT: .LBB17_3: # %cond.store1
6375 ; AVX-NEXT: vpextrb $1, %xmm0, 1(%rdi)
6376 ; AVX-NEXT: testb $4, %al
6377 ; AVX-NEXT: je .LBB17_6
6378 ; AVX-NEXT: .LBB17_5: # %cond.store3
6379 ; AVX-NEXT: vpextrb $2, %xmm0, 2(%rdi)
6380 ; AVX-NEXT: testb $8, %al
6381 ; AVX-NEXT: je .LBB17_8
6382 ; AVX-NEXT: .LBB17_7: # %cond.store5
6383 ; AVX-NEXT: vpextrb $3, %xmm0, 3(%rdi)
6384 ; AVX-NEXT: testb $16, %al
6385 ; AVX-NEXT: je .LBB17_10
6386 ; AVX-NEXT: .LBB17_9: # %cond.store7
6387 ; AVX-NEXT: vpextrb $4, %xmm0, 4(%rdi)
6388 ; AVX-NEXT: testb $32, %al
6389 ; AVX-NEXT: je .LBB17_12
6390 ; AVX-NEXT: .LBB17_11: # %cond.store9
6391 ; AVX-NEXT: vpextrb $5, %xmm0, 5(%rdi)
6392 ; AVX-NEXT: testb $64, %al
6393 ; AVX-NEXT: je .LBB17_14
6394 ; AVX-NEXT: .LBB17_13: # %cond.store11
6395 ; AVX-NEXT: vpextrb $6, %xmm0, 6(%rdi)
6396 ; AVX-NEXT: testb $-128, %al
6397 ; AVX-NEXT: je .LBB17_16
6398 ; AVX-NEXT: .LBB17_15: # %cond.store13
6399 ; AVX-NEXT: vpextrb $7, %xmm0, 7(%rdi)
6402 ; AVX512F-LABEL: truncstore_v8i16_v8i8:
6404 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2
6405 ; AVX512F-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1
6406 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1
6407 ; AVX512F-NEXT: vpmovsxwq %xmm1, %zmm1
6408 ; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0
6409 ; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
6410 ; AVX512F-NEXT: kmovw %k0, %eax
6411 ; AVX512F-NEXT: testb $1, %al
6412 ; AVX512F-NEXT: jne .LBB17_1
6413 ; AVX512F-NEXT: # %bb.2: # %else
6414 ; AVX512F-NEXT: testb $2, %al
6415 ; AVX512F-NEXT: jne .LBB17_3
6416 ; AVX512F-NEXT: .LBB17_4: # %else2
6417 ; AVX512F-NEXT: testb $4, %al
6418 ; AVX512F-NEXT: jne .LBB17_5
6419 ; AVX512F-NEXT: .LBB17_6: # %else4
6420 ; AVX512F-NEXT: testb $8, %al
6421 ; AVX512F-NEXT: jne .LBB17_7
6422 ; AVX512F-NEXT: .LBB17_8: # %else6
6423 ; AVX512F-NEXT: testb $16, %al
6424 ; AVX512F-NEXT: jne .LBB17_9
6425 ; AVX512F-NEXT: .LBB17_10: # %else8
6426 ; AVX512F-NEXT: testb $32, %al
6427 ; AVX512F-NEXT: jne .LBB17_11
6428 ; AVX512F-NEXT: .LBB17_12: # %else10
6429 ; AVX512F-NEXT: testb $64, %al
6430 ; AVX512F-NEXT: jne .LBB17_13
6431 ; AVX512F-NEXT: .LBB17_14: # %else12
6432 ; AVX512F-NEXT: testb $-128, %al
6433 ; AVX512F-NEXT: jne .LBB17_15
6434 ; AVX512F-NEXT: .LBB17_16: # %else14
6435 ; AVX512F-NEXT: vzeroupper
6436 ; AVX512F-NEXT: retq
6437 ; AVX512F-NEXT: .LBB17_1: # %cond.store
6438 ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi)
6439 ; AVX512F-NEXT: testb $2, %al
6440 ; AVX512F-NEXT: je .LBB17_4
6441 ; AVX512F-NEXT: .LBB17_3: # %cond.store1
6442 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi)
6443 ; AVX512F-NEXT: testb $4, %al
6444 ; AVX512F-NEXT: je .LBB17_6
6445 ; AVX512F-NEXT: .LBB17_5: # %cond.store3
6446 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi)
6447 ; AVX512F-NEXT: testb $8, %al
6448 ; AVX512F-NEXT: je .LBB17_8
6449 ; AVX512F-NEXT: .LBB17_7: # %cond.store5
6450 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi)
6451 ; AVX512F-NEXT: testb $16, %al
6452 ; AVX512F-NEXT: je .LBB17_10
6453 ; AVX512F-NEXT: .LBB17_9: # %cond.store7
6454 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi)
6455 ; AVX512F-NEXT: testb $32, %al
6456 ; AVX512F-NEXT: je .LBB17_12
6457 ; AVX512F-NEXT: .LBB17_11: # %cond.store9
6458 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi)
6459 ; AVX512F-NEXT: testb $64, %al
6460 ; AVX512F-NEXT: je .LBB17_14
6461 ; AVX512F-NEXT: .LBB17_13: # %cond.store11
6462 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi)
6463 ; AVX512F-NEXT: testb $-128, %al
6464 ; AVX512F-NEXT: je .LBB17_16
6465 ; AVX512F-NEXT: .LBB17_15: # %cond.store13
6466 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi)
6467 ; AVX512F-NEXT: vzeroupper
6468 ; AVX512F-NEXT: retq
6470 ; AVX512BW-LABEL: truncstore_v8i16_v8i8:
6471 ; AVX512BW: # %bb.0:
6472 ; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1
6473 ; AVX512BW-NEXT: vptestmw %zmm1, %zmm1, %k0
6474 ; AVX512BW-NEXT: kshiftlq $56, %k0, %k0
6475 ; AVX512BW-NEXT: kshiftrq $56, %k0, %k1
6476 ; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
6477 ; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1}
6478 ; AVX512BW-NEXT: vzeroupper
6479 ; AVX512BW-NEXT: retq
6481 ; AVX512BWVL-LABEL: truncstore_v8i16_v8i8:
6482 ; AVX512BWVL: # %bb.0:
6483 ; AVX512BWVL-NEXT: vptestmw %xmm1, %xmm1, %k1
6484 ; AVX512BWVL-NEXT: vpmovwb %xmm0, (%rdi) {%k1}
6485 ; AVX512BWVL-NEXT: retq
6486 %a = icmp ne <8 x i16> %mask, zeroinitializer
6487 %b = trunc <8 x i16> %x to <8 x i8>
6488 call void @llvm.masked.store.v8i8.p0(<8 x i8> %b, ptr %p, i32 1, <8 x i1> %a)
6492 declare void @llvm.masked.store.v8i32.p0(<8 x i32>, ptr, i32, <8 x i1>)
6493 declare void @llvm.masked.store.v8i16.p0(<8 x i16>, ptr, i32, <8 x i1>)
6494 declare void @llvm.masked.store.v8i8.p0(<8 x i8>, ptr, i32, <8 x i1>)
6495 declare void @llvm.masked.store.v4i32.p0(<4 x i32>, ptr, i32, <4 x i1>)
6496 declare void @llvm.masked.store.v4i16.p0(<4 x i16>, ptr, i32, <4 x i1>)
6497 declare void @llvm.masked.store.v4i8.p0(<4 x i8>, ptr, i32, <4 x i1>)
6498 declare void @llvm.masked.store.v2i32.p0(<2 x i32>, ptr, i32, <2 x i1>)
6499 declare void @llvm.masked.store.v2i16.p0(<2 x i16>, ptr, i32, <2 x i1>)
6500 declare void @llvm.masked.store.v2i8.p0(<2 x i8>, ptr, i32, <2 x i1>)
6501 declare void @llvm.masked.store.v16i16.p0(<16 x i16>, ptr, i32, <16 x i1>)
6502 declare void @llvm.masked.store.v16i8.p0(<16 x i8>, ptr, i32, <16 x i1>)
6503 declare void @llvm.masked.store.v32i8.p0(<32 x i8>, ptr, i32, <32 x i1>)