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