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