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