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