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