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