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