1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2    | FileCheck %s --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2  | FileCheck %s --check-prefix=SSE4
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx     | FileCheck %s --check-prefixes=AVX,AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2    | FileCheck %s --check-prefixes=AVX,AVX2
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=AVX512F
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl | FileCheck %s --check-prefix=AVX512VL
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=AVX512BW
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl,avx512bw | FileCheck %s --check-prefixes=AVX512VL,AVX512BWVL
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 %xmm8, %xmm8
15; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [2147483647,2147483647]
16; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648]
17; SSE2-NEXT:    movdqa %xmm2, %xmm6
18; SSE2-NEXT:    pxor %xmm11, %xmm6
19; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [4294967295,4294967295]
20; SSE2-NEXT:    movdqa %xmm10, %xmm7
21; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
22; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2]
23; SSE2-NEXT:    pcmpeqd %xmm10, %xmm6
24; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
25; SSE2-NEXT:    pand %xmm12, %xmm6
26; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
27; SSE2-NEXT:    por %xmm6, %xmm13
28; SSE2-NEXT:    pand %xmm13, %xmm2
29; SSE2-NEXT:    pandn %xmm9, %xmm13
30; SSE2-NEXT:    por %xmm2, %xmm13
31; SSE2-NEXT:    movdqa %xmm3, %xmm2
32; SSE2-NEXT:    pxor %xmm11, %xmm2
33; SSE2-NEXT:    movdqa %xmm10, %xmm6
34; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
35; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2]
36; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
37; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
38; SSE2-NEXT:    pand %xmm12, %xmm7
39; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
40; SSE2-NEXT:    por %xmm7, %xmm2
41; SSE2-NEXT:    pand %xmm2, %xmm3
42; SSE2-NEXT:    pandn %xmm9, %xmm2
43; SSE2-NEXT:    por %xmm3, %xmm2
44; SSE2-NEXT:    movdqa %xmm0, %xmm3
45; SSE2-NEXT:    pxor %xmm11, %xmm3
46; SSE2-NEXT:    movdqa %xmm10, %xmm6
47; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
48; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2]
49; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
50; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
51; SSE2-NEXT:    pand %xmm12, %xmm7
52; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
53; SSE2-NEXT:    por %xmm7, %xmm3
54; SSE2-NEXT:    pand %xmm3, %xmm0
55; SSE2-NEXT:    pandn %xmm9, %xmm3
56; SSE2-NEXT:    por %xmm0, %xmm3
57; SSE2-NEXT:    movdqa %xmm1, %xmm0
58; SSE2-NEXT:    pxor %xmm11, %xmm0
59; SSE2-NEXT:    movdqa %xmm10, %xmm6
60; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
61; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
62; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
63; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
64; SSE2-NEXT:    pand %xmm7, %xmm0
65; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
66; SSE2-NEXT:    por %xmm0, %xmm6
67; SSE2-NEXT:    pand %xmm6, %xmm1
68; SSE2-NEXT:    pandn %xmm9, %xmm6
69; SSE2-NEXT:    por %xmm1, %xmm6
70; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744071562067968,18446744071562067968]
71; SSE2-NEXT:    movdqa %xmm6, %xmm1
72; SSE2-NEXT:    pxor %xmm11, %xmm1
73; SSE2-NEXT:    movdqa {{.*#+}} xmm12 = [18446744069414584320,18446744069414584320]
74; SSE2-NEXT:    movdqa %xmm1, %xmm7
75; SSE2-NEXT:    pcmpgtd %xmm12, %xmm7
76; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
77; SSE2-NEXT:    pcmpeqd %xmm12, %xmm1
78; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
79; SSE2-NEXT:    pand %xmm0, %xmm1
80; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
81; SSE2-NEXT:    por %xmm1, %xmm0
82; SSE2-NEXT:    pand %xmm0, %xmm6
83; SSE2-NEXT:    pandn %xmm9, %xmm0
84; SSE2-NEXT:    por %xmm6, %xmm0
85; SSE2-NEXT:    movdqa %xmm3, %xmm1
86; SSE2-NEXT:    pxor %xmm11, %xmm1
87; SSE2-NEXT:    movdqa %xmm1, %xmm6
88; SSE2-NEXT:    pcmpgtd %xmm12, %xmm6
89; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
90; SSE2-NEXT:    pcmpeqd %xmm12, %xmm1
91; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
92; SSE2-NEXT:    pand %xmm10, %xmm7
93; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
94; SSE2-NEXT:    por %xmm7, %xmm1
95; SSE2-NEXT:    pand %xmm1, %xmm3
96; SSE2-NEXT:    pandn %xmm9, %xmm1
97; SSE2-NEXT:    por %xmm3, %xmm1
98; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[0,2]
99; SSE2-NEXT:    movdqa %xmm2, %xmm0
100; SSE2-NEXT:    pxor %xmm11, %xmm0
101; SSE2-NEXT:    movdqa %xmm0, %xmm6
102; SSE2-NEXT:    pcmpgtd %xmm12, %xmm6
103; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
104; SSE2-NEXT:    pcmpeqd %xmm12, %xmm0
105; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
106; SSE2-NEXT:    pand %xmm7, %xmm3
107; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[1,1,3,3]
108; SSE2-NEXT:    pxor %xmm13, %xmm11
109; SSE2-NEXT:    movdqa %xmm11, %xmm6
110; SSE2-NEXT:    pcmpgtd %xmm12, %xmm6
111; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
112; SSE2-NEXT:    pcmpeqd %xmm12, %xmm11
113; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm11[1,1,3,3]
114; SSE2-NEXT:    pand %xmm7, %xmm0
115; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
116; SSE2-NEXT:    pcmpeqd %xmm8, %xmm5
117; SSE2-NEXT:    pcmpeqd %xmm7, %xmm7
118; SSE2-NEXT:    pxor %xmm7, %xmm5
119; SSE2-NEXT:    pcmpeqd %xmm8, %xmm4
120; SSE2-NEXT:    pxor %xmm7, %xmm4
121; SSE2-NEXT:    packssdw %xmm5, %xmm4
122; SSE2-NEXT:    packsswb %xmm4, %xmm4
123; SSE2-NEXT:    pmovmskb %xmm4, %eax
124; SSE2-NEXT:    testb $1, %al
125; SSE2-NEXT:    je .LBB0_2
126; SSE2-NEXT:  # %bb.1: # %cond.store
127; SSE2-NEXT:    movss %xmm1, (%rdi)
128; SSE2-NEXT:  .LBB0_2: # %else
129; SSE2-NEXT:    por %xmm10, %xmm3
130; SSE2-NEXT:    por %xmm6, %xmm0
131; SSE2-NEXT:    testb $2, %al
132; SSE2-NEXT:    je .LBB0_4
133; SSE2-NEXT:  # %bb.3: # %cond.store1
134; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,1,1]
135; SSE2-NEXT:    movd %xmm4, 4(%rdi)
136; SSE2-NEXT:  .LBB0_4: # %else2
137; SSE2-NEXT:    pand %xmm3, %xmm2
138; SSE2-NEXT:    pandn %xmm9, %xmm3
139; SSE2-NEXT:    pand %xmm0, %xmm13
140; SSE2-NEXT:    pandn %xmm9, %xmm0
141; SSE2-NEXT:    testb $4, %al
142; SSE2-NEXT:    je .LBB0_6
143; SSE2-NEXT:  # %bb.5: # %cond.store3
144; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3]
145; SSE2-NEXT:    movd %xmm4, 8(%rdi)
146; SSE2-NEXT:  .LBB0_6: # %else4
147; SSE2-NEXT:    por %xmm3, %xmm2
148; SSE2-NEXT:    por %xmm0, %xmm13
149; SSE2-NEXT:    testb $8, %al
150; SSE2-NEXT:    je .LBB0_8
151; SSE2-NEXT:  # %bb.7: # %cond.store5
152; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
153; SSE2-NEXT:    movd %xmm0, 12(%rdi)
154; SSE2-NEXT:  .LBB0_8: # %else6
155; SSE2-NEXT:    shufps {{.*#+}} xmm13 = xmm13[0,2],xmm2[0,2]
156; SSE2-NEXT:    testb $16, %al
157; SSE2-NEXT:    jne .LBB0_9
158; SSE2-NEXT:  # %bb.10: # %else8
159; SSE2-NEXT:    testb $32, %al
160; SSE2-NEXT:    jne .LBB0_11
161; SSE2-NEXT:  .LBB0_12: # %else10
162; SSE2-NEXT:    testb $64, %al
163; SSE2-NEXT:    jne .LBB0_13
164; SSE2-NEXT:  .LBB0_14: # %else12
165; SSE2-NEXT:    testb $-128, %al
166; SSE2-NEXT:    jne .LBB0_15
167; SSE2-NEXT:  .LBB0_16: # %else14
168; SSE2-NEXT:    retq
169; SSE2-NEXT:  .LBB0_9: # %cond.store7
170; SSE2-NEXT:    movss %xmm13, 16(%rdi)
171; SSE2-NEXT:    testb $32, %al
172; SSE2-NEXT:    je .LBB0_12
173; SSE2-NEXT:  .LBB0_11: # %cond.store9
174; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[1,1,1,1]
175; SSE2-NEXT:    movd %xmm0, 20(%rdi)
176; SSE2-NEXT:    testb $64, %al
177; SSE2-NEXT:    je .LBB0_14
178; SSE2-NEXT:  .LBB0_13: # %cond.store11
179; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[2,3,2,3]
180; SSE2-NEXT:    movd %xmm0, 24(%rdi)
181; SSE2-NEXT:    testb $-128, %al
182; SSE2-NEXT:    je .LBB0_16
183; SSE2-NEXT:  .LBB0_15: # %cond.store13
184; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm13[3,3,3,3]
185; SSE2-NEXT:    movd %xmm0, 28(%rdi)
186; SSE2-NEXT:    retq
187;
188; SSE4-LABEL: truncstore_v8i64_v8i32:
189; SSE4:       # %bb.0:
190; SSE4-NEXT:    movdqa %xmm0, %xmm9
191; SSE4-NEXT:    pxor %xmm8, %xmm8
192; SSE4-NEXT:    movdqa {{.*#+}} xmm7 = [2147483647,2147483647]
193; SSE4-NEXT:    movdqa %xmm7, %xmm0
194; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
195; SSE4-NEXT:    movdqa %xmm7, %xmm10
196; SSE4-NEXT:    blendvpd %xmm0, %xmm2, %xmm10
197; SSE4-NEXT:    movdqa %xmm7, %xmm0
198; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
199; SSE4-NEXT:    movdqa %xmm7, %xmm6
200; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
201; SSE4-NEXT:    movdqa %xmm7, %xmm0
202; SSE4-NEXT:    pcmpgtq %xmm9, %xmm0
203; SSE4-NEXT:    movdqa %xmm7, %xmm3
204; SSE4-NEXT:    blendvpd %xmm0, %xmm9, %xmm3
205; SSE4-NEXT:    movdqa %xmm7, %xmm0
206; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
207; SSE4-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
208; SSE4-NEXT:    movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
209; SSE4-NEXT:    movapd %xmm7, %xmm0
210; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
211; SSE4-NEXT:    movdqa %xmm1, %xmm2
212; SSE4-NEXT:    blendvpd %xmm0, %xmm7, %xmm2
213; SSE4-NEXT:    movapd %xmm3, %xmm0
214; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
215; SSE4-NEXT:    movdqa %xmm1, %xmm7
216; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
217; SSE4-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,2],xmm2[0,2]
218; SSE4-NEXT:    movapd %xmm6, %xmm0
219; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
220; SSE4-NEXT:    movdqa %xmm1, %xmm3
221; SSE4-NEXT:    blendvpd %xmm0, %xmm6, %xmm3
222; SSE4-NEXT:    movapd %xmm10, %xmm0
223; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
224; SSE4-NEXT:    blendvpd %xmm0, %xmm10, %xmm1
225; SSE4-NEXT:    pcmpeqd %xmm8, %xmm5
226; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
227; SSE4-NEXT:    pxor %xmm0, %xmm5
228; SSE4-NEXT:    pcmpeqd %xmm8, %xmm4
229; SSE4-NEXT:    pxor %xmm0, %xmm4
230; SSE4-NEXT:    packssdw %xmm5, %xmm4
231; SSE4-NEXT:    packsswb %xmm4, %xmm4
232; SSE4-NEXT:    pmovmskb %xmm4, %eax
233; SSE4-NEXT:    testb $1, %al
234; SSE4-NEXT:    jne .LBB0_1
235; SSE4-NEXT:  # %bb.2: # %else
236; SSE4-NEXT:    testb $2, %al
237; SSE4-NEXT:    jne .LBB0_3
238; SSE4-NEXT:  .LBB0_4: # %else2
239; SSE4-NEXT:    testb $4, %al
240; SSE4-NEXT:    jne .LBB0_5
241; SSE4-NEXT:  .LBB0_6: # %else4
242; SSE4-NEXT:    testb $8, %al
243; SSE4-NEXT:    je .LBB0_8
244; SSE4-NEXT:  .LBB0_7: # %cond.store5
245; SSE4-NEXT:    extractps $3, %xmm7, 12(%rdi)
246; SSE4-NEXT:  .LBB0_8: # %else6
247; SSE4-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]
248; SSE4-NEXT:    testb $16, %al
249; SSE4-NEXT:    jne .LBB0_9
250; SSE4-NEXT:  # %bb.10: # %else8
251; SSE4-NEXT:    testb $32, %al
252; SSE4-NEXT:    jne .LBB0_11
253; SSE4-NEXT:  .LBB0_12: # %else10
254; SSE4-NEXT:    testb $64, %al
255; SSE4-NEXT:    jne .LBB0_13
256; SSE4-NEXT:  .LBB0_14: # %else12
257; SSE4-NEXT:    testb $-128, %al
258; SSE4-NEXT:    jne .LBB0_15
259; SSE4-NEXT:  .LBB0_16: # %else14
260; SSE4-NEXT:    retq
261; SSE4-NEXT:  .LBB0_1: # %cond.store
262; SSE4-NEXT:    movss %xmm7, (%rdi)
263; SSE4-NEXT:    testb $2, %al
264; SSE4-NEXT:    je .LBB0_4
265; SSE4-NEXT:  .LBB0_3: # %cond.store1
266; SSE4-NEXT:    extractps $1, %xmm7, 4(%rdi)
267; SSE4-NEXT:    testb $4, %al
268; SSE4-NEXT:    je .LBB0_6
269; SSE4-NEXT:  .LBB0_5: # %cond.store3
270; SSE4-NEXT:    extractps $2, %xmm7, 8(%rdi)
271; SSE4-NEXT:    testb $8, %al
272; SSE4-NEXT:    jne .LBB0_7
273; SSE4-NEXT:    jmp .LBB0_8
274; SSE4-NEXT:  .LBB0_9: # %cond.store7
275; SSE4-NEXT:    movss %xmm1, 16(%rdi)
276; SSE4-NEXT:    testb $32, %al
277; SSE4-NEXT:    je .LBB0_12
278; SSE4-NEXT:  .LBB0_11: # %cond.store9
279; SSE4-NEXT:    extractps $1, %xmm1, 20(%rdi)
280; SSE4-NEXT:    testb $64, %al
281; SSE4-NEXT:    je .LBB0_14
282; SSE4-NEXT:  .LBB0_13: # %cond.store11
283; SSE4-NEXT:    extractps $2, %xmm1, 24(%rdi)
284; SSE4-NEXT:    testb $-128, %al
285; SSE4-NEXT:    je .LBB0_16
286; SSE4-NEXT:  .LBB0_15: # %cond.store13
287; SSE4-NEXT:    extractps $3, %xmm1, 28(%rdi)
288; SSE4-NEXT:    retq
289;
290; AVX1-LABEL: truncstore_v8i64_v8i32:
291; AVX1:       # %bb.0:
292; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
293; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
294; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm3, %xmm3
295; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
296; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
297; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm2
298; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
299; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm8
300; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
301; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [2147483647,2147483647]
302; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm9
303; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
304; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm4, %xmm7
305; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm2
306; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm5
307; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm4, %xmm0
308; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [18446744071562067968,18446744071562067968]
309; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm0, %xmm10
310; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm4, %xmm1
311; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm1, %xmm2
312; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm4, %xmm6
313; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm7
314; AVX1-NEXT:    vblendvpd %xmm9, %xmm3, %xmm4, %xmm3
315; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm3, %xmm4
316; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm5, %xmm3
317; AVX1-NEXT:    vblendvpd %xmm7, %xmm6, %xmm5, %xmm4
318; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm4, %ymm3
319; AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm5, %xmm1
320; AVX1-NEXT:    vblendvpd %xmm10, %xmm0, %xmm5, %xmm0
321; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
322; AVX1-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
323; AVX1-NEXT:    vmaskmovps %ymm0, %ymm8, (%rdi)
324; AVX1-NEXT:    vzeroupper
325; AVX1-NEXT:    retq
326;
327; AVX2-LABEL: truncstore_v8i64_v8i32:
328; AVX2:       # %bb.0:
329; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
330; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
331; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
332; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
333; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [2147483647,2147483647,2147483647,2147483647]
334; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm3, %ymm4
335; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm3, %ymm0
336; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm3, %ymm4
337; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
338; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
339; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
340; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
341; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm0, %ymm4
342; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm3, %ymm0
343; AVX2-NEXT:    vperm2f128 {{.*#+}} ymm3 = ymm0[2,3],ymm1[2,3]
344; AVX2-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
345; AVX2-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6]
346; AVX2-NEXT:    vpmaskmovd %ymm0, %ymm2, (%rdi)
347; AVX2-NEXT:    vzeroupper
348; AVX2-NEXT:    retq
349;
350; AVX512F-LABEL: truncstore_v8i64_v8i32:
351; AVX512F:       # %bb.0:
352; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
353; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k1
354; AVX512F-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
355; AVX512F-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
356; AVX512F-NEXT:    vpmovqd %zmm0, (%rdi) {%k1}
357; AVX512F-NEXT:    vzeroupper
358; AVX512F-NEXT:    retq
359;
360; AVX512VL-LABEL: truncstore_v8i64_v8i32:
361; AVX512VL:       # %bb.0:
362; AVX512VL-NEXT:    vptestmd %ymm1, %ymm1, %k1
363; AVX512VL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
364; AVX512VL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
365; AVX512VL-NEXT:    vpmovqd %zmm0, (%rdi) {%k1}
366; AVX512VL-NEXT:    vzeroupper
367; AVX512VL-NEXT:    retq
368;
369; AVX512BW-LABEL: truncstore_v8i64_v8i32:
370; AVX512BW:       # %bb.0:
371; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
372; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k1
373; AVX512BW-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
374; AVX512BW-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
375; AVX512BW-NEXT:    vpmovqd %zmm0, (%rdi) {%k1}
376; AVX512BW-NEXT:    vzeroupper
377; AVX512BW-NEXT:    retq
378  %a = icmp ne <8 x i32> %mask, zeroinitializer
379  %b = icmp slt <8 x i64> %x, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
380  %c = select <8 x i1> %b, <8 x i64> %x, <8 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
381  %d = icmp sgt <8 x i64> %c, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
382  %e = select <8 x i1> %d, <8 x i64> %c, <8 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
383  %f = trunc <8 x i64> %e to <8 x i32>
384  call void @llvm.masked.store.v8i32.p0v8i32(<8 x i32> %f, <8 x i32>* %p, i32 1, <8 x i1> %a)
385  ret void
386}
387
388define void @truncstore_v8i64_v8i16(<8 x i64> %x, <8 x i16>* %p, <8 x i32> %mask) {
389; SSE2-LABEL: truncstore_v8i64_v8i16:
390; SSE2:       # %bb.0:
391; SSE2-NEXT:    pxor %xmm8, %xmm8
392; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [32767,32767]
393; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648]
394; SSE2-NEXT:    movdqa %xmm2, %xmm6
395; SSE2-NEXT:    pxor %xmm11, %xmm6
396; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147516415,2147516415]
397; SSE2-NEXT:    movdqa %xmm10, %xmm7
398; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
399; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2]
400; SSE2-NEXT:    pcmpeqd %xmm10, %xmm6
401; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
402; SSE2-NEXT:    pand %xmm12, %xmm6
403; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
404; SSE2-NEXT:    por %xmm6, %xmm13
405; SSE2-NEXT:    pand %xmm13, %xmm2
406; SSE2-NEXT:    pandn %xmm9, %xmm13
407; SSE2-NEXT:    por %xmm2, %xmm13
408; SSE2-NEXT:    movdqa %xmm3, %xmm2
409; SSE2-NEXT:    pxor %xmm11, %xmm2
410; SSE2-NEXT:    movdqa %xmm10, %xmm6
411; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
412; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2]
413; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
414; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
415; SSE2-NEXT:    pand %xmm12, %xmm7
416; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
417; SSE2-NEXT:    por %xmm7, %xmm2
418; SSE2-NEXT:    pand %xmm2, %xmm3
419; SSE2-NEXT:    pandn %xmm9, %xmm2
420; SSE2-NEXT:    por %xmm3, %xmm2
421; SSE2-NEXT:    movdqa %xmm0, %xmm3
422; SSE2-NEXT:    pxor %xmm11, %xmm3
423; SSE2-NEXT:    movdqa %xmm10, %xmm6
424; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
425; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2]
426; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
427; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
428; SSE2-NEXT:    pand %xmm12, %xmm7
429; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
430; SSE2-NEXT:    por %xmm7, %xmm3
431; SSE2-NEXT:    pand %xmm3, %xmm0
432; SSE2-NEXT:    pandn %xmm9, %xmm3
433; SSE2-NEXT:    por %xmm0, %xmm3
434; SSE2-NEXT:    movdqa %xmm1, %xmm0
435; SSE2-NEXT:    pxor %xmm11, %xmm0
436; SSE2-NEXT:    movdqa %xmm10, %xmm6
437; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
438; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
439; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
440; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
441; SSE2-NEXT:    pand %xmm7, %xmm0
442; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
443; SSE2-NEXT:    por %xmm0, %xmm6
444; SSE2-NEXT:    pand %xmm6, %xmm1
445; SSE2-NEXT:    pandn %xmm9, %xmm6
446; SSE2-NEXT:    por %xmm1, %xmm6
447; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744073709518848,18446744073709518848]
448; SSE2-NEXT:    movdqa %xmm6, %xmm0
449; SSE2-NEXT:    pxor %xmm11, %xmm0
450; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [18446744071562035200,18446744071562035200]
451; SSE2-NEXT:    movdqa %xmm0, %xmm7
452; SSE2-NEXT:    pcmpgtd %xmm10, %xmm7
453; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]
454; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
455; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
456; SSE2-NEXT:    pand %xmm1, %xmm0
457; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
458; SSE2-NEXT:    por %xmm0, %xmm1
459; SSE2-NEXT:    pand %xmm1, %xmm6
460; SSE2-NEXT:    pandn %xmm9, %xmm1
461; SSE2-NEXT:    por %xmm6, %xmm1
462; SSE2-NEXT:    movdqa %xmm3, %xmm0
463; SSE2-NEXT:    pxor %xmm11, %xmm0
464; SSE2-NEXT:    movdqa %xmm0, %xmm6
465; SSE2-NEXT:    pcmpgtd %xmm10, %xmm6
466; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2]
467; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
468; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
469; SSE2-NEXT:    pand %xmm12, %xmm7
470; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
471; SSE2-NEXT:    por %xmm7, %xmm0
472; SSE2-NEXT:    pand %xmm0, %xmm3
473; SSE2-NEXT:    pandn %xmm9, %xmm0
474; SSE2-NEXT:    por %xmm3, %xmm0
475; SSE2-NEXT:    packssdw %xmm1, %xmm0
476; SSE2-NEXT:    movdqa %xmm2, %xmm1
477; SSE2-NEXT:    pxor %xmm11, %xmm1
478; SSE2-NEXT:    movdqa %xmm1, %xmm3
479; SSE2-NEXT:    pcmpgtd %xmm10, %xmm3
480; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
481; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
482; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
483; SSE2-NEXT:    pand %xmm6, %xmm1
484; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
485; SSE2-NEXT:    por %xmm1, %xmm3
486; SSE2-NEXT:    pand %xmm3, %xmm2
487; SSE2-NEXT:    pandn %xmm9, %xmm3
488; SSE2-NEXT:    por %xmm2, %xmm3
489; SSE2-NEXT:    pxor %xmm13, %xmm11
490; SSE2-NEXT:    movdqa %xmm11, %xmm1
491; SSE2-NEXT:    pcmpgtd %xmm10, %xmm1
492; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
493; SSE2-NEXT:    pcmpeqd %xmm10, %xmm11
494; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm11[1,1,3,3]
495; SSE2-NEXT:    pand %xmm2, %xmm6
496; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
497; SSE2-NEXT:    por %xmm6, %xmm1
498; SSE2-NEXT:    pand %xmm1, %xmm13
499; SSE2-NEXT:    pandn %xmm9, %xmm1
500; SSE2-NEXT:    por %xmm13, %xmm1
501; SSE2-NEXT:    packssdw %xmm3, %xmm1
502; SSE2-NEXT:    packssdw %xmm1, %xmm0
503; SSE2-NEXT:    pcmpeqd %xmm8, %xmm5
504; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
505; SSE2-NEXT:    pxor %xmm1, %xmm5
506; SSE2-NEXT:    pcmpeqd %xmm8, %xmm4
507; SSE2-NEXT:    pxor %xmm1, %xmm4
508; SSE2-NEXT:    packssdw %xmm5, %xmm4
509; SSE2-NEXT:    packsswb %xmm4, %xmm4
510; SSE2-NEXT:    pmovmskb %xmm4, %eax
511; SSE2-NEXT:    testb $1, %al
512; SSE2-NEXT:    jne .LBB1_1
513; SSE2-NEXT:  # %bb.2: # %else
514; SSE2-NEXT:    testb $2, %al
515; SSE2-NEXT:    jne .LBB1_3
516; SSE2-NEXT:  .LBB1_4: # %else2
517; SSE2-NEXT:    testb $4, %al
518; SSE2-NEXT:    jne .LBB1_5
519; SSE2-NEXT:  .LBB1_6: # %else4
520; SSE2-NEXT:    testb $8, %al
521; SSE2-NEXT:    jne .LBB1_7
522; SSE2-NEXT:  .LBB1_8: # %else6
523; SSE2-NEXT:    testb $16, %al
524; SSE2-NEXT:    jne .LBB1_9
525; SSE2-NEXT:  .LBB1_10: # %else8
526; SSE2-NEXT:    testb $32, %al
527; SSE2-NEXT:    jne .LBB1_11
528; SSE2-NEXT:  .LBB1_12: # %else10
529; SSE2-NEXT:    testb $64, %al
530; SSE2-NEXT:    jne .LBB1_13
531; SSE2-NEXT:  .LBB1_14: # %else12
532; SSE2-NEXT:    testb $-128, %al
533; SSE2-NEXT:    jne .LBB1_15
534; SSE2-NEXT:  .LBB1_16: # %else14
535; SSE2-NEXT:    retq
536; SSE2-NEXT:  .LBB1_1: # %cond.store
537; SSE2-NEXT:    movd %xmm0, %ecx
538; SSE2-NEXT:    movw %cx, (%rdi)
539; SSE2-NEXT:    testb $2, %al
540; SSE2-NEXT:    je .LBB1_4
541; SSE2-NEXT:  .LBB1_3: # %cond.store1
542; SSE2-NEXT:    pextrw $1, %xmm0, %ecx
543; SSE2-NEXT:    movw %cx, 2(%rdi)
544; SSE2-NEXT:    testb $4, %al
545; SSE2-NEXT:    je .LBB1_6
546; SSE2-NEXT:  .LBB1_5: # %cond.store3
547; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
548; SSE2-NEXT:    movw %cx, 4(%rdi)
549; SSE2-NEXT:    testb $8, %al
550; SSE2-NEXT:    je .LBB1_8
551; SSE2-NEXT:  .LBB1_7: # %cond.store5
552; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
553; SSE2-NEXT:    movw %cx, 6(%rdi)
554; SSE2-NEXT:    testb $16, %al
555; SSE2-NEXT:    je .LBB1_10
556; SSE2-NEXT:  .LBB1_9: # %cond.store7
557; SSE2-NEXT:    pextrw $4, %xmm0, %ecx
558; SSE2-NEXT:    movw %cx, 8(%rdi)
559; SSE2-NEXT:    testb $32, %al
560; SSE2-NEXT:    je .LBB1_12
561; SSE2-NEXT:  .LBB1_11: # %cond.store9
562; SSE2-NEXT:    pextrw $5, %xmm0, %ecx
563; SSE2-NEXT:    movw %cx, 10(%rdi)
564; SSE2-NEXT:    testb $64, %al
565; SSE2-NEXT:    je .LBB1_14
566; SSE2-NEXT:  .LBB1_13: # %cond.store11
567; SSE2-NEXT:    pextrw $6, %xmm0, %ecx
568; SSE2-NEXT:    movw %cx, 12(%rdi)
569; SSE2-NEXT:    testb $-128, %al
570; SSE2-NEXT:    je .LBB1_16
571; SSE2-NEXT:  .LBB1_15: # %cond.store13
572; SSE2-NEXT:    pextrw $7, %xmm0, %eax
573; SSE2-NEXT:    movw %ax, 14(%rdi)
574; SSE2-NEXT:    retq
575;
576; SSE4-LABEL: truncstore_v8i64_v8i16:
577; SSE4:       # %bb.0:
578; SSE4-NEXT:    movdqa %xmm0, %xmm9
579; SSE4-NEXT:    pxor %xmm8, %xmm8
580; SSE4-NEXT:    movdqa {{.*#+}} xmm7 = [32767,32767]
581; SSE4-NEXT:    movdqa %xmm7, %xmm0
582; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
583; SSE4-NEXT:    movdqa %xmm7, %xmm10
584; SSE4-NEXT:    blendvpd %xmm0, %xmm2, %xmm10
585; SSE4-NEXT:    movdqa %xmm7, %xmm0
586; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
587; SSE4-NEXT:    movdqa %xmm7, %xmm2
588; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
589; SSE4-NEXT:    movdqa %xmm7, %xmm0
590; SSE4-NEXT:    pcmpgtq %xmm9, %xmm0
591; SSE4-NEXT:    movdqa %xmm7, %xmm3
592; SSE4-NEXT:    blendvpd %xmm0, %xmm9, %xmm3
593; SSE4-NEXT:    movdqa %xmm7, %xmm0
594; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
595; SSE4-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
596; SSE4-NEXT:    movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
597; SSE4-NEXT:    movapd %xmm7, %xmm0
598; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
599; SSE4-NEXT:    movdqa %xmm1, %xmm6
600; SSE4-NEXT:    blendvpd %xmm0, %xmm7, %xmm6
601; SSE4-NEXT:    movapd %xmm3, %xmm0
602; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
603; SSE4-NEXT:    movdqa %xmm1, %xmm7
604; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
605; SSE4-NEXT:    packssdw %xmm6, %xmm7
606; SSE4-NEXT:    movapd %xmm2, %xmm0
607; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
608; SSE4-NEXT:    movdqa %xmm1, %xmm3
609; SSE4-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
610; SSE4-NEXT:    movapd %xmm10, %xmm0
611; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
612; SSE4-NEXT:    blendvpd %xmm0, %xmm10, %xmm1
613; SSE4-NEXT:    packssdw %xmm3, %xmm1
614; SSE4-NEXT:    packssdw %xmm1, %xmm7
615; SSE4-NEXT:    pcmpeqd %xmm8, %xmm5
616; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
617; SSE4-NEXT:    pxor %xmm0, %xmm5
618; SSE4-NEXT:    pcmpeqd %xmm8, %xmm4
619; SSE4-NEXT:    pxor %xmm0, %xmm4
620; SSE4-NEXT:    packssdw %xmm5, %xmm4
621; SSE4-NEXT:    packsswb %xmm4, %xmm4
622; SSE4-NEXT:    pmovmskb %xmm4, %eax
623; SSE4-NEXT:    testb $1, %al
624; SSE4-NEXT:    jne .LBB1_1
625; SSE4-NEXT:  # %bb.2: # %else
626; SSE4-NEXT:    testb $2, %al
627; SSE4-NEXT:    jne .LBB1_3
628; SSE4-NEXT:  .LBB1_4: # %else2
629; SSE4-NEXT:    testb $4, %al
630; SSE4-NEXT:    jne .LBB1_5
631; SSE4-NEXT:  .LBB1_6: # %else4
632; SSE4-NEXT:    testb $8, %al
633; SSE4-NEXT:    jne .LBB1_7
634; SSE4-NEXT:  .LBB1_8: # %else6
635; SSE4-NEXT:    testb $16, %al
636; SSE4-NEXT:    jne .LBB1_9
637; SSE4-NEXT:  .LBB1_10: # %else8
638; SSE4-NEXT:    testb $32, %al
639; SSE4-NEXT:    jne .LBB1_11
640; SSE4-NEXT:  .LBB1_12: # %else10
641; SSE4-NEXT:    testb $64, %al
642; SSE4-NEXT:    jne .LBB1_13
643; SSE4-NEXT:  .LBB1_14: # %else12
644; SSE4-NEXT:    testb $-128, %al
645; SSE4-NEXT:    jne .LBB1_15
646; SSE4-NEXT:  .LBB1_16: # %else14
647; SSE4-NEXT:    retq
648; SSE4-NEXT:  .LBB1_1: # %cond.store
649; SSE4-NEXT:    pextrw $0, %xmm7, (%rdi)
650; SSE4-NEXT:    testb $2, %al
651; SSE4-NEXT:    je .LBB1_4
652; SSE4-NEXT:  .LBB1_3: # %cond.store1
653; SSE4-NEXT:    pextrw $1, %xmm7, 2(%rdi)
654; SSE4-NEXT:    testb $4, %al
655; SSE4-NEXT:    je .LBB1_6
656; SSE4-NEXT:  .LBB1_5: # %cond.store3
657; SSE4-NEXT:    pextrw $2, %xmm7, 4(%rdi)
658; SSE4-NEXT:    testb $8, %al
659; SSE4-NEXT:    je .LBB1_8
660; SSE4-NEXT:  .LBB1_7: # %cond.store5
661; SSE4-NEXT:    pextrw $3, %xmm7, 6(%rdi)
662; SSE4-NEXT:    testb $16, %al
663; SSE4-NEXT:    je .LBB1_10
664; SSE4-NEXT:  .LBB1_9: # %cond.store7
665; SSE4-NEXT:    pextrw $4, %xmm7, 8(%rdi)
666; SSE4-NEXT:    testb $32, %al
667; SSE4-NEXT:    je .LBB1_12
668; SSE4-NEXT:  .LBB1_11: # %cond.store9
669; SSE4-NEXT:    pextrw $5, %xmm7, 10(%rdi)
670; SSE4-NEXT:    testb $64, %al
671; SSE4-NEXT:    je .LBB1_14
672; SSE4-NEXT:  .LBB1_13: # %cond.store11
673; SSE4-NEXT:    pextrw $6, %xmm7, 12(%rdi)
674; SSE4-NEXT:    testb $-128, %al
675; SSE4-NEXT:    je .LBB1_16
676; SSE4-NEXT:  .LBB1_15: # %cond.store13
677; SSE4-NEXT:    pextrw $7, %xmm7, 14(%rdi)
678; SSE4-NEXT:    retq
679;
680; AVX1-LABEL: truncstore_v8i64_v8i16:
681; AVX1:       # %bb.0:
682; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
683; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [32767,32767]
684; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm8
685; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm9
686; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
687; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm4, %xmm5
688; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm6
689; AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm4, %xmm0
690; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [18446744073709518848,18446744073709518848]
691; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm0, %xmm10
692; AVX1-NEXT:    vblendvpd %xmm5, %xmm7, %xmm4, %xmm5
693; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm11
694; AVX1-NEXT:    vblendvpd %xmm9, %xmm1, %xmm4, %xmm1
695; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm1, %xmm7
696; AVX1-NEXT:    vblendvpd %xmm8, %xmm3, %xmm4, %xmm3
697; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm3, %xmm4
698; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
699; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
700; AVX1-NEXT:    vpackssdw %xmm3, %xmm1, %xmm1
701; AVX1-NEXT:    vblendvpd %xmm11, %xmm5, %xmm6, %xmm3
702; AVX1-NEXT:    vblendvpd %xmm10, %xmm0, %xmm6, %xmm0
703; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
704; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
705; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm1
706; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
707; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
708; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
709; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
710; AVX1-NEXT:    vmovmskps %ymm1, %eax
711; AVX1-NEXT:    notl %eax
712; AVX1-NEXT:    testb $1, %al
713; AVX1-NEXT:    jne .LBB1_1
714; AVX1-NEXT:  # %bb.2: # %else
715; AVX1-NEXT:    testb $2, %al
716; AVX1-NEXT:    jne .LBB1_3
717; AVX1-NEXT:  .LBB1_4: # %else2
718; AVX1-NEXT:    testb $4, %al
719; AVX1-NEXT:    jne .LBB1_5
720; AVX1-NEXT:  .LBB1_6: # %else4
721; AVX1-NEXT:    testb $8, %al
722; AVX1-NEXT:    jne .LBB1_7
723; AVX1-NEXT:  .LBB1_8: # %else6
724; AVX1-NEXT:    testb $16, %al
725; AVX1-NEXT:    jne .LBB1_9
726; AVX1-NEXT:  .LBB1_10: # %else8
727; AVX1-NEXT:    testb $32, %al
728; AVX1-NEXT:    jne .LBB1_11
729; AVX1-NEXT:  .LBB1_12: # %else10
730; AVX1-NEXT:    testb $64, %al
731; AVX1-NEXT:    jne .LBB1_13
732; AVX1-NEXT:  .LBB1_14: # %else12
733; AVX1-NEXT:    testb $-128, %al
734; AVX1-NEXT:    jne .LBB1_15
735; AVX1-NEXT:  .LBB1_16: # %else14
736; AVX1-NEXT:    vzeroupper
737; AVX1-NEXT:    retq
738; AVX1-NEXT:  .LBB1_1: # %cond.store
739; AVX1-NEXT:    vpextrw $0, %xmm0, (%rdi)
740; AVX1-NEXT:    testb $2, %al
741; AVX1-NEXT:    je .LBB1_4
742; AVX1-NEXT:  .LBB1_3: # %cond.store1
743; AVX1-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
744; AVX1-NEXT:    testb $4, %al
745; AVX1-NEXT:    je .LBB1_6
746; AVX1-NEXT:  .LBB1_5: # %cond.store3
747; AVX1-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
748; AVX1-NEXT:    testb $8, %al
749; AVX1-NEXT:    je .LBB1_8
750; AVX1-NEXT:  .LBB1_7: # %cond.store5
751; AVX1-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
752; AVX1-NEXT:    testb $16, %al
753; AVX1-NEXT:    je .LBB1_10
754; AVX1-NEXT:  .LBB1_9: # %cond.store7
755; AVX1-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
756; AVX1-NEXT:    testb $32, %al
757; AVX1-NEXT:    je .LBB1_12
758; AVX1-NEXT:  .LBB1_11: # %cond.store9
759; AVX1-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
760; AVX1-NEXT:    testb $64, %al
761; AVX1-NEXT:    je .LBB1_14
762; AVX1-NEXT:  .LBB1_13: # %cond.store11
763; AVX1-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
764; AVX1-NEXT:    testb $-128, %al
765; AVX1-NEXT:    je .LBB1_16
766; AVX1-NEXT:  .LBB1_15: # %cond.store13
767; AVX1-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
768; AVX1-NEXT:    vzeroupper
769; AVX1-NEXT:    retq
770;
771; AVX2-LABEL: truncstore_v8i64_v8i16:
772; AVX2:       # %bb.0:
773; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
774; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [32767,32767,32767,32767]
775; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm5
776; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
777; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm5
778; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
779; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
780; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm1, %ymm5
781; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
782; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm5
783; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
784; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
785; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
786; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
787; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
788; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm1
789; AVX2-NEXT:    vmovmskps %ymm1, %eax
790; AVX2-NEXT:    notl %eax
791; AVX2-NEXT:    testb $1, %al
792; AVX2-NEXT:    jne .LBB1_1
793; AVX2-NEXT:  # %bb.2: # %else
794; AVX2-NEXT:    testb $2, %al
795; AVX2-NEXT:    jne .LBB1_3
796; AVX2-NEXT:  .LBB1_4: # %else2
797; AVX2-NEXT:    testb $4, %al
798; AVX2-NEXT:    jne .LBB1_5
799; AVX2-NEXT:  .LBB1_6: # %else4
800; AVX2-NEXT:    testb $8, %al
801; AVX2-NEXT:    jne .LBB1_7
802; AVX2-NEXT:  .LBB1_8: # %else6
803; AVX2-NEXT:    testb $16, %al
804; AVX2-NEXT:    jne .LBB1_9
805; AVX2-NEXT:  .LBB1_10: # %else8
806; AVX2-NEXT:    testb $32, %al
807; AVX2-NEXT:    jne .LBB1_11
808; AVX2-NEXT:  .LBB1_12: # %else10
809; AVX2-NEXT:    testb $64, %al
810; AVX2-NEXT:    jne .LBB1_13
811; AVX2-NEXT:  .LBB1_14: # %else12
812; AVX2-NEXT:    testb $-128, %al
813; AVX2-NEXT:    jne .LBB1_15
814; AVX2-NEXT:  .LBB1_16: # %else14
815; AVX2-NEXT:    vzeroupper
816; AVX2-NEXT:    retq
817; AVX2-NEXT:  .LBB1_1: # %cond.store
818; AVX2-NEXT:    vpextrw $0, %xmm0, (%rdi)
819; AVX2-NEXT:    testb $2, %al
820; AVX2-NEXT:    je .LBB1_4
821; AVX2-NEXT:  .LBB1_3: # %cond.store1
822; AVX2-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
823; AVX2-NEXT:    testb $4, %al
824; AVX2-NEXT:    je .LBB1_6
825; AVX2-NEXT:  .LBB1_5: # %cond.store3
826; AVX2-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
827; AVX2-NEXT:    testb $8, %al
828; AVX2-NEXT:    je .LBB1_8
829; AVX2-NEXT:  .LBB1_7: # %cond.store5
830; AVX2-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
831; AVX2-NEXT:    testb $16, %al
832; AVX2-NEXT:    je .LBB1_10
833; AVX2-NEXT:  .LBB1_9: # %cond.store7
834; AVX2-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
835; AVX2-NEXT:    testb $32, %al
836; AVX2-NEXT:    je .LBB1_12
837; AVX2-NEXT:  .LBB1_11: # %cond.store9
838; AVX2-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
839; AVX2-NEXT:    testb $64, %al
840; AVX2-NEXT:    je .LBB1_14
841; AVX2-NEXT:  .LBB1_13: # %cond.store11
842; AVX2-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
843; AVX2-NEXT:    testb $-128, %al
844; AVX2-NEXT:    je .LBB1_16
845; AVX2-NEXT:  .LBB1_15: # %cond.store13
846; AVX2-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
847; AVX2-NEXT:    vzeroupper
848; AVX2-NEXT:    retq
849;
850; AVX512F-LABEL: truncstore_v8i64_v8i16:
851; AVX512F:       # %bb.0:
852; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
853; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
854; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
855; AVX512F-NEXT:    kmovw %k0, %eax
856; AVX512F-NEXT:    testb $1, %al
857; AVX512F-NEXT:    jne .LBB1_1
858; AVX512F-NEXT:  # %bb.2: # %else
859; AVX512F-NEXT:    testb $2, %al
860; AVX512F-NEXT:    jne .LBB1_3
861; AVX512F-NEXT:  .LBB1_4: # %else2
862; AVX512F-NEXT:    testb $4, %al
863; AVX512F-NEXT:    jne .LBB1_5
864; AVX512F-NEXT:  .LBB1_6: # %else4
865; AVX512F-NEXT:    testb $8, %al
866; AVX512F-NEXT:    jne .LBB1_7
867; AVX512F-NEXT:  .LBB1_8: # %else6
868; AVX512F-NEXT:    testb $16, %al
869; AVX512F-NEXT:    jne .LBB1_9
870; AVX512F-NEXT:  .LBB1_10: # %else8
871; AVX512F-NEXT:    testb $32, %al
872; AVX512F-NEXT:    jne .LBB1_11
873; AVX512F-NEXT:  .LBB1_12: # %else10
874; AVX512F-NEXT:    testb $64, %al
875; AVX512F-NEXT:    jne .LBB1_13
876; AVX512F-NEXT:  .LBB1_14: # %else12
877; AVX512F-NEXT:    testb $-128, %al
878; AVX512F-NEXT:    jne .LBB1_15
879; AVX512F-NEXT:  .LBB1_16: # %else14
880; AVX512F-NEXT:    vzeroupper
881; AVX512F-NEXT:    retq
882; AVX512F-NEXT:  .LBB1_1: # %cond.store
883; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
884; AVX512F-NEXT:    testb $2, %al
885; AVX512F-NEXT:    je .LBB1_4
886; AVX512F-NEXT:  .LBB1_3: # %cond.store1
887; AVX512F-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
888; AVX512F-NEXT:    testb $4, %al
889; AVX512F-NEXT:    je .LBB1_6
890; AVX512F-NEXT:  .LBB1_5: # %cond.store3
891; AVX512F-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
892; AVX512F-NEXT:    testb $8, %al
893; AVX512F-NEXT:    je .LBB1_8
894; AVX512F-NEXT:  .LBB1_7: # %cond.store5
895; AVX512F-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
896; AVX512F-NEXT:    testb $16, %al
897; AVX512F-NEXT:    je .LBB1_10
898; AVX512F-NEXT:  .LBB1_9: # %cond.store7
899; AVX512F-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
900; AVX512F-NEXT:    testb $32, %al
901; AVX512F-NEXT:    je .LBB1_12
902; AVX512F-NEXT:  .LBB1_11: # %cond.store9
903; AVX512F-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
904; AVX512F-NEXT:    testb $64, %al
905; AVX512F-NEXT:    je .LBB1_14
906; AVX512F-NEXT:  .LBB1_13: # %cond.store11
907; AVX512F-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
908; AVX512F-NEXT:    testb $-128, %al
909; AVX512F-NEXT:    je .LBB1_16
910; AVX512F-NEXT:  .LBB1_15: # %cond.store13
911; AVX512F-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
912; AVX512F-NEXT:    vzeroupper
913; AVX512F-NEXT:    retq
914;
915; AVX512BW-LABEL: truncstore_v8i64_v8i16:
916; AVX512BW:       # %bb.0:
917; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
918; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k1
919; AVX512BW-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
920; AVX512BW-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
921; AVX512BW-NEXT:    vpmovqw %zmm0, (%rdi) {%k1}
922; AVX512BW-NEXT:    vzeroupper
923; AVX512BW-NEXT:    retq
924;
925; AVX512BWVL-LABEL: truncstore_v8i64_v8i16:
926; AVX512BWVL:       # %bb.0:
927; AVX512BWVL-NEXT:    vptestmd %ymm1, %ymm1, %k1
928; AVX512BWVL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
929; AVX512BWVL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
930; AVX512BWVL-NEXT:    vpmovqw %zmm0, (%rdi) {%k1}
931; AVX512BWVL-NEXT:    vzeroupper
932; AVX512BWVL-NEXT:    retq
933  %a = icmp ne <8 x i32> %mask, zeroinitializer
934  %b = icmp slt <8 x i64> %x, <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>
935  %c = select <8 x i1> %b, <8 x i64> %x, <8 x i64> <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767>
936  %d = icmp sgt <8 x i64> %c, <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>
937  %e = select <8 x i1> %d, <8 x i64> %c, <8 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768>
938  %f = trunc <8 x i64> %e to <8 x i16>
939  call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %f, <8 x i16>* %p, i32 1, <8 x i1> %a)
940  ret void
941}
942
943define void @truncstore_v8i64_v8i8(<8 x i64> %x, <8 x i8>* %p, <8 x i32> %mask) {
944; SSE2-LABEL: truncstore_v8i64_v8i8:
945; SSE2:       # %bb.0:
946; SSE2-NEXT:    pxor %xmm8, %xmm8
947; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [127,127]
948; SSE2-NEXT:    movdqa {{.*#+}} xmm11 = [2147483648,2147483648]
949; SSE2-NEXT:    movdqa %xmm2, %xmm6
950; SSE2-NEXT:    pxor %xmm11, %xmm6
951; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
952; SSE2-NEXT:    movdqa %xmm10, %xmm7
953; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
954; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2]
955; SSE2-NEXT:    pcmpeqd %xmm10, %xmm6
956; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
957; SSE2-NEXT:    pand %xmm12, %xmm6
958; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3]
959; SSE2-NEXT:    por %xmm6, %xmm13
960; SSE2-NEXT:    pand %xmm13, %xmm2
961; SSE2-NEXT:    pandn %xmm9, %xmm13
962; SSE2-NEXT:    por %xmm2, %xmm13
963; SSE2-NEXT:    movdqa %xmm3, %xmm2
964; SSE2-NEXT:    pxor %xmm11, %xmm2
965; SSE2-NEXT:    movdqa %xmm10, %xmm6
966; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
967; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2]
968; SSE2-NEXT:    pcmpeqd %xmm10, %xmm2
969; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
970; SSE2-NEXT:    pand %xmm12, %xmm7
971; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
972; SSE2-NEXT:    por %xmm7, %xmm2
973; SSE2-NEXT:    pand %xmm2, %xmm3
974; SSE2-NEXT:    pandn %xmm9, %xmm2
975; SSE2-NEXT:    por %xmm3, %xmm2
976; SSE2-NEXT:    movdqa %xmm0, %xmm3
977; SSE2-NEXT:    pxor %xmm11, %xmm3
978; SSE2-NEXT:    movdqa %xmm10, %xmm6
979; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
980; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2]
981; SSE2-NEXT:    pcmpeqd %xmm10, %xmm3
982; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
983; SSE2-NEXT:    pand %xmm12, %xmm7
984; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
985; SSE2-NEXT:    por %xmm7, %xmm3
986; SSE2-NEXT:    pand %xmm3, %xmm0
987; SSE2-NEXT:    pandn %xmm9, %xmm3
988; SSE2-NEXT:    por %xmm0, %xmm3
989; SSE2-NEXT:    movdqa %xmm1, %xmm0
990; SSE2-NEXT:    pxor %xmm11, %xmm0
991; SSE2-NEXT:    movdqa %xmm10, %xmm6
992; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
993; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
994; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
995; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
996; SSE2-NEXT:    pand %xmm7, %xmm0
997; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
998; SSE2-NEXT:    por %xmm0, %xmm6
999; SSE2-NEXT:    pand %xmm6, %xmm1
1000; SSE2-NEXT:    pandn %xmm9, %xmm6
1001; SSE2-NEXT:    por %xmm1, %xmm6
1002; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [18446744073709551488,18446744073709551488]
1003; SSE2-NEXT:    movdqa %xmm6, %xmm0
1004; SSE2-NEXT:    pxor %xmm11, %xmm0
1005; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [18446744071562067840,18446744071562067840]
1006; SSE2-NEXT:    movdqa %xmm0, %xmm7
1007; SSE2-NEXT:    pcmpgtd %xmm10, %xmm7
1008; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]
1009; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1010; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1011; SSE2-NEXT:    pand %xmm1, %xmm0
1012; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
1013; SSE2-NEXT:    por %xmm0, %xmm1
1014; SSE2-NEXT:    pand %xmm1, %xmm6
1015; SSE2-NEXT:    pandn %xmm9, %xmm1
1016; SSE2-NEXT:    por %xmm6, %xmm1
1017; SSE2-NEXT:    movdqa %xmm3, %xmm0
1018; SSE2-NEXT:    pxor %xmm11, %xmm0
1019; SSE2-NEXT:    movdqa %xmm0, %xmm6
1020; SSE2-NEXT:    pcmpgtd %xmm10, %xmm6
1021; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2]
1022; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1023; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1024; SSE2-NEXT:    pand %xmm12, %xmm7
1025; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
1026; SSE2-NEXT:    por %xmm7, %xmm0
1027; SSE2-NEXT:    pand %xmm0, %xmm3
1028; SSE2-NEXT:    pandn %xmm9, %xmm0
1029; SSE2-NEXT:    por %xmm3, %xmm0
1030; SSE2-NEXT:    packssdw %xmm1, %xmm0
1031; SSE2-NEXT:    movdqa %xmm2, %xmm1
1032; SSE2-NEXT:    pxor %xmm11, %xmm1
1033; SSE2-NEXT:    movdqa %xmm1, %xmm3
1034; SSE2-NEXT:    pcmpgtd %xmm10, %xmm3
1035; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1036; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
1037; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1038; SSE2-NEXT:    pand %xmm6, %xmm1
1039; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1040; SSE2-NEXT:    por %xmm1, %xmm3
1041; SSE2-NEXT:    pand %xmm3, %xmm2
1042; SSE2-NEXT:    pandn %xmm9, %xmm3
1043; SSE2-NEXT:    por %xmm2, %xmm3
1044; SSE2-NEXT:    pxor %xmm13, %xmm11
1045; SSE2-NEXT:    movdqa %xmm11, %xmm1
1046; SSE2-NEXT:    pcmpgtd %xmm10, %xmm1
1047; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
1048; SSE2-NEXT:    pcmpeqd %xmm10, %xmm11
1049; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm11[1,1,3,3]
1050; SSE2-NEXT:    pand %xmm2, %xmm6
1051; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1052; SSE2-NEXT:    por %xmm6, %xmm1
1053; SSE2-NEXT:    pand %xmm1, %xmm13
1054; SSE2-NEXT:    pandn %xmm9, %xmm1
1055; SSE2-NEXT:    por %xmm13, %xmm1
1056; SSE2-NEXT:    packssdw %xmm3, %xmm1
1057; SSE2-NEXT:    packssdw %xmm1, %xmm0
1058; SSE2-NEXT:    packsswb %xmm0, %xmm0
1059; SSE2-NEXT:    pcmpeqd %xmm8, %xmm5
1060; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
1061; SSE2-NEXT:    pxor %xmm1, %xmm5
1062; SSE2-NEXT:    pcmpeqd %xmm8, %xmm4
1063; SSE2-NEXT:    pxor %xmm1, %xmm4
1064; SSE2-NEXT:    packssdw %xmm5, %xmm4
1065; SSE2-NEXT:    packsswb %xmm4, %xmm4
1066; SSE2-NEXT:    pmovmskb %xmm4, %eax
1067; SSE2-NEXT:    testb $1, %al
1068; SSE2-NEXT:    movd %xmm0, %ecx
1069; SSE2-NEXT:    jne .LBB2_1
1070; SSE2-NEXT:  # %bb.2: # %else
1071; SSE2-NEXT:    testb $2, %al
1072; SSE2-NEXT:    jne .LBB2_3
1073; SSE2-NEXT:  .LBB2_4: # %else2
1074; SSE2-NEXT:    testb $4, %al
1075; SSE2-NEXT:    jne .LBB2_5
1076; SSE2-NEXT:  .LBB2_6: # %else4
1077; SSE2-NEXT:    testb $8, %al
1078; SSE2-NEXT:    je .LBB2_8
1079; SSE2-NEXT:  .LBB2_7: # %cond.store5
1080; SSE2-NEXT:    shrl $24, %ecx
1081; SSE2-NEXT:    movb %cl, 3(%rdi)
1082; SSE2-NEXT:  .LBB2_8: # %else6
1083; SSE2-NEXT:    testb $16, %al
1084; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
1085; SSE2-NEXT:    je .LBB2_10
1086; SSE2-NEXT:  # %bb.9: # %cond.store7
1087; SSE2-NEXT:    movb %cl, 4(%rdi)
1088; SSE2-NEXT:  .LBB2_10: # %else8
1089; SSE2-NEXT:    testb $32, %al
1090; SSE2-NEXT:    je .LBB2_12
1091; SSE2-NEXT:  # %bb.11: # %cond.store9
1092; SSE2-NEXT:    movb %ch, 5(%rdi)
1093; SSE2-NEXT:  .LBB2_12: # %else10
1094; SSE2-NEXT:    testb $64, %al
1095; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
1096; SSE2-NEXT:    jne .LBB2_13
1097; SSE2-NEXT:  # %bb.14: # %else12
1098; SSE2-NEXT:    testb $-128, %al
1099; SSE2-NEXT:    jne .LBB2_15
1100; SSE2-NEXT:  .LBB2_16: # %else14
1101; SSE2-NEXT:    retq
1102; SSE2-NEXT:  .LBB2_1: # %cond.store
1103; SSE2-NEXT:    movb %cl, (%rdi)
1104; SSE2-NEXT:    testb $2, %al
1105; SSE2-NEXT:    je .LBB2_4
1106; SSE2-NEXT:  .LBB2_3: # %cond.store1
1107; SSE2-NEXT:    movb %ch, 1(%rdi)
1108; SSE2-NEXT:    testb $4, %al
1109; SSE2-NEXT:    je .LBB2_6
1110; SSE2-NEXT:  .LBB2_5: # %cond.store3
1111; SSE2-NEXT:    movl %ecx, %edx
1112; SSE2-NEXT:    shrl $16, %edx
1113; SSE2-NEXT:    movb %dl, 2(%rdi)
1114; SSE2-NEXT:    testb $8, %al
1115; SSE2-NEXT:    jne .LBB2_7
1116; SSE2-NEXT:    jmp .LBB2_8
1117; SSE2-NEXT:  .LBB2_13: # %cond.store11
1118; SSE2-NEXT:    movb %cl, 6(%rdi)
1119; SSE2-NEXT:    testb $-128, %al
1120; SSE2-NEXT:    je .LBB2_16
1121; SSE2-NEXT:  .LBB2_15: # %cond.store13
1122; SSE2-NEXT:    movb %ch, 7(%rdi)
1123; SSE2-NEXT:    retq
1124;
1125; SSE4-LABEL: truncstore_v8i64_v8i8:
1126; SSE4:       # %bb.0:
1127; SSE4-NEXT:    movdqa %xmm0, %xmm9
1128; SSE4-NEXT:    pxor %xmm8, %xmm8
1129; SSE4-NEXT:    movdqa {{.*#+}} xmm7 = [127,127]
1130; SSE4-NEXT:    movdqa %xmm7, %xmm0
1131; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
1132; SSE4-NEXT:    movdqa %xmm7, %xmm10
1133; SSE4-NEXT:    blendvpd %xmm0, %xmm2, %xmm10
1134; SSE4-NEXT:    movdqa %xmm7, %xmm0
1135; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
1136; SSE4-NEXT:    movdqa %xmm7, %xmm2
1137; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
1138; SSE4-NEXT:    movdqa %xmm7, %xmm0
1139; SSE4-NEXT:    pcmpgtq %xmm9, %xmm0
1140; SSE4-NEXT:    movdqa %xmm7, %xmm3
1141; SSE4-NEXT:    blendvpd %xmm0, %xmm9, %xmm3
1142; SSE4-NEXT:    movdqa %xmm7, %xmm0
1143; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1144; SSE4-NEXT:    blendvpd %xmm0, %xmm1, %xmm7
1145; SSE4-NEXT:    movdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488]
1146; SSE4-NEXT:    movapd %xmm7, %xmm0
1147; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1148; SSE4-NEXT:    movdqa %xmm1, %xmm6
1149; SSE4-NEXT:    blendvpd %xmm0, %xmm7, %xmm6
1150; SSE4-NEXT:    movapd %xmm3, %xmm0
1151; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1152; SSE4-NEXT:    movdqa %xmm1, %xmm7
1153; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
1154; SSE4-NEXT:    packssdw %xmm6, %xmm7
1155; SSE4-NEXT:    movapd %xmm2, %xmm0
1156; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1157; SSE4-NEXT:    movdqa %xmm1, %xmm3
1158; SSE4-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
1159; SSE4-NEXT:    movapd %xmm10, %xmm0
1160; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1161; SSE4-NEXT:    blendvpd %xmm0, %xmm10, %xmm1
1162; SSE4-NEXT:    packssdw %xmm3, %xmm1
1163; SSE4-NEXT:    packssdw %xmm1, %xmm7
1164; SSE4-NEXT:    packsswb %xmm7, %xmm7
1165; SSE4-NEXT:    pcmpeqd %xmm8, %xmm5
1166; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
1167; SSE4-NEXT:    pxor %xmm0, %xmm5
1168; SSE4-NEXT:    pcmpeqd %xmm8, %xmm4
1169; SSE4-NEXT:    pxor %xmm0, %xmm4
1170; SSE4-NEXT:    packssdw %xmm5, %xmm4
1171; SSE4-NEXT:    packsswb %xmm4, %xmm4
1172; SSE4-NEXT:    pmovmskb %xmm4, %eax
1173; SSE4-NEXT:    testb $1, %al
1174; SSE4-NEXT:    jne .LBB2_1
1175; SSE4-NEXT:  # %bb.2: # %else
1176; SSE4-NEXT:    testb $2, %al
1177; SSE4-NEXT:    jne .LBB2_3
1178; SSE4-NEXT:  .LBB2_4: # %else2
1179; SSE4-NEXT:    testb $4, %al
1180; SSE4-NEXT:    jne .LBB2_5
1181; SSE4-NEXT:  .LBB2_6: # %else4
1182; SSE4-NEXT:    testb $8, %al
1183; SSE4-NEXT:    jne .LBB2_7
1184; SSE4-NEXT:  .LBB2_8: # %else6
1185; SSE4-NEXT:    testb $16, %al
1186; SSE4-NEXT:    jne .LBB2_9
1187; SSE4-NEXT:  .LBB2_10: # %else8
1188; SSE4-NEXT:    testb $32, %al
1189; SSE4-NEXT:    jne .LBB2_11
1190; SSE4-NEXT:  .LBB2_12: # %else10
1191; SSE4-NEXT:    testb $64, %al
1192; SSE4-NEXT:    jne .LBB2_13
1193; SSE4-NEXT:  .LBB2_14: # %else12
1194; SSE4-NEXT:    testb $-128, %al
1195; SSE4-NEXT:    jne .LBB2_15
1196; SSE4-NEXT:  .LBB2_16: # %else14
1197; SSE4-NEXT:    retq
1198; SSE4-NEXT:  .LBB2_1: # %cond.store
1199; SSE4-NEXT:    pextrb $0, %xmm7, (%rdi)
1200; SSE4-NEXT:    testb $2, %al
1201; SSE4-NEXT:    je .LBB2_4
1202; SSE4-NEXT:  .LBB2_3: # %cond.store1
1203; SSE4-NEXT:    pextrb $1, %xmm7, 1(%rdi)
1204; SSE4-NEXT:    testb $4, %al
1205; SSE4-NEXT:    je .LBB2_6
1206; SSE4-NEXT:  .LBB2_5: # %cond.store3
1207; SSE4-NEXT:    pextrb $2, %xmm7, 2(%rdi)
1208; SSE4-NEXT:    testb $8, %al
1209; SSE4-NEXT:    je .LBB2_8
1210; SSE4-NEXT:  .LBB2_7: # %cond.store5
1211; SSE4-NEXT:    pextrb $3, %xmm7, 3(%rdi)
1212; SSE4-NEXT:    testb $16, %al
1213; SSE4-NEXT:    je .LBB2_10
1214; SSE4-NEXT:  .LBB2_9: # %cond.store7
1215; SSE4-NEXT:    pextrb $4, %xmm7, 4(%rdi)
1216; SSE4-NEXT:    testb $32, %al
1217; SSE4-NEXT:    je .LBB2_12
1218; SSE4-NEXT:  .LBB2_11: # %cond.store9
1219; SSE4-NEXT:    pextrb $5, %xmm7, 5(%rdi)
1220; SSE4-NEXT:    testb $64, %al
1221; SSE4-NEXT:    je .LBB2_14
1222; SSE4-NEXT:  .LBB2_13: # %cond.store11
1223; SSE4-NEXT:    pextrb $6, %xmm7, 6(%rdi)
1224; SSE4-NEXT:    testb $-128, %al
1225; SSE4-NEXT:    je .LBB2_16
1226; SSE4-NEXT:  .LBB2_15: # %cond.store13
1227; SSE4-NEXT:    pextrb $7, %xmm7, 7(%rdi)
1228; SSE4-NEXT:    retq
1229;
1230; AVX1-LABEL: truncstore_v8i64_v8i8:
1231; AVX1:       # %bb.0:
1232; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1233; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [127,127]
1234; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm8
1235; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm9
1236; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1237; AVX1-NEXT:    vpcmpgtq %xmm7, %xmm4, %xmm5
1238; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm6
1239; AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm4, %xmm0
1240; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488]
1241; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm0, %xmm10
1242; AVX1-NEXT:    vblendvpd %xmm5, %xmm7, %xmm4, %xmm5
1243; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm11
1244; AVX1-NEXT:    vblendvpd %xmm9, %xmm1, %xmm4, %xmm1
1245; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm1, %xmm7
1246; AVX1-NEXT:    vblendvpd %xmm8, %xmm3, %xmm4, %xmm3
1247; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm3, %xmm4
1248; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
1249; AVX1-NEXT:    vblendvpd %xmm7, %xmm1, %xmm6, %xmm1
1250; AVX1-NEXT:    vpackssdw %xmm3, %xmm1, %xmm1
1251; AVX1-NEXT:    vblendvpd %xmm11, %xmm5, %xmm6, %xmm3
1252; AVX1-NEXT:    vblendvpd %xmm10, %xmm0, %xmm6, %xmm0
1253; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
1254; AVX1-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1255; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
1256; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm1
1257; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1258; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
1259; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
1260; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1261; AVX1-NEXT:    vmovmskps %ymm1, %eax
1262; AVX1-NEXT:    notl %eax
1263; AVX1-NEXT:    testb $1, %al
1264; AVX1-NEXT:    jne .LBB2_1
1265; AVX1-NEXT:  # %bb.2: # %else
1266; AVX1-NEXT:    testb $2, %al
1267; AVX1-NEXT:    jne .LBB2_3
1268; AVX1-NEXT:  .LBB2_4: # %else2
1269; AVX1-NEXT:    testb $4, %al
1270; AVX1-NEXT:    jne .LBB2_5
1271; AVX1-NEXT:  .LBB2_6: # %else4
1272; AVX1-NEXT:    testb $8, %al
1273; AVX1-NEXT:    jne .LBB2_7
1274; AVX1-NEXT:  .LBB2_8: # %else6
1275; AVX1-NEXT:    testb $16, %al
1276; AVX1-NEXT:    jne .LBB2_9
1277; AVX1-NEXT:  .LBB2_10: # %else8
1278; AVX1-NEXT:    testb $32, %al
1279; AVX1-NEXT:    jne .LBB2_11
1280; AVX1-NEXT:  .LBB2_12: # %else10
1281; AVX1-NEXT:    testb $64, %al
1282; AVX1-NEXT:    jne .LBB2_13
1283; AVX1-NEXT:  .LBB2_14: # %else12
1284; AVX1-NEXT:    testb $-128, %al
1285; AVX1-NEXT:    jne .LBB2_15
1286; AVX1-NEXT:  .LBB2_16: # %else14
1287; AVX1-NEXT:    vzeroupper
1288; AVX1-NEXT:    retq
1289; AVX1-NEXT:  .LBB2_1: # %cond.store
1290; AVX1-NEXT:    vpextrb $0, %xmm0, (%rdi)
1291; AVX1-NEXT:    testb $2, %al
1292; AVX1-NEXT:    je .LBB2_4
1293; AVX1-NEXT:  .LBB2_3: # %cond.store1
1294; AVX1-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
1295; AVX1-NEXT:    testb $4, %al
1296; AVX1-NEXT:    je .LBB2_6
1297; AVX1-NEXT:  .LBB2_5: # %cond.store3
1298; AVX1-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
1299; AVX1-NEXT:    testb $8, %al
1300; AVX1-NEXT:    je .LBB2_8
1301; AVX1-NEXT:  .LBB2_7: # %cond.store5
1302; AVX1-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
1303; AVX1-NEXT:    testb $16, %al
1304; AVX1-NEXT:    je .LBB2_10
1305; AVX1-NEXT:  .LBB2_9: # %cond.store7
1306; AVX1-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
1307; AVX1-NEXT:    testb $32, %al
1308; AVX1-NEXT:    je .LBB2_12
1309; AVX1-NEXT:  .LBB2_11: # %cond.store9
1310; AVX1-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
1311; AVX1-NEXT:    testb $64, %al
1312; AVX1-NEXT:    je .LBB2_14
1313; AVX1-NEXT:  .LBB2_13: # %cond.store11
1314; AVX1-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
1315; AVX1-NEXT:    testb $-128, %al
1316; AVX1-NEXT:    je .LBB2_16
1317; AVX1-NEXT:  .LBB2_15: # %cond.store13
1318; AVX1-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
1319; AVX1-NEXT:    vzeroupper
1320; AVX1-NEXT:    retq
1321;
1322; AVX2-LABEL: truncstore_v8i64_v8i8:
1323; AVX2:       # %bb.0:
1324; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
1325; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [127,127,127,127]
1326; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm4, %ymm5
1327; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
1328; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm4, %ymm5
1329; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
1330; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
1331; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm1, %ymm5
1332; AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
1333; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm0, %ymm5
1334; AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm4, %ymm0
1335; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
1336; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1337; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
1338; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1339; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
1340; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm1
1341; AVX2-NEXT:    vmovmskps %ymm1, %eax
1342; AVX2-NEXT:    notl %eax
1343; AVX2-NEXT:    testb $1, %al
1344; AVX2-NEXT:    jne .LBB2_1
1345; AVX2-NEXT:  # %bb.2: # %else
1346; AVX2-NEXT:    testb $2, %al
1347; AVX2-NEXT:    jne .LBB2_3
1348; AVX2-NEXT:  .LBB2_4: # %else2
1349; AVX2-NEXT:    testb $4, %al
1350; AVX2-NEXT:    jne .LBB2_5
1351; AVX2-NEXT:  .LBB2_6: # %else4
1352; AVX2-NEXT:    testb $8, %al
1353; AVX2-NEXT:    jne .LBB2_7
1354; AVX2-NEXT:  .LBB2_8: # %else6
1355; AVX2-NEXT:    testb $16, %al
1356; AVX2-NEXT:    jne .LBB2_9
1357; AVX2-NEXT:  .LBB2_10: # %else8
1358; AVX2-NEXT:    testb $32, %al
1359; AVX2-NEXT:    jne .LBB2_11
1360; AVX2-NEXT:  .LBB2_12: # %else10
1361; AVX2-NEXT:    testb $64, %al
1362; AVX2-NEXT:    jne .LBB2_13
1363; AVX2-NEXT:  .LBB2_14: # %else12
1364; AVX2-NEXT:    testb $-128, %al
1365; AVX2-NEXT:    jne .LBB2_15
1366; AVX2-NEXT:  .LBB2_16: # %else14
1367; AVX2-NEXT:    vzeroupper
1368; AVX2-NEXT:    retq
1369; AVX2-NEXT:  .LBB2_1: # %cond.store
1370; AVX2-NEXT:    vpextrb $0, %xmm0, (%rdi)
1371; AVX2-NEXT:    testb $2, %al
1372; AVX2-NEXT:    je .LBB2_4
1373; AVX2-NEXT:  .LBB2_3: # %cond.store1
1374; AVX2-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
1375; AVX2-NEXT:    testb $4, %al
1376; AVX2-NEXT:    je .LBB2_6
1377; AVX2-NEXT:  .LBB2_5: # %cond.store3
1378; AVX2-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
1379; AVX2-NEXT:    testb $8, %al
1380; AVX2-NEXT:    je .LBB2_8
1381; AVX2-NEXT:  .LBB2_7: # %cond.store5
1382; AVX2-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
1383; AVX2-NEXT:    testb $16, %al
1384; AVX2-NEXT:    je .LBB2_10
1385; AVX2-NEXT:  .LBB2_9: # %cond.store7
1386; AVX2-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
1387; AVX2-NEXT:    testb $32, %al
1388; AVX2-NEXT:    je .LBB2_12
1389; AVX2-NEXT:  .LBB2_11: # %cond.store9
1390; AVX2-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
1391; AVX2-NEXT:    testb $64, %al
1392; AVX2-NEXT:    je .LBB2_14
1393; AVX2-NEXT:  .LBB2_13: # %cond.store11
1394; AVX2-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
1395; AVX2-NEXT:    testb $-128, %al
1396; AVX2-NEXT:    je .LBB2_16
1397; AVX2-NEXT:  .LBB2_15: # %cond.store13
1398; AVX2-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
1399; AVX2-NEXT:    vzeroupper
1400; AVX2-NEXT:    retq
1401;
1402; AVX512F-LABEL: truncstore_v8i64_v8i8:
1403; AVX512F:       # %bb.0:
1404; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1405; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
1406; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
1407; AVX512F-NEXT:    kmovw %k0, %eax
1408; AVX512F-NEXT:    testb $1, %al
1409; AVX512F-NEXT:    jne .LBB2_1
1410; AVX512F-NEXT:  # %bb.2: # %else
1411; AVX512F-NEXT:    testb $2, %al
1412; AVX512F-NEXT:    jne .LBB2_3
1413; AVX512F-NEXT:  .LBB2_4: # %else2
1414; AVX512F-NEXT:    testb $4, %al
1415; AVX512F-NEXT:    jne .LBB2_5
1416; AVX512F-NEXT:  .LBB2_6: # %else4
1417; AVX512F-NEXT:    testb $8, %al
1418; AVX512F-NEXT:    jne .LBB2_7
1419; AVX512F-NEXT:  .LBB2_8: # %else6
1420; AVX512F-NEXT:    testb $16, %al
1421; AVX512F-NEXT:    jne .LBB2_9
1422; AVX512F-NEXT:  .LBB2_10: # %else8
1423; AVX512F-NEXT:    testb $32, %al
1424; AVX512F-NEXT:    jne .LBB2_11
1425; AVX512F-NEXT:  .LBB2_12: # %else10
1426; AVX512F-NEXT:    testb $64, %al
1427; AVX512F-NEXT:    jne .LBB2_13
1428; AVX512F-NEXT:  .LBB2_14: # %else12
1429; AVX512F-NEXT:    testb $-128, %al
1430; AVX512F-NEXT:    jne .LBB2_15
1431; AVX512F-NEXT:  .LBB2_16: # %else14
1432; AVX512F-NEXT:    vzeroupper
1433; AVX512F-NEXT:    retq
1434; AVX512F-NEXT:  .LBB2_1: # %cond.store
1435; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
1436; AVX512F-NEXT:    testb $2, %al
1437; AVX512F-NEXT:    je .LBB2_4
1438; AVX512F-NEXT:  .LBB2_3: # %cond.store1
1439; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
1440; AVX512F-NEXT:    testb $4, %al
1441; AVX512F-NEXT:    je .LBB2_6
1442; AVX512F-NEXT:  .LBB2_5: # %cond.store3
1443; AVX512F-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
1444; AVX512F-NEXT:    testb $8, %al
1445; AVX512F-NEXT:    je .LBB2_8
1446; AVX512F-NEXT:  .LBB2_7: # %cond.store5
1447; AVX512F-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
1448; AVX512F-NEXT:    testb $16, %al
1449; AVX512F-NEXT:    je .LBB2_10
1450; AVX512F-NEXT:  .LBB2_9: # %cond.store7
1451; AVX512F-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
1452; AVX512F-NEXT:    testb $32, %al
1453; AVX512F-NEXT:    je .LBB2_12
1454; AVX512F-NEXT:  .LBB2_11: # %cond.store9
1455; AVX512F-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
1456; AVX512F-NEXT:    testb $64, %al
1457; AVX512F-NEXT:    je .LBB2_14
1458; AVX512F-NEXT:  .LBB2_13: # %cond.store11
1459; AVX512F-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
1460; AVX512F-NEXT:    testb $-128, %al
1461; AVX512F-NEXT:    je .LBB2_16
1462; AVX512F-NEXT:  .LBB2_15: # %cond.store13
1463; AVX512F-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
1464; AVX512F-NEXT:    vzeroupper
1465; AVX512F-NEXT:    retq
1466;
1467; AVX512BW-LABEL: truncstore_v8i64_v8i8:
1468; AVX512BW:       # %bb.0:
1469; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1470; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k1
1471; AVX512BW-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
1472; AVX512BW-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
1473; AVX512BW-NEXT:    vpmovqb %zmm0, (%rdi) {%k1}
1474; AVX512BW-NEXT:    vzeroupper
1475; AVX512BW-NEXT:    retq
1476;
1477; AVX512BWVL-LABEL: truncstore_v8i64_v8i8:
1478; AVX512BWVL:       # %bb.0:
1479; AVX512BWVL-NEXT:    vptestmd %ymm1, %ymm1, %k1
1480; AVX512BWVL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
1481; AVX512BWVL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0
1482; AVX512BWVL-NEXT:    vpmovqb %zmm0, (%rdi) {%k1}
1483; AVX512BWVL-NEXT:    vzeroupper
1484; AVX512BWVL-NEXT:    retq
1485  %a = icmp ne <8 x i32> %mask, zeroinitializer
1486  %b = icmp slt <8 x i64> %x, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
1487  %c = select <8 x i1> %b, <8 x i64> %x, <8 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127>
1488  %d = icmp sgt <8 x i64> %c, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
1489  %e = select <8 x i1> %d, <8 x i64> %c, <8 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128>
1490  %f = trunc <8 x i64> %e to <8 x i8>
1491  call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %f, <8 x i8>* %p, i32 1, <8 x i1> %a)
1492  ret void
1493}
1494
1495define void @truncstore_v4i64_v4i32(<4 x i64> %x, <4 x i32>* %p, <4 x i32> %mask) {
1496; SSE2-LABEL: truncstore_v4i64_v4i32:
1497; SSE2:       # %bb.0:
1498; SSE2-NEXT:    pxor %xmm9, %xmm9
1499; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483647,2147483647]
1500; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1501; SSE2-NEXT:    movdqa %xmm0, %xmm5
1502; SSE2-NEXT:    pxor %xmm4, %xmm5
1503; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [4294967295,4294967295]
1504; SSE2-NEXT:    movdqa %xmm10, %xmm7
1505; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1506; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
1507; SSE2-NEXT:    pcmpeqd %xmm10, %xmm5
1508; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1509; SSE2-NEXT:    pand %xmm3, %xmm6
1510; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1511; SSE2-NEXT:    por %xmm6, %xmm5
1512; SSE2-NEXT:    pand %xmm5, %xmm0
1513; SSE2-NEXT:    pandn %xmm8, %xmm5
1514; SSE2-NEXT:    por %xmm0, %xmm5
1515; SSE2-NEXT:    movdqa %xmm1, %xmm0
1516; SSE2-NEXT:    pxor %xmm4, %xmm0
1517; SSE2-NEXT:    movdqa %xmm10, %xmm3
1518; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1519; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1520; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1521; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1522; SSE2-NEXT:    pand %xmm6, %xmm0
1523; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1524; SSE2-NEXT:    por %xmm0, %xmm3
1525; SSE2-NEXT:    pand %xmm3, %xmm1
1526; SSE2-NEXT:    pandn %xmm8, %xmm3
1527; SSE2-NEXT:    por %xmm1, %xmm3
1528; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968]
1529; SSE2-NEXT:    movdqa %xmm3, %xmm0
1530; SSE2-NEXT:    pxor %xmm4, %xmm0
1531; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320]
1532; SSE2-NEXT:    movdqa %xmm0, %xmm7
1533; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
1534; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]
1535; SSE2-NEXT:    pcmpeqd %xmm6, %xmm0
1536; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1537; SSE2-NEXT:    pand %xmm1, %xmm0
1538; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
1539; SSE2-NEXT:    por %xmm0, %xmm1
1540; SSE2-NEXT:    pand %xmm1, %xmm3
1541; SSE2-NEXT:    pandn %xmm8, %xmm1
1542; SSE2-NEXT:    por %xmm3, %xmm1
1543; SSE2-NEXT:    pxor %xmm5, %xmm4
1544; SSE2-NEXT:    movdqa %xmm4, %xmm0
1545; SSE2-NEXT:    pcmpgtd %xmm6, %xmm0
1546; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
1547; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
1548; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1549; SSE2-NEXT:    pand %xmm3, %xmm4
1550; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1551; SSE2-NEXT:    por %xmm4, %xmm0
1552; SSE2-NEXT:    pand %xmm0, %xmm5
1553; SSE2-NEXT:    pandn %xmm8, %xmm0
1554; SSE2-NEXT:    por %xmm5, %xmm0
1555; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1556; SSE2-NEXT:    pcmpeqd %xmm2, %xmm9
1557; SSE2-NEXT:    movmskps %xmm9, %eax
1558; SSE2-NEXT:    xorl $15, %eax
1559; SSE2-NEXT:    testb $1, %al
1560; SSE2-NEXT:    jne .LBB3_1
1561; SSE2-NEXT:  # %bb.2: # %else
1562; SSE2-NEXT:    testb $2, %al
1563; SSE2-NEXT:    jne .LBB3_3
1564; SSE2-NEXT:  .LBB3_4: # %else2
1565; SSE2-NEXT:    testb $4, %al
1566; SSE2-NEXT:    jne .LBB3_5
1567; SSE2-NEXT:  .LBB3_6: # %else4
1568; SSE2-NEXT:    testb $8, %al
1569; SSE2-NEXT:    jne .LBB3_7
1570; SSE2-NEXT:  .LBB3_8: # %else6
1571; SSE2-NEXT:    retq
1572; SSE2-NEXT:  .LBB3_1: # %cond.store
1573; SSE2-NEXT:    movss %xmm0, (%rdi)
1574; SSE2-NEXT:    testb $2, %al
1575; SSE2-NEXT:    je .LBB3_4
1576; SSE2-NEXT:  .LBB3_3: # %cond.store1
1577; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
1578; SSE2-NEXT:    movd %xmm1, 4(%rdi)
1579; SSE2-NEXT:    testb $4, %al
1580; SSE2-NEXT:    je .LBB3_6
1581; SSE2-NEXT:  .LBB3_5: # %cond.store3
1582; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
1583; SSE2-NEXT:    movd %xmm1, 8(%rdi)
1584; SSE2-NEXT:    testb $8, %al
1585; SSE2-NEXT:    je .LBB3_8
1586; SSE2-NEXT:  .LBB3_7: # %cond.store5
1587; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
1588; SSE2-NEXT:    movd %xmm0, 12(%rdi)
1589; SSE2-NEXT:    retq
1590;
1591; SSE4-LABEL: truncstore_v4i64_v4i32:
1592; SSE4:       # %bb.0:
1593; SSE4-NEXT:    movdqa %xmm0, %xmm3
1594; SSE4-NEXT:    pxor %xmm4, %xmm4
1595; SSE4-NEXT:    movdqa {{.*#+}} xmm5 = [2147483647,2147483647]
1596; SSE4-NEXT:    movdqa %xmm5, %xmm0
1597; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
1598; SSE4-NEXT:    movdqa %xmm5, %xmm6
1599; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
1600; SSE4-NEXT:    movdqa %xmm5, %xmm0
1601; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1602; SSE4-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
1603; SSE4-NEXT:    movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968]
1604; SSE4-NEXT:    movapd %xmm5, %xmm0
1605; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1606; SSE4-NEXT:    movdqa %xmm1, %xmm3
1607; SSE4-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
1608; SSE4-NEXT:    movapd %xmm6, %xmm0
1609; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1610; SSE4-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
1611; SSE4-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2]
1612; SSE4-NEXT:    pcmpeqd %xmm2, %xmm4
1613; SSE4-NEXT:    movmskps %xmm4, %eax
1614; SSE4-NEXT:    xorl $15, %eax
1615; SSE4-NEXT:    testb $1, %al
1616; SSE4-NEXT:    jne .LBB3_1
1617; SSE4-NEXT:  # %bb.2: # %else
1618; SSE4-NEXT:    testb $2, %al
1619; SSE4-NEXT:    jne .LBB3_3
1620; SSE4-NEXT:  .LBB3_4: # %else2
1621; SSE4-NEXT:    testb $4, %al
1622; SSE4-NEXT:    jne .LBB3_5
1623; SSE4-NEXT:  .LBB3_6: # %else4
1624; SSE4-NEXT:    testb $8, %al
1625; SSE4-NEXT:    jne .LBB3_7
1626; SSE4-NEXT:  .LBB3_8: # %else6
1627; SSE4-NEXT:    retq
1628; SSE4-NEXT:  .LBB3_1: # %cond.store
1629; SSE4-NEXT:    movss %xmm1, (%rdi)
1630; SSE4-NEXT:    testb $2, %al
1631; SSE4-NEXT:    je .LBB3_4
1632; SSE4-NEXT:  .LBB3_3: # %cond.store1
1633; SSE4-NEXT:    extractps $1, %xmm1, 4(%rdi)
1634; SSE4-NEXT:    testb $4, %al
1635; SSE4-NEXT:    je .LBB3_6
1636; SSE4-NEXT:  .LBB3_5: # %cond.store3
1637; SSE4-NEXT:    extractps $2, %xmm1, 8(%rdi)
1638; SSE4-NEXT:    testb $8, %al
1639; SSE4-NEXT:    je .LBB3_8
1640; SSE4-NEXT:  .LBB3_7: # %cond.store5
1641; SSE4-NEXT:    extractps $3, %xmm1, 12(%rdi)
1642; SSE4-NEXT:    retq
1643;
1644; AVX1-LABEL: truncstore_v4i64_v4i32:
1645; AVX1:       # %bb.0:
1646; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1647; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
1648; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1649; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1650; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1651; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2147483647,2147483647]
1652; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
1653; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm5
1654; AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm3, %xmm0
1655; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [18446744071562067968,18446744071562067968]
1656; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm0, %xmm6
1657; AVX1-NEXT:    vblendvpd %xmm4, %xmm2, %xmm3, %xmm2
1658; AVX1-NEXT:    vpcmpgtq %xmm5, %xmm2, %xmm3
1659; AVX1-NEXT:    vblendvpd %xmm3, %xmm2, %xmm5, %xmm2
1660; AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm5, %xmm0
1661; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
1662; AVX1-NEXT:    vmaskmovps %xmm0, %xmm1, (%rdi)
1663; AVX1-NEXT:    vzeroupper
1664; AVX1-NEXT:    retq
1665;
1666; AVX2-LABEL: truncstore_v4i64_v4i32:
1667; AVX2:       # %bb.0:
1668; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1669; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
1670; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
1671; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
1672; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647]
1673; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm3
1674; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1675; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968]
1676; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
1677; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
1678; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm2
1679; AVX2-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
1680; AVX2-NEXT:    vpmaskmovd %xmm0, %xmm1, (%rdi)
1681; AVX2-NEXT:    vzeroupper
1682; AVX2-NEXT:    retq
1683;
1684; AVX512F-LABEL: truncstore_v4i64_v4i32:
1685; AVX512F:       # %bb.0:
1686; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1687; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1688; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
1689; AVX512F-NEXT:    kshiftlw $12, %k0, %k0
1690; AVX512F-NEXT:    kshiftrw $12, %k0, %k1
1691; AVX512F-NEXT:    vpmovsqd %zmm0, %ymm0
1692; AVX512F-NEXT:    vmovdqu32 %zmm0, (%rdi) {%k1}
1693; AVX512F-NEXT:    vzeroupper
1694; AVX512F-NEXT:    retq
1695;
1696; AVX512VL-LABEL: truncstore_v4i64_v4i32:
1697; AVX512VL:       # %bb.0:
1698; AVX512VL-NEXT:    vptestmd %xmm1, %xmm1, %k1
1699; AVX512VL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
1700; AVX512VL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
1701; AVX512VL-NEXT:    vpmovqd %ymm0, (%rdi) {%k1}
1702; AVX512VL-NEXT:    vzeroupper
1703; AVX512VL-NEXT:    retq
1704;
1705; AVX512BW-LABEL: truncstore_v4i64_v4i32:
1706; AVX512BW:       # %bb.0:
1707; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1708; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1709; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k0
1710; AVX512BW-NEXT:    kshiftlw $12, %k0, %k0
1711; AVX512BW-NEXT:    kshiftrw $12, %k0, %k1
1712; AVX512BW-NEXT:    vpmovsqd %zmm0, %ymm0
1713; AVX512BW-NEXT:    vmovdqu32 %zmm0, (%rdi) {%k1}
1714; AVX512BW-NEXT:    vzeroupper
1715; AVX512BW-NEXT:    retq
1716  %a = icmp ne <4 x i32> %mask, zeroinitializer
1717  %b = icmp slt <4 x i64> %x, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
1718  %c = select <4 x i1> %b, <4 x i64> %x, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
1719  %d = icmp sgt <4 x i64> %c, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
1720  %e = select <4 x i1> %d, <4 x i64> %c, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
1721  %f = trunc <4 x i64> %e to <4 x i32>
1722  call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %f, <4 x i32>* %p, i32 1, <4 x i1> %a)
1723  ret void
1724}
1725
1726define void @truncstore_v4i64_v4i16(<4 x i64> %x, <4 x i16>* %p, <4 x i32> %mask) {
1727; SSE2-LABEL: truncstore_v4i64_v4i16:
1728; SSE2:       # %bb.0:
1729; SSE2-NEXT:    pxor %xmm9, %xmm9
1730; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [32767,32767]
1731; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
1732; SSE2-NEXT:    movdqa %xmm0, %xmm5
1733; SSE2-NEXT:    pxor %xmm4, %xmm5
1734; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147516415,2147516415]
1735; SSE2-NEXT:    movdqa %xmm10, %xmm7
1736; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
1737; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
1738; SSE2-NEXT:    pcmpeqd %xmm10, %xmm5
1739; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1740; SSE2-NEXT:    pand %xmm3, %xmm6
1741; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1742; SSE2-NEXT:    por %xmm6, %xmm5
1743; SSE2-NEXT:    pand %xmm5, %xmm0
1744; SSE2-NEXT:    pandn %xmm8, %xmm5
1745; SSE2-NEXT:    por %xmm0, %xmm5
1746; SSE2-NEXT:    movdqa %xmm1, %xmm0
1747; SSE2-NEXT:    pxor %xmm4, %xmm0
1748; SSE2-NEXT:    movdqa %xmm10, %xmm3
1749; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
1750; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
1751; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
1752; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1753; SSE2-NEXT:    pand %xmm6, %xmm0
1754; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1755; SSE2-NEXT:    por %xmm0, %xmm3
1756; SSE2-NEXT:    pand %xmm3, %xmm1
1757; SSE2-NEXT:    pandn %xmm8, %xmm3
1758; SSE2-NEXT:    por %xmm1, %xmm3
1759; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848]
1760; SSE2-NEXT:    movdqa %xmm3, %xmm0
1761; SSE2-NEXT:    pxor %xmm4, %xmm0
1762; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200]
1763; SSE2-NEXT:    movdqa %xmm0, %xmm7
1764; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
1765; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]
1766; SSE2-NEXT:    pcmpeqd %xmm6, %xmm0
1767; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1768; SSE2-NEXT:    pand %xmm1, %xmm0
1769; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
1770; SSE2-NEXT:    por %xmm0, %xmm1
1771; SSE2-NEXT:    pand %xmm1, %xmm3
1772; SSE2-NEXT:    pandn %xmm8, %xmm1
1773; SSE2-NEXT:    por %xmm3, %xmm1
1774; SSE2-NEXT:    pxor %xmm5, %xmm4
1775; SSE2-NEXT:    movdqa %xmm4, %xmm0
1776; SSE2-NEXT:    pcmpgtd %xmm6, %xmm0
1777; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2]
1778; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
1779; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1780; SSE2-NEXT:    pand %xmm3, %xmm4
1781; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1782; SSE2-NEXT:    por %xmm4, %xmm0
1783; SSE2-NEXT:    pand %xmm0, %xmm5
1784; SSE2-NEXT:    pandn %xmm8, %xmm0
1785; SSE2-NEXT:    por %xmm5, %xmm0
1786; SSE2-NEXT:    packssdw %xmm1, %xmm0
1787; SSE2-NEXT:    packssdw %xmm0, %xmm0
1788; SSE2-NEXT:    pcmpeqd %xmm2, %xmm9
1789; SSE2-NEXT:    movmskps %xmm9, %eax
1790; SSE2-NEXT:    xorl $15, %eax
1791; SSE2-NEXT:    testb $1, %al
1792; SSE2-NEXT:    jne .LBB4_1
1793; SSE2-NEXT:  # %bb.2: # %else
1794; SSE2-NEXT:    testb $2, %al
1795; SSE2-NEXT:    jne .LBB4_3
1796; SSE2-NEXT:  .LBB4_4: # %else2
1797; SSE2-NEXT:    testb $4, %al
1798; SSE2-NEXT:    jne .LBB4_5
1799; SSE2-NEXT:  .LBB4_6: # %else4
1800; SSE2-NEXT:    testb $8, %al
1801; SSE2-NEXT:    jne .LBB4_7
1802; SSE2-NEXT:  .LBB4_8: # %else6
1803; SSE2-NEXT:    retq
1804; SSE2-NEXT:  .LBB4_1: # %cond.store
1805; SSE2-NEXT:    movd %xmm0, %ecx
1806; SSE2-NEXT:    movw %cx, (%rdi)
1807; SSE2-NEXT:    testb $2, %al
1808; SSE2-NEXT:    je .LBB4_4
1809; SSE2-NEXT:  .LBB4_3: # %cond.store1
1810; SSE2-NEXT:    pextrw $1, %xmm0, %ecx
1811; SSE2-NEXT:    movw %cx, 2(%rdi)
1812; SSE2-NEXT:    testb $4, %al
1813; SSE2-NEXT:    je .LBB4_6
1814; SSE2-NEXT:  .LBB4_5: # %cond.store3
1815; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
1816; SSE2-NEXT:    movw %cx, 4(%rdi)
1817; SSE2-NEXT:    testb $8, %al
1818; SSE2-NEXT:    je .LBB4_8
1819; SSE2-NEXT:  .LBB4_7: # %cond.store5
1820; SSE2-NEXT:    pextrw $3, %xmm0, %eax
1821; SSE2-NEXT:    movw %ax, 6(%rdi)
1822; SSE2-NEXT:    retq
1823;
1824; SSE4-LABEL: truncstore_v4i64_v4i16:
1825; SSE4:       # %bb.0:
1826; SSE4-NEXT:    movdqa %xmm0, %xmm3
1827; SSE4-NEXT:    pxor %xmm4, %xmm4
1828; SSE4-NEXT:    movdqa {{.*#+}} xmm5 = [32767,32767]
1829; SSE4-NEXT:    movdqa %xmm5, %xmm0
1830; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
1831; SSE4-NEXT:    movdqa %xmm5, %xmm6
1832; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
1833; SSE4-NEXT:    movdqa %xmm5, %xmm0
1834; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1835; SSE4-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
1836; SSE4-NEXT:    movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848]
1837; SSE4-NEXT:    movapd %xmm5, %xmm0
1838; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1839; SSE4-NEXT:    movdqa %xmm1, %xmm3
1840; SSE4-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
1841; SSE4-NEXT:    movapd %xmm6, %xmm0
1842; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
1843; SSE4-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
1844; SSE4-NEXT:    packssdw %xmm3, %xmm1
1845; SSE4-NEXT:    packssdw %xmm1, %xmm1
1846; SSE4-NEXT:    pcmpeqd %xmm2, %xmm4
1847; SSE4-NEXT:    movmskps %xmm4, %eax
1848; SSE4-NEXT:    xorl $15, %eax
1849; SSE4-NEXT:    testb $1, %al
1850; SSE4-NEXT:    jne .LBB4_1
1851; SSE4-NEXT:  # %bb.2: # %else
1852; SSE4-NEXT:    testb $2, %al
1853; SSE4-NEXT:    jne .LBB4_3
1854; SSE4-NEXT:  .LBB4_4: # %else2
1855; SSE4-NEXT:    testb $4, %al
1856; SSE4-NEXT:    jne .LBB4_5
1857; SSE4-NEXT:  .LBB4_6: # %else4
1858; SSE4-NEXT:    testb $8, %al
1859; SSE4-NEXT:    jne .LBB4_7
1860; SSE4-NEXT:  .LBB4_8: # %else6
1861; SSE4-NEXT:    retq
1862; SSE4-NEXT:  .LBB4_1: # %cond.store
1863; SSE4-NEXT:    pextrw $0, %xmm1, (%rdi)
1864; SSE4-NEXT:    testb $2, %al
1865; SSE4-NEXT:    je .LBB4_4
1866; SSE4-NEXT:  .LBB4_3: # %cond.store1
1867; SSE4-NEXT:    pextrw $1, %xmm1, 2(%rdi)
1868; SSE4-NEXT:    testb $4, %al
1869; SSE4-NEXT:    je .LBB4_6
1870; SSE4-NEXT:  .LBB4_5: # %cond.store3
1871; SSE4-NEXT:    pextrw $2, %xmm1, 4(%rdi)
1872; SSE4-NEXT:    testb $8, %al
1873; SSE4-NEXT:    je .LBB4_8
1874; SSE4-NEXT:  .LBB4_7: # %cond.store5
1875; SSE4-NEXT:    pextrw $3, %xmm1, 6(%rdi)
1876; SSE4-NEXT:    retq
1877;
1878; AVX1-LABEL: truncstore_v4i64_v4i16:
1879; AVX1:       # %bb.0:
1880; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1881; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1882; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [32767,32767]
1883; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
1884; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm6
1885; AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm4, %xmm0
1886; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [18446744073709518848,18446744073709518848]
1887; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm0, %xmm7
1888; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
1889; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm3, %xmm4
1890; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
1891; AVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm6, %xmm0
1892; AVX1-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
1893; AVX1-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1894; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
1895; AVX1-NEXT:    vmovmskps %xmm1, %eax
1896; AVX1-NEXT:    xorl $15, %eax
1897; AVX1-NEXT:    testb $1, %al
1898; AVX1-NEXT:    jne .LBB4_1
1899; AVX1-NEXT:  # %bb.2: # %else
1900; AVX1-NEXT:    testb $2, %al
1901; AVX1-NEXT:    jne .LBB4_3
1902; AVX1-NEXT:  .LBB4_4: # %else2
1903; AVX1-NEXT:    testb $4, %al
1904; AVX1-NEXT:    jne .LBB4_5
1905; AVX1-NEXT:  .LBB4_6: # %else4
1906; AVX1-NEXT:    testb $8, %al
1907; AVX1-NEXT:    jne .LBB4_7
1908; AVX1-NEXT:  .LBB4_8: # %else6
1909; AVX1-NEXT:    vzeroupper
1910; AVX1-NEXT:    retq
1911; AVX1-NEXT:  .LBB4_1: # %cond.store
1912; AVX1-NEXT:    vpextrw $0, %xmm0, (%rdi)
1913; AVX1-NEXT:    testb $2, %al
1914; AVX1-NEXT:    je .LBB4_4
1915; AVX1-NEXT:  .LBB4_3: # %cond.store1
1916; AVX1-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
1917; AVX1-NEXT:    testb $4, %al
1918; AVX1-NEXT:    je .LBB4_6
1919; AVX1-NEXT:  .LBB4_5: # %cond.store3
1920; AVX1-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
1921; AVX1-NEXT:    testb $8, %al
1922; AVX1-NEXT:    je .LBB4_8
1923; AVX1-NEXT:  .LBB4_7: # %cond.store5
1924; AVX1-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
1925; AVX1-NEXT:    vzeroupper
1926; AVX1-NEXT:    retq
1927;
1928; AVX2-LABEL: truncstore_v4i64_v4i16:
1929; AVX2:       # %bb.0:
1930; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1931; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [32767,32767,32767,32767]
1932; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm3, %ymm4
1933; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm3, %ymm0
1934; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848]
1935; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm0, %ymm4
1936; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm3, %ymm0
1937; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm3
1938; AVX2-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
1939; AVX2-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
1940; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
1941; AVX2-NEXT:    vmovmskps %xmm1, %eax
1942; AVX2-NEXT:    xorl $15, %eax
1943; AVX2-NEXT:    testb $1, %al
1944; AVX2-NEXT:    jne .LBB4_1
1945; AVX2-NEXT:  # %bb.2: # %else
1946; AVX2-NEXT:    testb $2, %al
1947; AVX2-NEXT:    jne .LBB4_3
1948; AVX2-NEXT:  .LBB4_4: # %else2
1949; AVX2-NEXT:    testb $4, %al
1950; AVX2-NEXT:    jne .LBB4_5
1951; AVX2-NEXT:  .LBB4_6: # %else4
1952; AVX2-NEXT:    testb $8, %al
1953; AVX2-NEXT:    jne .LBB4_7
1954; AVX2-NEXT:  .LBB4_8: # %else6
1955; AVX2-NEXT:    vzeroupper
1956; AVX2-NEXT:    retq
1957; AVX2-NEXT:  .LBB4_1: # %cond.store
1958; AVX2-NEXT:    vpextrw $0, %xmm0, (%rdi)
1959; AVX2-NEXT:    testb $2, %al
1960; AVX2-NEXT:    je .LBB4_4
1961; AVX2-NEXT:  .LBB4_3: # %cond.store1
1962; AVX2-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
1963; AVX2-NEXT:    testb $4, %al
1964; AVX2-NEXT:    je .LBB4_6
1965; AVX2-NEXT:  .LBB4_5: # %cond.store3
1966; AVX2-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
1967; AVX2-NEXT:    testb $8, %al
1968; AVX2-NEXT:    je .LBB4_8
1969; AVX2-NEXT:  .LBB4_7: # %cond.store5
1970; AVX2-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
1971; AVX2-NEXT:    vzeroupper
1972; AVX2-NEXT:    retq
1973;
1974; AVX512F-LABEL: truncstore_v4i64_v4i16:
1975; AVX512F:       # %bb.0:
1976; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
1977; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1978; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
1979; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
1980; AVX512F-NEXT:    kmovw %k0, %eax
1981; AVX512F-NEXT:    testb $1, %al
1982; AVX512F-NEXT:    jne .LBB4_1
1983; AVX512F-NEXT:  # %bb.2: # %else
1984; AVX512F-NEXT:    testb $2, %al
1985; AVX512F-NEXT:    jne .LBB4_3
1986; AVX512F-NEXT:  .LBB4_4: # %else2
1987; AVX512F-NEXT:    testb $4, %al
1988; AVX512F-NEXT:    jne .LBB4_5
1989; AVX512F-NEXT:  .LBB4_6: # %else4
1990; AVX512F-NEXT:    testb $8, %al
1991; AVX512F-NEXT:    jne .LBB4_7
1992; AVX512F-NEXT:  .LBB4_8: # %else6
1993; AVX512F-NEXT:    vzeroupper
1994; AVX512F-NEXT:    retq
1995; AVX512F-NEXT:  .LBB4_1: # %cond.store
1996; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
1997; AVX512F-NEXT:    testb $2, %al
1998; AVX512F-NEXT:    je .LBB4_4
1999; AVX512F-NEXT:  .LBB4_3: # %cond.store1
2000; AVX512F-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
2001; AVX512F-NEXT:    testb $4, %al
2002; AVX512F-NEXT:    je .LBB4_6
2003; AVX512F-NEXT:  .LBB4_5: # %cond.store3
2004; AVX512F-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
2005; AVX512F-NEXT:    testb $8, %al
2006; AVX512F-NEXT:    je .LBB4_8
2007; AVX512F-NEXT:  .LBB4_7: # %cond.store5
2008; AVX512F-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
2009; AVX512F-NEXT:    vzeroupper
2010; AVX512F-NEXT:    retq
2011;
2012; AVX512BW-LABEL: truncstore_v4i64_v4i16:
2013; AVX512BW:       # %bb.0:
2014; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2015; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2016; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k0
2017; AVX512BW-NEXT:    kshiftld $28, %k0, %k0
2018; AVX512BW-NEXT:    kshiftrd $28, %k0, %k1
2019; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
2020; AVX512BW-NEXT:    vmovdqu16 %zmm0, (%rdi) {%k1}
2021; AVX512BW-NEXT:    vzeroupper
2022; AVX512BW-NEXT:    retq
2023;
2024; AVX512BWVL-LABEL: truncstore_v4i64_v4i16:
2025; AVX512BWVL:       # %bb.0:
2026; AVX512BWVL-NEXT:    vptestmd %xmm1, %xmm1, %k1
2027; AVX512BWVL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
2028; AVX512BWVL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
2029; AVX512BWVL-NEXT:    vpmovqw %ymm0, (%rdi) {%k1}
2030; AVX512BWVL-NEXT:    vzeroupper
2031; AVX512BWVL-NEXT:    retq
2032  %a = icmp ne <4 x i32> %mask, zeroinitializer
2033  %b = icmp slt <4 x i64> %x, <i64 32767, i64 32767, i64 32767, i64 32767>
2034  %c = select <4 x i1> %b, <4 x i64> %x, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767>
2035  %d = icmp sgt <4 x i64> %c, <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
2036  %e = select <4 x i1> %d, <4 x i64> %c, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768>
2037  %f = trunc <4 x i64> %e to <4 x i16>
2038  call void @llvm.masked.store.v4i16.p0v4i16(<4 x i16> %f, <4 x i16>* %p, i32 1, <4 x i1> %a)
2039  ret void
2040}
2041
2042define void @truncstore_v4i64_v4i8(<4 x i64> %x, <4 x i8>* %p, <4 x i32> %mask) {
2043; SSE2-LABEL: truncstore_v4i64_v4i8:
2044; SSE2:       # %bb.0:
2045; SSE2-NEXT:    pxor %xmm9, %xmm9
2046; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [127,127]
2047; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
2048; SSE2-NEXT:    movdqa %xmm1, %xmm5
2049; SSE2-NEXT:    pxor %xmm4, %xmm5
2050; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [2147483775,2147483775]
2051; SSE2-NEXT:    movdqa %xmm10, %xmm7
2052; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
2053; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2]
2054; SSE2-NEXT:    pcmpeqd %xmm10, %xmm5
2055; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
2056; SSE2-NEXT:    pand %xmm3, %xmm6
2057; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
2058; SSE2-NEXT:    por %xmm6, %xmm5
2059; SSE2-NEXT:    pand %xmm5, %xmm1
2060; SSE2-NEXT:    pandn %xmm8, %xmm5
2061; SSE2-NEXT:    por %xmm1, %xmm5
2062; SSE2-NEXT:    movdqa %xmm0, %xmm1
2063; SSE2-NEXT:    pxor %xmm4, %xmm1
2064; SSE2-NEXT:    movdqa %xmm10, %xmm3
2065; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
2066; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
2067; SSE2-NEXT:    pcmpeqd %xmm10, %xmm1
2068; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2069; SSE2-NEXT:    pand %xmm6, %xmm1
2070; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
2071; SSE2-NEXT:    por %xmm1, %xmm3
2072; SSE2-NEXT:    pand %xmm3, %xmm0
2073; SSE2-NEXT:    pandn %xmm8, %xmm3
2074; SSE2-NEXT:    por %xmm0, %xmm3
2075; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488]
2076; SSE2-NEXT:    movdqa %xmm3, %xmm0
2077; SSE2-NEXT:    pxor %xmm4, %xmm0
2078; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [18446744071562067840,18446744071562067840]
2079; SSE2-NEXT:    movdqa %xmm0, %xmm7
2080; SSE2-NEXT:    pcmpgtd %xmm10, %xmm7
2081; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]
2082; SSE2-NEXT:    pcmpeqd %xmm10, %xmm0
2083; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
2084; SSE2-NEXT:    pand %xmm1, %xmm6
2085; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
2086; SSE2-NEXT:    por %xmm6, %xmm0
2087; SSE2-NEXT:    pand %xmm0, %xmm3
2088; SSE2-NEXT:    pandn %xmm8, %xmm0
2089; SSE2-NEXT:    por %xmm3, %xmm0
2090; SSE2-NEXT:    pxor %xmm5, %xmm4
2091; SSE2-NEXT:    movdqa %xmm4, %xmm1
2092; SSE2-NEXT:    pcmpgtd %xmm10, %xmm1
2093; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2]
2094; SSE2-NEXT:    pcmpeqd %xmm10, %xmm4
2095; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2096; SSE2-NEXT:    pand %xmm3, %xmm4
2097; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
2098; SSE2-NEXT:    por %xmm4, %xmm1
2099; SSE2-NEXT:    pand %xmm1, %xmm5
2100; SSE2-NEXT:    pandn %xmm8, %xmm1
2101; SSE2-NEXT:    por %xmm5, %xmm1
2102; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,0,0,0,255,0,0,0]
2103; SSE2-NEXT:    pand %xmm3, %xmm1
2104; SSE2-NEXT:    pand %xmm3, %xmm0
2105; SSE2-NEXT:    packuswb %xmm1, %xmm0
2106; SSE2-NEXT:    packuswb %xmm0, %xmm0
2107; SSE2-NEXT:    packuswb %xmm0, %xmm0
2108; SSE2-NEXT:    pcmpeqd %xmm2, %xmm9
2109; SSE2-NEXT:    movmskps %xmm9, %ecx
2110; SSE2-NEXT:    xorl $15, %ecx
2111; SSE2-NEXT:    testb $1, %cl
2112; SSE2-NEXT:    movd %xmm0, %eax
2113; SSE2-NEXT:    jne .LBB5_1
2114; SSE2-NEXT:  # %bb.2: # %else
2115; SSE2-NEXT:    testb $2, %cl
2116; SSE2-NEXT:    jne .LBB5_3
2117; SSE2-NEXT:  .LBB5_4: # %else2
2118; SSE2-NEXT:    testb $4, %cl
2119; SSE2-NEXT:    jne .LBB5_5
2120; SSE2-NEXT:  .LBB5_6: # %else4
2121; SSE2-NEXT:    testb $8, %cl
2122; SSE2-NEXT:    jne .LBB5_7
2123; SSE2-NEXT:  .LBB5_8: # %else6
2124; SSE2-NEXT:    retq
2125; SSE2-NEXT:  .LBB5_1: # %cond.store
2126; SSE2-NEXT:    movb %al, (%rdi)
2127; SSE2-NEXT:    testb $2, %cl
2128; SSE2-NEXT:    je .LBB5_4
2129; SSE2-NEXT:  .LBB5_3: # %cond.store1
2130; SSE2-NEXT:    movb %ah, 1(%rdi)
2131; SSE2-NEXT:    testb $4, %cl
2132; SSE2-NEXT:    je .LBB5_6
2133; SSE2-NEXT:  .LBB5_5: # %cond.store3
2134; SSE2-NEXT:    movl %eax, %edx
2135; SSE2-NEXT:    shrl $16, %edx
2136; SSE2-NEXT:    movb %dl, 2(%rdi)
2137; SSE2-NEXT:    testb $8, %cl
2138; SSE2-NEXT:    je .LBB5_8
2139; SSE2-NEXT:  .LBB5_7: # %cond.store5
2140; SSE2-NEXT:    shrl $24, %eax
2141; SSE2-NEXT:    movb %al, 3(%rdi)
2142; SSE2-NEXT:    retq
2143;
2144; SSE4-LABEL: truncstore_v4i64_v4i8:
2145; SSE4:       # %bb.0:
2146; SSE4-NEXT:    movdqa %xmm0, %xmm3
2147; SSE4-NEXT:    pxor %xmm4, %xmm4
2148; SSE4-NEXT:    movdqa {{.*#+}} xmm5 = [127,127]
2149; SSE4-NEXT:    movdqa %xmm5, %xmm0
2150; SSE4-NEXT:    pcmpgtq %xmm1, %xmm0
2151; SSE4-NEXT:    movdqa %xmm5, %xmm6
2152; SSE4-NEXT:    blendvpd %xmm0, %xmm1, %xmm6
2153; SSE4-NEXT:    movdqa %xmm5, %xmm0
2154; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
2155; SSE4-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
2156; SSE4-NEXT:    movdqa {{.*#+}} xmm3 = [18446744073709551488,18446744073709551488]
2157; SSE4-NEXT:    movapd %xmm5, %xmm0
2158; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
2159; SSE4-NEXT:    movdqa %xmm3, %xmm1
2160; SSE4-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
2161; SSE4-NEXT:    movapd %xmm6, %xmm0
2162; SSE4-NEXT:    pcmpgtq %xmm3, %xmm0
2163; SSE4-NEXT:    blendvpd %xmm0, %xmm6, %xmm3
2164; SSE4-NEXT:    movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2165; SSE4-NEXT:    pshufb %xmm0, %xmm3
2166; SSE4-NEXT:    pshufb %xmm0, %xmm1
2167; SSE4-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
2168; SSE4-NEXT:    pcmpeqd %xmm2, %xmm4
2169; SSE4-NEXT:    movmskps %xmm4, %eax
2170; SSE4-NEXT:    xorl $15, %eax
2171; SSE4-NEXT:    testb $1, %al
2172; SSE4-NEXT:    jne .LBB5_1
2173; SSE4-NEXT:  # %bb.2: # %else
2174; SSE4-NEXT:    testb $2, %al
2175; SSE4-NEXT:    jne .LBB5_3
2176; SSE4-NEXT:  .LBB5_4: # %else2
2177; SSE4-NEXT:    testb $4, %al
2178; SSE4-NEXT:    jne .LBB5_5
2179; SSE4-NEXT:  .LBB5_6: # %else4
2180; SSE4-NEXT:    testb $8, %al
2181; SSE4-NEXT:    jne .LBB5_7
2182; SSE4-NEXT:  .LBB5_8: # %else6
2183; SSE4-NEXT:    retq
2184; SSE4-NEXT:  .LBB5_1: # %cond.store
2185; SSE4-NEXT:    pextrb $0, %xmm1, (%rdi)
2186; SSE4-NEXT:    testb $2, %al
2187; SSE4-NEXT:    je .LBB5_4
2188; SSE4-NEXT:  .LBB5_3: # %cond.store1
2189; SSE4-NEXT:    pextrb $1, %xmm1, 1(%rdi)
2190; SSE4-NEXT:    testb $4, %al
2191; SSE4-NEXT:    je .LBB5_6
2192; SSE4-NEXT:  .LBB5_5: # %cond.store3
2193; SSE4-NEXT:    pextrb $2, %xmm1, 2(%rdi)
2194; SSE4-NEXT:    testb $8, %al
2195; SSE4-NEXT:    je .LBB5_8
2196; SSE4-NEXT:  .LBB5_7: # %cond.store5
2197; SSE4-NEXT:    pextrb $3, %xmm1, 3(%rdi)
2198; SSE4-NEXT:    retq
2199;
2200; AVX1-LABEL: truncstore_v4i64_v4i8:
2201; AVX1:       # %bb.0:
2202; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2203; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2204; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [127,127]
2205; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
2206; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm4, %xmm6
2207; AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm4, %xmm0
2208; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488]
2209; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm0, %xmm7
2210; AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
2211; AVX1-NEXT:    vpcmpgtq %xmm6, %xmm3, %xmm4
2212; AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm6, %xmm3
2213; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2214; AVX1-NEXT:    vpshufb %xmm4, %xmm3, %xmm3
2215; AVX1-NEXT:    vblendvpd %xmm7, %xmm0, %xmm6, %xmm0
2216; AVX1-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
2217; AVX1-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2218; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
2219; AVX1-NEXT:    vmovmskps %xmm1, %eax
2220; AVX1-NEXT:    xorl $15, %eax
2221; AVX1-NEXT:    testb $1, %al
2222; AVX1-NEXT:    jne .LBB5_1
2223; AVX1-NEXT:  # %bb.2: # %else
2224; AVX1-NEXT:    testb $2, %al
2225; AVX1-NEXT:    jne .LBB5_3
2226; AVX1-NEXT:  .LBB5_4: # %else2
2227; AVX1-NEXT:    testb $4, %al
2228; AVX1-NEXT:    jne .LBB5_5
2229; AVX1-NEXT:  .LBB5_6: # %else4
2230; AVX1-NEXT:    testb $8, %al
2231; AVX1-NEXT:    jne .LBB5_7
2232; AVX1-NEXT:  .LBB5_8: # %else6
2233; AVX1-NEXT:    vzeroupper
2234; AVX1-NEXT:    retq
2235; AVX1-NEXT:  .LBB5_1: # %cond.store
2236; AVX1-NEXT:    vpextrb $0, %xmm0, (%rdi)
2237; AVX1-NEXT:    testb $2, %al
2238; AVX1-NEXT:    je .LBB5_4
2239; AVX1-NEXT:  .LBB5_3: # %cond.store1
2240; AVX1-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
2241; AVX1-NEXT:    testb $4, %al
2242; AVX1-NEXT:    je .LBB5_6
2243; AVX1-NEXT:  .LBB5_5: # %cond.store3
2244; AVX1-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
2245; AVX1-NEXT:    testb $8, %al
2246; AVX1-NEXT:    je .LBB5_8
2247; AVX1-NEXT:  .LBB5_7: # %cond.store5
2248; AVX1-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
2249; AVX1-NEXT:    vzeroupper
2250; AVX1-NEXT:    retq
2251;
2252; AVX2-LABEL: truncstore_v4i64_v4i8:
2253; AVX2:       # %bb.0:
2254; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2255; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [127,127,127,127]
2256; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm3, %ymm4
2257; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm3, %ymm0
2258; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488]
2259; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm0, %ymm4
2260; AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm3, %ymm0
2261; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm3
2262; AVX2-NEXT:    vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u>
2263; AVX2-NEXT:    vpshufb %xmm4, %xmm3, %xmm3
2264; AVX2-NEXT:    vpshufb %xmm4, %xmm0, %xmm0
2265; AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
2266; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
2267; AVX2-NEXT:    vmovmskps %xmm1, %eax
2268; AVX2-NEXT:    xorl $15, %eax
2269; AVX2-NEXT:    testb $1, %al
2270; AVX2-NEXT:    jne .LBB5_1
2271; AVX2-NEXT:  # %bb.2: # %else
2272; AVX2-NEXT:    testb $2, %al
2273; AVX2-NEXT:    jne .LBB5_3
2274; AVX2-NEXT:  .LBB5_4: # %else2
2275; AVX2-NEXT:    testb $4, %al
2276; AVX2-NEXT:    jne .LBB5_5
2277; AVX2-NEXT:  .LBB5_6: # %else4
2278; AVX2-NEXT:    testb $8, %al
2279; AVX2-NEXT:    jne .LBB5_7
2280; AVX2-NEXT:  .LBB5_8: # %else6
2281; AVX2-NEXT:    vzeroupper
2282; AVX2-NEXT:    retq
2283; AVX2-NEXT:  .LBB5_1: # %cond.store
2284; AVX2-NEXT:    vpextrb $0, %xmm0, (%rdi)
2285; AVX2-NEXT:    testb $2, %al
2286; AVX2-NEXT:    je .LBB5_4
2287; AVX2-NEXT:  .LBB5_3: # %cond.store1
2288; AVX2-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
2289; AVX2-NEXT:    testb $4, %al
2290; AVX2-NEXT:    je .LBB5_6
2291; AVX2-NEXT:  .LBB5_5: # %cond.store3
2292; AVX2-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
2293; AVX2-NEXT:    testb $8, %al
2294; AVX2-NEXT:    je .LBB5_8
2295; AVX2-NEXT:  .LBB5_7: # %cond.store5
2296; AVX2-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
2297; AVX2-NEXT:    vzeroupper
2298; AVX2-NEXT:    retq
2299;
2300; AVX512F-LABEL: truncstore_v4i64_v4i8:
2301; AVX512F:       # %bb.0:
2302; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2303; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2304; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
2305; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
2306; AVX512F-NEXT:    kmovw %k0, %eax
2307; AVX512F-NEXT:    testb $1, %al
2308; AVX512F-NEXT:    jne .LBB5_1
2309; AVX512F-NEXT:  # %bb.2: # %else
2310; AVX512F-NEXT:    testb $2, %al
2311; AVX512F-NEXT:    jne .LBB5_3
2312; AVX512F-NEXT:  .LBB5_4: # %else2
2313; AVX512F-NEXT:    testb $4, %al
2314; AVX512F-NEXT:    jne .LBB5_5
2315; AVX512F-NEXT:  .LBB5_6: # %else4
2316; AVX512F-NEXT:    testb $8, %al
2317; AVX512F-NEXT:    jne .LBB5_7
2318; AVX512F-NEXT:  .LBB5_8: # %else6
2319; AVX512F-NEXT:    vzeroupper
2320; AVX512F-NEXT:    retq
2321; AVX512F-NEXT:  .LBB5_1: # %cond.store
2322; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
2323; AVX512F-NEXT:    testb $2, %al
2324; AVX512F-NEXT:    je .LBB5_4
2325; AVX512F-NEXT:  .LBB5_3: # %cond.store1
2326; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
2327; AVX512F-NEXT:    testb $4, %al
2328; AVX512F-NEXT:    je .LBB5_6
2329; AVX512F-NEXT:  .LBB5_5: # %cond.store3
2330; AVX512F-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
2331; AVX512F-NEXT:    testb $8, %al
2332; AVX512F-NEXT:    je .LBB5_8
2333; AVX512F-NEXT:  .LBB5_7: # %cond.store5
2334; AVX512F-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
2335; AVX512F-NEXT:    vzeroupper
2336; AVX512F-NEXT:    retq
2337;
2338; AVX512BW-LABEL: truncstore_v4i64_v4i8:
2339; AVX512BW:       # %bb.0:
2340; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2341; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2342; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k0
2343; AVX512BW-NEXT:    kshiftlq $60, %k0, %k0
2344; AVX512BW-NEXT:    kshiftrq $60, %k0, %k1
2345; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
2346; AVX512BW-NEXT:    vmovdqu8 %zmm0, (%rdi) {%k1}
2347; AVX512BW-NEXT:    vzeroupper
2348; AVX512BW-NEXT:    retq
2349;
2350; AVX512BWVL-LABEL: truncstore_v4i64_v4i8:
2351; AVX512BWVL:       # %bb.0:
2352; AVX512BWVL-NEXT:    vptestmd %xmm1, %xmm1, %k1
2353; AVX512BWVL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
2354; AVX512BWVL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0
2355; AVX512BWVL-NEXT:    vpmovqb %ymm0, (%rdi) {%k1}
2356; AVX512BWVL-NEXT:    vzeroupper
2357; AVX512BWVL-NEXT:    retq
2358  %a = icmp ne <4 x i32> %mask, zeroinitializer
2359  %b = icmp slt <4 x i64> %x, <i64 127, i64 127, i64 127, i64 127>
2360  %c = select <4 x i1> %b, <4 x i64> %x, <4 x i64> <i64 127, i64 127, i64 127, i64 127>
2361  %d = icmp sgt <4 x i64> %c, <i64 -128, i64 -128, i64 -128, i64 -128>
2362  %e = select <4 x i1> %d, <4 x i64> %c, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128>
2363  %f = trunc <4 x i64> %e to <4 x i8>
2364  call void @llvm.masked.store.v4i8.p0v4i8(<4 x i8> %f, <4 x i8>* %p, i32 1, <4 x i1> %a)
2365  ret void
2366}
2367
2368define void @truncstore_v2i64_v2i32(<2 x i64> %x, <2 x i32>* %p, <2 x i64> %mask) {
2369; SSE2-LABEL: truncstore_v2i64_v2i32:
2370; SSE2:       # %bb.0:
2371; SSE2-NEXT:    pxor %xmm2, %xmm2
2372; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2373; SSE2-NEXT:    movdqa %xmm0, %xmm4
2374; SSE2-NEXT:    pxor %xmm3, %xmm4
2375; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4294967295,4294967295]
2376; SSE2-NEXT:    movdqa %xmm5, %xmm6
2377; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2378; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2379; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2380; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2381; SSE2-NEXT:    pand %xmm7, %xmm4
2382; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
2383; SSE2-NEXT:    por %xmm4, %xmm5
2384; SSE2-NEXT:    pand %xmm5, %xmm0
2385; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
2386; SSE2-NEXT:    por %xmm0, %xmm5
2387; SSE2-NEXT:    pxor %xmm5, %xmm3
2388; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320]
2389; SSE2-NEXT:    movdqa %xmm3, %xmm4
2390; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
2391; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2392; SSE2-NEXT:    pcmpeqd %xmm0, %xmm3
2393; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2394; SSE2-NEXT:    pand %xmm6, %xmm0
2395; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2396; SSE2-NEXT:    por %xmm0, %xmm3
2397; SSE2-NEXT:    pand %xmm3, %xmm5
2398; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2399; SSE2-NEXT:    por %xmm5, %xmm3
2400; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
2401; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
2402; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
2403; SSE2-NEXT:    pand %xmm2, %xmm1
2404; SSE2-NEXT:    movmskpd %xmm1, %eax
2405; SSE2-NEXT:    xorl $3, %eax
2406; SSE2-NEXT:    testb $1, %al
2407; SSE2-NEXT:    jne .LBB6_1
2408; SSE2-NEXT:  # %bb.2: # %else
2409; SSE2-NEXT:    testb $2, %al
2410; SSE2-NEXT:    jne .LBB6_3
2411; SSE2-NEXT:  .LBB6_4: # %else2
2412; SSE2-NEXT:    retq
2413; SSE2-NEXT:  .LBB6_1: # %cond.store
2414; SSE2-NEXT:    movd %xmm0, (%rdi)
2415; SSE2-NEXT:    testb $2, %al
2416; SSE2-NEXT:    je .LBB6_4
2417; SSE2-NEXT:  .LBB6_3: # %cond.store1
2418; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2419; SSE2-NEXT:    movd %xmm0, 4(%rdi)
2420; SSE2-NEXT:    retq
2421;
2422; SSE4-LABEL: truncstore_v2i64_v2i32:
2423; SSE4:       # %bb.0:
2424; SSE4-NEXT:    movdqa %xmm0, %xmm2
2425; SSE4-NEXT:    pxor %xmm3, %xmm3
2426; SSE4-NEXT:    movdqa {{.*#+}} xmm4 = [2147483647,2147483647]
2427; SSE4-NEXT:    movdqa %xmm4, %xmm0
2428; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
2429; SSE4-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
2430; SSE4-NEXT:    movdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
2431; SSE4-NEXT:    movapd %xmm4, %xmm0
2432; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
2433; SSE4-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
2434; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
2435; SSE4-NEXT:    pcmpeqq %xmm1, %xmm3
2436; SSE4-NEXT:    movmskpd %xmm3, %eax
2437; SSE4-NEXT:    xorl $3, %eax
2438; SSE4-NEXT:    testb $1, %al
2439; SSE4-NEXT:    jne .LBB6_1
2440; SSE4-NEXT:  # %bb.2: # %else
2441; SSE4-NEXT:    testb $2, %al
2442; SSE4-NEXT:    jne .LBB6_3
2443; SSE4-NEXT:  .LBB6_4: # %else2
2444; SSE4-NEXT:    retq
2445; SSE4-NEXT:  .LBB6_1: # %cond.store
2446; SSE4-NEXT:    movd %xmm0, (%rdi)
2447; SSE4-NEXT:    testb $2, %al
2448; SSE4-NEXT:    je .LBB6_4
2449; SSE4-NEXT:  .LBB6_3: # %cond.store1
2450; SSE4-NEXT:    pextrd $1, %xmm0, 4(%rdi)
2451; SSE4-NEXT:    retq
2452;
2453; AVX1-LABEL: truncstore_v2i64_v2i32:
2454; AVX1:       # %bb.0:
2455; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2456; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm1
2457; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2458; AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm1
2459; AVX1-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero
2460; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [2147483647,2147483647]
2461; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm3
2462; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
2463; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
2464; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm3
2465; AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
2466; AVX1-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
2467; AVX1-NEXT:    vmaskmovps %xmm0, %xmm1, (%rdi)
2468; AVX1-NEXT:    retq
2469;
2470; AVX2-LABEL: truncstore_v2i64_v2i32:
2471; AVX2:       # %bb.0:
2472; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2473; AVX2-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm1
2474; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2475; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
2476; AVX2-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero
2477; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [2147483647,2147483647]
2478; AVX2-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm3
2479; AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
2480; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968]
2481; AVX2-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm3
2482; AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm2, %xmm0
2483; AVX2-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
2484; AVX2-NEXT:    vpmaskmovd %xmm0, %xmm1, (%rdi)
2485; AVX2-NEXT:    retq
2486;
2487; AVX512F-LABEL: truncstore_v2i64_v2i32:
2488; AVX512F:       # %bb.0:
2489; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2490; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2491; AVX512F-NEXT:    vptestmq %zmm1, %zmm1, %k0
2492; AVX512F-NEXT:    kshiftlw $14, %k0, %k0
2493; AVX512F-NEXT:    kshiftrw $14, %k0, %k1
2494; AVX512F-NEXT:    vpmovsqd %zmm0, %ymm0
2495; AVX512F-NEXT:    vmovdqu32 %zmm0, (%rdi) {%k1}
2496; AVX512F-NEXT:    vzeroupper
2497; AVX512F-NEXT:    retq
2498;
2499; AVX512VL-LABEL: truncstore_v2i64_v2i32:
2500; AVX512VL:       # %bb.0:
2501; AVX512VL-NEXT:    vptestmq %xmm1, %xmm1, %k1
2502; AVX512VL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2503; AVX512VL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2504; AVX512VL-NEXT:    vpmovqd %xmm0, (%rdi) {%k1}
2505; AVX512VL-NEXT:    retq
2506;
2507; AVX512BW-LABEL: truncstore_v2i64_v2i32:
2508; AVX512BW:       # %bb.0:
2509; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2510; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2511; AVX512BW-NEXT:    vptestmq %zmm1, %zmm1, %k0
2512; AVX512BW-NEXT:    kshiftlw $14, %k0, %k0
2513; AVX512BW-NEXT:    kshiftrw $14, %k0, %k1
2514; AVX512BW-NEXT:    vpmovsqd %zmm0, %ymm0
2515; AVX512BW-NEXT:    vmovdqu32 %zmm0, (%rdi) {%k1}
2516; AVX512BW-NEXT:    vzeroupper
2517; AVX512BW-NEXT:    retq
2518  %a = icmp ne <2 x i64> %mask, zeroinitializer
2519  %b = icmp slt <2 x i64> %x, <i64 2147483647, i64 2147483647>
2520  %c = select <2 x i1> %b, <2 x i64> %x, <2 x i64> <i64 2147483647, i64 2147483647>
2521  %d = icmp sgt <2 x i64> %c, <i64 -2147483648, i64 -2147483648>
2522  %e = select <2 x i1> %d, <2 x i64> %c, <2 x i64> <i64 -2147483648, i64 -2147483648>
2523  %f = trunc <2 x i64> %e to <2 x i32>
2524  call void @llvm.masked.store.v2i32.p0v2i32(<2 x i32> %f, <2 x i32>* %p, i32 1, <2 x i1> %a)
2525  ret void
2526}
2527
2528define void @truncstore_v2i64_v2i16(<2 x i64> %x, <2 x i16>* %p, <2 x i64> %mask) {
2529; SSE2-LABEL: truncstore_v2i64_v2i16:
2530; SSE2:       # %bb.0:
2531; SSE2-NEXT:    pxor %xmm2, %xmm2
2532; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2533; SSE2-NEXT:    movdqa %xmm0, %xmm4
2534; SSE2-NEXT:    pxor %xmm3, %xmm4
2535; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147516415,2147516415]
2536; SSE2-NEXT:    movdqa %xmm5, %xmm6
2537; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2538; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2539; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2540; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2541; SSE2-NEXT:    pand %xmm7, %xmm4
2542; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
2543; SSE2-NEXT:    por %xmm4, %xmm5
2544; SSE2-NEXT:    pand %xmm5, %xmm0
2545; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
2546; SSE2-NEXT:    por %xmm0, %xmm5
2547; SSE2-NEXT:    pxor %xmm5, %xmm3
2548; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200]
2549; SSE2-NEXT:    movdqa %xmm3, %xmm4
2550; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
2551; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2552; SSE2-NEXT:    pcmpeqd %xmm0, %xmm3
2553; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2554; SSE2-NEXT:    pand %xmm6, %xmm0
2555; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2556; SSE2-NEXT:    por %xmm0, %xmm3
2557; SSE2-NEXT:    pand %xmm3, %xmm5
2558; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2559; SSE2-NEXT:    por %xmm5, %xmm3
2560; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
2561; SSE2-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2562; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
2563; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
2564; SSE2-NEXT:    pand %xmm2, %xmm1
2565; SSE2-NEXT:    movmskpd %xmm1, %eax
2566; SSE2-NEXT:    xorl $3, %eax
2567; SSE2-NEXT:    testb $1, %al
2568; SSE2-NEXT:    jne .LBB7_1
2569; SSE2-NEXT:  # %bb.2: # %else
2570; SSE2-NEXT:    testb $2, %al
2571; SSE2-NEXT:    jne .LBB7_3
2572; SSE2-NEXT:  .LBB7_4: # %else2
2573; SSE2-NEXT:    retq
2574; SSE2-NEXT:  .LBB7_1: # %cond.store
2575; SSE2-NEXT:    movd %xmm0, %ecx
2576; SSE2-NEXT:    movw %cx, (%rdi)
2577; SSE2-NEXT:    testb $2, %al
2578; SSE2-NEXT:    je .LBB7_4
2579; SSE2-NEXT:  .LBB7_3: # %cond.store1
2580; SSE2-NEXT:    pextrw $1, %xmm0, %eax
2581; SSE2-NEXT:    movw %ax, 2(%rdi)
2582; SSE2-NEXT:    retq
2583;
2584; SSE4-LABEL: truncstore_v2i64_v2i16:
2585; SSE4:       # %bb.0:
2586; SSE4-NEXT:    movdqa %xmm0, %xmm2
2587; SSE4-NEXT:    pxor %xmm3, %xmm3
2588; SSE4-NEXT:    movdqa {{.*#+}} xmm4 = [32767,32767]
2589; SSE4-NEXT:    movdqa %xmm4, %xmm0
2590; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
2591; SSE4-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
2592; SSE4-NEXT:    movdqa {{.*#+}} xmm2 = [18446744073709518848,18446744073709518848]
2593; SSE4-NEXT:    movapd %xmm4, %xmm0
2594; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
2595; SSE4-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
2596; SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
2597; SSE4-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2598; SSE4-NEXT:    pcmpeqq %xmm1, %xmm3
2599; SSE4-NEXT:    movmskpd %xmm3, %eax
2600; SSE4-NEXT:    xorl $3, %eax
2601; SSE4-NEXT:    testb $1, %al
2602; SSE4-NEXT:    jne .LBB7_1
2603; SSE4-NEXT:  # %bb.2: # %else
2604; SSE4-NEXT:    testb $2, %al
2605; SSE4-NEXT:    jne .LBB7_3
2606; SSE4-NEXT:  .LBB7_4: # %else2
2607; SSE4-NEXT:    retq
2608; SSE4-NEXT:  .LBB7_1: # %cond.store
2609; SSE4-NEXT:    pextrw $0, %xmm0, (%rdi)
2610; SSE4-NEXT:    testb $2, %al
2611; SSE4-NEXT:    je .LBB7_4
2612; SSE4-NEXT:  .LBB7_3: # %cond.store1
2613; SSE4-NEXT:    pextrw $1, %xmm0, 2(%rdi)
2614; SSE4-NEXT:    retq
2615;
2616; AVX-LABEL: truncstore_v2i64_v2i16:
2617; AVX:       # %bb.0:
2618; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2619; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [32767,32767]
2620; AVX-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm4
2621; AVX-NEXT:    vblendvpd %xmm4, %xmm0, %xmm3, %xmm0
2622; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [18446744073709518848,18446744073709518848]
2623; AVX-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm4
2624; AVX-NEXT:    vblendvpd %xmm4, %xmm0, %xmm3, %xmm0
2625; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3]
2626; AVX-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]
2627; AVX-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm1
2628; AVX-NEXT:    vmovmskpd %xmm1, %eax
2629; AVX-NEXT:    xorl $3, %eax
2630; AVX-NEXT:    testb $1, %al
2631; AVX-NEXT:    jne .LBB7_1
2632; AVX-NEXT:  # %bb.2: # %else
2633; AVX-NEXT:    testb $2, %al
2634; AVX-NEXT:    jne .LBB7_3
2635; AVX-NEXT:  .LBB7_4: # %else2
2636; AVX-NEXT:    retq
2637; AVX-NEXT:  .LBB7_1: # %cond.store
2638; AVX-NEXT:    vpextrw $0, %xmm0, (%rdi)
2639; AVX-NEXT:    testb $2, %al
2640; AVX-NEXT:    je .LBB7_4
2641; AVX-NEXT:  .LBB7_3: # %cond.store1
2642; AVX-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
2643; AVX-NEXT:    retq
2644;
2645; AVX512F-LABEL: truncstore_v2i64_v2i16:
2646; AVX512F:       # %bb.0:
2647; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2648; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2649; AVX512F-NEXT:    vptestmq %zmm1, %zmm1, %k0
2650; AVX512F-NEXT:    vpmovsqw %zmm0, %xmm0
2651; AVX512F-NEXT:    kmovw %k0, %eax
2652; AVX512F-NEXT:    testb $1, %al
2653; AVX512F-NEXT:    jne .LBB7_1
2654; AVX512F-NEXT:  # %bb.2: # %else
2655; AVX512F-NEXT:    testb $2, %al
2656; AVX512F-NEXT:    jne .LBB7_3
2657; AVX512F-NEXT:  .LBB7_4: # %else2
2658; AVX512F-NEXT:    vzeroupper
2659; AVX512F-NEXT:    retq
2660; AVX512F-NEXT:  .LBB7_1: # %cond.store
2661; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
2662; AVX512F-NEXT:    testb $2, %al
2663; AVX512F-NEXT:    je .LBB7_4
2664; AVX512F-NEXT:  .LBB7_3: # %cond.store1
2665; AVX512F-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
2666; AVX512F-NEXT:    vzeroupper
2667; AVX512F-NEXT:    retq
2668;
2669; AVX512BW-LABEL: truncstore_v2i64_v2i16:
2670; AVX512BW:       # %bb.0:
2671; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2672; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2673; AVX512BW-NEXT:    vptestmq %zmm1, %zmm1, %k0
2674; AVX512BW-NEXT:    kshiftld $30, %k0, %k0
2675; AVX512BW-NEXT:    kshiftrd $30, %k0, %k1
2676; AVX512BW-NEXT:    vpmovsqw %zmm0, %xmm0
2677; AVX512BW-NEXT:    vmovdqu16 %zmm0, (%rdi) {%k1}
2678; AVX512BW-NEXT:    vzeroupper
2679; AVX512BW-NEXT:    retq
2680;
2681; AVX512BWVL-LABEL: truncstore_v2i64_v2i16:
2682; AVX512BWVL:       # %bb.0:
2683; AVX512BWVL-NEXT:    vptestmq %xmm1, %xmm1, %k1
2684; AVX512BWVL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2685; AVX512BWVL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2686; AVX512BWVL-NEXT:    vpmovqw %xmm0, (%rdi) {%k1}
2687; AVX512BWVL-NEXT:    retq
2688  %a = icmp ne <2 x i64> %mask, zeroinitializer
2689  %b = icmp slt <2 x i64> %x, <i64 32767, i64 32767>
2690  %c = select <2 x i1> %b, <2 x i64> %x, <2 x i64> <i64 32767, i64 32767>
2691  %d = icmp sgt <2 x i64> %c, <i64 -32768, i64 -32768>
2692  %e = select <2 x i1> %d, <2 x i64> %c, <2 x i64> <i64 -32768, i64 -32768>
2693  %f = trunc <2 x i64> %e to <2 x i16>
2694  call void @llvm.masked.store.v2i16.p0v2i16(<2 x i16> %f, <2 x i16>* %p, i32 1, <2 x i1> %a)
2695  ret void
2696}
2697
2698define void @truncstore_v2i64_v2i8(<2 x i64> %x, <2 x i8>* %p, <2 x i64> %mask) {
2699; SSE2-LABEL: truncstore_v2i64_v2i8:
2700; SSE2:       # %bb.0:
2701; SSE2-NEXT:    pxor %xmm2, %xmm2
2702; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648]
2703; SSE2-NEXT:    movdqa %xmm0, %xmm4
2704; SSE2-NEXT:    pxor %xmm3, %xmm4
2705; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [2147483775,2147483775]
2706; SSE2-NEXT:    movdqa %xmm5, %xmm6
2707; SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
2708; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
2709; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
2710; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2711; SSE2-NEXT:    pand %xmm7, %xmm4
2712; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
2713; SSE2-NEXT:    por %xmm4, %xmm5
2714; SSE2-NEXT:    pand %xmm5, %xmm0
2715; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
2716; SSE2-NEXT:    por %xmm0, %xmm5
2717; SSE2-NEXT:    pxor %xmm5, %xmm3
2718; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840]
2719; SSE2-NEXT:    movdqa %xmm3, %xmm4
2720; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
2721; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
2722; SSE2-NEXT:    pcmpeqd %xmm0, %xmm3
2723; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
2724; SSE2-NEXT:    pand %xmm6, %xmm0
2725; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
2726; SSE2-NEXT:    por %xmm0, %xmm3
2727; SSE2-NEXT:    pand %xmm3, %xmm5
2728; SSE2-NEXT:    pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2729; SSE2-NEXT:    por %xmm5, %xmm3
2730; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
2731; SSE2-NEXT:    packuswb %xmm3, %xmm3
2732; SSE2-NEXT:    packuswb %xmm3, %xmm3
2733; SSE2-NEXT:    packuswb %xmm3, %xmm3
2734; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
2735; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
2736; SSE2-NEXT:    pand %xmm2, %xmm0
2737; SSE2-NEXT:    movmskpd %xmm0, %eax
2738; SSE2-NEXT:    xorl $3, %eax
2739; SSE2-NEXT:    testb $1, %al
2740; SSE2-NEXT:    movd %xmm3, %ecx
2741; SSE2-NEXT:    jne .LBB8_1
2742; SSE2-NEXT:  # %bb.2: # %else
2743; SSE2-NEXT:    testb $2, %al
2744; SSE2-NEXT:    jne .LBB8_3
2745; SSE2-NEXT:  .LBB8_4: # %else2
2746; SSE2-NEXT:    retq
2747; SSE2-NEXT:  .LBB8_1: # %cond.store
2748; SSE2-NEXT:    movb %cl, (%rdi)
2749; SSE2-NEXT:    testb $2, %al
2750; SSE2-NEXT:    je .LBB8_4
2751; SSE2-NEXT:  .LBB8_3: # %cond.store1
2752; SSE2-NEXT:    movb %ch, 1(%rdi)
2753; SSE2-NEXT:    retq
2754;
2755; SSE4-LABEL: truncstore_v2i64_v2i8:
2756; SSE4:       # %bb.0:
2757; SSE4-NEXT:    movdqa %xmm0, %xmm2
2758; SSE4-NEXT:    pxor %xmm3, %xmm3
2759; SSE4-NEXT:    movdqa {{.*#+}} xmm4 = [127,127]
2760; SSE4-NEXT:    movdqa %xmm4, %xmm0
2761; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
2762; SSE4-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
2763; SSE4-NEXT:    movdqa {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488]
2764; SSE4-NEXT:    movapd %xmm4, %xmm0
2765; SSE4-NEXT:    pcmpgtq %xmm2, %xmm0
2766; SSE4-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
2767; SSE4-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2768; SSE4-NEXT:    pcmpeqq %xmm1, %xmm3
2769; SSE4-NEXT:    movmskpd %xmm3, %eax
2770; SSE4-NEXT:    xorl $3, %eax
2771; SSE4-NEXT:    testb $1, %al
2772; SSE4-NEXT:    jne .LBB8_1
2773; SSE4-NEXT:  # %bb.2: # %else
2774; SSE4-NEXT:    testb $2, %al
2775; SSE4-NEXT:    jne .LBB8_3
2776; SSE4-NEXT:  .LBB8_4: # %else2
2777; SSE4-NEXT:    retq
2778; SSE4-NEXT:  .LBB8_1: # %cond.store
2779; SSE4-NEXT:    pextrb $0, %xmm2, (%rdi)
2780; SSE4-NEXT:    testb $2, %al
2781; SSE4-NEXT:    je .LBB8_4
2782; SSE4-NEXT:  .LBB8_3: # %cond.store1
2783; SSE4-NEXT:    pextrb $1, %xmm2, 1(%rdi)
2784; SSE4-NEXT:    retq
2785;
2786; AVX-LABEL: truncstore_v2i64_v2i8:
2787; AVX:       # %bb.0:
2788; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2789; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [127,127]
2790; AVX-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm4
2791; AVX-NEXT:    vblendvpd %xmm4, %xmm0, %xmm3, %xmm0
2792; AVX-NEXT:    vmovdqa {{.*#+}} xmm3 = [18446744073709551488,18446744073709551488]
2793; AVX-NEXT:    vpcmpgtq %xmm3, %xmm0, %xmm4
2794; AVX-NEXT:    vblendvpd %xmm4, %xmm0, %xmm3, %xmm0
2795; AVX-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
2796; AVX-NEXT:    vpcmpeqq %xmm2, %xmm1, %xmm1
2797; AVX-NEXT:    vmovmskpd %xmm1, %eax
2798; AVX-NEXT:    xorl $3, %eax
2799; AVX-NEXT:    testb $1, %al
2800; AVX-NEXT:    jne .LBB8_1
2801; AVX-NEXT:  # %bb.2: # %else
2802; AVX-NEXT:    testb $2, %al
2803; AVX-NEXT:    jne .LBB8_3
2804; AVX-NEXT:  .LBB8_4: # %else2
2805; AVX-NEXT:    retq
2806; AVX-NEXT:  .LBB8_1: # %cond.store
2807; AVX-NEXT:    vpextrb $0, %xmm0, (%rdi)
2808; AVX-NEXT:    testb $2, %al
2809; AVX-NEXT:    je .LBB8_4
2810; AVX-NEXT:  .LBB8_3: # %cond.store1
2811; AVX-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
2812; AVX-NEXT:    retq
2813;
2814; AVX512F-LABEL: truncstore_v2i64_v2i8:
2815; AVX512F:       # %bb.0:
2816; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2817; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2818; AVX512F-NEXT:    vptestmq %zmm1, %zmm1, %k0
2819; AVX512F-NEXT:    vpmovsqb %zmm0, %xmm0
2820; AVX512F-NEXT:    kmovw %k0, %eax
2821; AVX512F-NEXT:    testb $1, %al
2822; AVX512F-NEXT:    jne .LBB8_1
2823; AVX512F-NEXT:  # %bb.2: # %else
2824; AVX512F-NEXT:    testb $2, %al
2825; AVX512F-NEXT:    jne .LBB8_3
2826; AVX512F-NEXT:  .LBB8_4: # %else2
2827; AVX512F-NEXT:    vzeroupper
2828; AVX512F-NEXT:    retq
2829; AVX512F-NEXT:  .LBB8_1: # %cond.store
2830; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
2831; AVX512F-NEXT:    testb $2, %al
2832; AVX512F-NEXT:    je .LBB8_4
2833; AVX512F-NEXT:  .LBB8_3: # %cond.store1
2834; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
2835; AVX512F-NEXT:    vzeroupper
2836; AVX512F-NEXT:    retq
2837;
2838; AVX512BW-LABEL: truncstore_v2i64_v2i8:
2839; AVX512BW:       # %bb.0:
2840; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
2841; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
2842; AVX512BW-NEXT:    vptestmq %zmm1, %zmm1, %k0
2843; AVX512BW-NEXT:    kshiftlq $62, %k0, %k0
2844; AVX512BW-NEXT:    kshiftrq $62, %k0, %k1
2845; AVX512BW-NEXT:    vpmovsqb %zmm0, %xmm0
2846; AVX512BW-NEXT:    vmovdqu8 %zmm0, (%rdi) {%k1}
2847; AVX512BW-NEXT:    vzeroupper
2848; AVX512BW-NEXT:    retq
2849;
2850; AVX512BWVL-LABEL: truncstore_v2i64_v2i8:
2851; AVX512BWVL:       # %bb.0:
2852; AVX512BWVL-NEXT:    vptestmq %xmm1, %xmm1, %k1
2853; AVX512BWVL-NEXT:    vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2854; AVX512BWVL-NEXT:    vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
2855; AVX512BWVL-NEXT:    vpmovqb %xmm0, (%rdi) {%k1}
2856; AVX512BWVL-NEXT:    retq
2857  %a = icmp ne <2 x i64> %mask, zeroinitializer
2858  %b = icmp slt <2 x i64> %x, <i64 127, i64 127>
2859  %c = select <2 x i1> %b, <2 x i64> %x, <2 x i64> <i64 127, i64 127>
2860  %d = icmp sgt <2 x i64> %c, <i64 -128, i64 -128>
2861  %e = select <2 x i1> %d, <2 x i64> %c, <2 x i64> <i64 -128, i64 -128>
2862  %f = trunc <2 x i64> %e to <2 x i8>
2863  call void @llvm.masked.store.v2i8.p0v2i8(<2 x i8> %f, <2 x i8>* %p, i32 1, <2 x i1> %a)
2864  ret void
2865}
2866
2867define void @truncstore_v16i32_v16i16(<16 x i32> %x, <16 x i16>* %p, <16 x i32> %mask) {
2868; SSE2-LABEL: truncstore_v16i32_v16i16:
2869; SSE2:       # %bb.0:
2870; SSE2-NEXT:    pxor %xmm8, %xmm8
2871; SSE2-NEXT:    packssdw %xmm1, %xmm0
2872; SSE2-NEXT:    pcmpeqd %xmm8, %xmm7
2873; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
2874; SSE2-NEXT:    pxor %xmm1, %xmm7
2875; SSE2-NEXT:    pcmpeqd %xmm8, %xmm6
2876; SSE2-NEXT:    pxor %xmm1, %xmm6
2877; SSE2-NEXT:    packssdw %xmm7, %xmm6
2878; SSE2-NEXT:    pcmpeqd %xmm8, %xmm5
2879; SSE2-NEXT:    pxor %xmm1, %xmm5
2880; SSE2-NEXT:    pcmpeqd %xmm8, %xmm4
2881; SSE2-NEXT:    pxor %xmm1, %xmm4
2882; SSE2-NEXT:    packssdw %xmm5, %xmm4
2883; SSE2-NEXT:    packsswb %xmm6, %xmm4
2884; SSE2-NEXT:    pmovmskb %xmm4, %eax
2885; SSE2-NEXT:    testb $1, %al
2886; SSE2-NEXT:    jne .LBB9_1
2887; SSE2-NEXT:  # %bb.2: # %else
2888; SSE2-NEXT:    testb $2, %al
2889; SSE2-NEXT:    jne .LBB9_3
2890; SSE2-NEXT:  .LBB9_4: # %else2
2891; SSE2-NEXT:    testb $4, %al
2892; SSE2-NEXT:    jne .LBB9_5
2893; SSE2-NEXT:  .LBB9_6: # %else4
2894; SSE2-NEXT:    testb $8, %al
2895; SSE2-NEXT:    jne .LBB9_7
2896; SSE2-NEXT:  .LBB9_8: # %else6
2897; SSE2-NEXT:    testb $16, %al
2898; SSE2-NEXT:    jne .LBB9_9
2899; SSE2-NEXT:  .LBB9_10: # %else8
2900; SSE2-NEXT:    testb $32, %al
2901; SSE2-NEXT:    jne .LBB9_11
2902; SSE2-NEXT:  .LBB9_12: # %else10
2903; SSE2-NEXT:    testb $64, %al
2904; SSE2-NEXT:    jne .LBB9_13
2905; SSE2-NEXT:  .LBB9_14: # %else12
2906; SSE2-NEXT:    testb $-128, %al
2907; SSE2-NEXT:    je .LBB9_16
2908; SSE2-NEXT:  .LBB9_15: # %cond.store13
2909; SSE2-NEXT:    pextrw $7, %xmm0, %ecx
2910; SSE2-NEXT:    movw %cx, 14(%rdi)
2911; SSE2-NEXT:  .LBB9_16: # %else14
2912; SSE2-NEXT:    packssdw %xmm3, %xmm2
2913; SSE2-NEXT:    testl $256, %eax # imm = 0x100
2914; SSE2-NEXT:    jne .LBB9_17
2915; SSE2-NEXT:  # %bb.18: # %else16
2916; SSE2-NEXT:    testl $512, %eax # imm = 0x200
2917; SSE2-NEXT:    jne .LBB9_19
2918; SSE2-NEXT:  .LBB9_20: # %else18
2919; SSE2-NEXT:    testl $1024, %eax # imm = 0x400
2920; SSE2-NEXT:    jne .LBB9_21
2921; SSE2-NEXT:  .LBB9_22: # %else20
2922; SSE2-NEXT:    testl $2048, %eax # imm = 0x800
2923; SSE2-NEXT:    jne .LBB9_23
2924; SSE2-NEXT:  .LBB9_24: # %else22
2925; SSE2-NEXT:    testl $4096, %eax # imm = 0x1000
2926; SSE2-NEXT:    jne .LBB9_25
2927; SSE2-NEXT:  .LBB9_26: # %else24
2928; SSE2-NEXT:    testl $8192, %eax # imm = 0x2000
2929; SSE2-NEXT:    jne .LBB9_27
2930; SSE2-NEXT:  .LBB9_28: # %else26
2931; SSE2-NEXT:    testl $16384, %eax # imm = 0x4000
2932; SSE2-NEXT:    jne .LBB9_29
2933; SSE2-NEXT:  .LBB9_30: # %else28
2934; SSE2-NEXT:    testl $32768, %eax # imm = 0x8000
2935; SSE2-NEXT:    jne .LBB9_31
2936; SSE2-NEXT:  .LBB9_32: # %else30
2937; SSE2-NEXT:    retq
2938; SSE2-NEXT:  .LBB9_1: # %cond.store
2939; SSE2-NEXT:    movd %xmm0, %ecx
2940; SSE2-NEXT:    movw %cx, (%rdi)
2941; SSE2-NEXT:    testb $2, %al
2942; SSE2-NEXT:    je .LBB9_4
2943; SSE2-NEXT:  .LBB9_3: # %cond.store1
2944; SSE2-NEXT:    pextrw $1, %xmm0, %ecx
2945; SSE2-NEXT:    movw %cx, 2(%rdi)
2946; SSE2-NEXT:    testb $4, %al
2947; SSE2-NEXT:    je .LBB9_6
2948; SSE2-NEXT:  .LBB9_5: # %cond.store3
2949; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
2950; SSE2-NEXT:    movw %cx, 4(%rdi)
2951; SSE2-NEXT:    testb $8, %al
2952; SSE2-NEXT:    je .LBB9_8
2953; SSE2-NEXT:  .LBB9_7: # %cond.store5
2954; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
2955; SSE2-NEXT:    movw %cx, 6(%rdi)
2956; SSE2-NEXT:    testb $16, %al
2957; SSE2-NEXT:    je .LBB9_10
2958; SSE2-NEXT:  .LBB9_9: # %cond.store7
2959; SSE2-NEXT:    pextrw $4, %xmm0, %ecx
2960; SSE2-NEXT:    movw %cx, 8(%rdi)
2961; SSE2-NEXT:    testb $32, %al
2962; SSE2-NEXT:    je .LBB9_12
2963; SSE2-NEXT:  .LBB9_11: # %cond.store9
2964; SSE2-NEXT:    pextrw $5, %xmm0, %ecx
2965; SSE2-NEXT:    movw %cx, 10(%rdi)
2966; SSE2-NEXT:    testb $64, %al
2967; SSE2-NEXT:    je .LBB9_14
2968; SSE2-NEXT:  .LBB9_13: # %cond.store11
2969; SSE2-NEXT:    pextrw $6, %xmm0, %ecx
2970; SSE2-NEXT:    movw %cx, 12(%rdi)
2971; SSE2-NEXT:    testb $-128, %al
2972; SSE2-NEXT:    jne .LBB9_15
2973; SSE2-NEXT:    jmp .LBB9_16
2974; SSE2-NEXT:  .LBB9_17: # %cond.store15
2975; SSE2-NEXT:    movd %xmm2, %ecx
2976; SSE2-NEXT:    movw %cx, 16(%rdi)
2977; SSE2-NEXT:    testl $512, %eax # imm = 0x200
2978; SSE2-NEXT:    je .LBB9_20
2979; SSE2-NEXT:  .LBB9_19: # %cond.store17
2980; SSE2-NEXT:    pextrw $1, %xmm2, %ecx
2981; SSE2-NEXT:    movw %cx, 18(%rdi)
2982; SSE2-NEXT:    testl $1024, %eax # imm = 0x400
2983; SSE2-NEXT:    je .LBB9_22
2984; SSE2-NEXT:  .LBB9_21: # %cond.store19
2985; SSE2-NEXT:    pextrw $2, %xmm2, %ecx
2986; SSE2-NEXT:    movw %cx, 20(%rdi)
2987; SSE2-NEXT:    testl $2048, %eax # imm = 0x800
2988; SSE2-NEXT:    je .LBB9_24
2989; SSE2-NEXT:  .LBB9_23: # %cond.store21
2990; SSE2-NEXT:    pextrw $3, %xmm2, %ecx
2991; SSE2-NEXT:    movw %cx, 22(%rdi)
2992; SSE2-NEXT:    testl $4096, %eax # imm = 0x1000
2993; SSE2-NEXT:    je .LBB9_26
2994; SSE2-NEXT:  .LBB9_25: # %cond.store23
2995; SSE2-NEXT:    pextrw $4, %xmm2, %ecx
2996; SSE2-NEXT:    movw %cx, 24(%rdi)
2997; SSE2-NEXT:    testl $8192, %eax # imm = 0x2000
2998; SSE2-NEXT:    je .LBB9_28
2999; SSE2-NEXT:  .LBB9_27: # %cond.store25
3000; SSE2-NEXT:    pextrw $5, %xmm2, %ecx
3001; SSE2-NEXT:    movw %cx, 26(%rdi)
3002; SSE2-NEXT:    testl $16384, %eax # imm = 0x4000
3003; SSE2-NEXT:    je .LBB9_30
3004; SSE2-NEXT:  .LBB9_29: # %cond.store27
3005; SSE2-NEXT:    pextrw $6, %xmm2, %ecx
3006; SSE2-NEXT:    movw %cx, 28(%rdi)
3007; SSE2-NEXT:    testl $32768, %eax # imm = 0x8000
3008; SSE2-NEXT:    je .LBB9_32
3009; SSE2-NEXT:  .LBB9_31: # %cond.store29
3010; SSE2-NEXT:    pextrw $7, %xmm2, %eax
3011; SSE2-NEXT:    movw %ax, 30(%rdi)
3012; SSE2-NEXT:    retq
3013;
3014; SSE4-LABEL: truncstore_v16i32_v16i16:
3015; SSE4:       # %bb.0:
3016; SSE4-NEXT:    pxor %xmm8, %xmm8
3017; SSE4-NEXT:    packssdw %xmm1, %xmm0
3018; SSE4-NEXT:    pcmpeqd %xmm8, %xmm7
3019; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
3020; SSE4-NEXT:    pxor %xmm1, %xmm7
3021; SSE4-NEXT:    pcmpeqd %xmm8, %xmm6
3022; SSE4-NEXT:    pxor %xmm1, %xmm6
3023; SSE4-NEXT:    packssdw %xmm7, %xmm6
3024; SSE4-NEXT:    pcmpeqd %xmm8, %xmm5
3025; SSE4-NEXT:    pxor %xmm1, %xmm5
3026; SSE4-NEXT:    pcmpeqd %xmm8, %xmm4
3027; SSE4-NEXT:    pxor %xmm1, %xmm4
3028; SSE4-NEXT:    packssdw %xmm5, %xmm4
3029; SSE4-NEXT:    packsswb %xmm6, %xmm4
3030; SSE4-NEXT:    pmovmskb %xmm4, %eax
3031; SSE4-NEXT:    testb $1, %al
3032; SSE4-NEXT:    jne .LBB9_1
3033; SSE4-NEXT:  # %bb.2: # %else
3034; SSE4-NEXT:    testb $2, %al
3035; SSE4-NEXT:    jne .LBB9_3
3036; SSE4-NEXT:  .LBB9_4: # %else2
3037; SSE4-NEXT:    testb $4, %al
3038; SSE4-NEXT:    jne .LBB9_5
3039; SSE4-NEXT:  .LBB9_6: # %else4
3040; SSE4-NEXT:    testb $8, %al
3041; SSE4-NEXT:    jne .LBB9_7
3042; SSE4-NEXT:  .LBB9_8: # %else6
3043; SSE4-NEXT:    testb $16, %al
3044; SSE4-NEXT:    jne .LBB9_9
3045; SSE4-NEXT:  .LBB9_10: # %else8
3046; SSE4-NEXT:    testb $32, %al
3047; SSE4-NEXT:    jne .LBB9_11
3048; SSE4-NEXT:  .LBB9_12: # %else10
3049; SSE4-NEXT:    testb $64, %al
3050; SSE4-NEXT:    jne .LBB9_13
3051; SSE4-NEXT:  .LBB9_14: # %else12
3052; SSE4-NEXT:    testb $-128, %al
3053; SSE4-NEXT:    je .LBB9_16
3054; SSE4-NEXT:  .LBB9_15: # %cond.store13
3055; SSE4-NEXT:    pextrw $7, %xmm0, 14(%rdi)
3056; SSE4-NEXT:  .LBB9_16: # %else14
3057; SSE4-NEXT:    packssdw %xmm3, %xmm2
3058; SSE4-NEXT:    testl $256, %eax # imm = 0x100
3059; SSE4-NEXT:    jne .LBB9_17
3060; SSE4-NEXT:  # %bb.18: # %else16
3061; SSE4-NEXT:    testl $512, %eax # imm = 0x200
3062; SSE4-NEXT:    jne .LBB9_19
3063; SSE4-NEXT:  .LBB9_20: # %else18
3064; SSE4-NEXT:    testl $1024, %eax # imm = 0x400
3065; SSE4-NEXT:    jne .LBB9_21
3066; SSE4-NEXT:  .LBB9_22: # %else20
3067; SSE4-NEXT:    testl $2048, %eax # imm = 0x800
3068; SSE4-NEXT:    jne .LBB9_23
3069; SSE4-NEXT:  .LBB9_24: # %else22
3070; SSE4-NEXT:    testl $4096, %eax # imm = 0x1000
3071; SSE4-NEXT:    jne .LBB9_25
3072; SSE4-NEXT:  .LBB9_26: # %else24
3073; SSE4-NEXT:    testl $8192, %eax # imm = 0x2000
3074; SSE4-NEXT:    jne .LBB9_27
3075; SSE4-NEXT:  .LBB9_28: # %else26
3076; SSE4-NEXT:    testl $16384, %eax # imm = 0x4000
3077; SSE4-NEXT:    jne .LBB9_29
3078; SSE4-NEXT:  .LBB9_30: # %else28
3079; SSE4-NEXT:    testl $32768, %eax # imm = 0x8000
3080; SSE4-NEXT:    jne .LBB9_31
3081; SSE4-NEXT:  .LBB9_32: # %else30
3082; SSE4-NEXT:    retq
3083; SSE4-NEXT:  .LBB9_1: # %cond.store
3084; SSE4-NEXT:    pextrw $0, %xmm0, (%rdi)
3085; SSE4-NEXT:    testb $2, %al
3086; SSE4-NEXT:    je .LBB9_4
3087; SSE4-NEXT:  .LBB9_3: # %cond.store1
3088; SSE4-NEXT:    pextrw $1, %xmm0, 2(%rdi)
3089; SSE4-NEXT:    testb $4, %al
3090; SSE4-NEXT:    je .LBB9_6
3091; SSE4-NEXT:  .LBB9_5: # %cond.store3
3092; SSE4-NEXT:    pextrw $2, %xmm0, 4(%rdi)
3093; SSE4-NEXT:    testb $8, %al
3094; SSE4-NEXT:    je .LBB9_8
3095; SSE4-NEXT:  .LBB9_7: # %cond.store5
3096; SSE4-NEXT:    pextrw $3, %xmm0, 6(%rdi)
3097; SSE4-NEXT:    testb $16, %al
3098; SSE4-NEXT:    je .LBB9_10
3099; SSE4-NEXT:  .LBB9_9: # %cond.store7
3100; SSE4-NEXT:    pextrw $4, %xmm0, 8(%rdi)
3101; SSE4-NEXT:    testb $32, %al
3102; SSE4-NEXT:    je .LBB9_12
3103; SSE4-NEXT:  .LBB9_11: # %cond.store9
3104; SSE4-NEXT:    pextrw $5, %xmm0, 10(%rdi)
3105; SSE4-NEXT:    testb $64, %al
3106; SSE4-NEXT:    je .LBB9_14
3107; SSE4-NEXT:  .LBB9_13: # %cond.store11
3108; SSE4-NEXT:    pextrw $6, %xmm0, 12(%rdi)
3109; SSE4-NEXT:    testb $-128, %al
3110; SSE4-NEXT:    jne .LBB9_15
3111; SSE4-NEXT:    jmp .LBB9_16
3112; SSE4-NEXT:  .LBB9_17: # %cond.store15
3113; SSE4-NEXT:    pextrw $0, %xmm2, 16(%rdi)
3114; SSE4-NEXT:    testl $512, %eax # imm = 0x200
3115; SSE4-NEXT:    je .LBB9_20
3116; SSE4-NEXT:  .LBB9_19: # %cond.store17
3117; SSE4-NEXT:    pextrw $1, %xmm2, 18(%rdi)
3118; SSE4-NEXT:    testl $1024, %eax # imm = 0x400
3119; SSE4-NEXT:    je .LBB9_22
3120; SSE4-NEXT:  .LBB9_21: # %cond.store19
3121; SSE4-NEXT:    pextrw $2, %xmm2, 20(%rdi)
3122; SSE4-NEXT:    testl $2048, %eax # imm = 0x800
3123; SSE4-NEXT:    je .LBB9_24
3124; SSE4-NEXT:  .LBB9_23: # %cond.store21
3125; SSE4-NEXT:    pextrw $3, %xmm2, 22(%rdi)
3126; SSE4-NEXT:    testl $4096, %eax # imm = 0x1000
3127; SSE4-NEXT:    je .LBB9_26
3128; SSE4-NEXT:  .LBB9_25: # %cond.store23
3129; SSE4-NEXT:    pextrw $4, %xmm2, 24(%rdi)
3130; SSE4-NEXT:    testl $8192, %eax # imm = 0x2000
3131; SSE4-NEXT:    je .LBB9_28
3132; SSE4-NEXT:  .LBB9_27: # %cond.store25
3133; SSE4-NEXT:    pextrw $5, %xmm2, 26(%rdi)
3134; SSE4-NEXT:    testl $16384, %eax # imm = 0x4000
3135; SSE4-NEXT:    je .LBB9_30
3136; SSE4-NEXT:  .LBB9_29: # %cond.store27
3137; SSE4-NEXT:    pextrw $6, %xmm2, 28(%rdi)
3138; SSE4-NEXT:    testl $32768, %eax # imm = 0x8000
3139; SSE4-NEXT:    je .LBB9_32
3140; SSE4-NEXT:  .LBB9_31: # %cond.store29
3141; SSE4-NEXT:    pextrw $7, %xmm2, 30(%rdi)
3142; SSE4-NEXT:    retq
3143;
3144; AVX1-LABEL: truncstore_v16i32_v16i16:
3145; AVX1:       # %bb.0:
3146; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3147; AVX1-NEXT:    vpackssdw %xmm4, %xmm1, %xmm1
3148; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
3149; AVX1-NEXT:    vpackssdw %xmm4, %xmm0, %xmm0
3150; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3151; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm1
3152; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
3153; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm1, %xmm1
3154; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
3155; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
3156; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm3, %xmm3
3157; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
3158; AVX1-NEXT:    vpackssdw %xmm1, %xmm3, %xmm1
3159; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
3160; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm3, %xmm3
3161; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
3162; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm2
3163; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
3164; AVX1-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
3165; AVX1-NEXT:    vpacksswb %xmm1, %xmm2, %xmm1
3166; AVX1-NEXT:    vpmovmskb %xmm1, %eax
3167; AVX1-NEXT:    testb $1, %al
3168; AVX1-NEXT:    jne .LBB9_1
3169; AVX1-NEXT:  # %bb.2: # %else
3170; AVX1-NEXT:    testb $2, %al
3171; AVX1-NEXT:    jne .LBB9_3
3172; AVX1-NEXT:  .LBB9_4: # %else2
3173; AVX1-NEXT:    testb $4, %al
3174; AVX1-NEXT:    jne .LBB9_5
3175; AVX1-NEXT:  .LBB9_6: # %else4
3176; AVX1-NEXT:    testb $8, %al
3177; AVX1-NEXT:    jne .LBB9_7
3178; AVX1-NEXT:  .LBB9_8: # %else6
3179; AVX1-NEXT:    testb $16, %al
3180; AVX1-NEXT:    jne .LBB9_9
3181; AVX1-NEXT:  .LBB9_10: # %else8
3182; AVX1-NEXT:    testb $32, %al
3183; AVX1-NEXT:    jne .LBB9_11
3184; AVX1-NEXT:  .LBB9_12: # %else10
3185; AVX1-NEXT:    testb $64, %al
3186; AVX1-NEXT:    jne .LBB9_13
3187; AVX1-NEXT:  .LBB9_14: # %else12
3188; AVX1-NEXT:    testb $-128, %al
3189; AVX1-NEXT:    je .LBB9_16
3190; AVX1-NEXT:  .LBB9_15: # %cond.store13
3191; AVX1-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
3192; AVX1-NEXT:  .LBB9_16: # %else14
3193; AVX1-NEXT:    testl $256, %eax # imm = 0x100
3194; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
3195; AVX1-NEXT:    jne .LBB9_17
3196; AVX1-NEXT:  # %bb.18: # %else16
3197; AVX1-NEXT:    testl $512, %eax # imm = 0x200
3198; AVX1-NEXT:    jne .LBB9_19
3199; AVX1-NEXT:  .LBB9_20: # %else18
3200; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
3201; AVX1-NEXT:    jne .LBB9_21
3202; AVX1-NEXT:  .LBB9_22: # %else20
3203; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
3204; AVX1-NEXT:    jne .LBB9_23
3205; AVX1-NEXT:  .LBB9_24: # %else22
3206; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
3207; AVX1-NEXT:    jne .LBB9_25
3208; AVX1-NEXT:  .LBB9_26: # %else24
3209; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
3210; AVX1-NEXT:    jne .LBB9_27
3211; AVX1-NEXT:  .LBB9_28: # %else26
3212; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
3213; AVX1-NEXT:    jne .LBB9_29
3214; AVX1-NEXT:  .LBB9_30: # %else28
3215; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
3216; AVX1-NEXT:    jne .LBB9_31
3217; AVX1-NEXT:  .LBB9_32: # %else30
3218; AVX1-NEXT:    vzeroupper
3219; AVX1-NEXT:    retq
3220; AVX1-NEXT:  .LBB9_1: # %cond.store
3221; AVX1-NEXT:    vpextrw $0, %xmm0, (%rdi)
3222; AVX1-NEXT:    testb $2, %al
3223; AVX1-NEXT:    je .LBB9_4
3224; AVX1-NEXT:  .LBB9_3: # %cond.store1
3225; AVX1-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
3226; AVX1-NEXT:    testb $4, %al
3227; AVX1-NEXT:    je .LBB9_6
3228; AVX1-NEXT:  .LBB9_5: # %cond.store3
3229; AVX1-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
3230; AVX1-NEXT:    testb $8, %al
3231; AVX1-NEXT:    je .LBB9_8
3232; AVX1-NEXT:  .LBB9_7: # %cond.store5
3233; AVX1-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
3234; AVX1-NEXT:    testb $16, %al
3235; AVX1-NEXT:    je .LBB9_10
3236; AVX1-NEXT:  .LBB9_9: # %cond.store7
3237; AVX1-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
3238; AVX1-NEXT:    testb $32, %al
3239; AVX1-NEXT:    je .LBB9_12
3240; AVX1-NEXT:  .LBB9_11: # %cond.store9
3241; AVX1-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
3242; AVX1-NEXT:    testb $64, %al
3243; AVX1-NEXT:    je .LBB9_14
3244; AVX1-NEXT:  .LBB9_13: # %cond.store11
3245; AVX1-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
3246; AVX1-NEXT:    testb $-128, %al
3247; AVX1-NEXT:    jne .LBB9_15
3248; AVX1-NEXT:    jmp .LBB9_16
3249; AVX1-NEXT:  .LBB9_17: # %cond.store15
3250; AVX1-NEXT:    vpextrw $0, %xmm0, 16(%rdi)
3251; AVX1-NEXT:    testl $512, %eax # imm = 0x200
3252; AVX1-NEXT:    je .LBB9_20
3253; AVX1-NEXT:  .LBB9_19: # %cond.store17
3254; AVX1-NEXT:    vpextrw $1, %xmm0, 18(%rdi)
3255; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
3256; AVX1-NEXT:    je .LBB9_22
3257; AVX1-NEXT:  .LBB9_21: # %cond.store19
3258; AVX1-NEXT:    vpextrw $2, %xmm0, 20(%rdi)
3259; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
3260; AVX1-NEXT:    je .LBB9_24
3261; AVX1-NEXT:  .LBB9_23: # %cond.store21
3262; AVX1-NEXT:    vpextrw $3, %xmm0, 22(%rdi)
3263; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
3264; AVX1-NEXT:    je .LBB9_26
3265; AVX1-NEXT:  .LBB9_25: # %cond.store23
3266; AVX1-NEXT:    vpextrw $4, %xmm0, 24(%rdi)
3267; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
3268; AVX1-NEXT:    je .LBB9_28
3269; AVX1-NEXT:  .LBB9_27: # %cond.store25
3270; AVX1-NEXT:    vpextrw $5, %xmm0, 26(%rdi)
3271; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
3272; AVX1-NEXT:    je .LBB9_30
3273; AVX1-NEXT:  .LBB9_29: # %cond.store27
3274; AVX1-NEXT:    vpextrw $6, %xmm0, 28(%rdi)
3275; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
3276; AVX1-NEXT:    je .LBB9_32
3277; AVX1-NEXT:  .LBB9_31: # %cond.store29
3278; AVX1-NEXT:    vpextrw $7, %xmm0, 30(%rdi)
3279; AVX1-NEXT:    vzeroupper
3280; AVX1-NEXT:    retq
3281;
3282; AVX2-LABEL: truncstore_v16i32_v16i16:
3283; AVX2:       # %bb.0:
3284; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
3285; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
3286; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
3287; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm3, %ymm1
3288; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
3289; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
3290; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm2, %ymm2
3291; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
3292; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
3293; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
3294; AVX2-NEXT:    vpacksswb %xmm2, %xmm1, %xmm1
3295; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
3296; AVX2-NEXT:    vpmovmskb %xmm1, %eax
3297; AVX2-NEXT:    testb $1, %al
3298; AVX2-NEXT:    jne .LBB9_1
3299; AVX2-NEXT:  # %bb.2: # %else
3300; AVX2-NEXT:    testb $2, %al
3301; AVX2-NEXT:    jne .LBB9_3
3302; AVX2-NEXT:  .LBB9_4: # %else2
3303; AVX2-NEXT:    testb $4, %al
3304; AVX2-NEXT:    jne .LBB9_5
3305; AVX2-NEXT:  .LBB9_6: # %else4
3306; AVX2-NEXT:    testb $8, %al
3307; AVX2-NEXT:    jne .LBB9_7
3308; AVX2-NEXT:  .LBB9_8: # %else6
3309; AVX2-NEXT:    testb $16, %al
3310; AVX2-NEXT:    jne .LBB9_9
3311; AVX2-NEXT:  .LBB9_10: # %else8
3312; AVX2-NEXT:    testb $32, %al
3313; AVX2-NEXT:    jne .LBB9_11
3314; AVX2-NEXT:  .LBB9_12: # %else10
3315; AVX2-NEXT:    testb $64, %al
3316; AVX2-NEXT:    jne .LBB9_13
3317; AVX2-NEXT:  .LBB9_14: # %else12
3318; AVX2-NEXT:    testb $-128, %al
3319; AVX2-NEXT:    je .LBB9_16
3320; AVX2-NEXT:  .LBB9_15: # %cond.store13
3321; AVX2-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
3322; AVX2-NEXT:  .LBB9_16: # %else14
3323; AVX2-NEXT:    testl $256, %eax # imm = 0x100
3324; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
3325; AVX2-NEXT:    jne .LBB9_17
3326; AVX2-NEXT:  # %bb.18: # %else16
3327; AVX2-NEXT:    testl $512, %eax # imm = 0x200
3328; AVX2-NEXT:    jne .LBB9_19
3329; AVX2-NEXT:  .LBB9_20: # %else18
3330; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
3331; AVX2-NEXT:    jne .LBB9_21
3332; AVX2-NEXT:  .LBB9_22: # %else20
3333; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
3334; AVX2-NEXT:    jne .LBB9_23
3335; AVX2-NEXT:  .LBB9_24: # %else22
3336; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
3337; AVX2-NEXT:    jne .LBB9_25
3338; AVX2-NEXT:  .LBB9_26: # %else24
3339; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
3340; AVX2-NEXT:    jne .LBB9_27
3341; AVX2-NEXT:  .LBB9_28: # %else26
3342; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
3343; AVX2-NEXT:    jne .LBB9_29
3344; AVX2-NEXT:  .LBB9_30: # %else28
3345; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
3346; AVX2-NEXT:    jne .LBB9_31
3347; AVX2-NEXT:  .LBB9_32: # %else30
3348; AVX2-NEXT:    vzeroupper
3349; AVX2-NEXT:    retq
3350; AVX2-NEXT:  .LBB9_1: # %cond.store
3351; AVX2-NEXT:    vpextrw $0, %xmm0, (%rdi)
3352; AVX2-NEXT:    testb $2, %al
3353; AVX2-NEXT:    je .LBB9_4
3354; AVX2-NEXT:  .LBB9_3: # %cond.store1
3355; AVX2-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
3356; AVX2-NEXT:    testb $4, %al
3357; AVX2-NEXT:    je .LBB9_6
3358; AVX2-NEXT:  .LBB9_5: # %cond.store3
3359; AVX2-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
3360; AVX2-NEXT:    testb $8, %al
3361; AVX2-NEXT:    je .LBB9_8
3362; AVX2-NEXT:  .LBB9_7: # %cond.store5
3363; AVX2-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
3364; AVX2-NEXT:    testb $16, %al
3365; AVX2-NEXT:    je .LBB9_10
3366; AVX2-NEXT:  .LBB9_9: # %cond.store7
3367; AVX2-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
3368; AVX2-NEXT:    testb $32, %al
3369; AVX2-NEXT:    je .LBB9_12
3370; AVX2-NEXT:  .LBB9_11: # %cond.store9
3371; AVX2-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
3372; AVX2-NEXT:    testb $64, %al
3373; AVX2-NEXT:    je .LBB9_14
3374; AVX2-NEXT:  .LBB9_13: # %cond.store11
3375; AVX2-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
3376; AVX2-NEXT:    testb $-128, %al
3377; AVX2-NEXT:    jne .LBB9_15
3378; AVX2-NEXT:    jmp .LBB9_16
3379; AVX2-NEXT:  .LBB9_17: # %cond.store15
3380; AVX2-NEXT:    vpextrw $0, %xmm0, 16(%rdi)
3381; AVX2-NEXT:    testl $512, %eax # imm = 0x200
3382; AVX2-NEXT:    je .LBB9_20
3383; AVX2-NEXT:  .LBB9_19: # %cond.store17
3384; AVX2-NEXT:    vpextrw $1, %xmm0, 18(%rdi)
3385; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
3386; AVX2-NEXT:    je .LBB9_22
3387; AVX2-NEXT:  .LBB9_21: # %cond.store19
3388; AVX2-NEXT:    vpextrw $2, %xmm0, 20(%rdi)
3389; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
3390; AVX2-NEXT:    je .LBB9_24
3391; AVX2-NEXT:  .LBB9_23: # %cond.store21
3392; AVX2-NEXT:    vpextrw $3, %xmm0, 22(%rdi)
3393; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
3394; AVX2-NEXT:    je .LBB9_26
3395; AVX2-NEXT:  .LBB9_25: # %cond.store23
3396; AVX2-NEXT:    vpextrw $4, %xmm0, 24(%rdi)
3397; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
3398; AVX2-NEXT:    je .LBB9_28
3399; AVX2-NEXT:  .LBB9_27: # %cond.store25
3400; AVX2-NEXT:    vpextrw $5, %xmm0, 26(%rdi)
3401; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
3402; AVX2-NEXT:    je .LBB9_30
3403; AVX2-NEXT:  .LBB9_29: # %cond.store27
3404; AVX2-NEXT:    vpextrw $6, %xmm0, 28(%rdi)
3405; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
3406; AVX2-NEXT:    je .LBB9_32
3407; AVX2-NEXT:  .LBB9_31: # %cond.store29
3408; AVX2-NEXT:    vpextrw $7, %xmm0, 30(%rdi)
3409; AVX2-NEXT:    vzeroupper
3410; AVX2-NEXT:    retq
3411;
3412; AVX512F-LABEL: truncstore_v16i32_v16i16:
3413; AVX512F:       # %bb.0:
3414; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
3415; AVX512F-NEXT:    vpmovsdw %zmm0, %ymm0
3416; AVX512F-NEXT:    kmovw %k0, %eax
3417; AVX512F-NEXT:    testb $1, %al
3418; AVX512F-NEXT:    jne .LBB9_1
3419; AVX512F-NEXT:  # %bb.2: # %else
3420; AVX512F-NEXT:    testb $2, %al
3421; AVX512F-NEXT:    jne .LBB9_3
3422; AVX512F-NEXT:  .LBB9_4: # %else2
3423; AVX512F-NEXT:    testb $4, %al
3424; AVX512F-NEXT:    jne .LBB9_5
3425; AVX512F-NEXT:  .LBB9_6: # %else4
3426; AVX512F-NEXT:    testb $8, %al
3427; AVX512F-NEXT:    jne .LBB9_7
3428; AVX512F-NEXT:  .LBB9_8: # %else6
3429; AVX512F-NEXT:    testb $16, %al
3430; AVX512F-NEXT:    jne .LBB9_9
3431; AVX512F-NEXT:  .LBB9_10: # %else8
3432; AVX512F-NEXT:    testb $32, %al
3433; AVX512F-NEXT:    jne .LBB9_11
3434; AVX512F-NEXT:  .LBB9_12: # %else10
3435; AVX512F-NEXT:    testb $64, %al
3436; AVX512F-NEXT:    jne .LBB9_13
3437; AVX512F-NEXT:  .LBB9_14: # %else12
3438; AVX512F-NEXT:    testb $-128, %al
3439; AVX512F-NEXT:    je .LBB9_16
3440; AVX512F-NEXT:  .LBB9_15: # %cond.store13
3441; AVX512F-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
3442; AVX512F-NEXT:  .LBB9_16: # %else14
3443; AVX512F-NEXT:    testl $256, %eax # imm = 0x100
3444; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
3445; AVX512F-NEXT:    jne .LBB9_17
3446; AVX512F-NEXT:  # %bb.18: # %else16
3447; AVX512F-NEXT:    testl $512, %eax # imm = 0x200
3448; AVX512F-NEXT:    jne .LBB9_19
3449; AVX512F-NEXT:  .LBB9_20: # %else18
3450; AVX512F-NEXT:    testl $1024, %eax # imm = 0x400
3451; AVX512F-NEXT:    jne .LBB9_21
3452; AVX512F-NEXT:  .LBB9_22: # %else20
3453; AVX512F-NEXT:    testl $2048, %eax # imm = 0x800
3454; AVX512F-NEXT:    jne .LBB9_23
3455; AVX512F-NEXT:  .LBB9_24: # %else22
3456; AVX512F-NEXT:    testl $4096, %eax # imm = 0x1000
3457; AVX512F-NEXT:    jne .LBB9_25
3458; AVX512F-NEXT:  .LBB9_26: # %else24
3459; AVX512F-NEXT:    testl $8192, %eax # imm = 0x2000
3460; AVX512F-NEXT:    jne .LBB9_27
3461; AVX512F-NEXT:  .LBB9_28: # %else26
3462; AVX512F-NEXT:    testl $16384, %eax # imm = 0x4000
3463; AVX512F-NEXT:    jne .LBB9_29
3464; AVX512F-NEXT:  .LBB9_30: # %else28
3465; AVX512F-NEXT:    testl $32768, %eax # imm = 0x8000
3466; AVX512F-NEXT:    jne .LBB9_31
3467; AVX512F-NEXT:  .LBB9_32: # %else30
3468; AVX512F-NEXT:    vzeroupper
3469; AVX512F-NEXT:    retq
3470; AVX512F-NEXT:  .LBB9_1: # %cond.store
3471; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
3472; AVX512F-NEXT:    testb $2, %al
3473; AVX512F-NEXT:    je .LBB9_4
3474; AVX512F-NEXT:  .LBB9_3: # %cond.store1
3475; AVX512F-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
3476; AVX512F-NEXT:    testb $4, %al
3477; AVX512F-NEXT:    je .LBB9_6
3478; AVX512F-NEXT:  .LBB9_5: # %cond.store3
3479; AVX512F-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
3480; AVX512F-NEXT:    testb $8, %al
3481; AVX512F-NEXT:    je .LBB9_8
3482; AVX512F-NEXT:  .LBB9_7: # %cond.store5
3483; AVX512F-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
3484; AVX512F-NEXT:    testb $16, %al
3485; AVX512F-NEXT:    je .LBB9_10
3486; AVX512F-NEXT:  .LBB9_9: # %cond.store7
3487; AVX512F-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
3488; AVX512F-NEXT:    testb $32, %al
3489; AVX512F-NEXT:    je .LBB9_12
3490; AVX512F-NEXT:  .LBB9_11: # %cond.store9
3491; AVX512F-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
3492; AVX512F-NEXT:    testb $64, %al
3493; AVX512F-NEXT:    je .LBB9_14
3494; AVX512F-NEXT:  .LBB9_13: # %cond.store11
3495; AVX512F-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
3496; AVX512F-NEXT:    testb $-128, %al
3497; AVX512F-NEXT:    jne .LBB9_15
3498; AVX512F-NEXT:    jmp .LBB9_16
3499; AVX512F-NEXT:  .LBB9_17: # %cond.store15
3500; AVX512F-NEXT:    vpextrw $0, %xmm0, 16(%rdi)
3501; AVX512F-NEXT:    testl $512, %eax # imm = 0x200
3502; AVX512F-NEXT:    je .LBB9_20
3503; AVX512F-NEXT:  .LBB9_19: # %cond.store17
3504; AVX512F-NEXT:    vpextrw $1, %xmm0, 18(%rdi)
3505; AVX512F-NEXT:    testl $1024, %eax # imm = 0x400
3506; AVX512F-NEXT:    je .LBB9_22
3507; AVX512F-NEXT:  .LBB9_21: # %cond.store19
3508; AVX512F-NEXT:    vpextrw $2, %xmm0, 20(%rdi)
3509; AVX512F-NEXT:    testl $2048, %eax # imm = 0x800
3510; AVX512F-NEXT:    je .LBB9_24
3511; AVX512F-NEXT:  .LBB9_23: # %cond.store21
3512; AVX512F-NEXT:    vpextrw $3, %xmm0, 22(%rdi)
3513; AVX512F-NEXT:    testl $4096, %eax # imm = 0x1000
3514; AVX512F-NEXT:    je .LBB9_26
3515; AVX512F-NEXT:  .LBB9_25: # %cond.store23
3516; AVX512F-NEXT:    vpextrw $4, %xmm0, 24(%rdi)
3517; AVX512F-NEXT:    testl $8192, %eax # imm = 0x2000
3518; AVX512F-NEXT:    je .LBB9_28
3519; AVX512F-NEXT:  .LBB9_27: # %cond.store25
3520; AVX512F-NEXT:    vpextrw $5, %xmm0, 26(%rdi)
3521; AVX512F-NEXT:    testl $16384, %eax # imm = 0x4000
3522; AVX512F-NEXT:    je .LBB9_30
3523; AVX512F-NEXT:  .LBB9_29: # %cond.store27
3524; AVX512F-NEXT:    vpextrw $6, %xmm0, 28(%rdi)
3525; AVX512F-NEXT:    testl $32768, %eax # imm = 0x8000
3526; AVX512F-NEXT:    je .LBB9_32
3527; AVX512F-NEXT:  .LBB9_31: # %cond.store29
3528; AVX512F-NEXT:    vpextrw $7, %xmm0, 30(%rdi)
3529; AVX512F-NEXT:    vzeroupper
3530; AVX512F-NEXT:    retq
3531;
3532; AVX512BW-LABEL: truncstore_v16i32_v16i16:
3533; AVX512BW:       # %bb.0:
3534; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k1
3535; AVX512BW-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
3536; AVX512BW-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
3537; AVX512BW-NEXT:    vpmovdw %zmm0, (%rdi) {%k1}
3538; AVX512BW-NEXT:    vzeroupper
3539; AVX512BW-NEXT:    retq
3540;
3541; AVX512BWVL-LABEL: truncstore_v16i32_v16i16:
3542; AVX512BWVL:       # %bb.0:
3543; AVX512BWVL-NEXT:    vptestmd %zmm1, %zmm1, %k1
3544; AVX512BWVL-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
3545; AVX512BWVL-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
3546; AVX512BWVL-NEXT:    vpmovdw %zmm0, (%rdi) {%k1}
3547; AVX512BWVL-NEXT:    vzeroupper
3548; AVX512BWVL-NEXT:    retq
3549  %a = icmp ne <16 x i32> %mask, zeroinitializer
3550  %b = icmp slt <16 x i32> %x, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
3551  %c = select <16 x i1> %b, <16 x i32> %x, <16 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
3552  %d = icmp sgt <16 x i32> %c, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
3553  %e = select <16 x i1> %d, <16 x i32> %c, <16 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
3554  %f = trunc <16 x i32> %e to <16 x i16>
3555  call void @llvm.masked.store.v16i16.p0v16i16(<16 x i16> %f, <16 x i16>* %p, i32 1, <16 x i1> %a)
3556  ret void
3557}
3558
3559define void @truncstore_v16i32_v16i8(<16 x i32> %x, <16 x i8>* %p, <16 x i32> %mask) {
3560; SSE2-LABEL: truncstore_v16i32_v16i8:
3561; SSE2:       # %bb.0:
3562; SSE2-NEXT:    pxor %xmm8, %xmm8
3563; SSE2-NEXT:    packssdw %xmm3, %xmm2
3564; SSE2-NEXT:    packssdw %xmm1, %xmm0
3565; SSE2-NEXT:    packsswb %xmm2, %xmm0
3566; SSE2-NEXT:    pcmpeqd %xmm8, %xmm7
3567; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
3568; SSE2-NEXT:    pxor %xmm1, %xmm7
3569; SSE2-NEXT:    pcmpeqd %xmm8, %xmm6
3570; SSE2-NEXT:    pxor %xmm1, %xmm6
3571; SSE2-NEXT:    packssdw %xmm7, %xmm6
3572; SSE2-NEXT:    pcmpeqd %xmm8, %xmm5
3573; SSE2-NEXT:    pxor %xmm1, %xmm5
3574; SSE2-NEXT:    pcmpeqd %xmm8, %xmm4
3575; SSE2-NEXT:    pxor %xmm1, %xmm4
3576; SSE2-NEXT:    packssdw %xmm5, %xmm4
3577; SSE2-NEXT:    packsswb %xmm6, %xmm4
3578; SSE2-NEXT:    pmovmskb %xmm4, %eax
3579; SSE2-NEXT:    testb $1, %al
3580; SSE2-NEXT:    movd %xmm0, %ecx
3581; SSE2-NEXT:    jne .LBB10_1
3582; SSE2-NEXT:  # %bb.2: # %else
3583; SSE2-NEXT:    testb $2, %al
3584; SSE2-NEXT:    jne .LBB10_3
3585; SSE2-NEXT:  .LBB10_4: # %else2
3586; SSE2-NEXT:    testb $4, %al
3587; SSE2-NEXT:    jne .LBB10_5
3588; SSE2-NEXT:  .LBB10_6: # %else4
3589; SSE2-NEXT:    testb $8, %al
3590; SSE2-NEXT:    je .LBB10_8
3591; SSE2-NEXT:  .LBB10_7: # %cond.store5
3592; SSE2-NEXT:    shrl $24, %ecx
3593; SSE2-NEXT:    movb %cl, 3(%rdi)
3594; SSE2-NEXT:  .LBB10_8: # %else6
3595; SSE2-NEXT:    testb $16, %al
3596; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
3597; SSE2-NEXT:    je .LBB10_10
3598; SSE2-NEXT:  # %bb.9: # %cond.store7
3599; SSE2-NEXT:    movb %cl, 4(%rdi)
3600; SSE2-NEXT:  .LBB10_10: # %else8
3601; SSE2-NEXT:    testb $32, %al
3602; SSE2-NEXT:    je .LBB10_12
3603; SSE2-NEXT:  # %bb.11: # %cond.store9
3604; SSE2-NEXT:    movb %ch, 5(%rdi)
3605; SSE2-NEXT:  .LBB10_12: # %else10
3606; SSE2-NEXT:    testb $64, %al
3607; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
3608; SSE2-NEXT:    je .LBB10_14
3609; SSE2-NEXT:  # %bb.13: # %cond.store11
3610; SSE2-NEXT:    movb %cl, 6(%rdi)
3611; SSE2-NEXT:  .LBB10_14: # %else12
3612; SSE2-NEXT:    testb $-128, %al
3613; SSE2-NEXT:    je .LBB10_16
3614; SSE2-NEXT:  # %bb.15: # %cond.store13
3615; SSE2-NEXT:    movb %ch, 7(%rdi)
3616; SSE2-NEXT:  .LBB10_16: # %else14
3617; SSE2-NEXT:    testl $256, %eax # imm = 0x100
3618; SSE2-NEXT:    pextrw $4, %xmm0, %ecx
3619; SSE2-NEXT:    je .LBB10_18
3620; SSE2-NEXT:  # %bb.17: # %cond.store15
3621; SSE2-NEXT:    movb %cl, 8(%rdi)
3622; SSE2-NEXT:  .LBB10_18: # %else16
3623; SSE2-NEXT:    testl $512, %eax # imm = 0x200
3624; SSE2-NEXT:    je .LBB10_20
3625; SSE2-NEXT:  # %bb.19: # %cond.store17
3626; SSE2-NEXT:    movb %ch, 9(%rdi)
3627; SSE2-NEXT:  .LBB10_20: # %else18
3628; SSE2-NEXT:    testl $1024, %eax # imm = 0x400
3629; SSE2-NEXT:    pextrw $5, %xmm0, %ecx
3630; SSE2-NEXT:    je .LBB10_22
3631; SSE2-NEXT:  # %bb.21: # %cond.store19
3632; SSE2-NEXT:    movb %cl, 10(%rdi)
3633; SSE2-NEXT:  .LBB10_22: # %else20
3634; SSE2-NEXT:    testl $2048, %eax # imm = 0x800
3635; SSE2-NEXT:    je .LBB10_24
3636; SSE2-NEXT:  # %bb.23: # %cond.store21
3637; SSE2-NEXT:    movb %ch, 11(%rdi)
3638; SSE2-NEXT:  .LBB10_24: # %else22
3639; SSE2-NEXT:    testl $4096, %eax # imm = 0x1000
3640; SSE2-NEXT:    pextrw $6, %xmm0, %ecx
3641; SSE2-NEXT:    je .LBB10_26
3642; SSE2-NEXT:  # %bb.25: # %cond.store23
3643; SSE2-NEXT:    movb %cl, 12(%rdi)
3644; SSE2-NEXT:  .LBB10_26: # %else24
3645; SSE2-NEXT:    testl $8192, %eax # imm = 0x2000
3646; SSE2-NEXT:    je .LBB10_28
3647; SSE2-NEXT:  # %bb.27: # %cond.store25
3648; SSE2-NEXT:    movb %ch, 13(%rdi)
3649; SSE2-NEXT:  .LBB10_28: # %else26
3650; SSE2-NEXT:    testl $16384, %eax # imm = 0x4000
3651; SSE2-NEXT:    pextrw $7, %xmm0, %ecx
3652; SSE2-NEXT:    jne .LBB10_29
3653; SSE2-NEXT:  # %bb.30: # %else28
3654; SSE2-NEXT:    testl $32768, %eax # imm = 0x8000
3655; SSE2-NEXT:    jne .LBB10_31
3656; SSE2-NEXT:  .LBB10_32: # %else30
3657; SSE2-NEXT:    retq
3658; SSE2-NEXT:  .LBB10_1: # %cond.store
3659; SSE2-NEXT:    movb %cl, (%rdi)
3660; SSE2-NEXT:    testb $2, %al
3661; SSE2-NEXT:    je .LBB10_4
3662; SSE2-NEXT:  .LBB10_3: # %cond.store1
3663; SSE2-NEXT:    movb %ch, 1(%rdi)
3664; SSE2-NEXT:    testb $4, %al
3665; SSE2-NEXT:    je .LBB10_6
3666; SSE2-NEXT:  .LBB10_5: # %cond.store3
3667; SSE2-NEXT:    movl %ecx, %edx
3668; SSE2-NEXT:    shrl $16, %edx
3669; SSE2-NEXT:    movb %dl, 2(%rdi)
3670; SSE2-NEXT:    testb $8, %al
3671; SSE2-NEXT:    jne .LBB10_7
3672; SSE2-NEXT:    jmp .LBB10_8
3673; SSE2-NEXT:  .LBB10_29: # %cond.store27
3674; SSE2-NEXT:    movb %cl, 14(%rdi)
3675; SSE2-NEXT:    testl $32768, %eax # imm = 0x8000
3676; SSE2-NEXT:    je .LBB10_32
3677; SSE2-NEXT:  .LBB10_31: # %cond.store29
3678; SSE2-NEXT:    movb %ch, 15(%rdi)
3679; SSE2-NEXT:    retq
3680;
3681; SSE4-LABEL: truncstore_v16i32_v16i8:
3682; SSE4:       # %bb.0:
3683; SSE4-NEXT:    pxor %xmm8, %xmm8
3684; SSE4-NEXT:    packssdw %xmm3, %xmm2
3685; SSE4-NEXT:    packssdw %xmm1, %xmm0
3686; SSE4-NEXT:    packsswb %xmm2, %xmm0
3687; SSE4-NEXT:    pcmpeqd %xmm8, %xmm7
3688; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
3689; SSE4-NEXT:    pxor %xmm1, %xmm7
3690; SSE4-NEXT:    pcmpeqd %xmm8, %xmm6
3691; SSE4-NEXT:    pxor %xmm1, %xmm6
3692; SSE4-NEXT:    packssdw %xmm7, %xmm6
3693; SSE4-NEXT:    pcmpeqd %xmm8, %xmm5
3694; SSE4-NEXT:    pxor %xmm1, %xmm5
3695; SSE4-NEXT:    pcmpeqd %xmm8, %xmm4
3696; SSE4-NEXT:    pxor %xmm1, %xmm4
3697; SSE4-NEXT:    packssdw %xmm5, %xmm4
3698; SSE4-NEXT:    packsswb %xmm6, %xmm4
3699; SSE4-NEXT:    pmovmskb %xmm4, %eax
3700; SSE4-NEXT:    testb $1, %al
3701; SSE4-NEXT:    jne .LBB10_1
3702; SSE4-NEXT:  # %bb.2: # %else
3703; SSE4-NEXT:    testb $2, %al
3704; SSE4-NEXT:    jne .LBB10_3
3705; SSE4-NEXT:  .LBB10_4: # %else2
3706; SSE4-NEXT:    testb $4, %al
3707; SSE4-NEXT:    jne .LBB10_5
3708; SSE4-NEXT:  .LBB10_6: # %else4
3709; SSE4-NEXT:    testb $8, %al
3710; SSE4-NEXT:    jne .LBB10_7
3711; SSE4-NEXT:  .LBB10_8: # %else6
3712; SSE4-NEXT:    testb $16, %al
3713; SSE4-NEXT:    jne .LBB10_9
3714; SSE4-NEXT:  .LBB10_10: # %else8
3715; SSE4-NEXT:    testb $32, %al
3716; SSE4-NEXT:    jne .LBB10_11
3717; SSE4-NEXT:  .LBB10_12: # %else10
3718; SSE4-NEXT:    testb $64, %al
3719; SSE4-NEXT:    jne .LBB10_13
3720; SSE4-NEXT:  .LBB10_14: # %else12
3721; SSE4-NEXT:    testb $-128, %al
3722; SSE4-NEXT:    jne .LBB10_15
3723; SSE4-NEXT:  .LBB10_16: # %else14
3724; SSE4-NEXT:    testl $256, %eax # imm = 0x100
3725; SSE4-NEXT:    jne .LBB10_17
3726; SSE4-NEXT:  .LBB10_18: # %else16
3727; SSE4-NEXT:    testl $512, %eax # imm = 0x200
3728; SSE4-NEXT:    jne .LBB10_19
3729; SSE4-NEXT:  .LBB10_20: # %else18
3730; SSE4-NEXT:    testl $1024, %eax # imm = 0x400
3731; SSE4-NEXT:    jne .LBB10_21
3732; SSE4-NEXT:  .LBB10_22: # %else20
3733; SSE4-NEXT:    testl $2048, %eax # imm = 0x800
3734; SSE4-NEXT:    jne .LBB10_23
3735; SSE4-NEXT:  .LBB10_24: # %else22
3736; SSE4-NEXT:    testl $4096, %eax # imm = 0x1000
3737; SSE4-NEXT:    jne .LBB10_25
3738; SSE4-NEXT:  .LBB10_26: # %else24
3739; SSE4-NEXT:    testl $8192, %eax # imm = 0x2000
3740; SSE4-NEXT:    jne .LBB10_27
3741; SSE4-NEXT:  .LBB10_28: # %else26
3742; SSE4-NEXT:    testl $16384, %eax # imm = 0x4000
3743; SSE4-NEXT:    jne .LBB10_29
3744; SSE4-NEXT:  .LBB10_30: # %else28
3745; SSE4-NEXT:    testl $32768, %eax # imm = 0x8000
3746; SSE4-NEXT:    jne .LBB10_31
3747; SSE4-NEXT:  .LBB10_32: # %else30
3748; SSE4-NEXT:    retq
3749; SSE4-NEXT:  .LBB10_1: # %cond.store
3750; SSE4-NEXT:    pextrb $0, %xmm0, (%rdi)
3751; SSE4-NEXT:    testb $2, %al
3752; SSE4-NEXT:    je .LBB10_4
3753; SSE4-NEXT:  .LBB10_3: # %cond.store1
3754; SSE4-NEXT:    pextrb $1, %xmm0, 1(%rdi)
3755; SSE4-NEXT:    testb $4, %al
3756; SSE4-NEXT:    je .LBB10_6
3757; SSE4-NEXT:  .LBB10_5: # %cond.store3
3758; SSE4-NEXT:    pextrb $2, %xmm0, 2(%rdi)
3759; SSE4-NEXT:    testb $8, %al
3760; SSE4-NEXT:    je .LBB10_8
3761; SSE4-NEXT:  .LBB10_7: # %cond.store5
3762; SSE4-NEXT:    pextrb $3, %xmm0, 3(%rdi)
3763; SSE4-NEXT:    testb $16, %al
3764; SSE4-NEXT:    je .LBB10_10
3765; SSE4-NEXT:  .LBB10_9: # %cond.store7
3766; SSE4-NEXT:    pextrb $4, %xmm0, 4(%rdi)
3767; SSE4-NEXT:    testb $32, %al
3768; SSE4-NEXT:    je .LBB10_12
3769; SSE4-NEXT:  .LBB10_11: # %cond.store9
3770; SSE4-NEXT:    pextrb $5, %xmm0, 5(%rdi)
3771; SSE4-NEXT:    testb $64, %al
3772; SSE4-NEXT:    je .LBB10_14
3773; SSE4-NEXT:  .LBB10_13: # %cond.store11
3774; SSE4-NEXT:    pextrb $6, %xmm0, 6(%rdi)
3775; SSE4-NEXT:    testb $-128, %al
3776; SSE4-NEXT:    je .LBB10_16
3777; SSE4-NEXT:  .LBB10_15: # %cond.store13
3778; SSE4-NEXT:    pextrb $7, %xmm0, 7(%rdi)
3779; SSE4-NEXT:    testl $256, %eax # imm = 0x100
3780; SSE4-NEXT:    je .LBB10_18
3781; SSE4-NEXT:  .LBB10_17: # %cond.store15
3782; SSE4-NEXT:    pextrb $8, %xmm0, 8(%rdi)
3783; SSE4-NEXT:    testl $512, %eax # imm = 0x200
3784; SSE4-NEXT:    je .LBB10_20
3785; SSE4-NEXT:  .LBB10_19: # %cond.store17
3786; SSE4-NEXT:    pextrb $9, %xmm0, 9(%rdi)
3787; SSE4-NEXT:    testl $1024, %eax # imm = 0x400
3788; SSE4-NEXT:    je .LBB10_22
3789; SSE4-NEXT:  .LBB10_21: # %cond.store19
3790; SSE4-NEXT:    pextrb $10, %xmm0, 10(%rdi)
3791; SSE4-NEXT:    testl $2048, %eax # imm = 0x800
3792; SSE4-NEXT:    je .LBB10_24
3793; SSE4-NEXT:  .LBB10_23: # %cond.store21
3794; SSE4-NEXT:    pextrb $11, %xmm0, 11(%rdi)
3795; SSE4-NEXT:    testl $4096, %eax # imm = 0x1000
3796; SSE4-NEXT:    je .LBB10_26
3797; SSE4-NEXT:  .LBB10_25: # %cond.store23
3798; SSE4-NEXT:    pextrb $12, %xmm0, 12(%rdi)
3799; SSE4-NEXT:    testl $8192, %eax # imm = 0x2000
3800; SSE4-NEXT:    je .LBB10_28
3801; SSE4-NEXT:  .LBB10_27: # %cond.store25
3802; SSE4-NEXT:    pextrb $13, %xmm0, 13(%rdi)
3803; SSE4-NEXT:    testl $16384, %eax # imm = 0x4000
3804; SSE4-NEXT:    je .LBB10_30
3805; SSE4-NEXT:  .LBB10_29: # %cond.store27
3806; SSE4-NEXT:    pextrb $14, %xmm0, 14(%rdi)
3807; SSE4-NEXT:    testl $32768, %eax # imm = 0x8000
3808; SSE4-NEXT:    je .LBB10_32
3809; SSE4-NEXT:  .LBB10_31: # %cond.store29
3810; SSE4-NEXT:    pextrb $15, %xmm0, 15(%rdi)
3811; SSE4-NEXT:    retq
3812;
3813; AVX1-LABEL: truncstore_v16i32_v16i8:
3814; AVX1:       # %bb.0:
3815; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
3816; AVX1-NEXT:    vpackssdw %xmm4, %xmm1, %xmm1
3817; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
3818; AVX1-NEXT:    vpackssdw %xmm4, %xmm0, %xmm0
3819; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
3820; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm1
3821; AVX1-NEXT:    vpxor %xmm4, %xmm4, %xmm4
3822; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm1, %xmm1
3823; AVX1-NEXT:    vpcmpeqd %xmm5, %xmm5, %xmm5
3824; AVX1-NEXT:    vpxor %xmm5, %xmm1, %xmm1
3825; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm3, %xmm3
3826; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
3827; AVX1-NEXT:    vpackssdw %xmm1, %xmm3, %xmm1
3828; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
3829; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm3, %xmm3
3830; AVX1-NEXT:    vpxor %xmm5, %xmm3, %xmm3
3831; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm2, %xmm2
3832; AVX1-NEXT:    vpxor %xmm5, %xmm2, %xmm2
3833; AVX1-NEXT:    vpackssdw %xmm3, %xmm2, %xmm2
3834; AVX1-NEXT:    vpacksswb %xmm1, %xmm2, %xmm1
3835; AVX1-NEXT:    vpmovmskb %xmm1, %eax
3836; AVX1-NEXT:    testb $1, %al
3837; AVX1-NEXT:    jne .LBB10_1
3838; AVX1-NEXT:  # %bb.2: # %else
3839; AVX1-NEXT:    testb $2, %al
3840; AVX1-NEXT:    jne .LBB10_3
3841; AVX1-NEXT:  .LBB10_4: # %else2
3842; AVX1-NEXT:    testb $4, %al
3843; AVX1-NEXT:    jne .LBB10_5
3844; AVX1-NEXT:  .LBB10_6: # %else4
3845; AVX1-NEXT:    testb $8, %al
3846; AVX1-NEXT:    jne .LBB10_7
3847; AVX1-NEXT:  .LBB10_8: # %else6
3848; AVX1-NEXT:    testb $16, %al
3849; AVX1-NEXT:    jne .LBB10_9
3850; AVX1-NEXT:  .LBB10_10: # %else8
3851; AVX1-NEXT:    testb $32, %al
3852; AVX1-NEXT:    jne .LBB10_11
3853; AVX1-NEXT:  .LBB10_12: # %else10
3854; AVX1-NEXT:    testb $64, %al
3855; AVX1-NEXT:    jne .LBB10_13
3856; AVX1-NEXT:  .LBB10_14: # %else12
3857; AVX1-NEXT:    testb $-128, %al
3858; AVX1-NEXT:    jne .LBB10_15
3859; AVX1-NEXT:  .LBB10_16: # %else14
3860; AVX1-NEXT:    testl $256, %eax # imm = 0x100
3861; AVX1-NEXT:    jne .LBB10_17
3862; AVX1-NEXT:  .LBB10_18: # %else16
3863; AVX1-NEXT:    testl $512, %eax # imm = 0x200
3864; AVX1-NEXT:    jne .LBB10_19
3865; AVX1-NEXT:  .LBB10_20: # %else18
3866; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
3867; AVX1-NEXT:    jne .LBB10_21
3868; AVX1-NEXT:  .LBB10_22: # %else20
3869; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
3870; AVX1-NEXT:    jne .LBB10_23
3871; AVX1-NEXT:  .LBB10_24: # %else22
3872; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
3873; AVX1-NEXT:    jne .LBB10_25
3874; AVX1-NEXT:  .LBB10_26: # %else24
3875; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
3876; AVX1-NEXT:    jne .LBB10_27
3877; AVX1-NEXT:  .LBB10_28: # %else26
3878; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
3879; AVX1-NEXT:    jne .LBB10_29
3880; AVX1-NEXT:  .LBB10_30: # %else28
3881; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
3882; AVX1-NEXT:    jne .LBB10_31
3883; AVX1-NEXT:  .LBB10_32: # %else30
3884; AVX1-NEXT:    vzeroupper
3885; AVX1-NEXT:    retq
3886; AVX1-NEXT:  .LBB10_1: # %cond.store
3887; AVX1-NEXT:    vpextrb $0, %xmm0, (%rdi)
3888; AVX1-NEXT:    testb $2, %al
3889; AVX1-NEXT:    je .LBB10_4
3890; AVX1-NEXT:  .LBB10_3: # %cond.store1
3891; AVX1-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
3892; AVX1-NEXT:    testb $4, %al
3893; AVX1-NEXT:    je .LBB10_6
3894; AVX1-NEXT:  .LBB10_5: # %cond.store3
3895; AVX1-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
3896; AVX1-NEXT:    testb $8, %al
3897; AVX1-NEXT:    je .LBB10_8
3898; AVX1-NEXT:  .LBB10_7: # %cond.store5
3899; AVX1-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
3900; AVX1-NEXT:    testb $16, %al
3901; AVX1-NEXT:    je .LBB10_10
3902; AVX1-NEXT:  .LBB10_9: # %cond.store7
3903; AVX1-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
3904; AVX1-NEXT:    testb $32, %al
3905; AVX1-NEXT:    je .LBB10_12
3906; AVX1-NEXT:  .LBB10_11: # %cond.store9
3907; AVX1-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
3908; AVX1-NEXT:    testb $64, %al
3909; AVX1-NEXT:    je .LBB10_14
3910; AVX1-NEXT:  .LBB10_13: # %cond.store11
3911; AVX1-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
3912; AVX1-NEXT:    testb $-128, %al
3913; AVX1-NEXT:    je .LBB10_16
3914; AVX1-NEXT:  .LBB10_15: # %cond.store13
3915; AVX1-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
3916; AVX1-NEXT:    testl $256, %eax # imm = 0x100
3917; AVX1-NEXT:    je .LBB10_18
3918; AVX1-NEXT:  .LBB10_17: # %cond.store15
3919; AVX1-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
3920; AVX1-NEXT:    testl $512, %eax # imm = 0x200
3921; AVX1-NEXT:    je .LBB10_20
3922; AVX1-NEXT:  .LBB10_19: # %cond.store17
3923; AVX1-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
3924; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
3925; AVX1-NEXT:    je .LBB10_22
3926; AVX1-NEXT:  .LBB10_21: # %cond.store19
3927; AVX1-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
3928; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
3929; AVX1-NEXT:    je .LBB10_24
3930; AVX1-NEXT:  .LBB10_23: # %cond.store21
3931; AVX1-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
3932; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
3933; AVX1-NEXT:    je .LBB10_26
3934; AVX1-NEXT:  .LBB10_25: # %cond.store23
3935; AVX1-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
3936; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
3937; AVX1-NEXT:    je .LBB10_28
3938; AVX1-NEXT:  .LBB10_27: # %cond.store25
3939; AVX1-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
3940; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
3941; AVX1-NEXT:    je .LBB10_30
3942; AVX1-NEXT:  .LBB10_29: # %cond.store27
3943; AVX1-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
3944; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
3945; AVX1-NEXT:    je .LBB10_32
3946; AVX1-NEXT:  .LBB10_31: # %cond.store29
3947; AVX1-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
3948; AVX1-NEXT:    vzeroupper
3949; AVX1-NEXT:    retq
3950;
3951; AVX2-LABEL: truncstore_v16i32_v16i8:
3952; AVX2:       # %bb.0:
3953; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
3954; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
3955; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3956; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
3957; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
3958; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm3, %ymm1
3959; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm3, %ymm3
3960; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
3961; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm2, %ymm2
3962; AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm2
3963; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
3964; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
3965; AVX2-NEXT:    vpacksswb %xmm2, %xmm1, %xmm1
3966; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
3967; AVX2-NEXT:    vpmovmskb %xmm1, %eax
3968; AVX2-NEXT:    testb $1, %al
3969; AVX2-NEXT:    jne .LBB10_1
3970; AVX2-NEXT:  # %bb.2: # %else
3971; AVX2-NEXT:    testb $2, %al
3972; AVX2-NEXT:    jne .LBB10_3
3973; AVX2-NEXT:  .LBB10_4: # %else2
3974; AVX2-NEXT:    testb $4, %al
3975; AVX2-NEXT:    jne .LBB10_5
3976; AVX2-NEXT:  .LBB10_6: # %else4
3977; AVX2-NEXT:    testb $8, %al
3978; AVX2-NEXT:    jne .LBB10_7
3979; AVX2-NEXT:  .LBB10_8: # %else6
3980; AVX2-NEXT:    testb $16, %al
3981; AVX2-NEXT:    jne .LBB10_9
3982; AVX2-NEXT:  .LBB10_10: # %else8
3983; AVX2-NEXT:    testb $32, %al
3984; AVX2-NEXT:    jne .LBB10_11
3985; AVX2-NEXT:  .LBB10_12: # %else10
3986; AVX2-NEXT:    testb $64, %al
3987; AVX2-NEXT:    jne .LBB10_13
3988; AVX2-NEXT:  .LBB10_14: # %else12
3989; AVX2-NEXT:    testb $-128, %al
3990; AVX2-NEXT:    jne .LBB10_15
3991; AVX2-NEXT:  .LBB10_16: # %else14
3992; AVX2-NEXT:    testl $256, %eax # imm = 0x100
3993; AVX2-NEXT:    jne .LBB10_17
3994; AVX2-NEXT:  .LBB10_18: # %else16
3995; AVX2-NEXT:    testl $512, %eax # imm = 0x200
3996; AVX2-NEXT:    jne .LBB10_19
3997; AVX2-NEXT:  .LBB10_20: # %else18
3998; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
3999; AVX2-NEXT:    jne .LBB10_21
4000; AVX2-NEXT:  .LBB10_22: # %else20
4001; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
4002; AVX2-NEXT:    jne .LBB10_23
4003; AVX2-NEXT:  .LBB10_24: # %else22
4004; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
4005; AVX2-NEXT:    jne .LBB10_25
4006; AVX2-NEXT:  .LBB10_26: # %else24
4007; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
4008; AVX2-NEXT:    jne .LBB10_27
4009; AVX2-NEXT:  .LBB10_28: # %else26
4010; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
4011; AVX2-NEXT:    jne .LBB10_29
4012; AVX2-NEXT:  .LBB10_30: # %else28
4013; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
4014; AVX2-NEXT:    jne .LBB10_31
4015; AVX2-NEXT:  .LBB10_32: # %else30
4016; AVX2-NEXT:    vzeroupper
4017; AVX2-NEXT:    retq
4018; AVX2-NEXT:  .LBB10_1: # %cond.store
4019; AVX2-NEXT:    vpextrb $0, %xmm0, (%rdi)
4020; AVX2-NEXT:    testb $2, %al
4021; AVX2-NEXT:    je .LBB10_4
4022; AVX2-NEXT:  .LBB10_3: # %cond.store1
4023; AVX2-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
4024; AVX2-NEXT:    testb $4, %al
4025; AVX2-NEXT:    je .LBB10_6
4026; AVX2-NEXT:  .LBB10_5: # %cond.store3
4027; AVX2-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
4028; AVX2-NEXT:    testb $8, %al
4029; AVX2-NEXT:    je .LBB10_8
4030; AVX2-NEXT:  .LBB10_7: # %cond.store5
4031; AVX2-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
4032; AVX2-NEXT:    testb $16, %al
4033; AVX2-NEXT:    je .LBB10_10
4034; AVX2-NEXT:  .LBB10_9: # %cond.store7
4035; AVX2-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
4036; AVX2-NEXT:    testb $32, %al
4037; AVX2-NEXT:    je .LBB10_12
4038; AVX2-NEXT:  .LBB10_11: # %cond.store9
4039; AVX2-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
4040; AVX2-NEXT:    testb $64, %al
4041; AVX2-NEXT:    je .LBB10_14
4042; AVX2-NEXT:  .LBB10_13: # %cond.store11
4043; AVX2-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
4044; AVX2-NEXT:    testb $-128, %al
4045; AVX2-NEXT:    je .LBB10_16
4046; AVX2-NEXT:  .LBB10_15: # %cond.store13
4047; AVX2-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
4048; AVX2-NEXT:    testl $256, %eax # imm = 0x100
4049; AVX2-NEXT:    je .LBB10_18
4050; AVX2-NEXT:  .LBB10_17: # %cond.store15
4051; AVX2-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
4052; AVX2-NEXT:    testl $512, %eax # imm = 0x200
4053; AVX2-NEXT:    je .LBB10_20
4054; AVX2-NEXT:  .LBB10_19: # %cond.store17
4055; AVX2-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
4056; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
4057; AVX2-NEXT:    je .LBB10_22
4058; AVX2-NEXT:  .LBB10_21: # %cond.store19
4059; AVX2-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
4060; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
4061; AVX2-NEXT:    je .LBB10_24
4062; AVX2-NEXT:  .LBB10_23: # %cond.store21
4063; AVX2-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
4064; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
4065; AVX2-NEXT:    je .LBB10_26
4066; AVX2-NEXT:  .LBB10_25: # %cond.store23
4067; AVX2-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
4068; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
4069; AVX2-NEXT:    je .LBB10_28
4070; AVX2-NEXT:  .LBB10_27: # %cond.store25
4071; AVX2-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
4072; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
4073; AVX2-NEXT:    je .LBB10_30
4074; AVX2-NEXT:  .LBB10_29: # %cond.store27
4075; AVX2-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
4076; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
4077; AVX2-NEXT:    je .LBB10_32
4078; AVX2-NEXT:  .LBB10_31: # %cond.store29
4079; AVX2-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
4080; AVX2-NEXT:    vzeroupper
4081; AVX2-NEXT:    retq
4082;
4083; AVX512F-LABEL: truncstore_v16i32_v16i8:
4084; AVX512F:       # %bb.0:
4085; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
4086; AVX512F-NEXT:    vpmovsdb %zmm0, %xmm0
4087; AVX512F-NEXT:    kmovw %k0, %eax
4088; AVX512F-NEXT:    testb $1, %al
4089; AVX512F-NEXT:    jne .LBB10_1
4090; AVX512F-NEXT:  # %bb.2: # %else
4091; AVX512F-NEXT:    testb $2, %al
4092; AVX512F-NEXT:    jne .LBB10_3
4093; AVX512F-NEXT:  .LBB10_4: # %else2
4094; AVX512F-NEXT:    testb $4, %al
4095; AVX512F-NEXT:    jne .LBB10_5
4096; AVX512F-NEXT:  .LBB10_6: # %else4
4097; AVX512F-NEXT:    testb $8, %al
4098; AVX512F-NEXT:    jne .LBB10_7
4099; AVX512F-NEXT:  .LBB10_8: # %else6
4100; AVX512F-NEXT:    testb $16, %al
4101; AVX512F-NEXT:    jne .LBB10_9
4102; AVX512F-NEXT:  .LBB10_10: # %else8
4103; AVX512F-NEXT:    testb $32, %al
4104; AVX512F-NEXT:    jne .LBB10_11
4105; AVX512F-NEXT:  .LBB10_12: # %else10
4106; AVX512F-NEXT:    testb $64, %al
4107; AVX512F-NEXT:    jne .LBB10_13
4108; AVX512F-NEXT:  .LBB10_14: # %else12
4109; AVX512F-NEXT:    testb $-128, %al
4110; AVX512F-NEXT:    jne .LBB10_15
4111; AVX512F-NEXT:  .LBB10_16: # %else14
4112; AVX512F-NEXT:    testl $256, %eax # imm = 0x100
4113; AVX512F-NEXT:    jne .LBB10_17
4114; AVX512F-NEXT:  .LBB10_18: # %else16
4115; AVX512F-NEXT:    testl $512, %eax # imm = 0x200
4116; AVX512F-NEXT:    jne .LBB10_19
4117; AVX512F-NEXT:  .LBB10_20: # %else18
4118; AVX512F-NEXT:    testl $1024, %eax # imm = 0x400
4119; AVX512F-NEXT:    jne .LBB10_21
4120; AVX512F-NEXT:  .LBB10_22: # %else20
4121; AVX512F-NEXT:    testl $2048, %eax # imm = 0x800
4122; AVX512F-NEXT:    jne .LBB10_23
4123; AVX512F-NEXT:  .LBB10_24: # %else22
4124; AVX512F-NEXT:    testl $4096, %eax # imm = 0x1000
4125; AVX512F-NEXT:    jne .LBB10_25
4126; AVX512F-NEXT:  .LBB10_26: # %else24
4127; AVX512F-NEXT:    testl $8192, %eax # imm = 0x2000
4128; AVX512F-NEXT:    jne .LBB10_27
4129; AVX512F-NEXT:  .LBB10_28: # %else26
4130; AVX512F-NEXT:    testl $16384, %eax # imm = 0x4000
4131; AVX512F-NEXT:    jne .LBB10_29
4132; AVX512F-NEXT:  .LBB10_30: # %else28
4133; AVX512F-NEXT:    testl $32768, %eax # imm = 0x8000
4134; AVX512F-NEXT:    jne .LBB10_31
4135; AVX512F-NEXT:  .LBB10_32: # %else30
4136; AVX512F-NEXT:    vzeroupper
4137; AVX512F-NEXT:    retq
4138; AVX512F-NEXT:  .LBB10_1: # %cond.store
4139; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
4140; AVX512F-NEXT:    testb $2, %al
4141; AVX512F-NEXT:    je .LBB10_4
4142; AVX512F-NEXT:  .LBB10_3: # %cond.store1
4143; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
4144; AVX512F-NEXT:    testb $4, %al
4145; AVX512F-NEXT:    je .LBB10_6
4146; AVX512F-NEXT:  .LBB10_5: # %cond.store3
4147; AVX512F-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
4148; AVX512F-NEXT:    testb $8, %al
4149; AVX512F-NEXT:    je .LBB10_8
4150; AVX512F-NEXT:  .LBB10_7: # %cond.store5
4151; AVX512F-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
4152; AVX512F-NEXT:    testb $16, %al
4153; AVX512F-NEXT:    je .LBB10_10
4154; AVX512F-NEXT:  .LBB10_9: # %cond.store7
4155; AVX512F-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
4156; AVX512F-NEXT:    testb $32, %al
4157; AVX512F-NEXT:    je .LBB10_12
4158; AVX512F-NEXT:  .LBB10_11: # %cond.store9
4159; AVX512F-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
4160; AVX512F-NEXT:    testb $64, %al
4161; AVX512F-NEXT:    je .LBB10_14
4162; AVX512F-NEXT:  .LBB10_13: # %cond.store11
4163; AVX512F-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
4164; AVX512F-NEXT:    testb $-128, %al
4165; AVX512F-NEXT:    je .LBB10_16
4166; AVX512F-NEXT:  .LBB10_15: # %cond.store13
4167; AVX512F-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
4168; AVX512F-NEXT:    testl $256, %eax # imm = 0x100
4169; AVX512F-NEXT:    je .LBB10_18
4170; AVX512F-NEXT:  .LBB10_17: # %cond.store15
4171; AVX512F-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
4172; AVX512F-NEXT:    testl $512, %eax # imm = 0x200
4173; AVX512F-NEXT:    je .LBB10_20
4174; AVX512F-NEXT:  .LBB10_19: # %cond.store17
4175; AVX512F-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
4176; AVX512F-NEXT:    testl $1024, %eax # imm = 0x400
4177; AVX512F-NEXT:    je .LBB10_22
4178; AVX512F-NEXT:  .LBB10_21: # %cond.store19
4179; AVX512F-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
4180; AVX512F-NEXT:    testl $2048, %eax # imm = 0x800
4181; AVX512F-NEXT:    je .LBB10_24
4182; AVX512F-NEXT:  .LBB10_23: # %cond.store21
4183; AVX512F-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
4184; AVX512F-NEXT:    testl $4096, %eax # imm = 0x1000
4185; AVX512F-NEXT:    je .LBB10_26
4186; AVX512F-NEXT:  .LBB10_25: # %cond.store23
4187; AVX512F-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
4188; AVX512F-NEXT:    testl $8192, %eax # imm = 0x2000
4189; AVX512F-NEXT:    je .LBB10_28
4190; AVX512F-NEXT:  .LBB10_27: # %cond.store25
4191; AVX512F-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
4192; AVX512F-NEXT:    testl $16384, %eax # imm = 0x4000
4193; AVX512F-NEXT:    je .LBB10_30
4194; AVX512F-NEXT:  .LBB10_29: # %cond.store27
4195; AVX512F-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
4196; AVX512F-NEXT:    testl $32768, %eax # imm = 0x8000
4197; AVX512F-NEXT:    je .LBB10_32
4198; AVX512F-NEXT:  .LBB10_31: # %cond.store29
4199; AVX512F-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
4200; AVX512F-NEXT:    vzeroupper
4201; AVX512F-NEXT:    retq
4202;
4203; AVX512BW-LABEL: truncstore_v16i32_v16i8:
4204; AVX512BW:       # %bb.0:
4205; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k1
4206; AVX512BW-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
4207; AVX512BW-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
4208; AVX512BW-NEXT:    vpmovdb %zmm0, (%rdi) {%k1}
4209; AVX512BW-NEXT:    vzeroupper
4210; AVX512BW-NEXT:    retq
4211;
4212; AVX512BWVL-LABEL: truncstore_v16i32_v16i8:
4213; AVX512BWVL:       # %bb.0:
4214; AVX512BWVL-NEXT:    vptestmd %zmm1, %zmm1, %k1
4215; AVX512BWVL-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
4216; AVX512BWVL-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
4217; AVX512BWVL-NEXT:    vpmovdb %zmm0, (%rdi) {%k1}
4218; AVX512BWVL-NEXT:    vzeroupper
4219; AVX512BWVL-NEXT:    retq
4220  %a = icmp ne <16 x i32> %mask, zeroinitializer
4221  %b = icmp slt <16 x i32> %x, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4222  %c = select <16 x i1> %b, <16 x i32> %x, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4223  %d = icmp sgt <16 x i32> %c, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4224  %e = select <16 x i1> %d, <16 x i32> %c, <16 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4225  %f = trunc <16 x i32> %e to <16 x i8>
4226  call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %f, <16 x i8>* %p, i32 1, <16 x i1> %a)
4227  ret void
4228}
4229
4230define void @truncstore_v8i32_v8i16(<8 x i32> %x, <8 x i16>* %p, <8 x i32> %mask) {
4231; SSE2-LABEL: truncstore_v8i32_v8i16:
4232; SSE2:       # %bb.0:
4233; SSE2-NEXT:    pxor %xmm4, %xmm4
4234; SSE2-NEXT:    packssdw %xmm1, %xmm0
4235; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
4236; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
4237; SSE2-NEXT:    pxor %xmm1, %xmm3
4238; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
4239; SSE2-NEXT:    pxor %xmm1, %xmm2
4240; SSE2-NEXT:    packssdw %xmm3, %xmm2
4241; SSE2-NEXT:    packsswb %xmm2, %xmm2
4242; SSE2-NEXT:    pmovmskb %xmm2, %eax
4243; SSE2-NEXT:    testb $1, %al
4244; SSE2-NEXT:    jne .LBB11_1
4245; SSE2-NEXT:  # %bb.2: # %else
4246; SSE2-NEXT:    testb $2, %al
4247; SSE2-NEXT:    jne .LBB11_3
4248; SSE2-NEXT:  .LBB11_4: # %else2
4249; SSE2-NEXT:    testb $4, %al
4250; SSE2-NEXT:    jne .LBB11_5
4251; SSE2-NEXT:  .LBB11_6: # %else4
4252; SSE2-NEXT:    testb $8, %al
4253; SSE2-NEXT:    jne .LBB11_7
4254; SSE2-NEXT:  .LBB11_8: # %else6
4255; SSE2-NEXT:    testb $16, %al
4256; SSE2-NEXT:    jne .LBB11_9
4257; SSE2-NEXT:  .LBB11_10: # %else8
4258; SSE2-NEXT:    testb $32, %al
4259; SSE2-NEXT:    jne .LBB11_11
4260; SSE2-NEXT:  .LBB11_12: # %else10
4261; SSE2-NEXT:    testb $64, %al
4262; SSE2-NEXT:    jne .LBB11_13
4263; SSE2-NEXT:  .LBB11_14: # %else12
4264; SSE2-NEXT:    testb $-128, %al
4265; SSE2-NEXT:    jne .LBB11_15
4266; SSE2-NEXT:  .LBB11_16: # %else14
4267; SSE2-NEXT:    retq
4268; SSE2-NEXT:  .LBB11_1: # %cond.store
4269; SSE2-NEXT:    movd %xmm0, %ecx
4270; SSE2-NEXT:    movw %cx, (%rdi)
4271; SSE2-NEXT:    testb $2, %al
4272; SSE2-NEXT:    je .LBB11_4
4273; SSE2-NEXT:  .LBB11_3: # %cond.store1
4274; SSE2-NEXT:    pextrw $1, %xmm0, %ecx
4275; SSE2-NEXT:    movw %cx, 2(%rdi)
4276; SSE2-NEXT:    testb $4, %al
4277; SSE2-NEXT:    je .LBB11_6
4278; SSE2-NEXT:  .LBB11_5: # %cond.store3
4279; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
4280; SSE2-NEXT:    movw %cx, 4(%rdi)
4281; SSE2-NEXT:    testb $8, %al
4282; SSE2-NEXT:    je .LBB11_8
4283; SSE2-NEXT:  .LBB11_7: # %cond.store5
4284; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
4285; SSE2-NEXT:    movw %cx, 6(%rdi)
4286; SSE2-NEXT:    testb $16, %al
4287; SSE2-NEXT:    je .LBB11_10
4288; SSE2-NEXT:  .LBB11_9: # %cond.store7
4289; SSE2-NEXT:    pextrw $4, %xmm0, %ecx
4290; SSE2-NEXT:    movw %cx, 8(%rdi)
4291; SSE2-NEXT:    testb $32, %al
4292; SSE2-NEXT:    je .LBB11_12
4293; SSE2-NEXT:  .LBB11_11: # %cond.store9
4294; SSE2-NEXT:    pextrw $5, %xmm0, %ecx
4295; SSE2-NEXT:    movw %cx, 10(%rdi)
4296; SSE2-NEXT:    testb $64, %al
4297; SSE2-NEXT:    je .LBB11_14
4298; SSE2-NEXT:  .LBB11_13: # %cond.store11
4299; SSE2-NEXT:    pextrw $6, %xmm0, %ecx
4300; SSE2-NEXT:    movw %cx, 12(%rdi)
4301; SSE2-NEXT:    testb $-128, %al
4302; SSE2-NEXT:    je .LBB11_16
4303; SSE2-NEXT:  .LBB11_15: # %cond.store13
4304; SSE2-NEXT:    pextrw $7, %xmm0, %eax
4305; SSE2-NEXT:    movw %ax, 14(%rdi)
4306; SSE2-NEXT:    retq
4307;
4308; SSE4-LABEL: truncstore_v8i32_v8i16:
4309; SSE4:       # %bb.0:
4310; SSE4-NEXT:    pxor %xmm4, %xmm4
4311; SSE4-NEXT:    packssdw %xmm1, %xmm0
4312; SSE4-NEXT:    pcmpeqd %xmm4, %xmm3
4313; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
4314; SSE4-NEXT:    pxor %xmm1, %xmm3
4315; SSE4-NEXT:    pcmpeqd %xmm4, %xmm2
4316; SSE4-NEXT:    pxor %xmm1, %xmm2
4317; SSE4-NEXT:    packssdw %xmm3, %xmm2
4318; SSE4-NEXT:    packsswb %xmm2, %xmm2
4319; SSE4-NEXT:    pmovmskb %xmm2, %eax
4320; SSE4-NEXT:    testb $1, %al
4321; SSE4-NEXT:    jne .LBB11_1
4322; SSE4-NEXT:  # %bb.2: # %else
4323; SSE4-NEXT:    testb $2, %al
4324; SSE4-NEXT:    jne .LBB11_3
4325; SSE4-NEXT:  .LBB11_4: # %else2
4326; SSE4-NEXT:    testb $4, %al
4327; SSE4-NEXT:    jne .LBB11_5
4328; SSE4-NEXT:  .LBB11_6: # %else4
4329; SSE4-NEXT:    testb $8, %al
4330; SSE4-NEXT:    jne .LBB11_7
4331; SSE4-NEXT:  .LBB11_8: # %else6
4332; SSE4-NEXT:    testb $16, %al
4333; SSE4-NEXT:    jne .LBB11_9
4334; SSE4-NEXT:  .LBB11_10: # %else8
4335; SSE4-NEXT:    testb $32, %al
4336; SSE4-NEXT:    jne .LBB11_11
4337; SSE4-NEXT:  .LBB11_12: # %else10
4338; SSE4-NEXT:    testb $64, %al
4339; SSE4-NEXT:    jne .LBB11_13
4340; SSE4-NEXT:  .LBB11_14: # %else12
4341; SSE4-NEXT:    testb $-128, %al
4342; SSE4-NEXT:    jne .LBB11_15
4343; SSE4-NEXT:  .LBB11_16: # %else14
4344; SSE4-NEXT:    retq
4345; SSE4-NEXT:  .LBB11_1: # %cond.store
4346; SSE4-NEXT:    pextrw $0, %xmm0, (%rdi)
4347; SSE4-NEXT:    testb $2, %al
4348; SSE4-NEXT:    je .LBB11_4
4349; SSE4-NEXT:  .LBB11_3: # %cond.store1
4350; SSE4-NEXT:    pextrw $1, %xmm0, 2(%rdi)
4351; SSE4-NEXT:    testb $4, %al
4352; SSE4-NEXT:    je .LBB11_6
4353; SSE4-NEXT:  .LBB11_5: # %cond.store3
4354; SSE4-NEXT:    pextrw $2, %xmm0, 4(%rdi)
4355; SSE4-NEXT:    testb $8, %al
4356; SSE4-NEXT:    je .LBB11_8
4357; SSE4-NEXT:  .LBB11_7: # %cond.store5
4358; SSE4-NEXT:    pextrw $3, %xmm0, 6(%rdi)
4359; SSE4-NEXT:    testb $16, %al
4360; SSE4-NEXT:    je .LBB11_10
4361; SSE4-NEXT:  .LBB11_9: # %cond.store7
4362; SSE4-NEXT:    pextrw $4, %xmm0, 8(%rdi)
4363; SSE4-NEXT:    testb $32, %al
4364; SSE4-NEXT:    je .LBB11_12
4365; SSE4-NEXT:  .LBB11_11: # %cond.store9
4366; SSE4-NEXT:    pextrw $5, %xmm0, 10(%rdi)
4367; SSE4-NEXT:    testb $64, %al
4368; SSE4-NEXT:    je .LBB11_14
4369; SSE4-NEXT:  .LBB11_13: # %cond.store11
4370; SSE4-NEXT:    pextrw $6, %xmm0, 12(%rdi)
4371; SSE4-NEXT:    testb $-128, %al
4372; SSE4-NEXT:    je .LBB11_16
4373; SSE4-NEXT:  .LBB11_15: # %cond.store13
4374; SSE4-NEXT:    pextrw $7, %xmm0, 14(%rdi)
4375; SSE4-NEXT:    retq
4376;
4377; AVX1-LABEL: truncstore_v8i32_v8i16:
4378; AVX1:       # %bb.0:
4379; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4380; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
4381; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
4382; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
4383; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
4384; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
4385; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4386; AVX1-NEXT:    vmovmskps %ymm1, %eax
4387; AVX1-NEXT:    notl %eax
4388; AVX1-NEXT:    testb $1, %al
4389; AVX1-NEXT:    jne .LBB11_1
4390; AVX1-NEXT:  # %bb.2: # %else
4391; AVX1-NEXT:    testb $2, %al
4392; AVX1-NEXT:    jne .LBB11_3
4393; AVX1-NEXT:  .LBB11_4: # %else2
4394; AVX1-NEXT:    testb $4, %al
4395; AVX1-NEXT:    jne .LBB11_5
4396; AVX1-NEXT:  .LBB11_6: # %else4
4397; AVX1-NEXT:    testb $8, %al
4398; AVX1-NEXT:    jne .LBB11_7
4399; AVX1-NEXT:  .LBB11_8: # %else6
4400; AVX1-NEXT:    testb $16, %al
4401; AVX1-NEXT:    jne .LBB11_9
4402; AVX1-NEXT:  .LBB11_10: # %else8
4403; AVX1-NEXT:    testb $32, %al
4404; AVX1-NEXT:    jne .LBB11_11
4405; AVX1-NEXT:  .LBB11_12: # %else10
4406; AVX1-NEXT:    testb $64, %al
4407; AVX1-NEXT:    jne .LBB11_13
4408; AVX1-NEXT:  .LBB11_14: # %else12
4409; AVX1-NEXT:    testb $-128, %al
4410; AVX1-NEXT:    jne .LBB11_15
4411; AVX1-NEXT:  .LBB11_16: # %else14
4412; AVX1-NEXT:    vzeroupper
4413; AVX1-NEXT:    retq
4414; AVX1-NEXT:  .LBB11_1: # %cond.store
4415; AVX1-NEXT:    vpextrw $0, %xmm0, (%rdi)
4416; AVX1-NEXT:    testb $2, %al
4417; AVX1-NEXT:    je .LBB11_4
4418; AVX1-NEXT:  .LBB11_3: # %cond.store1
4419; AVX1-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
4420; AVX1-NEXT:    testb $4, %al
4421; AVX1-NEXT:    je .LBB11_6
4422; AVX1-NEXT:  .LBB11_5: # %cond.store3
4423; AVX1-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
4424; AVX1-NEXT:    testb $8, %al
4425; AVX1-NEXT:    je .LBB11_8
4426; AVX1-NEXT:  .LBB11_7: # %cond.store5
4427; AVX1-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
4428; AVX1-NEXT:    testb $16, %al
4429; AVX1-NEXT:    je .LBB11_10
4430; AVX1-NEXT:  .LBB11_9: # %cond.store7
4431; AVX1-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
4432; AVX1-NEXT:    testb $32, %al
4433; AVX1-NEXT:    je .LBB11_12
4434; AVX1-NEXT:  .LBB11_11: # %cond.store9
4435; AVX1-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
4436; AVX1-NEXT:    testb $64, %al
4437; AVX1-NEXT:    je .LBB11_14
4438; AVX1-NEXT:  .LBB11_13: # %cond.store11
4439; AVX1-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
4440; AVX1-NEXT:    testb $-128, %al
4441; AVX1-NEXT:    je .LBB11_16
4442; AVX1-NEXT:  .LBB11_15: # %cond.store13
4443; AVX1-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
4444; AVX1-NEXT:    vzeroupper
4445; AVX1-NEXT:    retq
4446;
4447; AVX2-LABEL: truncstore_v8i32_v8i16:
4448; AVX2:       # %bb.0:
4449; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
4450; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
4451; AVX2-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
4452; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm1, %ymm1
4453; AVX2-NEXT:    vmovmskps %ymm1, %eax
4454; AVX2-NEXT:    notl %eax
4455; AVX2-NEXT:    testb $1, %al
4456; AVX2-NEXT:    jne .LBB11_1
4457; AVX2-NEXT:  # %bb.2: # %else
4458; AVX2-NEXT:    testb $2, %al
4459; AVX2-NEXT:    jne .LBB11_3
4460; AVX2-NEXT:  .LBB11_4: # %else2
4461; AVX2-NEXT:    testb $4, %al
4462; AVX2-NEXT:    jne .LBB11_5
4463; AVX2-NEXT:  .LBB11_6: # %else4
4464; AVX2-NEXT:    testb $8, %al
4465; AVX2-NEXT:    jne .LBB11_7
4466; AVX2-NEXT:  .LBB11_8: # %else6
4467; AVX2-NEXT:    testb $16, %al
4468; AVX2-NEXT:    jne .LBB11_9
4469; AVX2-NEXT:  .LBB11_10: # %else8
4470; AVX2-NEXT:    testb $32, %al
4471; AVX2-NEXT:    jne .LBB11_11
4472; AVX2-NEXT:  .LBB11_12: # %else10
4473; AVX2-NEXT:    testb $64, %al
4474; AVX2-NEXT:    jne .LBB11_13
4475; AVX2-NEXT:  .LBB11_14: # %else12
4476; AVX2-NEXT:    testb $-128, %al
4477; AVX2-NEXT:    jne .LBB11_15
4478; AVX2-NEXT:  .LBB11_16: # %else14
4479; AVX2-NEXT:    vzeroupper
4480; AVX2-NEXT:    retq
4481; AVX2-NEXT:  .LBB11_1: # %cond.store
4482; AVX2-NEXT:    vpextrw $0, %xmm0, (%rdi)
4483; AVX2-NEXT:    testb $2, %al
4484; AVX2-NEXT:    je .LBB11_4
4485; AVX2-NEXT:  .LBB11_3: # %cond.store1
4486; AVX2-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
4487; AVX2-NEXT:    testb $4, %al
4488; AVX2-NEXT:    je .LBB11_6
4489; AVX2-NEXT:  .LBB11_5: # %cond.store3
4490; AVX2-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
4491; AVX2-NEXT:    testb $8, %al
4492; AVX2-NEXT:    je .LBB11_8
4493; AVX2-NEXT:  .LBB11_7: # %cond.store5
4494; AVX2-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
4495; AVX2-NEXT:    testb $16, %al
4496; AVX2-NEXT:    je .LBB11_10
4497; AVX2-NEXT:  .LBB11_9: # %cond.store7
4498; AVX2-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
4499; AVX2-NEXT:    testb $32, %al
4500; AVX2-NEXT:    je .LBB11_12
4501; AVX2-NEXT:  .LBB11_11: # %cond.store9
4502; AVX2-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
4503; AVX2-NEXT:    testb $64, %al
4504; AVX2-NEXT:    je .LBB11_14
4505; AVX2-NEXT:  .LBB11_13: # %cond.store11
4506; AVX2-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
4507; AVX2-NEXT:    testb $-128, %al
4508; AVX2-NEXT:    je .LBB11_16
4509; AVX2-NEXT:  .LBB11_15: # %cond.store13
4510; AVX2-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
4511; AVX2-NEXT:    vzeroupper
4512; AVX2-NEXT:    retq
4513;
4514; AVX512F-LABEL: truncstore_v8i32_v8i16:
4515; AVX512F:       # %bb.0:
4516; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
4517; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
4518; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
4519; AVX512F-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
4520; AVX512F-NEXT:    kmovw %k0, %eax
4521; AVX512F-NEXT:    testb $1, %al
4522; AVX512F-NEXT:    jne .LBB11_1
4523; AVX512F-NEXT:  # %bb.2: # %else
4524; AVX512F-NEXT:    testb $2, %al
4525; AVX512F-NEXT:    jne .LBB11_3
4526; AVX512F-NEXT:  .LBB11_4: # %else2
4527; AVX512F-NEXT:    testb $4, %al
4528; AVX512F-NEXT:    jne .LBB11_5
4529; AVX512F-NEXT:  .LBB11_6: # %else4
4530; AVX512F-NEXT:    testb $8, %al
4531; AVX512F-NEXT:    jne .LBB11_7
4532; AVX512F-NEXT:  .LBB11_8: # %else6
4533; AVX512F-NEXT:    testb $16, %al
4534; AVX512F-NEXT:    jne .LBB11_9
4535; AVX512F-NEXT:  .LBB11_10: # %else8
4536; AVX512F-NEXT:    testb $32, %al
4537; AVX512F-NEXT:    jne .LBB11_11
4538; AVX512F-NEXT:  .LBB11_12: # %else10
4539; AVX512F-NEXT:    testb $64, %al
4540; AVX512F-NEXT:    jne .LBB11_13
4541; AVX512F-NEXT:  .LBB11_14: # %else12
4542; AVX512F-NEXT:    testb $-128, %al
4543; AVX512F-NEXT:    jne .LBB11_15
4544; AVX512F-NEXT:  .LBB11_16: # %else14
4545; AVX512F-NEXT:    vzeroupper
4546; AVX512F-NEXT:    retq
4547; AVX512F-NEXT:  .LBB11_1: # %cond.store
4548; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
4549; AVX512F-NEXT:    testb $2, %al
4550; AVX512F-NEXT:    je .LBB11_4
4551; AVX512F-NEXT:  .LBB11_3: # %cond.store1
4552; AVX512F-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
4553; AVX512F-NEXT:    testb $4, %al
4554; AVX512F-NEXT:    je .LBB11_6
4555; AVX512F-NEXT:  .LBB11_5: # %cond.store3
4556; AVX512F-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
4557; AVX512F-NEXT:    testb $8, %al
4558; AVX512F-NEXT:    je .LBB11_8
4559; AVX512F-NEXT:  .LBB11_7: # %cond.store5
4560; AVX512F-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
4561; AVX512F-NEXT:    testb $16, %al
4562; AVX512F-NEXT:    je .LBB11_10
4563; AVX512F-NEXT:  .LBB11_9: # %cond.store7
4564; AVX512F-NEXT:    vpextrw $4, %xmm0, 8(%rdi)
4565; AVX512F-NEXT:    testb $32, %al
4566; AVX512F-NEXT:    je .LBB11_12
4567; AVX512F-NEXT:  .LBB11_11: # %cond.store9
4568; AVX512F-NEXT:    vpextrw $5, %xmm0, 10(%rdi)
4569; AVX512F-NEXT:    testb $64, %al
4570; AVX512F-NEXT:    je .LBB11_14
4571; AVX512F-NEXT:  .LBB11_13: # %cond.store11
4572; AVX512F-NEXT:    vpextrw $6, %xmm0, 12(%rdi)
4573; AVX512F-NEXT:    testb $-128, %al
4574; AVX512F-NEXT:    je .LBB11_16
4575; AVX512F-NEXT:  .LBB11_15: # %cond.store13
4576; AVX512F-NEXT:    vpextrw $7, %xmm0, 14(%rdi)
4577; AVX512F-NEXT:    vzeroupper
4578; AVX512F-NEXT:    retq
4579;
4580; AVX512BW-LABEL: truncstore_v8i32_v8i16:
4581; AVX512BW:       # %bb.0:
4582; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
4583; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k0
4584; AVX512BW-NEXT:    kshiftld $24, %k0, %k0
4585; AVX512BW-NEXT:    kshiftrd $24, %k0, %k1
4586; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
4587; AVX512BW-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
4588; AVX512BW-NEXT:    vmovdqu16 %zmm0, (%rdi) {%k1}
4589; AVX512BW-NEXT:    vzeroupper
4590; AVX512BW-NEXT:    retq
4591;
4592; AVX512BWVL-LABEL: truncstore_v8i32_v8i16:
4593; AVX512BWVL:       # %bb.0:
4594; AVX512BWVL-NEXT:    vptestmd %ymm1, %ymm1, %k1
4595; AVX512BWVL-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
4596; AVX512BWVL-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
4597; AVX512BWVL-NEXT:    vpmovdw %ymm0, (%rdi) {%k1}
4598; AVX512BWVL-NEXT:    vzeroupper
4599; AVX512BWVL-NEXT:    retq
4600  %a = icmp ne <8 x i32> %mask, zeroinitializer
4601  %b = icmp slt <8 x i32> %x, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
4602  %c = select <8 x i1> %b, <8 x i32> %x, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
4603  %d = icmp sgt <8 x i32> %c, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
4604  %e = select <8 x i1> %d, <8 x i32> %c, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
4605  %f = trunc <8 x i32> %e to <8 x i16>
4606  call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %f, <8 x i16>* %p, i32 1, <8 x i1> %a)
4607  ret void
4608}
4609
4610define void @truncstore_v8i32_v8i8(<8 x i32> %x, <8 x i8>* %p, <8 x i32> %mask) {
4611; SSE2-LABEL: truncstore_v8i32_v8i8:
4612; SSE2:       # %bb.0:
4613; SSE2-NEXT:    pxor %xmm4, %xmm4
4614; SSE2-NEXT:    packssdw %xmm1, %xmm0
4615; SSE2-NEXT:    packsswb %xmm0, %xmm0
4616; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
4617; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
4618; SSE2-NEXT:    pxor %xmm1, %xmm3
4619; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
4620; SSE2-NEXT:    pxor %xmm1, %xmm2
4621; SSE2-NEXT:    packssdw %xmm3, %xmm2
4622; SSE2-NEXT:    packsswb %xmm2, %xmm2
4623; SSE2-NEXT:    pmovmskb %xmm2, %eax
4624; SSE2-NEXT:    testb $1, %al
4625; SSE2-NEXT:    movd %xmm0, %ecx
4626; SSE2-NEXT:    jne .LBB12_1
4627; SSE2-NEXT:  # %bb.2: # %else
4628; SSE2-NEXT:    testb $2, %al
4629; SSE2-NEXT:    jne .LBB12_3
4630; SSE2-NEXT:  .LBB12_4: # %else2
4631; SSE2-NEXT:    testb $4, %al
4632; SSE2-NEXT:    jne .LBB12_5
4633; SSE2-NEXT:  .LBB12_6: # %else4
4634; SSE2-NEXT:    testb $8, %al
4635; SSE2-NEXT:    je .LBB12_8
4636; SSE2-NEXT:  .LBB12_7: # %cond.store5
4637; SSE2-NEXT:    shrl $24, %ecx
4638; SSE2-NEXT:    movb %cl, 3(%rdi)
4639; SSE2-NEXT:  .LBB12_8: # %else6
4640; SSE2-NEXT:    testb $16, %al
4641; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
4642; SSE2-NEXT:    je .LBB12_10
4643; SSE2-NEXT:  # %bb.9: # %cond.store7
4644; SSE2-NEXT:    movb %cl, 4(%rdi)
4645; SSE2-NEXT:  .LBB12_10: # %else8
4646; SSE2-NEXT:    testb $32, %al
4647; SSE2-NEXT:    je .LBB12_12
4648; SSE2-NEXT:  # %bb.11: # %cond.store9
4649; SSE2-NEXT:    movb %ch, 5(%rdi)
4650; SSE2-NEXT:  .LBB12_12: # %else10
4651; SSE2-NEXT:    testb $64, %al
4652; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
4653; SSE2-NEXT:    jne .LBB12_13
4654; SSE2-NEXT:  # %bb.14: # %else12
4655; SSE2-NEXT:    testb $-128, %al
4656; SSE2-NEXT:    jne .LBB12_15
4657; SSE2-NEXT:  .LBB12_16: # %else14
4658; SSE2-NEXT:    retq
4659; SSE2-NEXT:  .LBB12_1: # %cond.store
4660; SSE2-NEXT:    movb %cl, (%rdi)
4661; SSE2-NEXT:    testb $2, %al
4662; SSE2-NEXT:    je .LBB12_4
4663; SSE2-NEXT:  .LBB12_3: # %cond.store1
4664; SSE2-NEXT:    movb %ch, 1(%rdi)
4665; SSE2-NEXT:    testb $4, %al
4666; SSE2-NEXT:    je .LBB12_6
4667; SSE2-NEXT:  .LBB12_5: # %cond.store3
4668; SSE2-NEXT:    movl %ecx, %edx
4669; SSE2-NEXT:    shrl $16, %edx
4670; SSE2-NEXT:    movb %dl, 2(%rdi)
4671; SSE2-NEXT:    testb $8, %al
4672; SSE2-NEXT:    jne .LBB12_7
4673; SSE2-NEXT:    jmp .LBB12_8
4674; SSE2-NEXT:  .LBB12_13: # %cond.store11
4675; SSE2-NEXT:    movb %cl, 6(%rdi)
4676; SSE2-NEXT:    testb $-128, %al
4677; SSE2-NEXT:    je .LBB12_16
4678; SSE2-NEXT:  .LBB12_15: # %cond.store13
4679; SSE2-NEXT:    movb %ch, 7(%rdi)
4680; SSE2-NEXT:    retq
4681;
4682; SSE4-LABEL: truncstore_v8i32_v8i8:
4683; SSE4:       # %bb.0:
4684; SSE4-NEXT:    pxor %xmm4, %xmm4
4685; SSE4-NEXT:    packssdw %xmm1, %xmm0
4686; SSE4-NEXT:    packsswb %xmm0, %xmm0
4687; SSE4-NEXT:    pcmpeqd %xmm4, %xmm3
4688; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
4689; SSE4-NEXT:    pxor %xmm1, %xmm3
4690; SSE4-NEXT:    pcmpeqd %xmm4, %xmm2
4691; SSE4-NEXT:    pxor %xmm1, %xmm2
4692; SSE4-NEXT:    packssdw %xmm3, %xmm2
4693; SSE4-NEXT:    packsswb %xmm2, %xmm2
4694; SSE4-NEXT:    pmovmskb %xmm2, %eax
4695; SSE4-NEXT:    testb $1, %al
4696; SSE4-NEXT:    jne .LBB12_1
4697; SSE4-NEXT:  # %bb.2: # %else
4698; SSE4-NEXT:    testb $2, %al
4699; SSE4-NEXT:    jne .LBB12_3
4700; SSE4-NEXT:  .LBB12_4: # %else2
4701; SSE4-NEXT:    testb $4, %al
4702; SSE4-NEXT:    jne .LBB12_5
4703; SSE4-NEXT:  .LBB12_6: # %else4
4704; SSE4-NEXT:    testb $8, %al
4705; SSE4-NEXT:    jne .LBB12_7
4706; SSE4-NEXT:  .LBB12_8: # %else6
4707; SSE4-NEXT:    testb $16, %al
4708; SSE4-NEXT:    jne .LBB12_9
4709; SSE4-NEXT:  .LBB12_10: # %else8
4710; SSE4-NEXT:    testb $32, %al
4711; SSE4-NEXT:    jne .LBB12_11
4712; SSE4-NEXT:  .LBB12_12: # %else10
4713; SSE4-NEXT:    testb $64, %al
4714; SSE4-NEXT:    jne .LBB12_13
4715; SSE4-NEXT:  .LBB12_14: # %else12
4716; SSE4-NEXT:    testb $-128, %al
4717; SSE4-NEXT:    jne .LBB12_15
4718; SSE4-NEXT:  .LBB12_16: # %else14
4719; SSE4-NEXT:    retq
4720; SSE4-NEXT:  .LBB12_1: # %cond.store
4721; SSE4-NEXT:    pextrb $0, %xmm0, (%rdi)
4722; SSE4-NEXT:    testb $2, %al
4723; SSE4-NEXT:    je .LBB12_4
4724; SSE4-NEXT:  .LBB12_3: # %cond.store1
4725; SSE4-NEXT:    pextrb $1, %xmm0, 1(%rdi)
4726; SSE4-NEXT:    testb $4, %al
4727; SSE4-NEXT:    je .LBB12_6
4728; SSE4-NEXT:  .LBB12_5: # %cond.store3
4729; SSE4-NEXT:    pextrb $2, %xmm0, 2(%rdi)
4730; SSE4-NEXT:    testb $8, %al
4731; SSE4-NEXT:    je .LBB12_8
4732; SSE4-NEXT:  .LBB12_7: # %cond.store5
4733; SSE4-NEXT:    pextrb $3, %xmm0, 3(%rdi)
4734; SSE4-NEXT:    testb $16, %al
4735; SSE4-NEXT:    je .LBB12_10
4736; SSE4-NEXT:  .LBB12_9: # %cond.store7
4737; SSE4-NEXT:    pextrb $4, %xmm0, 4(%rdi)
4738; SSE4-NEXT:    testb $32, %al
4739; SSE4-NEXT:    je .LBB12_12
4740; SSE4-NEXT:  .LBB12_11: # %cond.store9
4741; SSE4-NEXT:    pextrb $5, %xmm0, 5(%rdi)
4742; SSE4-NEXT:    testb $64, %al
4743; SSE4-NEXT:    je .LBB12_14
4744; SSE4-NEXT:  .LBB12_13: # %cond.store11
4745; SSE4-NEXT:    pextrb $6, %xmm0, 6(%rdi)
4746; SSE4-NEXT:    testb $-128, %al
4747; SSE4-NEXT:    je .LBB12_16
4748; SSE4-NEXT:  .LBB12_15: # %cond.store13
4749; SSE4-NEXT:    pextrb $7, %xmm0, 7(%rdi)
4750; SSE4-NEXT:    retq
4751;
4752; AVX1-LABEL: truncstore_v8i32_v8i8:
4753; AVX1:       # %bb.0:
4754; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4755; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
4756; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4757; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
4758; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
4759; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
4760; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm1, %xmm1
4761; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
4762; AVX1-NEXT:    vmovmskps %ymm1, %eax
4763; AVX1-NEXT:    notl %eax
4764; AVX1-NEXT:    testb $1, %al
4765; AVX1-NEXT:    jne .LBB12_1
4766; AVX1-NEXT:  # %bb.2: # %else
4767; AVX1-NEXT:    testb $2, %al
4768; AVX1-NEXT:    jne .LBB12_3
4769; AVX1-NEXT:  .LBB12_4: # %else2
4770; AVX1-NEXT:    testb $4, %al
4771; AVX1-NEXT:    jne .LBB12_5
4772; AVX1-NEXT:  .LBB12_6: # %else4
4773; AVX1-NEXT:    testb $8, %al
4774; AVX1-NEXT:    jne .LBB12_7
4775; AVX1-NEXT:  .LBB12_8: # %else6
4776; AVX1-NEXT:    testb $16, %al
4777; AVX1-NEXT:    jne .LBB12_9
4778; AVX1-NEXT:  .LBB12_10: # %else8
4779; AVX1-NEXT:    testb $32, %al
4780; AVX1-NEXT:    jne .LBB12_11
4781; AVX1-NEXT:  .LBB12_12: # %else10
4782; AVX1-NEXT:    testb $64, %al
4783; AVX1-NEXT:    jne .LBB12_13
4784; AVX1-NEXT:  .LBB12_14: # %else12
4785; AVX1-NEXT:    testb $-128, %al
4786; AVX1-NEXT:    jne .LBB12_15
4787; AVX1-NEXT:  .LBB12_16: # %else14
4788; AVX1-NEXT:    vzeroupper
4789; AVX1-NEXT:    retq
4790; AVX1-NEXT:  .LBB12_1: # %cond.store
4791; AVX1-NEXT:    vpextrb $0, %xmm0, (%rdi)
4792; AVX1-NEXT:    testb $2, %al
4793; AVX1-NEXT:    je .LBB12_4
4794; AVX1-NEXT:  .LBB12_3: # %cond.store1
4795; AVX1-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
4796; AVX1-NEXT:    testb $4, %al
4797; AVX1-NEXT:    je .LBB12_6
4798; AVX1-NEXT:  .LBB12_5: # %cond.store3
4799; AVX1-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
4800; AVX1-NEXT:    testb $8, %al
4801; AVX1-NEXT:    je .LBB12_8
4802; AVX1-NEXT:  .LBB12_7: # %cond.store5
4803; AVX1-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
4804; AVX1-NEXT:    testb $16, %al
4805; AVX1-NEXT:    je .LBB12_10
4806; AVX1-NEXT:  .LBB12_9: # %cond.store7
4807; AVX1-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
4808; AVX1-NEXT:    testb $32, %al
4809; AVX1-NEXT:    je .LBB12_12
4810; AVX1-NEXT:  .LBB12_11: # %cond.store9
4811; AVX1-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
4812; AVX1-NEXT:    testb $64, %al
4813; AVX1-NEXT:    je .LBB12_14
4814; AVX1-NEXT:  .LBB12_13: # %cond.store11
4815; AVX1-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
4816; AVX1-NEXT:    testb $-128, %al
4817; AVX1-NEXT:    je .LBB12_16
4818; AVX1-NEXT:  .LBB12_15: # %cond.store13
4819; AVX1-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
4820; AVX1-NEXT:    vzeroupper
4821; AVX1-NEXT:    retq
4822;
4823; AVX2-LABEL: truncstore_v8i32_v8i8:
4824; AVX2:       # %bb.0:
4825; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
4826; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
4827; AVX2-NEXT:    vpackssdw %xmm3, %xmm0, %xmm0
4828; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4829; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm1, %ymm1
4830; AVX2-NEXT:    vmovmskps %ymm1, %eax
4831; AVX2-NEXT:    notl %eax
4832; AVX2-NEXT:    testb $1, %al
4833; AVX2-NEXT:    jne .LBB12_1
4834; AVX2-NEXT:  # %bb.2: # %else
4835; AVX2-NEXT:    testb $2, %al
4836; AVX2-NEXT:    jne .LBB12_3
4837; AVX2-NEXT:  .LBB12_4: # %else2
4838; AVX2-NEXT:    testb $4, %al
4839; AVX2-NEXT:    jne .LBB12_5
4840; AVX2-NEXT:  .LBB12_6: # %else4
4841; AVX2-NEXT:    testb $8, %al
4842; AVX2-NEXT:    jne .LBB12_7
4843; AVX2-NEXT:  .LBB12_8: # %else6
4844; AVX2-NEXT:    testb $16, %al
4845; AVX2-NEXT:    jne .LBB12_9
4846; AVX2-NEXT:  .LBB12_10: # %else8
4847; AVX2-NEXT:    testb $32, %al
4848; AVX2-NEXT:    jne .LBB12_11
4849; AVX2-NEXT:  .LBB12_12: # %else10
4850; AVX2-NEXT:    testb $64, %al
4851; AVX2-NEXT:    jne .LBB12_13
4852; AVX2-NEXT:  .LBB12_14: # %else12
4853; AVX2-NEXT:    testb $-128, %al
4854; AVX2-NEXT:    jne .LBB12_15
4855; AVX2-NEXT:  .LBB12_16: # %else14
4856; AVX2-NEXT:    vzeroupper
4857; AVX2-NEXT:    retq
4858; AVX2-NEXT:  .LBB12_1: # %cond.store
4859; AVX2-NEXT:    vpextrb $0, %xmm0, (%rdi)
4860; AVX2-NEXT:    testb $2, %al
4861; AVX2-NEXT:    je .LBB12_4
4862; AVX2-NEXT:  .LBB12_3: # %cond.store1
4863; AVX2-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
4864; AVX2-NEXT:    testb $4, %al
4865; AVX2-NEXT:    je .LBB12_6
4866; AVX2-NEXT:  .LBB12_5: # %cond.store3
4867; AVX2-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
4868; AVX2-NEXT:    testb $8, %al
4869; AVX2-NEXT:    je .LBB12_8
4870; AVX2-NEXT:  .LBB12_7: # %cond.store5
4871; AVX2-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
4872; AVX2-NEXT:    testb $16, %al
4873; AVX2-NEXT:    je .LBB12_10
4874; AVX2-NEXT:  .LBB12_9: # %cond.store7
4875; AVX2-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
4876; AVX2-NEXT:    testb $32, %al
4877; AVX2-NEXT:    je .LBB12_12
4878; AVX2-NEXT:  .LBB12_11: # %cond.store9
4879; AVX2-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
4880; AVX2-NEXT:    testb $64, %al
4881; AVX2-NEXT:    je .LBB12_14
4882; AVX2-NEXT:  .LBB12_13: # %cond.store11
4883; AVX2-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
4884; AVX2-NEXT:    testb $-128, %al
4885; AVX2-NEXT:    je .LBB12_16
4886; AVX2-NEXT:  .LBB12_15: # %cond.store13
4887; AVX2-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
4888; AVX2-NEXT:    vzeroupper
4889; AVX2-NEXT:    retq
4890;
4891; AVX512F-LABEL: truncstore_v8i32_v8i8:
4892; AVX512F:       # %bb.0:
4893; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
4894; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
4895; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm1
4896; AVX512F-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
4897; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4898; AVX512F-NEXT:    kmovw %k0, %eax
4899; AVX512F-NEXT:    testb $1, %al
4900; AVX512F-NEXT:    jne .LBB12_1
4901; AVX512F-NEXT:  # %bb.2: # %else
4902; AVX512F-NEXT:    testb $2, %al
4903; AVX512F-NEXT:    jne .LBB12_3
4904; AVX512F-NEXT:  .LBB12_4: # %else2
4905; AVX512F-NEXT:    testb $4, %al
4906; AVX512F-NEXT:    jne .LBB12_5
4907; AVX512F-NEXT:  .LBB12_6: # %else4
4908; AVX512F-NEXT:    testb $8, %al
4909; AVX512F-NEXT:    jne .LBB12_7
4910; AVX512F-NEXT:  .LBB12_8: # %else6
4911; AVX512F-NEXT:    testb $16, %al
4912; AVX512F-NEXT:    jne .LBB12_9
4913; AVX512F-NEXT:  .LBB12_10: # %else8
4914; AVX512F-NEXT:    testb $32, %al
4915; AVX512F-NEXT:    jne .LBB12_11
4916; AVX512F-NEXT:  .LBB12_12: # %else10
4917; AVX512F-NEXT:    testb $64, %al
4918; AVX512F-NEXT:    jne .LBB12_13
4919; AVX512F-NEXT:  .LBB12_14: # %else12
4920; AVX512F-NEXT:    testb $-128, %al
4921; AVX512F-NEXT:    jne .LBB12_15
4922; AVX512F-NEXT:  .LBB12_16: # %else14
4923; AVX512F-NEXT:    vzeroupper
4924; AVX512F-NEXT:    retq
4925; AVX512F-NEXT:  .LBB12_1: # %cond.store
4926; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
4927; AVX512F-NEXT:    testb $2, %al
4928; AVX512F-NEXT:    je .LBB12_4
4929; AVX512F-NEXT:  .LBB12_3: # %cond.store1
4930; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
4931; AVX512F-NEXT:    testb $4, %al
4932; AVX512F-NEXT:    je .LBB12_6
4933; AVX512F-NEXT:  .LBB12_5: # %cond.store3
4934; AVX512F-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
4935; AVX512F-NEXT:    testb $8, %al
4936; AVX512F-NEXT:    je .LBB12_8
4937; AVX512F-NEXT:  .LBB12_7: # %cond.store5
4938; AVX512F-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
4939; AVX512F-NEXT:    testb $16, %al
4940; AVX512F-NEXT:    je .LBB12_10
4941; AVX512F-NEXT:  .LBB12_9: # %cond.store7
4942; AVX512F-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
4943; AVX512F-NEXT:    testb $32, %al
4944; AVX512F-NEXT:    je .LBB12_12
4945; AVX512F-NEXT:  .LBB12_11: # %cond.store9
4946; AVX512F-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
4947; AVX512F-NEXT:    testb $64, %al
4948; AVX512F-NEXT:    je .LBB12_14
4949; AVX512F-NEXT:  .LBB12_13: # %cond.store11
4950; AVX512F-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
4951; AVX512F-NEXT:    testb $-128, %al
4952; AVX512F-NEXT:    je .LBB12_16
4953; AVX512F-NEXT:  .LBB12_15: # %cond.store13
4954; AVX512F-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
4955; AVX512F-NEXT:    vzeroupper
4956; AVX512F-NEXT:    retq
4957;
4958; AVX512BW-LABEL: truncstore_v8i32_v8i8:
4959; AVX512BW:       # %bb.0:
4960; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
4961; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k0
4962; AVX512BW-NEXT:    kshiftlq $56, %k0, %k0
4963; AVX512BW-NEXT:    kshiftrq $56, %k0, %k1
4964; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
4965; AVX512BW-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
4966; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
4967; AVX512BW-NEXT:    vmovdqu8 %zmm0, (%rdi) {%k1}
4968; AVX512BW-NEXT:    vzeroupper
4969; AVX512BW-NEXT:    retq
4970;
4971; AVX512BWVL-LABEL: truncstore_v8i32_v8i8:
4972; AVX512BWVL:       # %bb.0:
4973; AVX512BWVL-NEXT:    vptestmd %ymm1, %ymm1, %k1
4974; AVX512BWVL-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
4975; AVX512BWVL-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
4976; AVX512BWVL-NEXT:    vpmovdb %ymm0, (%rdi) {%k1}
4977; AVX512BWVL-NEXT:    vzeroupper
4978; AVX512BWVL-NEXT:    retq
4979  %a = icmp ne <8 x i32> %mask, zeroinitializer
4980  %b = icmp slt <8 x i32> %x, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4981  %c = select <8 x i1> %b, <8 x i32> %x, <8 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127>
4982  %d = icmp sgt <8 x i32> %c, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4983  %e = select <8 x i1> %d, <8 x i32> %c, <8 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128>
4984  %f = trunc <8 x i32> %e to <8 x i8>
4985  call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %f, <8 x i8>* %p, i32 1, <8 x i1> %a)
4986  ret void
4987}
4988
4989define void @truncstore_v4i32_v4i16(<4 x i32> %x, <4 x i16>* %p, <4 x i32> %mask) {
4990; SSE2-LABEL: truncstore_v4i32_v4i16:
4991; SSE2:       # %bb.0:
4992; SSE2-NEXT:    pxor %xmm2, %xmm2
4993; SSE2-NEXT:    packssdw %xmm0, %xmm0
4994; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
4995; SSE2-NEXT:    movmskps %xmm2, %eax
4996; SSE2-NEXT:    xorl $15, %eax
4997; SSE2-NEXT:    testb $1, %al
4998; SSE2-NEXT:    jne .LBB13_1
4999; SSE2-NEXT:  # %bb.2: # %else
5000; SSE2-NEXT:    testb $2, %al
5001; SSE2-NEXT:    jne .LBB13_3
5002; SSE2-NEXT:  .LBB13_4: # %else2
5003; SSE2-NEXT:    testb $4, %al
5004; SSE2-NEXT:    jne .LBB13_5
5005; SSE2-NEXT:  .LBB13_6: # %else4
5006; SSE2-NEXT:    testb $8, %al
5007; SSE2-NEXT:    jne .LBB13_7
5008; SSE2-NEXT:  .LBB13_8: # %else6
5009; SSE2-NEXT:    retq
5010; SSE2-NEXT:  .LBB13_1: # %cond.store
5011; SSE2-NEXT:    movd %xmm0, %ecx
5012; SSE2-NEXT:    movw %cx, (%rdi)
5013; SSE2-NEXT:    testb $2, %al
5014; SSE2-NEXT:    je .LBB13_4
5015; SSE2-NEXT:  .LBB13_3: # %cond.store1
5016; SSE2-NEXT:    pextrw $1, %xmm0, %ecx
5017; SSE2-NEXT:    movw %cx, 2(%rdi)
5018; SSE2-NEXT:    testb $4, %al
5019; SSE2-NEXT:    je .LBB13_6
5020; SSE2-NEXT:  .LBB13_5: # %cond.store3
5021; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
5022; SSE2-NEXT:    movw %cx, 4(%rdi)
5023; SSE2-NEXT:    testb $8, %al
5024; SSE2-NEXT:    je .LBB13_8
5025; SSE2-NEXT:  .LBB13_7: # %cond.store5
5026; SSE2-NEXT:    pextrw $3, %xmm0, %eax
5027; SSE2-NEXT:    movw %ax, 6(%rdi)
5028; SSE2-NEXT:    retq
5029;
5030; SSE4-LABEL: truncstore_v4i32_v4i16:
5031; SSE4:       # %bb.0:
5032; SSE4-NEXT:    pxor %xmm2, %xmm2
5033; SSE4-NEXT:    packssdw %xmm0, %xmm0
5034; SSE4-NEXT:    pcmpeqd %xmm1, %xmm2
5035; SSE4-NEXT:    movmskps %xmm2, %eax
5036; SSE4-NEXT:    xorl $15, %eax
5037; SSE4-NEXT:    testb $1, %al
5038; SSE4-NEXT:    jne .LBB13_1
5039; SSE4-NEXT:  # %bb.2: # %else
5040; SSE4-NEXT:    testb $2, %al
5041; SSE4-NEXT:    jne .LBB13_3
5042; SSE4-NEXT:  .LBB13_4: # %else2
5043; SSE4-NEXT:    testb $4, %al
5044; SSE4-NEXT:    jne .LBB13_5
5045; SSE4-NEXT:  .LBB13_6: # %else4
5046; SSE4-NEXT:    testb $8, %al
5047; SSE4-NEXT:    jne .LBB13_7
5048; SSE4-NEXT:  .LBB13_8: # %else6
5049; SSE4-NEXT:    retq
5050; SSE4-NEXT:  .LBB13_1: # %cond.store
5051; SSE4-NEXT:    pextrw $0, %xmm0, (%rdi)
5052; SSE4-NEXT:    testb $2, %al
5053; SSE4-NEXT:    je .LBB13_4
5054; SSE4-NEXT:  .LBB13_3: # %cond.store1
5055; SSE4-NEXT:    pextrw $1, %xmm0, 2(%rdi)
5056; SSE4-NEXT:    testb $4, %al
5057; SSE4-NEXT:    je .LBB13_6
5058; SSE4-NEXT:  .LBB13_5: # %cond.store3
5059; SSE4-NEXT:    pextrw $2, %xmm0, 4(%rdi)
5060; SSE4-NEXT:    testb $8, %al
5061; SSE4-NEXT:    je .LBB13_8
5062; SSE4-NEXT:  .LBB13_7: # %cond.store5
5063; SSE4-NEXT:    pextrw $3, %xmm0, 6(%rdi)
5064; SSE4-NEXT:    retq
5065;
5066; AVX-LABEL: truncstore_v4i32_v4i16:
5067; AVX:       # %bb.0:
5068; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
5069; AVX-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
5070; AVX-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
5071; AVX-NEXT:    vmovmskps %xmm1, %eax
5072; AVX-NEXT:    xorl $15, %eax
5073; AVX-NEXT:    testb $1, %al
5074; AVX-NEXT:    jne .LBB13_1
5075; AVX-NEXT:  # %bb.2: # %else
5076; AVX-NEXT:    testb $2, %al
5077; AVX-NEXT:    jne .LBB13_3
5078; AVX-NEXT:  .LBB13_4: # %else2
5079; AVX-NEXT:    testb $4, %al
5080; AVX-NEXT:    jne .LBB13_5
5081; AVX-NEXT:  .LBB13_6: # %else4
5082; AVX-NEXT:    testb $8, %al
5083; AVX-NEXT:    jne .LBB13_7
5084; AVX-NEXT:  .LBB13_8: # %else6
5085; AVX-NEXT:    retq
5086; AVX-NEXT:  .LBB13_1: # %cond.store
5087; AVX-NEXT:    vpextrw $0, %xmm0, (%rdi)
5088; AVX-NEXT:    testb $2, %al
5089; AVX-NEXT:    je .LBB13_4
5090; AVX-NEXT:  .LBB13_3: # %cond.store1
5091; AVX-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
5092; AVX-NEXT:    testb $4, %al
5093; AVX-NEXT:    je .LBB13_6
5094; AVX-NEXT:  .LBB13_5: # %cond.store3
5095; AVX-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
5096; AVX-NEXT:    testb $8, %al
5097; AVX-NEXT:    je .LBB13_8
5098; AVX-NEXT:  .LBB13_7: # %cond.store5
5099; AVX-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
5100; AVX-NEXT:    retq
5101;
5102; AVX512F-LABEL: truncstore_v4i32_v4i16:
5103; AVX512F:       # %bb.0:
5104; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
5105; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
5106; AVX512F-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
5107; AVX512F-NEXT:    kmovw %k0, %eax
5108; AVX512F-NEXT:    testb $1, %al
5109; AVX512F-NEXT:    jne .LBB13_1
5110; AVX512F-NEXT:  # %bb.2: # %else
5111; AVX512F-NEXT:    testb $2, %al
5112; AVX512F-NEXT:    jne .LBB13_3
5113; AVX512F-NEXT:  .LBB13_4: # %else2
5114; AVX512F-NEXT:    testb $4, %al
5115; AVX512F-NEXT:    jne .LBB13_5
5116; AVX512F-NEXT:  .LBB13_6: # %else4
5117; AVX512F-NEXT:    testb $8, %al
5118; AVX512F-NEXT:    jne .LBB13_7
5119; AVX512F-NEXT:  .LBB13_8: # %else6
5120; AVX512F-NEXT:    vzeroupper
5121; AVX512F-NEXT:    retq
5122; AVX512F-NEXT:  .LBB13_1: # %cond.store
5123; AVX512F-NEXT:    vpextrw $0, %xmm0, (%rdi)
5124; AVX512F-NEXT:    testb $2, %al
5125; AVX512F-NEXT:    je .LBB13_4
5126; AVX512F-NEXT:  .LBB13_3: # %cond.store1
5127; AVX512F-NEXT:    vpextrw $1, %xmm0, 2(%rdi)
5128; AVX512F-NEXT:    testb $4, %al
5129; AVX512F-NEXT:    je .LBB13_6
5130; AVX512F-NEXT:  .LBB13_5: # %cond.store3
5131; AVX512F-NEXT:    vpextrw $2, %xmm0, 4(%rdi)
5132; AVX512F-NEXT:    testb $8, %al
5133; AVX512F-NEXT:    je .LBB13_8
5134; AVX512F-NEXT:  .LBB13_7: # %cond.store5
5135; AVX512F-NEXT:    vpextrw $3, %xmm0, 6(%rdi)
5136; AVX512F-NEXT:    vzeroupper
5137; AVX512F-NEXT:    retq
5138;
5139; AVX512BW-LABEL: truncstore_v4i32_v4i16:
5140; AVX512BW:       # %bb.0:
5141; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
5142; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k0
5143; AVX512BW-NEXT:    kshiftld $28, %k0, %k0
5144; AVX512BW-NEXT:    kshiftrd $28, %k0, %k1
5145; AVX512BW-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
5146; AVX512BW-NEXT:    vmovdqu16 %zmm0, (%rdi) {%k1}
5147; AVX512BW-NEXT:    vzeroupper
5148; AVX512BW-NEXT:    retq
5149;
5150; AVX512BWVL-LABEL: truncstore_v4i32_v4i16:
5151; AVX512BWVL:       # %bb.0:
5152; AVX512BWVL-NEXT:    vptestmd %xmm1, %xmm1, %k1
5153; AVX512BWVL-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
5154; AVX512BWVL-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
5155; AVX512BWVL-NEXT:    vpmovdw %xmm0, (%rdi) {%k1}
5156; AVX512BWVL-NEXT:    retq
5157  %a = icmp ne <4 x i32> %mask, zeroinitializer
5158  %b = icmp slt <4 x i32> %x, <i32 32767, i32 32767, i32 32767, i32 32767>
5159  %c = select <4 x i1> %b, <4 x i32> %x, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
5160  %d = icmp sgt <4 x i32> %c, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
5161  %e = select <4 x i1> %d, <4 x i32> %c, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
5162  %f = trunc <4 x i32> %e to <4 x i16>
5163  call void @llvm.masked.store.v4i16.p0v4i16(<4 x i16> %f, <4 x i16>* %p, i32 1, <4 x i1> %a)
5164  ret void
5165}
5166
5167define void @truncstore_v4i32_v4i8(<4 x i32> %x, <4 x i8>* %p, <4 x i32> %mask) {
5168; SSE2-LABEL: truncstore_v4i32_v4i8:
5169; SSE2:       # %bb.0:
5170; SSE2-NEXT:    pxor %xmm2, %xmm2
5171; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [127,127,127,127]
5172; SSE2-NEXT:    movdqa %xmm3, %xmm4
5173; SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
5174; SSE2-NEXT:    pand %xmm4, %xmm0
5175; SSE2-NEXT:    pandn %xmm3, %xmm4
5176; SSE2-NEXT:    por %xmm0, %xmm4
5177; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [4294967168,4294967168,4294967168,4294967168]
5178; SSE2-NEXT:    movdqa %xmm4, %xmm3
5179; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
5180; SSE2-NEXT:    pand %xmm3, %xmm4
5181; SSE2-NEXT:    pandn %xmm0, %xmm3
5182; SSE2-NEXT:    por %xmm4, %xmm3
5183; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
5184; SSE2-NEXT:    packuswb %xmm3, %xmm3
5185; SSE2-NEXT:    packuswb %xmm3, %xmm3
5186; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
5187; SSE2-NEXT:    movmskps %xmm2, %ecx
5188; SSE2-NEXT:    xorl $15, %ecx
5189; SSE2-NEXT:    testb $1, %cl
5190; SSE2-NEXT:    movd %xmm3, %eax
5191; SSE2-NEXT:    jne .LBB14_1
5192; SSE2-NEXT:  # %bb.2: # %else
5193; SSE2-NEXT:    testb $2, %cl
5194; SSE2-NEXT:    jne .LBB14_3
5195; SSE2-NEXT:  .LBB14_4: # %else2
5196; SSE2-NEXT:    testb $4, %cl
5197; SSE2-NEXT:    jne .LBB14_5
5198; SSE2-NEXT:  .LBB14_6: # %else4
5199; SSE2-NEXT:    testb $8, %cl
5200; SSE2-NEXT:    jne .LBB14_7
5201; SSE2-NEXT:  .LBB14_8: # %else6
5202; SSE2-NEXT:    retq
5203; SSE2-NEXT:  .LBB14_1: # %cond.store
5204; SSE2-NEXT:    movb %al, (%rdi)
5205; SSE2-NEXT:    testb $2, %cl
5206; SSE2-NEXT:    je .LBB14_4
5207; SSE2-NEXT:  .LBB14_3: # %cond.store1
5208; SSE2-NEXT:    movb %ah, 1(%rdi)
5209; SSE2-NEXT:    testb $4, %cl
5210; SSE2-NEXT:    je .LBB14_6
5211; SSE2-NEXT:  .LBB14_5: # %cond.store3
5212; SSE2-NEXT:    movl %eax, %edx
5213; SSE2-NEXT:    shrl $16, %edx
5214; SSE2-NEXT:    movb %dl, 2(%rdi)
5215; SSE2-NEXT:    testb $8, %cl
5216; SSE2-NEXT:    je .LBB14_8
5217; SSE2-NEXT:  .LBB14_7: # %cond.store5
5218; SSE2-NEXT:    shrl $24, %eax
5219; SSE2-NEXT:    movb %al, 3(%rdi)
5220; SSE2-NEXT:    retq
5221;
5222; SSE4-LABEL: truncstore_v4i32_v4i8:
5223; SSE4:       # %bb.0:
5224; SSE4-NEXT:    pxor %xmm2, %xmm2
5225; SSE4-NEXT:    pminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
5226; SSE4-NEXT:    pmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
5227; SSE4-NEXT:    packssdw %xmm0, %xmm0
5228; SSE4-NEXT:    packsswb %xmm0, %xmm0
5229; SSE4-NEXT:    pcmpeqd %xmm1, %xmm2
5230; SSE4-NEXT:    movmskps %xmm2, %eax
5231; SSE4-NEXT:    xorl $15, %eax
5232; SSE4-NEXT:    testb $1, %al
5233; SSE4-NEXT:    jne .LBB14_1
5234; SSE4-NEXT:  # %bb.2: # %else
5235; SSE4-NEXT:    testb $2, %al
5236; SSE4-NEXT:    jne .LBB14_3
5237; SSE4-NEXT:  .LBB14_4: # %else2
5238; SSE4-NEXT:    testb $4, %al
5239; SSE4-NEXT:    jne .LBB14_5
5240; SSE4-NEXT:  .LBB14_6: # %else4
5241; SSE4-NEXT:    testb $8, %al
5242; SSE4-NEXT:    jne .LBB14_7
5243; SSE4-NEXT:  .LBB14_8: # %else6
5244; SSE4-NEXT:    retq
5245; SSE4-NEXT:  .LBB14_1: # %cond.store
5246; SSE4-NEXT:    pextrb $0, %xmm0, (%rdi)
5247; SSE4-NEXT:    testb $2, %al
5248; SSE4-NEXT:    je .LBB14_4
5249; SSE4-NEXT:  .LBB14_3: # %cond.store1
5250; SSE4-NEXT:    pextrb $1, %xmm0, 1(%rdi)
5251; SSE4-NEXT:    testb $4, %al
5252; SSE4-NEXT:    je .LBB14_6
5253; SSE4-NEXT:  .LBB14_5: # %cond.store3
5254; SSE4-NEXT:    pextrb $2, %xmm0, 2(%rdi)
5255; SSE4-NEXT:    testb $8, %al
5256; SSE4-NEXT:    je .LBB14_8
5257; SSE4-NEXT:  .LBB14_7: # %cond.store5
5258; SSE4-NEXT:    pextrb $3, %xmm0, 3(%rdi)
5259; SSE4-NEXT:    retq
5260;
5261; AVX1-LABEL: truncstore_v4i32_v4i8:
5262; AVX1:       # %bb.0:
5263; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
5264; AVX1-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
5265; AVX1-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
5266; AVX1-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
5267; AVX1-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5268; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
5269; AVX1-NEXT:    vmovmskps %xmm1, %eax
5270; AVX1-NEXT:    xorl $15, %eax
5271; AVX1-NEXT:    testb $1, %al
5272; AVX1-NEXT:    jne .LBB14_1
5273; AVX1-NEXT:  # %bb.2: # %else
5274; AVX1-NEXT:    testb $2, %al
5275; AVX1-NEXT:    jne .LBB14_3
5276; AVX1-NEXT:  .LBB14_4: # %else2
5277; AVX1-NEXT:    testb $4, %al
5278; AVX1-NEXT:    jne .LBB14_5
5279; AVX1-NEXT:  .LBB14_6: # %else4
5280; AVX1-NEXT:    testb $8, %al
5281; AVX1-NEXT:    jne .LBB14_7
5282; AVX1-NEXT:  .LBB14_8: # %else6
5283; AVX1-NEXT:    retq
5284; AVX1-NEXT:  .LBB14_1: # %cond.store
5285; AVX1-NEXT:    vpextrb $0, %xmm0, (%rdi)
5286; AVX1-NEXT:    testb $2, %al
5287; AVX1-NEXT:    je .LBB14_4
5288; AVX1-NEXT:  .LBB14_3: # %cond.store1
5289; AVX1-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
5290; AVX1-NEXT:    testb $4, %al
5291; AVX1-NEXT:    je .LBB14_6
5292; AVX1-NEXT:  .LBB14_5: # %cond.store3
5293; AVX1-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
5294; AVX1-NEXT:    testb $8, %al
5295; AVX1-NEXT:    je .LBB14_8
5296; AVX1-NEXT:  .LBB14_7: # %cond.store5
5297; AVX1-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
5298; AVX1-NEXT:    retq
5299;
5300; AVX2-LABEL: truncstore_v4i32_v4i8:
5301; AVX2:       # %bb.0:
5302; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
5303; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [127,127,127,127]
5304; AVX2-NEXT:    vpminsd %xmm3, %xmm0, %xmm0
5305; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm3 = [4294967168,4294967168,4294967168,4294967168]
5306; AVX2-NEXT:    vpmaxsd %xmm3, %xmm0, %xmm0
5307; AVX2-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0
5308; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
5309; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm1, %xmm1
5310; AVX2-NEXT:    vmovmskps %xmm1, %eax
5311; AVX2-NEXT:    xorl $15, %eax
5312; AVX2-NEXT:    testb $1, %al
5313; AVX2-NEXT:    jne .LBB14_1
5314; AVX2-NEXT:  # %bb.2: # %else
5315; AVX2-NEXT:    testb $2, %al
5316; AVX2-NEXT:    jne .LBB14_3
5317; AVX2-NEXT:  .LBB14_4: # %else2
5318; AVX2-NEXT:    testb $4, %al
5319; AVX2-NEXT:    jne .LBB14_5
5320; AVX2-NEXT:  .LBB14_6: # %else4
5321; AVX2-NEXT:    testb $8, %al
5322; AVX2-NEXT:    jne .LBB14_7
5323; AVX2-NEXT:  .LBB14_8: # %else6
5324; AVX2-NEXT:    retq
5325; AVX2-NEXT:  .LBB14_1: # %cond.store
5326; AVX2-NEXT:    vpextrb $0, %xmm0, (%rdi)
5327; AVX2-NEXT:    testb $2, %al
5328; AVX2-NEXT:    je .LBB14_4
5329; AVX2-NEXT:  .LBB14_3: # %cond.store1
5330; AVX2-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
5331; AVX2-NEXT:    testb $4, %al
5332; AVX2-NEXT:    je .LBB14_6
5333; AVX2-NEXT:  .LBB14_5: # %cond.store3
5334; AVX2-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
5335; AVX2-NEXT:    testb $8, %al
5336; AVX2-NEXT:    je .LBB14_8
5337; AVX2-NEXT:  .LBB14_7: # %cond.store5
5338; AVX2-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
5339; AVX2-NEXT:    retq
5340;
5341; AVX512F-LABEL: truncstore_v4i32_v4i8:
5342; AVX512F:       # %bb.0:
5343; AVX512F-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
5344; AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5345; AVX512F-NEXT:    vptestmd %zmm1, %zmm1, %k0
5346; AVX512F-NEXT:    vpmovsdb %zmm0, %xmm0
5347; AVX512F-NEXT:    kmovw %k0, %eax
5348; AVX512F-NEXT:    testb $1, %al
5349; AVX512F-NEXT:    jne .LBB14_1
5350; AVX512F-NEXT:  # %bb.2: # %else
5351; AVX512F-NEXT:    testb $2, %al
5352; AVX512F-NEXT:    jne .LBB14_3
5353; AVX512F-NEXT:  .LBB14_4: # %else2
5354; AVX512F-NEXT:    testb $4, %al
5355; AVX512F-NEXT:    jne .LBB14_5
5356; AVX512F-NEXT:  .LBB14_6: # %else4
5357; AVX512F-NEXT:    testb $8, %al
5358; AVX512F-NEXT:    jne .LBB14_7
5359; AVX512F-NEXT:  .LBB14_8: # %else6
5360; AVX512F-NEXT:    vzeroupper
5361; AVX512F-NEXT:    retq
5362; AVX512F-NEXT:  .LBB14_1: # %cond.store
5363; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
5364; AVX512F-NEXT:    testb $2, %al
5365; AVX512F-NEXT:    je .LBB14_4
5366; AVX512F-NEXT:  .LBB14_3: # %cond.store1
5367; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
5368; AVX512F-NEXT:    testb $4, %al
5369; AVX512F-NEXT:    je .LBB14_6
5370; AVX512F-NEXT:  .LBB14_5: # %cond.store3
5371; AVX512F-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
5372; AVX512F-NEXT:    testb $8, %al
5373; AVX512F-NEXT:    je .LBB14_8
5374; AVX512F-NEXT:  .LBB14_7: # %cond.store5
5375; AVX512F-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
5376; AVX512F-NEXT:    vzeroupper
5377; AVX512F-NEXT:    retq
5378;
5379; AVX512BW-LABEL: truncstore_v4i32_v4i8:
5380; AVX512BW:       # %bb.0:
5381; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
5382; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
5383; AVX512BW-NEXT:    vptestmd %zmm1, %zmm1, %k0
5384; AVX512BW-NEXT:    kshiftlq $60, %k0, %k0
5385; AVX512BW-NEXT:    kshiftrq $60, %k0, %k1
5386; AVX512BW-NEXT:    vpmovsdb %zmm0, %xmm0
5387; AVX512BW-NEXT:    vmovdqu8 %zmm0, (%rdi) {%k1}
5388; AVX512BW-NEXT:    vzeroupper
5389; AVX512BW-NEXT:    retq
5390;
5391; AVX512BWVL-LABEL: truncstore_v4i32_v4i8:
5392; AVX512BWVL:       # %bb.0:
5393; AVX512BWVL-NEXT:    vptestmd %xmm1, %xmm1, %k1
5394; AVX512BWVL-NEXT:    vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
5395; AVX512BWVL-NEXT:    vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
5396; AVX512BWVL-NEXT:    vpmovdb %xmm0, (%rdi) {%k1}
5397; AVX512BWVL-NEXT:    retq
5398  %a = icmp ne <4 x i32> %mask, zeroinitializer
5399  %b = icmp slt <4 x i32> %x, <i32 127, i32 127, i32 127, i32 127>
5400  %c = select <4 x i1> %b, <4 x i32> %x, <4 x i32> <i32 127, i32 127, i32 127, i32 127>
5401  %d = icmp sgt <4 x i32> %c, <i32 -128, i32 -128, i32 -128, i32 -128>
5402  %e = select <4 x i1> %d, <4 x i32> %c, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128>
5403  %f = trunc <4 x i32> %e to <4 x i8>
5404  call void @llvm.masked.store.v4i8.p0v4i8(<4 x i8> %f, <4 x i8>* %p, i32 1, <4 x i1> %a)
5405  ret void
5406}
5407
5408define void @truncstore_v32i16_v32i8(<32 x i16> %x, <32 x i8>* %p, <32 x i8> %mask) {
5409; SSE2-LABEL: truncstore_v32i16_v32i8:
5410; SSE2:       # %bb.0:
5411; SSE2-NEXT:    pxor %xmm6, %xmm6
5412; SSE2-NEXT:    packsswb %xmm1, %xmm0
5413; SSE2-NEXT:    pcmpeqb %xmm6, %xmm4
5414; SSE2-NEXT:    pmovmskb %xmm4, %ecx
5415; SSE2-NEXT:    xorl $65535, %ecx # imm = 0xFFFF
5416; SSE2-NEXT:    pcmpeqb %xmm6, %xmm5
5417; SSE2-NEXT:    pmovmskb %xmm5, %eax
5418; SSE2-NEXT:    notl %eax
5419; SSE2-NEXT:    shll $16, %eax
5420; SSE2-NEXT:    orl %ecx, %eax
5421; SSE2-NEXT:    testb $1, %al
5422; SSE2-NEXT:    movd %xmm0, %ecx
5423; SSE2-NEXT:    jne .LBB15_1
5424; SSE2-NEXT:  # %bb.2: # %else
5425; SSE2-NEXT:    testb $2, %al
5426; SSE2-NEXT:    jne .LBB15_3
5427; SSE2-NEXT:  .LBB15_4: # %else2
5428; SSE2-NEXT:    testb $4, %al
5429; SSE2-NEXT:    jne .LBB15_5
5430; SSE2-NEXT:  .LBB15_6: # %else4
5431; SSE2-NEXT:    testb $8, %al
5432; SSE2-NEXT:    je .LBB15_8
5433; SSE2-NEXT:  .LBB15_7: # %cond.store5
5434; SSE2-NEXT:    shrl $24, %ecx
5435; SSE2-NEXT:    movb %cl, 3(%rdi)
5436; SSE2-NEXT:  .LBB15_8: # %else6
5437; SSE2-NEXT:    testb $16, %al
5438; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
5439; SSE2-NEXT:    je .LBB15_10
5440; SSE2-NEXT:  # %bb.9: # %cond.store7
5441; SSE2-NEXT:    movb %cl, 4(%rdi)
5442; SSE2-NEXT:  .LBB15_10: # %else8
5443; SSE2-NEXT:    testb $32, %al
5444; SSE2-NEXT:    je .LBB15_12
5445; SSE2-NEXT:  # %bb.11: # %cond.store9
5446; SSE2-NEXT:    movb %ch, 5(%rdi)
5447; SSE2-NEXT:  .LBB15_12: # %else10
5448; SSE2-NEXT:    testb $64, %al
5449; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
5450; SSE2-NEXT:    je .LBB15_14
5451; SSE2-NEXT:  # %bb.13: # %cond.store11
5452; SSE2-NEXT:    movb %cl, 6(%rdi)
5453; SSE2-NEXT:  .LBB15_14: # %else12
5454; SSE2-NEXT:    testb $-128, %al
5455; SSE2-NEXT:    je .LBB15_16
5456; SSE2-NEXT:  # %bb.15: # %cond.store13
5457; SSE2-NEXT:    movb %ch, 7(%rdi)
5458; SSE2-NEXT:  .LBB15_16: # %else14
5459; SSE2-NEXT:    testl $256, %eax # imm = 0x100
5460; SSE2-NEXT:    pextrw $4, %xmm0, %ecx
5461; SSE2-NEXT:    je .LBB15_18
5462; SSE2-NEXT:  # %bb.17: # %cond.store15
5463; SSE2-NEXT:    movb %cl, 8(%rdi)
5464; SSE2-NEXT:  .LBB15_18: # %else16
5465; SSE2-NEXT:    testl $512, %eax # imm = 0x200
5466; SSE2-NEXT:    je .LBB15_20
5467; SSE2-NEXT:  # %bb.19: # %cond.store17
5468; SSE2-NEXT:    movb %ch, 9(%rdi)
5469; SSE2-NEXT:  .LBB15_20: # %else18
5470; SSE2-NEXT:    testl $1024, %eax # imm = 0x400
5471; SSE2-NEXT:    pextrw $5, %xmm0, %ecx
5472; SSE2-NEXT:    je .LBB15_22
5473; SSE2-NEXT:  # %bb.21: # %cond.store19
5474; SSE2-NEXT:    movb %cl, 10(%rdi)
5475; SSE2-NEXT:  .LBB15_22: # %else20
5476; SSE2-NEXT:    testl $2048, %eax # imm = 0x800
5477; SSE2-NEXT:    je .LBB15_24
5478; SSE2-NEXT:  # %bb.23: # %cond.store21
5479; SSE2-NEXT:    movb %ch, 11(%rdi)
5480; SSE2-NEXT:  .LBB15_24: # %else22
5481; SSE2-NEXT:    testl $4096, %eax # imm = 0x1000
5482; SSE2-NEXT:    pextrw $6, %xmm0, %ecx
5483; SSE2-NEXT:    je .LBB15_26
5484; SSE2-NEXT:  # %bb.25: # %cond.store23
5485; SSE2-NEXT:    movb %cl, 12(%rdi)
5486; SSE2-NEXT:  .LBB15_26: # %else24
5487; SSE2-NEXT:    testl $8192, %eax # imm = 0x2000
5488; SSE2-NEXT:    je .LBB15_28
5489; SSE2-NEXT:  # %bb.27: # %cond.store25
5490; SSE2-NEXT:    movb %ch, 13(%rdi)
5491; SSE2-NEXT:  .LBB15_28: # %else26
5492; SSE2-NEXT:    testl $16384, %eax # imm = 0x4000
5493; SSE2-NEXT:    pextrw $7, %xmm0, %ecx
5494; SSE2-NEXT:    je .LBB15_30
5495; SSE2-NEXT:  # %bb.29: # %cond.store27
5496; SSE2-NEXT:    movb %cl, 14(%rdi)
5497; SSE2-NEXT:  .LBB15_30: # %else28
5498; SSE2-NEXT:    packsswb %xmm3, %xmm2
5499; SSE2-NEXT:    testl $32768, %eax # imm = 0x8000
5500; SSE2-NEXT:    je .LBB15_32
5501; SSE2-NEXT:  # %bb.31: # %cond.store29
5502; SSE2-NEXT:    movb %ch, 15(%rdi)
5503; SSE2-NEXT:  .LBB15_32: # %else30
5504; SSE2-NEXT:    testl $65536, %eax # imm = 0x10000
5505; SSE2-NEXT:    movd %xmm2, %ecx
5506; SSE2-NEXT:    jne .LBB15_33
5507; SSE2-NEXT:  # %bb.34: # %else32
5508; SSE2-NEXT:    testl $131072, %eax # imm = 0x20000
5509; SSE2-NEXT:    jne .LBB15_35
5510; SSE2-NEXT:  .LBB15_36: # %else34
5511; SSE2-NEXT:    testl $262144, %eax # imm = 0x40000
5512; SSE2-NEXT:    jne .LBB15_37
5513; SSE2-NEXT:  .LBB15_38: # %else36
5514; SSE2-NEXT:    testl $524288, %eax # imm = 0x80000
5515; SSE2-NEXT:    je .LBB15_40
5516; SSE2-NEXT:  .LBB15_39: # %cond.store37
5517; SSE2-NEXT:    shrl $24, %ecx
5518; SSE2-NEXT:    movb %cl, 19(%rdi)
5519; SSE2-NEXT:  .LBB15_40: # %else38
5520; SSE2-NEXT:    testl $1048576, %eax # imm = 0x100000
5521; SSE2-NEXT:    pextrw $2, %xmm2, %ecx
5522; SSE2-NEXT:    je .LBB15_42
5523; SSE2-NEXT:  # %bb.41: # %cond.store39
5524; SSE2-NEXT:    movb %cl, 20(%rdi)
5525; SSE2-NEXT:  .LBB15_42: # %else40
5526; SSE2-NEXT:    testl $2097152, %eax # imm = 0x200000
5527; SSE2-NEXT:    je .LBB15_44
5528; SSE2-NEXT:  # %bb.43: # %cond.store41
5529; SSE2-NEXT:    movb %ch, 21(%rdi)
5530; SSE2-NEXT:  .LBB15_44: # %else42
5531; SSE2-NEXT:    testl $4194304, %eax # imm = 0x400000
5532; SSE2-NEXT:    pextrw $3, %xmm2, %ecx
5533; SSE2-NEXT:    je .LBB15_46
5534; SSE2-NEXT:  # %bb.45: # %cond.store43
5535; SSE2-NEXT:    movb %cl, 22(%rdi)
5536; SSE2-NEXT:  .LBB15_46: # %else44
5537; SSE2-NEXT:    testl $8388608, %eax # imm = 0x800000
5538; SSE2-NEXT:    je .LBB15_48
5539; SSE2-NEXT:  # %bb.47: # %cond.store45
5540; SSE2-NEXT:    movb %ch, 23(%rdi)
5541; SSE2-NEXT:  .LBB15_48: # %else46
5542; SSE2-NEXT:    testl $16777216, %eax # imm = 0x1000000
5543; SSE2-NEXT:    pextrw $4, %xmm2, %ecx
5544; SSE2-NEXT:    je .LBB15_50
5545; SSE2-NEXT:  # %bb.49: # %cond.store47
5546; SSE2-NEXT:    movb %cl, 24(%rdi)
5547; SSE2-NEXT:  .LBB15_50: # %else48
5548; SSE2-NEXT:    testl $33554432, %eax # imm = 0x2000000
5549; SSE2-NEXT:    je .LBB15_52
5550; SSE2-NEXT:  # %bb.51: # %cond.store49
5551; SSE2-NEXT:    movb %ch, 25(%rdi)
5552; SSE2-NEXT:  .LBB15_52: # %else50
5553; SSE2-NEXT:    testl $67108864, %eax # imm = 0x4000000
5554; SSE2-NEXT:    pextrw $5, %xmm2, %ecx
5555; SSE2-NEXT:    je .LBB15_54
5556; SSE2-NEXT:  # %bb.53: # %cond.store51
5557; SSE2-NEXT:    movb %cl, 26(%rdi)
5558; SSE2-NEXT:  .LBB15_54: # %else52
5559; SSE2-NEXT:    testl $134217728, %eax # imm = 0x8000000
5560; SSE2-NEXT:    je .LBB15_56
5561; SSE2-NEXT:  # %bb.55: # %cond.store53
5562; SSE2-NEXT:    movb %ch, 27(%rdi)
5563; SSE2-NEXT:  .LBB15_56: # %else54
5564; SSE2-NEXT:    testl $268435456, %eax # imm = 0x10000000
5565; SSE2-NEXT:    pextrw $6, %xmm2, %ecx
5566; SSE2-NEXT:    je .LBB15_58
5567; SSE2-NEXT:  # %bb.57: # %cond.store55
5568; SSE2-NEXT:    movb %cl, 28(%rdi)
5569; SSE2-NEXT:  .LBB15_58: # %else56
5570; SSE2-NEXT:    testl $536870912, %eax # imm = 0x20000000
5571; SSE2-NEXT:    je .LBB15_60
5572; SSE2-NEXT:  # %bb.59: # %cond.store57
5573; SSE2-NEXT:    movb %ch, 29(%rdi)
5574; SSE2-NEXT:  .LBB15_60: # %else58
5575; SSE2-NEXT:    testl $1073741824, %eax # imm = 0x40000000
5576; SSE2-NEXT:    pextrw $7, %xmm2, %ecx
5577; SSE2-NEXT:    jne .LBB15_61
5578; SSE2-NEXT:  # %bb.62: # %else60
5579; SSE2-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
5580; SSE2-NEXT:    jne .LBB15_63
5581; SSE2-NEXT:  .LBB15_64: # %else62
5582; SSE2-NEXT:    retq
5583; SSE2-NEXT:  .LBB15_1: # %cond.store
5584; SSE2-NEXT:    movb %cl, (%rdi)
5585; SSE2-NEXT:    testb $2, %al
5586; SSE2-NEXT:    je .LBB15_4
5587; SSE2-NEXT:  .LBB15_3: # %cond.store1
5588; SSE2-NEXT:    movb %ch, 1(%rdi)
5589; SSE2-NEXT:    testb $4, %al
5590; SSE2-NEXT:    je .LBB15_6
5591; SSE2-NEXT:  .LBB15_5: # %cond.store3
5592; SSE2-NEXT:    movl %ecx, %edx
5593; SSE2-NEXT:    shrl $16, %edx
5594; SSE2-NEXT:    movb %dl, 2(%rdi)
5595; SSE2-NEXT:    testb $8, %al
5596; SSE2-NEXT:    jne .LBB15_7
5597; SSE2-NEXT:    jmp .LBB15_8
5598; SSE2-NEXT:  .LBB15_33: # %cond.store31
5599; SSE2-NEXT:    movb %cl, 16(%rdi)
5600; SSE2-NEXT:    testl $131072, %eax # imm = 0x20000
5601; SSE2-NEXT:    je .LBB15_36
5602; SSE2-NEXT:  .LBB15_35: # %cond.store33
5603; SSE2-NEXT:    movb %ch, 17(%rdi)
5604; SSE2-NEXT:    testl $262144, %eax # imm = 0x40000
5605; SSE2-NEXT:    je .LBB15_38
5606; SSE2-NEXT:  .LBB15_37: # %cond.store35
5607; SSE2-NEXT:    movl %ecx, %edx
5608; SSE2-NEXT:    shrl $16, %edx
5609; SSE2-NEXT:    movb %dl, 18(%rdi)
5610; SSE2-NEXT:    testl $524288, %eax # imm = 0x80000
5611; SSE2-NEXT:    jne .LBB15_39
5612; SSE2-NEXT:    jmp .LBB15_40
5613; SSE2-NEXT:  .LBB15_61: # %cond.store59
5614; SSE2-NEXT:    movb %cl, 30(%rdi)
5615; SSE2-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
5616; SSE2-NEXT:    je .LBB15_64
5617; SSE2-NEXT:  .LBB15_63: # %cond.store61
5618; SSE2-NEXT:    movb %ch, 31(%rdi)
5619; SSE2-NEXT:    retq
5620;
5621; SSE4-LABEL: truncstore_v32i16_v32i8:
5622; SSE4:       # %bb.0:
5623; SSE4-NEXT:    pxor %xmm6, %xmm6
5624; SSE4-NEXT:    packsswb %xmm1, %xmm0
5625; SSE4-NEXT:    pcmpeqb %xmm6, %xmm4
5626; SSE4-NEXT:    pmovmskb %xmm4, %ecx
5627; SSE4-NEXT:    xorl $65535, %ecx # imm = 0xFFFF
5628; SSE4-NEXT:    pcmpeqb %xmm6, %xmm5
5629; SSE4-NEXT:    pmovmskb %xmm5, %eax
5630; SSE4-NEXT:    notl %eax
5631; SSE4-NEXT:    shll $16, %eax
5632; SSE4-NEXT:    orl %ecx, %eax
5633; SSE4-NEXT:    testb $1, %al
5634; SSE4-NEXT:    jne .LBB15_1
5635; SSE4-NEXT:  # %bb.2: # %else
5636; SSE4-NEXT:    testb $2, %al
5637; SSE4-NEXT:    jne .LBB15_3
5638; SSE4-NEXT:  .LBB15_4: # %else2
5639; SSE4-NEXT:    testb $4, %al
5640; SSE4-NEXT:    jne .LBB15_5
5641; SSE4-NEXT:  .LBB15_6: # %else4
5642; SSE4-NEXT:    testb $8, %al
5643; SSE4-NEXT:    jne .LBB15_7
5644; SSE4-NEXT:  .LBB15_8: # %else6
5645; SSE4-NEXT:    testb $16, %al
5646; SSE4-NEXT:    jne .LBB15_9
5647; SSE4-NEXT:  .LBB15_10: # %else8
5648; SSE4-NEXT:    testb $32, %al
5649; SSE4-NEXT:    jne .LBB15_11
5650; SSE4-NEXT:  .LBB15_12: # %else10
5651; SSE4-NEXT:    testb $64, %al
5652; SSE4-NEXT:    jne .LBB15_13
5653; SSE4-NEXT:  .LBB15_14: # %else12
5654; SSE4-NEXT:    testb $-128, %al
5655; SSE4-NEXT:    jne .LBB15_15
5656; SSE4-NEXT:  .LBB15_16: # %else14
5657; SSE4-NEXT:    testl $256, %eax # imm = 0x100
5658; SSE4-NEXT:    jne .LBB15_17
5659; SSE4-NEXT:  .LBB15_18: # %else16
5660; SSE4-NEXT:    testl $512, %eax # imm = 0x200
5661; SSE4-NEXT:    jne .LBB15_19
5662; SSE4-NEXT:  .LBB15_20: # %else18
5663; SSE4-NEXT:    testl $1024, %eax # imm = 0x400
5664; SSE4-NEXT:    jne .LBB15_21
5665; SSE4-NEXT:  .LBB15_22: # %else20
5666; SSE4-NEXT:    testl $2048, %eax # imm = 0x800
5667; SSE4-NEXT:    jne .LBB15_23
5668; SSE4-NEXT:  .LBB15_24: # %else22
5669; SSE4-NEXT:    testl $4096, %eax # imm = 0x1000
5670; SSE4-NEXT:    jne .LBB15_25
5671; SSE4-NEXT:  .LBB15_26: # %else24
5672; SSE4-NEXT:    testl $8192, %eax # imm = 0x2000
5673; SSE4-NEXT:    jne .LBB15_27
5674; SSE4-NEXT:  .LBB15_28: # %else26
5675; SSE4-NEXT:    testl $16384, %eax # imm = 0x4000
5676; SSE4-NEXT:    jne .LBB15_29
5677; SSE4-NEXT:  .LBB15_30: # %else28
5678; SSE4-NEXT:    testl $32768, %eax # imm = 0x8000
5679; SSE4-NEXT:    je .LBB15_32
5680; SSE4-NEXT:  .LBB15_31: # %cond.store29
5681; SSE4-NEXT:    pextrb $15, %xmm0, 15(%rdi)
5682; SSE4-NEXT:  .LBB15_32: # %else30
5683; SSE4-NEXT:    packsswb %xmm3, %xmm2
5684; SSE4-NEXT:    testl $65536, %eax # imm = 0x10000
5685; SSE4-NEXT:    jne .LBB15_33
5686; SSE4-NEXT:  # %bb.34: # %else32
5687; SSE4-NEXT:    testl $131072, %eax # imm = 0x20000
5688; SSE4-NEXT:    jne .LBB15_35
5689; SSE4-NEXT:  .LBB15_36: # %else34
5690; SSE4-NEXT:    testl $262144, %eax # imm = 0x40000
5691; SSE4-NEXT:    jne .LBB15_37
5692; SSE4-NEXT:  .LBB15_38: # %else36
5693; SSE4-NEXT:    testl $524288, %eax # imm = 0x80000
5694; SSE4-NEXT:    jne .LBB15_39
5695; SSE4-NEXT:  .LBB15_40: # %else38
5696; SSE4-NEXT:    testl $1048576, %eax # imm = 0x100000
5697; SSE4-NEXT:    jne .LBB15_41
5698; SSE4-NEXT:  .LBB15_42: # %else40
5699; SSE4-NEXT:    testl $2097152, %eax # imm = 0x200000
5700; SSE4-NEXT:    jne .LBB15_43
5701; SSE4-NEXT:  .LBB15_44: # %else42
5702; SSE4-NEXT:    testl $4194304, %eax # imm = 0x400000
5703; SSE4-NEXT:    jne .LBB15_45
5704; SSE4-NEXT:  .LBB15_46: # %else44
5705; SSE4-NEXT:    testl $8388608, %eax # imm = 0x800000
5706; SSE4-NEXT:    jne .LBB15_47
5707; SSE4-NEXT:  .LBB15_48: # %else46
5708; SSE4-NEXT:    testl $16777216, %eax # imm = 0x1000000
5709; SSE4-NEXT:    jne .LBB15_49
5710; SSE4-NEXT:  .LBB15_50: # %else48
5711; SSE4-NEXT:    testl $33554432, %eax # imm = 0x2000000
5712; SSE4-NEXT:    jne .LBB15_51
5713; SSE4-NEXT:  .LBB15_52: # %else50
5714; SSE4-NEXT:    testl $67108864, %eax # imm = 0x4000000
5715; SSE4-NEXT:    jne .LBB15_53
5716; SSE4-NEXT:  .LBB15_54: # %else52
5717; SSE4-NEXT:    testl $134217728, %eax # imm = 0x8000000
5718; SSE4-NEXT:    jne .LBB15_55
5719; SSE4-NEXT:  .LBB15_56: # %else54
5720; SSE4-NEXT:    testl $268435456, %eax # imm = 0x10000000
5721; SSE4-NEXT:    jne .LBB15_57
5722; SSE4-NEXT:  .LBB15_58: # %else56
5723; SSE4-NEXT:    testl $536870912, %eax # imm = 0x20000000
5724; SSE4-NEXT:    jne .LBB15_59
5725; SSE4-NEXT:  .LBB15_60: # %else58
5726; SSE4-NEXT:    testl $1073741824, %eax # imm = 0x40000000
5727; SSE4-NEXT:    jne .LBB15_61
5728; SSE4-NEXT:  .LBB15_62: # %else60
5729; SSE4-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
5730; SSE4-NEXT:    jne .LBB15_63
5731; SSE4-NEXT:  .LBB15_64: # %else62
5732; SSE4-NEXT:    retq
5733; SSE4-NEXT:  .LBB15_1: # %cond.store
5734; SSE4-NEXT:    pextrb $0, %xmm0, (%rdi)
5735; SSE4-NEXT:    testb $2, %al
5736; SSE4-NEXT:    je .LBB15_4
5737; SSE4-NEXT:  .LBB15_3: # %cond.store1
5738; SSE4-NEXT:    pextrb $1, %xmm0, 1(%rdi)
5739; SSE4-NEXT:    testb $4, %al
5740; SSE4-NEXT:    je .LBB15_6
5741; SSE4-NEXT:  .LBB15_5: # %cond.store3
5742; SSE4-NEXT:    pextrb $2, %xmm0, 2(%rdi)
5743; SSE4-NEXT:    testb $8, %al
5744; SSE4-NEXT:    je .LBB15_8
5745; SSE4-NEXT:  .LBB15_7: # %cond.store5
5746; SSE4-NEXT:    pextrb $3, %xmm0, 3(%rdi)
5747; SSE4-NEXT:    testb $16, %al
5748; SSE4-NEXT:    je .LBB15_10
5749; SSE4-NEXT:  .LBB15_9: # %cond.store7
5750; SSE4-NEXT:    pextrb $4, %xmm0, 4(%rdi)
5751; SSE4-NEXT:    testb $32, %al
5752; SSE4-NEXT:    je .LBB15_12
5753; SSE4-NEXT:  .LBB15_11: # %cond.store9
5754; SSE4-NEXT:    pextrb $5, %xmm0, 5(%rdi)
5755; SSE4-NEXT:    testb $64, %al
5756; SSE4-NEXT:    je .LBB15_14
5757; SSE4-NEXT:  .LBB15_13: # %cond.store11
5758; SSE4-NEXT:    pextrb $6, %xmm0, 6(%rdi)
5759; SSE4-NEXT:    testb $-128, %al
5760; SSE4-NEXT:    je .LBB15_16
5761; SSE4-NEXT:  .LBB15_15: # %cond.store13
5762; SSE4-NEXT:    pextrb $7, %xmm0, 7(%rdi)
5763; SSE4-NEXT:    testl $256, %eax # imm = 0x100
5764; SSE4-NEXT:    je .LBB15_18
5765; SSE4-NEXT:  .LBB15_17: # %cond.store15
5766; SSE4-NEXT:    pextrb $8, %xmm0, 8(%rdi)
5767; SSE4-NEXT:    testl $512, %eax # imm = 0x200
5768; SSE4-NEXT:    je .LBB15_20
5769; SSE4-NEXT:  .LBB15_19: # %cond.store17
5770; SSE4-NEXT:    pextrb $9, %xmm0, 9(%rdi)
5771; SSE4-NEXT:    testl $1024, %eax # imm = 0x400
5772; SSE4-NEXT:    je .LBB15_22
5773; SSE4-NEXT:  .LBB15_21: # %cond.store19
5774; SSE4-NEXT:    pextrb $10, %xmm0, 10(%rdi)
5775; SSE4-NEXT:    testl $2048, %eax # imm = 0x800
5776; SSE4-NEXT:    je .LBB15_24
5777; SSE4-NEXT:  .LBB15_23: # %cond.store21
5778; SSE4-NEXT:    pextrb $11, %xmm0, 11(%rdi)
5779; SSE4-NEXT:    testl $4096, %eax # imm = 0x1000
5780; SSE4-NEXT:    je .LBB15_26
5781; SSE4-NEXT:  .LBB15_25: # %cond.store23
5782; SSE4-NEXT:    pextrb $12, %xmm0, 12(%rdi)
5783; SSE4-NEXT:    testl $8192, %eax # imm = 0x2000
5784; SSE4-NEXT:    je .LBB15_28
5785; SSE4-NEXT:  .LBB15_27: # %cond.store25
5786; SSE4-NEXT:    pextrb $13, %xmm0, 13(%rdi)
5787; SSE4-NEXT:    testl $16384, %eax # imm = 0x4000
5788; SSE4-NEXT:    je .LBB15_30
5789; SSE4-NEXT:  .LBB15_29: # %cond.store27
5790; SSE4-NEXT:    pextrb $14, %xmm0, 14(%rdi)
5791; SSE4-NEXT:    testl $32768, %eax # imm = 0x8000
5792; SSE4-NEXT:    jne .LBB15_31
5793; SSE4-NEXT:    jmp .LBB15_32
5794; SSE4-NEXT:  .LBB15_33: # %cond.store31
5795; SSE4-NEXT:    pextrb $0, %xmm2, 16(%rdi)
5796; SSE4-NEXT:    testl $131072, %eax # imm = 0x20000
5797; SSE4-NEXT:    je .LBB15_36
5798; SSE4-NEXT:  .LBB15_35: # %cond.store33
5799; SSE4-NEXT:    pextrb $1, %xmm2, 17(%rdi)
5800; SSE4-NEXT:    testl $262144, %eax # imm = 0x40000
5801; SSE4-NEXT:    je .LBB15_38
5802; SSE4-NEXT:  .LBB15_37: # %cond.store35
5803; SSE4-NEXT:    pextrb $2, %xmm2, 18(%rdi)
5804; SSE4-NEXT:    testl $524288, %eax # imm = 0x80000
5805; SSE4-NEXT:    je .LBB15_40
5806; SSE4-NEXT:  .LBB15_39: # %cond.store37
5807; SSE4-NEXT:    pextrb $3, %xmm2, 19(%rdi)
5808; SSE4-NEXT:    testl $1048576, %eax # imm = 0x100000
5809; SSE4-NEXT:    je .LBB15_42
5810; SSE4-NEXT:  .LBB15_41: # %cond.store39
5811; SSE4-NEXT:    pextrb $4, %xmm2, 20(%rdi)
5812; SSE4-NEXT:    testl $2097152, %eax # imm = 0x200000
5813; SSE4-NEXT:    je .LBB15_44
5814; SSE4-NEXT:  .LBB15_43: # %cond.store41
5815; SSE4-NEXT:    pextrb $5, %xmm2, 21(%rdi)
5816; SSE4-NEXT:    testl $4194304, %eax # imm = 0x400000
5817; SSE4-NEXT:    je .LBB15_46
5818; SSE4-NEXT:  .LBB15_45: # %cond.store43
5819; SSE4-NEXT:    pextrb $6, %xmm2, 22(%rdi)
5820; SSE4-NEXT:    testl $8388608, %eax # imm = 0x800000
5821; SSE4-NEXT:    je .LBB15_48
5822; SSE4-NEXT:  .LBB15_47: # %cond.store45
5823; SSE4-NEXT:    pextrb $7, %xmm2, 23(%rdi)
5824; SSE4-NEXT:    testl $16777216, %eax # imm = 0x1000000
5825; SSE4-NEXT:    je .LBB15_50
5826; SSE4-NEXT:  .LBB15_49: # %cond.store47
5827; SSE4-NEXT:    pextrb $8, %xmm2, 24(%rdi)
5828; SSE4-NEXT:    testl $33554432, %eax # imm = 0x2000000
5829; SSE4-NEXT:    je .LBB15_52
5830; SSE4-NEXT:  .LBB15_51: # %cond.store49
5831; SSE4-NEXT:    pextrb $9, %xmm2, 25(%rdi)
5832; SSE4-NEXT:    testl $67108864, %eax # imm = 0x4000000
5833; SSE4-NEXT:    je .LBB15_54
5834; SSE4-NEXT:  .LBB15_53: # %cond.store51
5835; SSE4-NEXT:    pextrb $10, %xmm2, 26(%rdi)
5836; SSE4-NEXT:    testl $134217728, %eax # imm = 0x8000000
5837; SSE4-NEXT:    je .LBB15_56
5838; SSE4-NEXT:  .LBB15_55: # %cond.store53
5839; SSE4-NEXT:    pextrb $11, %xmm2, 27(%rdi)
5840; SSE4-NEXT:    testl $268435456, %eax # imm = 0x10000000
5841; SSE4-NEXT:    je .LBB15_58
5842; SSE4-NEXT:  .LBB15_57: # %cond.store55
5843; SSE4-NEXT:    pextrb $12, %xmm2, 28(%rdi)
5844; SSE4-NEXT:    testl $536870912, %eax # imm = 0x20000000
5845; SSE4-NEXT:    je .LBB15_60
5846; SSE4-NEXT:  .LBB15_59: # %cond.store57
5847; SSE4-NEXT:    pextrb $13, %xmm2, 29(%rdi)
5848; SSE4-NEXT:    testl $1073741824, %eax # imm = 0x40000000
5849; SSE4-NEXT:    je .LBB15_62
5850; SSE4-NEXT:  .LBB15_61: # %cond.store59
5851; SSE4-NEXT:    pextrb $14, %xmm2, 30(%rdi)
5852; SSE4-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
5853; SSE4-NEXT:    je .LBB15_64
5854; SSE4-NEXT:  .LBB15_63: # %cond.store61
5855; SSE4-NEXT:    pextrb $15, %xmm2, 31(%rdi)
5856; SSE4-NEXT:    retq
5857;
5858; AVX1-LABEL: truncstore_v32i16_v32i8:
5859; AVX1:       # %bb.0:
5860; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
5861; AVX1-NEXT:    vpacksswb %xmm3, %xmm1, %xmm1
5862; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
5863; AVX1-NEXT:    vpacksswb %xmm3, %xmm0, %xmm0
5864; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
5865; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
5866; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm2, %xmm3
5867; AVX1-NEXT:    vpmovmskb %xmm3, %ecx
5868; AVX1-NEXT:    xorl $65535, %ecx # imm = 0xFFFF
5869; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
5870; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm2, %xmm1
5871; AVX1-NEXT:    vpmovmskb %xmm1, %eax
5872; AVX1-NEXT:    notl %eax
5873; AVX1-NEXT:    shll $16, %eax
5874; AVX1-NEXT:    orl %ecx, %eax
5875; AVX1-NEXT:    testb $1, %al
5876; AVX1-NEXT:    jne .LBB15_1
5877; AVX1-NEXT:  # %bb.2: # %else
5878; AVX1-NEXT:    testb $2, %al
5879; AVX1-NEXT:    jne .LBB15_3
5880; AVX1-NEXT:  .LBB15_4: # %else2
5881; AVX1-NEXT:    testb $4, %al
5882; AVX1-NEXT:    jne .LBB15_5
5883; AVX1-NEXT:  .LBB15_6: # %else4
5884; AVX1-NEXT:    testb $8, %al
5885; AVX1-NEXT:    jne .LBB15_7
5886; AVX1-NEXT:  .LBB15_8: # %else6
5887; AVX1-NEXT:    testb $16, %al
5888; AVX1-NEXT:    jne .LBB15_9
5889; AVX1-NEXT:  .LBB15_10: # %else8
5890; AVX1-NEXT:    testb $32, %al
5891; AVX1-NEXT:    jne .LBB15_11
5892; AVX1-NEXT:  .LBB15_12: # %else10
5893; AVX1-NEXT:    testb $64, %al
5894; AVX1-NEXT:    jne .LBB15_13
5895; AVX1-NEXT:  .LBB15_14: # %else12
5896; AVX1-NEXT:    testb $-128, %al
5897; AVX1-NEXT:    jne .LBB15_15
5898; AVX1-NEXT:  .LBB15_16: # %else14
5899; AVX1-NEXT:    testl $256, %eax # imm = 0x100
5900; AVX1-NEXT:    jne .LBB15_17
5901; AVX1-NEXT:  .LBB15_18: # %else16
5902; AVX1-NEXT:    testl $512, %eax # imm = 0x200
5903; AVX1-NEXT:    jne .LBB15_19
5904; AVX1-NEXT:  .LBB15_20: # %else18
5905; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
5906; AVX1-NEXT:    jne .LBB15_21
5907; AVX1-NEXT:  .LBB15_22: # %else20
5908; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
5909; AVX1-NEXT:    jne .LBB15_23
5910; AVX1-NEXT:  .LBB15_24: # %else22
5911; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
5912; AVX1-NEXT:    jne .LBB15_25
5913; AVX1-NEXT:  .LBB15_26: # %else24
5914; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
5915; AVX1-NEXT:    jne .LBB15_27
5916; AVX1-NEXT:  .LBB15_28: # %else26
5917; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
5918; AVX1-NEXT:    jne .LBB15_29
5919; AVX1-NEXT:  .LBB15_30: # %else28
5920; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
5921; AVX1-NEXT:    je .LBB15_32
5922; AVX1-NEXT:  .LBB15_31: # %cond.store29
5923; AVX1-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
5924; AVX1-NEXT:  .LBB15_32: # %else30
5925; AVX1-NEXT:    testl $65536, %eax # imm = 0x10000
5926; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
5927; AVX1-NEXT:    jne .LBB15_33
5928; AVX1-NEXT:  # %bb.34: # %else32
5929; AVX1-NEXT:    testl $131072, %eax # imm = 0x20000
5930; AVX1-NEXT:    jne .LBB15_35
5931; AVX1-NEXT:  .LBB15_36: # %else34
5932; AVX1-NEXT:    testl $262144, %eax # imm = 0x40000
5933; AVX1-NEXT:    jne .LBB15_37
5934; AVX1-NEXT:  .LBB15_38: # %else36
5935; AVX1-NEXT:    testl $524288, %eax # imm = 0x80000
5936; AVX1-NEXT:    jne .LBB15_39
5937; AVX1-NEXT:  .LBB15_40: # %else38
5938; AVX1-NEXT:    testl $1048576, %eax # imm = 0x100000
5939; AVX1-NEXT:    jne .LBB15_41
5940; AVX1-NEXT:  .LBB15_42: # %else40
5941; AVX1-NEXT:    testl $2097152, %eax # imm = 0x200000
5942; AVX1-NEXT:    jne .LBB15_43
5943; AVX1-NEXT:  .LBB15_44: # %else42
5944; AVX1-NEXT:    testl $4194304, %eax # imm = 0x400000
5945; AVX1-NEXT:    jne .LBB15_45
5946; AVX1-NEXT:  .LBB15_46: # %else44
5947; AVX1-NEXT:    testl $8388608, %eax # imm = 0x800000
5948; AVX1-NEXT:    jne .LBB15_47
5949; AVX1-NEXT:  .LBB15_48: # %else46
5950; AVX1-NEXT:    testl $16777216, %eax # imm = 0x1000000
5951; AVX1-NEXT:    jne .LBB15_49
5952; AVX1-NEXT:  .LBB15_50: # %else48
5953; AVX1-NEXT:    testl $33554432, %eax # imm = 0x2000000
5954; AVX1-NEXT:    jne .LBB15_51
5955; AVX1-NEXT:  .LBB15_52: # %else50
5956; AVX1-NEXT:    testl $67108864, %eax # imm = 0x4000000
5957; AVX1-NEXT:    jne .LBB15_53
5958; AVX1-NEXT:  .LBB15_54: # %else52
5959; AVX1-NEXT:    testl $134217728, %eax # imm = 0x8000000
5960; AVX1-NEXT:    jne .LBB15_55
5961; AVX1-NEXT:  .LBB15_56: # %else54
5962; AVX1-NEXT:    testl $268435456, %eax # imm = 0x10000000
5963; AVX1-NEXT:    jne .LBB15_57
5964; AVX1-NEXT:  .LBB15_58: # %else56
5965; AVX1-NEXT:    testl $536870912, %eax # imm = 0x20000000
5966; AVX1-NEXT:    jne .LBB15_59
5967; AVX1-NEXT:  .LBB15_60: # %else58
5968; AVX1-NEXT:    testl $1073741824, %eax # imm = 0x40000000
5969; AVX1-NEXT:    jne .LBB15_61
5970; AVX1-NEXT:  .LBB15_62: # %else60
5971; AVX1-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
5972; AVX1-NEXT:    jne .LBB15_63
5973; AVX1-NEXT:  .LBB15_64: # %else62
5974; AVX1-NEXT:    vzeroupper
5975; AVX1-NEXT:    retq
5976; AVX1-NEXT:  .LBB15_1: # %cond.store
5977; AVX1-NEXT:    vpextrb $0, %xmm0, (%rdi)
5978; AVX1-NEXT:    testb $2, %al
5979; AVX1-NEXT:    je .LBB15_4
5980; AVX1-NEXT:  .LBB15_3: # %cond.store1
5981; AVX1-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
5982; AVX1-NEXT:    testb $4, %al
5983; AVX1-NEXT:    je .LBB15_6
5984; AVX1-NEXT:  .LBB15_5: # %cond.store3
5985; AVX1-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
5986; AVX1-NEXT:    testb $8, %al
5987; AVX1-NEXT:    je .LBB15_8
5988; AVX1-NEXT:  .LBB15_7: # %cond.store5
5989; AVX1-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
5990; AVX1-NEXT:    testb $16, %al
5991; AVX1-NEXT:    je .LBB15_10
5992; AVX1-NEXT:  .LBB15_9: # %cond.store7
5993; AVX1-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
5994; AVX1-NEXT:    testb $32, %al
5995; AVX1-NEXT:    je .LBB15_12
5996; AVX1-NEXT:  .LBB15_11: # %cond.store9
5997; AVX1-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
5998; AVX1-NEXT:    testb $64, %al
5999; AVX1-NEXT:    je .LBB15_14
6000; AVX1-NEXT:  .LBB15_13: # %cond.store11
6001; AVX1-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
6002; AVX1-NEXT:    testb $-128, %al
6003; AVX1-NEXT:    je .LBB15_16
6004; AVX1-NEXT:  .LBB15_15: # %cond.store13
6005; AVX1-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
6006; AVX1-NEXT:    testl $256, %eax # imm = 0x100
6007; AVX1-NEXT:    je .LBB15_18
6008; AVX1-NEXT:  .LBB15_17: # %cond.store15
6009; AVX1-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
6010; AVX1-NEXT:    testl $512, %eax # imm = 0x200
6011; AVX1-NEXT:    je .LBB15_20
6012; AVX1-NEXT:  .LBB15_19: # %cond.store17
6013; AVX1-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
6014; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
6015; AVX1-NEXT:    je .LBB15_22
6016; AVX1-NEXT:  .LBB15_21: # %cond.store19
6017; AVX1-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
6018; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
6019; AVX1-NEXT:    je .LBB15_24
6020; AVX1-NEXT:  .LBB15_23: # %cond.store21
6021; AVX1-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
6022; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
6023; AVX1-NEXT:    je .LBB15_26
6024; AVX1-NEXT:  .LBB15_25: # %cond.store23
6025; AVX1-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
6026; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
6027; AVX1-NEXT:    je .LBB15_28
6028; AVX1-NEXT:  .LBB15_27: # %cond.store25
6029; AVX1-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
6030; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
6031; AVX1-NEXT:    je .LBB15_30
6032; AVX1-NEXT:  .LBB15_29: # %cond.store27
6033; AVX1-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
6034; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
6035; AVX1-NEXT:    jne .LBB15_31
6036; AVX1-NEXT:    jmp .LBB15_32
6037; AVX1-NEXT:  .LBB15_33: # %cond.store31
6038; AVX1-NEXT:    vpextrb $0, %xmm0, 16(%rdi)
6039; AVX1-NEXT:    testl $131072, %eax # imm = 0x20000
6040; AVX1-NEXT:    je .LBB15_36
6041; AVX1-NEXT:  .LBB15_35: # %cond.store33
6042; AVX1-NEXT:    vpextrb $1, %xmm0, 17(%rdi)
6043; AVX1-NEXT:    testl $262144, %eax # imm = 0x40000
6044; AVX1-NEXT:    je .LBB15_38
6045; AVX1-NEXT:  .LBB15_37: # %cond.store35
6046; AVX1-NEXT:    vpextrb $2, %xmm0, 18(%rdi)
6047; AVX1-NEXT:    testl $524288, %eax # imm = 0x80000
6048; AVX1-NEXT:    je .LBB15_40
6049; AVX1-NEXT:  .LBB15_39: # %cond.store37
6050; AVX1-NEXT:    vpextrb $3, %xmm0, 19(%rdi)
6051; AVX1-NEXT:    testl $1048576, %eax # imm = 0x100000
6052; AVX1-NEXT:    je .LBB15_42
6053; AVX1-NEXT:  .LBB15_41: # %cond.store39
6054; AVX1-NEXT:    vpextrb $4, %xmm0, 20(%rdi)
6055; AVX1-NEXT:    testl $2097152, %eax # imm = 0x200000
6056; AVX1-NEXT:    je .LBB15_44
6057; AVX1-NEXT:  .LBB15_43: # %cond.store41
6058; AVX1-NEXT:    vpextrb $5, %xmm0, 21(%rdi)
6059; AVX1-NEXT:    testl $4194304, %eax # imm = 0x400000
6060; AVX1-NEXT:    je .LBB15_46
6061; AVX1-NEXT:  .LBB15_45: # %cond.store43
6062; AVX1-NEXT:    vpextrb $6, %xmm0, 22(%rdi)
6063; AVX1-NEXT:    testl $8388608, %eax # imm = 0x800000
6064; AVX1-NEXT:    je .LBB15_48
6065; AVX1-NEXT:  .LBB15_47: # %cond.store45
6066; AVX1-NEXT:    vpextrb $7, %xmm0, 23(%rdi)
6067; AVX1-NEXT:    testl $16777216, %eax # imm = 0x1000000
6068; AVX1-NEXT:    je .LBB15_50
6069; AVX1-NEXT:  .LBB15_49: # %cond.store47
6070; AVX1-NEXT:    vpextrb $8, %xmm0, 24(%rdi)
6071; AVX1-NEXT:    testl $33554432, %eax # imm = 0x2000000
6072; AVX1-NEXT:    je .LBB15_52
6073; AVX1-NEXT:  .LBB15_51: # %cond.store49
6074; AVX1-NEXT:    vpextrb $9, %xmm0, 25(%rdi)
6075; AVX1-NEXT:    testl $67108864, %eax # imm = 0x4000000
6076; AVX1-NEXT:    je .LBB15_54
6077; AVX1-NEXT:  .LBB15_53: # %cond.store51
6078; AVX1-NEXT:    vpextrb $10, %xmm0, 26(%rdi)
6079; AVX1-NEXT:    testl $134217728, %eax # imm = 0x8000000
6080; AVX1-NEXT:    je .LBB15_56
6081; AVX1-NEXT:  .LBB15_55: # %cond.store53
6082; AVX1-NEXT:    vpextrb $11, %xmm0, 27(%rdi)
6083; AVX1-NEXT:    testl $268435456, %eax # imm = 0x10000000
6084; AVX1-NEXT:    je .LBB15_58
6085; AVX1-NEXT:  .LBB15_57: # %cond.store55
6086; AVX1-NEXT:    vpextrb $12, %xmm0, 28(%rdi)
6087; AVX1-NEXT:    testl $536870912, %eax # imm = 0x20000000
6088; AVX1-NEXT:    je .LBB15_60
6089; AVX1-NEXT:  .LBB15_59: # %cond.store57
6090; AVX1-NEXT:    vpextrb $13, %xmm0, 29(%rdi)
6091; AVX1-NEXT:    testl $1073741824, %eax # imm = 0x40000000
6092; AVX1-NEXT:    je .LBB15_62
6093; AVX1-NEXT:  .LBB15_61: # %cond.store59
6094; AVX1-NEXT:    vpextrb $14, %xmm0, 30(%rdi)
6095; AVX1-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
6096; AVX1-NEXT:    je .LBB15_64
6097; AVX1-NEXT:  .LBB15_63: # %cond.store61
6098; AVX1-NEXT:    vpextrb $15, %xmm0, 31(%rdi)
6099; AVX1-NEXT:    vzeroupper
6100; AVX1-NEXT:    retq
6101;
6102; AVX2-LABEL: truncstore_v32i16_v32i8:
6103; AVX2:       # %bb.0:
6104; AVX2-NEXT:    vpxor %xmm3, %xmm3, %xmm3
6105; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
6106; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
6107; AVX2-NEXT:    vpcmpeqb %ymm3, %ymm2, %ymm1
6108; AVX2-NEXT:    vpmovmskb %ymm1, %eax
6109; AVX2-NEXT:    notl %eax
6110; AVX2-NEXT:    testb $1, %al
6111; AVX2-NEXT:    jne .LBB15_1
6112; AVX2-NEXT:  # %bb.2: # %else
6113; AVX2-NEXT:    testb $2, %al
6114; AVX2-NEXT:    jne .LBB15_3
6115; AVX2-NEXT:  .LBB15_4: # %else2
6116; AVX2-NEXT:    testb $4, %al
6117; AVX2-NEXT:    jne .LBB15_5
6118; AVX2-NEXT:  .LBB15_6: # %else4
6119; AVX2-NEXT:    testb $8, %al
6120; AVX2-NEXT:    jne .LBB15_7
6121; AVX2-NEXT:  .LBB15_8: # %else6
6122; AVX2-NEXT:    testb $16, %al
6123; AVX2-NEXT:    jne .LBB15_9
6124; AVX2-NEXT:  .LBB15_10: # %else8
6125; AVX2-NEXT:    testb $32, %al
6126; AVX2-NEXT:    jne .LBB15_11
6127; AVX2-NEXT:  .LBB15_12: # %else10
6128; AVX2-NEXT:    testb $64, %al
6129; AVX2-NEXT:    jne .LBB15_13
6130; AVX2-NEXT:  .LBB15_14: # %else12
6131; AVX2-NEXT:    testb $-128, %al
6132; AVX2-NEXT:    jne .LBB15_15
6133; AVX2-NEXT:  .LBB15_16: # %else14
6134; AVX2-NEXT:    testl $256, %eax # imm = 0x100
6135; AVX2-NEXT:    jne .LBB15_17
6136; AVX2-NEXT:  .LBB15_18: # %else16
6137; AVX2-NEXT:    testl $512, %eax # imm = 0x200
6138; AVX2-NEXT:    jne .LBB15_19
6139; AVX2-NEXT:  .LBB15_20: # %else18
6140; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
6141; AVX2-NEXT:    jne .LBB15_21
6142; AVX2-NEXT:  .LBB15_22: # %else20
6143; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
6144; AVX2-NEXT:    jne .LBB15_23
6145; AVX2-NEXT:  .LBB15_24: # %else22
6146; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
6147; AVX2-NEXT:    jne .LBB15_25
6148; AVX2-NEXT:  .LBB15_26: # %else24
6149; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
6150; AVX2-NEXT:    jne .LBB15_27
6151; AVX2-NEXT:  .LBB15_28: # %else26
6152; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
6153; AVX2-NEXT:    jne .LBB15_29
6154; AVX2-NEXT:  .LBB15_30: # %else28
6155; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
6156; AVX2-NEXT:    je .LBB15_32
6157; AVX2-NEXT:  .LBB15_31: # %cond.store29
6158; AVX2-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
6159; AVX2-NEXT:  .LBB15_32: # %else30
6160; AVX2-NEXT:    testl $65536, %eax # imm = 0x10000
6161; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
6162; AVX2-NEXT:    jne .LBB15_33
6163; AVX2-NEXT:  # %bb.34: # %else32
6164; AVX2-NEXT:    testl $131072, %eax # imm = 0x20000
6165; AVX2-NEXT:    jne .LBB15_35
6166; AVX2-NEXT:  .LBB15_36: # %else34
6167; AVX2-NEXT:    testl $262144, %eax # imm = 0x40000
6168; AVX2-NEXT:    jne .LBB15_37
6169; AVX2-NEXT:  .LBB15_38: # %else36
6170; AVX2-NEXT:    testl $524288, %eax # imm = 0x80000
6171; AVX2-NEXT:    jne .LBB15_39
6172; AVX2-NEXT:  .LBB15_40: # %else38
6173; AVX2-NEXT:    testl $1048576, %eax # imm = 0x100000
6174; AVX2-NEXT:    jne .LBB15_41
6175; AVX2-NEXT:  .LBB15_42: # %else40
6176; AVX2-NEXT:    testl $2097152, %eax # imm = 0x200000
6177; AVX2-NEXT:    jne .LBB15_43
6178; AVX2-NEXT:  .LBB15_44: # %else42
6179; AVX2-NEXT:    testl $4194304, %eax # imm = 0x400000
6180; AVX2-NEXT:    jne .LBB15_45
6181; AVX2-NEXT:  .LBB15_46: # %else44
6182; AVX2-NEXT:    testl $8388608, %eax # imm = 0x800000
6183; AVX2-NEXT:    jne .LBB15_47
6184; AVX2-NEXT:  .LBB15_48: # %else46
6185; AVX2-NEXT:    testl $16777216, %eax # imm = 0x1000000
6186; AVX2-NEXT:    jne .LBB15_49
6187; AVX2-NEXT:  .LBB15_50: # %else48
6188; AVX2-NEXT:    testl $33554432, %eax # imm = 0x2000000
6189; AVX2-NEXT:    jne .LBB15_51
6190; AVX2-NEXT:  .LBB15_52: # %else50
6191; AVX2-NEXT:    testl $67108864, %eax # imm = 0x4000000
6192; AVX2-NEXT:    jne .LBB15_53
6193; AVX2-NEXT:  .LBB15_54: # %else52
6194; AVX2-NEXT:    testl $134217728, %eax # imm = 0x8000000
6195; AVX2-NEXT:    jne .LBB15_55
6196; AVX2-NEXT:  .LBB15_56: # %else54
6197; AVX2-NEXT:    testl $268435456, %eax # imm = 0x10000000
6198; AVX2-NEXT:    jne .LBB15_57
6199; AVX2-NEXT:  .LBB15_58: # %else56
6200; AVX2-NEXT:    testl $536870912, %eax # imm = 0x20000000
6201; AVX2-NEXT:    jne .LBB15_59
6202; AVX2-NEXT:  .LBB15_60: # %else58
6203; AVX2-NEXT:    testl $1073741824, %eax # imm = 0x40000000
6204; AVX2-NEXT:    jne .LBB15_61
6205; AVX2-NEXT:  .LBB15_62: # %else60
6206; AVX2-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
6207; AVX2-NEXT:    jne .LBB15_63
6208; AVX2-NEXT:  .LBB15_64: # %else62
6209; AVX2-NEXT:    vzeroupper
6210; AVX2-NEXT:    retq
6211; AVX2-NEXT:  .LBB15_1: # %cond.store
6212; AVX2-NEXT:    vpextrb $0, %xmm0, (%rdi)
6213; AVX2-NEXT:    testb $2, %al
6214; AVX2-NEXT:    je .LBB15_4
6215; AVX2-NEXT:  .LBB15_3: # %cond.store1
6216; AVX2-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
6217; AVX2-NEXT:    testb $4, %al
6218; AVX2-NEXT:    je .LBB15_6
6219; AVX2-NEXT:  .LBB15_5: # %cond.store3
6220; AVX2-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
6221; AVX2-NEXT:    testb $8, %al
6222; AVX2-NEXT:    je .LBB15_8
6223; AVX2-NEXT:  .LBB15_7: # %cond.store5
6224; AVX2-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
6225; AVX2-NEXT:    testb $16, %al
6226; AVX2-NEXT:    je .LBB15_10
6227; AVX2-NEXT:  .LBB15_9: # %cond.store7
6228; AVX2-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
6229; AVX2-NEXT:    testb $32, %al
6230; AVX2-NEXT:    je .LBB15_12
6231; AVX2-NEXT:  .LBB15_11: # %cond.store9
6232; AVX2-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
6233; AVX2-NEXT:    testb $64, %al
6234; AVX2-NEXT:    je .LBB15_14
6235; AVX2-NEXT:  .LBB15_13: # %cond.store11
6236; AVX2-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
6237; AVX2-NEXT:    testb $-128, %al
6238; AVX2-NEXT:    je .LBB15_16
6239; AVX2-NEXT:  .LBB15_15: # %cond.store13
6240; AVX2-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
6241; AVX2-NEXT:    testl $256, %eax # imm = 0x100
6242; AVX2-NEXT:    je .LBB15_18
6243; AVX2-NEXT:  .LBB15_17: # %cond.store15
6244; AVX2-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
6245; AVX2-NEXT:    testl $512, %eax # imm = 0x200
6246; AVX2-NEXT:    je .LBB15_20
6247; AVX2-NEXT:  .LBB15_19: # %cond.store17
6248; AVX2-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
6249; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
6250; AVX2-NEXT:    je .LBB15_22
6251; AVX2-NEXT:  .LBB15_21: # %cond.store19
6252; AVX2-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
6253; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
6254; AVX2-NEXT:    je .LBB15_24
6255; AVX2-NEXT:  .LBB15_23: # %cond.store21
6256; AVX2-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
6257; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
6258; AVX2-NEXT:    je .LBB15_26
6259; AVX2-NEXT:  .LBB15_25: # %cond.store23
6260; AVX2-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
6261; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
6262; AVX2-NEXT:    je .LBB15_28
6263; AVX2-NEXT:  .LBB15_27: # %cond.store25
6264; AVX2-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
6265; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
6266; AVX2-NEXT:    je .LBB15_30
6267; AVX2-NEXT:  .LBB15_29: # %cond.store27
6268; AVX2-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
6269; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
6270; AVX2-NEXT:    jne .LBB15_31
6271; AVX2-NEXT:    jmp .LBB15_32
6272; AVX2-NEXT:  .LBB15_33: # %cond.store31
6273; AVX2-NEXT:    vpextrb $0, %xmm0, 16(%rdi)
6274; AVX2-NEXT:    testl $131072, %eax # imm = 0x20000
6275; AVX2-NEXT:    je .LBB15_36
6276; AVX2-NEXT:  .LBB15_35: # %cond.store33
6277; AVX2-NEXT:    vpextrb $1, %xmm0, 17(%rdi)
6278; AVX2-NEXT:    testl $262144, %eax # imm = 0x40000
6279; AVX2-NEXT:    je .LBB15_38
6280; AVX2-NEXT:  .LBB15_37: # %cond.store35
6281; AVX2-NEXT:    vpextrb $2, %xmm0, 18(%rdi)
6282; AVX2-NEXT:    testl $524288, %eax # imm = 0x80000
6283; AVX2-NEXT:    je .LBB15_40
6284; AVX2-NEXT:  .LBB15_39: # %cond.store37
6285; AVX2-NEXT:    vpextrb $3, %xmm0, 19(%rdi)
6286; AVX2-NEXT:    testl $1048576, %eax # imm = 0x100000
6287; AVX2-NEXT:    je .LBB15_42
6288; AVX2-NEXT:  .LBB15_41: # %cond.store39
6289; AVX2-NEXT:    vpextrb $4, %xmm0, 20(%rdi)
6290; AVX2-NEXT:    testl $2097152, %eax # imm = 0x200000
6291; AVX2-NEXT:    je .LBB15_44
6292; AVX2-NEXT:  .LBB15_43: # %cond.store41
6293; AVX2-NEXT:    vpextrb $5, %xmm0, 21(%rdi)
6294; AVX2-NEXT:    testl $4194304, %eax # imm = 0x400000
6295; AVX2-NEXT:    je .LBB15_46
6296; AVX2-NEXT:  .LBB15_45: # %cond.store43
6297; AVX2-NEXT:    vpextrb $6, %xmm0, 22(%rdi)
6298; AVX2-NEXT:    testl $8388608, %eax # imm = 0x800000
6299; AVX2-NEXT:    je .LBB15_48
6300; AVX2-NEXT:  .LBB15_47: # %cond.store45
6301; AVX2-NEXT:    vpextrb $7, %xmm0, 23(%rdi)
6302; AVX2-NEXT:    testl $16777216, %eax # imm = 0x1000000
6303; AVX2-NEXT:    je .LBB15_50
6304; AVX2-NEXT:  .LBB15_49: # %cond.store47
6305; AVX2-NEXT:    vpextrb $8, %xmm0, 24(%rdi)
6306; AVX2-NEXT:    testl $33554432, %eax # imm = 0x2000000
6307; AVX2-NEXT:    je .LBB15_52
6308; AVX2-NEXT:  .LBB15_51: # %cond.store49
6309; AVX2-NEXT:    vpextrb $9, %xmm0, 25(%rdi)
6310; AVX2-NEXT:    testl $67108864, %eax # imm = 0x4000000
6311; AVX2-NEXT:    je .LBB15_54
6312; AVX2-NEXT:  .LBB15_53: # %cond.store51
6313; AVX2-NEXT:    vpextrb $10, %xmm0, 26(%rdi)
6314; AVX2-NEXT:    testl $134217728, %eax # imm = 0x8000000
6315; AVX2-NEXT:    je .LBB15_56
6316; AVX2-NEXT:  .LBB15_55: # %cond.store53
6317; AVX2-NEXT:    vpextrb $11, %xmm0, 27(%rdi)
6318; AVX2-NEXT:    testl $268435456, %eax # imm = 0x10000000
6319; AVX2-NEXT:    je .LBB15_58
6320; AVX2-NEXT:  .LBB15_57: # %cond.store55
6321; AVX2-NEXT:    vpextrb $12, %xmm0, 28(%rdi)
6322; AVX2-NEXT:    testl $536870912, %eax # imm = 0x20000000
6323; AVX2-NEXT:    je .LBB15_60
6324; AVX2-NEXT:  .LBB15_59: # %cond.store57
6325; AVX2-NEXT:    vpextrb $13, %xmm0, 29(%rdi)
6326; AVX2-NEXT:    testl $1073741824, %eax # imm = 0x40000000
6327; AVX2-NEXT:    je .LBB15_62
6328; AVX2-NEXT:  .LBB15_61: # %cond.store59
6329; AVX2-NEXT:    vpextrb $14, %xmm0, 30(%rdi)
6330; AVX2-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
6331; AVX2-NEXT:    je .LBB15_64
6332; AVX2-NEXT:  .LBB15_63: # %cond.store61
6333; AVX2-NEXT:    vpextrb $15, %xmm0, 31(%rdi)
6334; AVX2-NEXT:    vzeroupper
6335; AVX2-NEXT:    retq
6336;
6337; AVX512F-LABEL: truncstore_v32i16_v32i8:
6338; AVX512F:       # %bb.0:
6339; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
6340; AVX512F-NEXT:    vpcmpeqb %ymm2, %ymm1, %ymm1
6341; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm2
6342; AVX512F-NEXT:    vpacksswb %ymm2, %ymm0, %ymm0
6343; AVX512F-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
6344; AVX512F-NEXT:    vpmovmskb %ymm1, %eax
6345; AVX512F-NEXT:    notl %eax
6346; AVX512F-NEXT:    testb $1, %al
6347; AVX512F-NEXT:    jne .LBB15_1
6348; AVX512F-NEXT:  # %bb.2: # %else
6349; AVX512F-NEXT:    testb $2, %al
6350; AVX512F-NEXT:    jne .LBB15_3
6351; AVX512F-NEXT:  .LBB15_4: # %else2
6352; AVX512F-NEXT:    testb $4, %al
6353; AVX512F-NEXT:    jne .LBB15_5
6354; AVX512F-NEXT:  .LBB15_6: # %else4
6355; AVX512F-NEXT:    testb $8, %al
6356; AVX512F-NEXT:    jne .LBB15_7
6357; AVX512F-NEXT:  .LBB15_8: # %else6
6358; AVX512F-NEXT:    testb $16, %al
6359; AVX512F-NEXT:    jne .LBB15_9
6360; AVX512F-NEXT:  .LBB15_10: # %else8
6361; AVX512F-NEXT:    testb $32, %al
6362; AVX512F-NEXT:    jne .LBB15_11
6363; AVX512F-NEXT:  .LBB15_12: # %else10
6364; AVX512F-NEXT:    testb $64, %al
6365; AVX512F-NEXT:    jne .LBB15_13
6366; AVX512F-NEXT:  .LBB15_14: # %else12
6367; AVX512F-NEXT:    testb $-128, %al
6368; AVX512F-NEXT:    jne .LBB15_15
6369; AVX512F-NEXT:  .LBB15_16: # %else14
6370; AVX512F-NEXT:    testl $256, %eax # imm = 0x100
6371; AVX512F-NEXT:    jne .LBB15_17
6372; AVX512F-NEXT:  .LBB15_18: # %else16
6373; AVX512F-NEXT:    testl $512, %eax # imm = 0x200
6374; AVX512F-NEXT:    jne .LBB15_19
6375; AVX512F-NEXT:  .LBB15_20: # %else18
6376; AVX512F-NEXT:    testl $1024, %eax # imm = 0x400
6377; AVX512F-NEXT:    jne .LBB15_21
6378; AVX512F-NEXT:  .LBB15_22: # %else20
6379; AVX512F-NEXT:    testl $2048, %eax # imm = 0x800
6380; AVX512F-NEXT:    jne .LBB15_23
6381; AVX512F-NEXT:  .LBB15_24: # %else22
6382; AVX512F-NEXT:    testl $4096, %eax # imm = 0x1000
6383; AVX512F-NEXT:    jne .LBB15_25
6384; AVX512F-NEXT:  .LBB15_26: # %else24
6385; AVX512F-NEXT:    testl $8192, %eax # imm = 0x2000
6386; AVX512F-NEXT:    jne .LBB15_27
6387; AVX512F-NEXT:  .LBB15_28: # %else26
6388; AVX512F-NEXT:    testl $16384, %eax # imm = 0x4000
6389; AVX512F-NEXT:    jne .LBB15_29
6390; AVX512F-NEXT:  .LBB15_30: # %else28
6391; AVX512F-NEXT:    testl $32768, %eax # imm = 0x8000
6392; AVX512F-NEXT:    je .LBB15_32
6393; AVX512F-NEXT:  .LBB15_31: # %cond.store29
6394; AVX512F-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
6395; AVX512F-NEXT:  .LBB15_32: # %else30
6396; AVX512F-NEXT:    testl $65536, %eax # imm = 0x10000
6397; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm0
6398; AVX512F-NEXT:    jne .LBB15_33
6399; AVX512F-NEXT:  # %bb.34: # %else32
6400; AVX512F-NEXT:    testl $131072, %eax # imm = 0x20000
6401; AVX512F-NEXT:    jne .LBB15_35
6402; AVX512F-NEXT:  .LBB15_36: # %else34
6403; AVX512F-NEXT:    testl $262144, %eax # imm = 0x40000
6404; AVX512F-NEXT:    jne .LBB15_37
6405; AVX512F-NEXT:  .LBB15_38: # %else36
6406; AVX512F-NEXT:    testl $524288, %eax # imm = 0x80000
6407; AVX512F-NEXT:    jne .LBB15_39
6408; AVX512F-NEXT:  .LBB15_40: # %else38
6409; AVX512F-NEXT:    testl $1048576, %eax # imm = 0x100000
6410; AVX512F-NEXT:    jne .LBB15_41
6411; AVX512F-NEXT:  .LBB15_42: # %else40
6412; AVX512F-NEXT:    testl $2097152, %eax # imm = 0x200000
6413; AVX512F-NEXT:    jne .LBB15_43
6414; AVX512F-NEXT:  .LBB15_44: # %else42
6415; AVX512F-NEXT:    testl $4194304, %eax # imm = 0x400000
6416; AVX512F-NEXT:    jne .LBB15_45
6417; AVX512F-NEXT:  .LBB15_46: # %else44
6418; AVX512F-NEXT:    testl $8388608, %eax # imm = 0x800000
6419; AVX512F-NEXT:    jne .LBB15_47
6420; AVX512F-NEXT:  .LBB15_48: # %else46
6421; AVX512F-NEXT:    testl $16777216, %eax # imm = 0x1000000
6422; AVX512F-NEXT:    jne .LBB15_49
6423; AVX512F-NEXT:  .LBB15_50: # %else48
6424; AVX512F-NEXT:    testl $33554432, %eax # imm = 0x2000000
6425; AVX512F-NEXT:    jne .LBB15_51
6426; AVX512F-NEXT:  .LBB15_52: # %else50
6427; AVX512F-NEXT:    testl $67108864, %eax # imm = 0x4000000
6428; AVX512F-NEXT:    jne .LBB15_53
6429; AVX512F-NEXT:  .LBB15_54: # %else52
6430; AVX512F-NEXT:    testl $134217728, %eax # imm = 0x8000000
6431; AVX512F-NEXT:    jne .LBB15_55
6432; AVX512F-NEXT:  .LBB15_56: # %else54
6433; AVX512F-NEXT:    testl $268435456, %eax # imm = 0x10000000
6434; AVX512F-NEXT:    jne .LBB15_57
6435; AVX512F-NEXT:  .LBB15_58: # %else56
6436; AVX512F-NEXT:    testl $536870912, %eax # imm = 0x20000000
6437; AVX512F-NEXT:    jne .LBB15_59
6438; AVX512F-NEXT:  .LBB15_60: # %else58
6439; AVX512F-NEXT:    testl $1073741824, %eax # imm = 0x40000000
6440; AVX512F-NEXT:    jne .LBB15_61
6441; AVX512F-NEXT:  .LBB15_62: # %else60
6442; AVX512F-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
6443; AVX512F-NEXT:    jne .LBB15_63
6444; AVX512F-NEXT:  .LBB15_64: # %else62
6445; AVX512F-NEXT:    vzeroupper
6446; AVX512F-NEXT:    retq
6447; AVX512F-NEXT:  .LBB15_1: # %cond.store
6448; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
6449; AVX512F-NEXT:    testb $2, %al
6450; AVX512F-NEXT:    je .LBB15_4
6451; AVX512F-NEXT:  .LBB15_3: # %cond.store1
6452; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
6453; AVX512F-NEXT:    testb $4, %al
6454; AVX512F-NEXT:    je .LBB15_6
6455; AVX512F-NEXT:  .LBB15_5: # %cond.store3
6456; AVX512F-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
6457; AVX512F-NEXT:    testb $8, %al
6458; AVX512F-NEXT:    je .LBB15_8
6459; AVX512F-NEXT:  .LBB15_7: # %cond.store5
6460; AVX512F-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
6461; AVX512F-NEXT:    testb $16, %al
6462; AVX512F-NEXT:    je .LBB15_10
6463; AVX512F-NEXT:  .LBB15_9: # %cond.store7
6464; AVX512F-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
6465; AVX512F-NEXT:    testb $32, %al
6466; AVX512F-NEXT:    je .LBB15_12
6467; AVX512F-NEXT:  .LBB15_11: # %cond.store9
6468; AVX512F-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
6469; AVX512F-NEXT:    testb $64, %al
6470; AVX512F-NEXT:    je .LBB15_14
6471; AVX512F-NEXT:  .LBB15_13: # %cond.store11
6472; AVX512F-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
6473; AVX512F-NEXT:    testb $-128, %al
6474; AVX512F-NEXT:    je .LBB15_16
6475; AVX512F-NEXT:  .LBB15_15: # %cond.store13
6476; AVX512F-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
6477; AVX512F-NEXT:    testl $256, %eax # imm = 0x100
6478; AVX512F-NEXT:    je .LBB15_18
6479; AVX512F-NEXT:  .LBB15_17: # %cond.store15
6480; AVX512F-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
6481; AVX512F-NEXT:    testl $512, %eax # imm = 0x200
6482; AVX512F-NEXT:    je .LBB15_20
6483; AVX512F-NEXT:  .LBB15_19: # %cond.store17
6484; AVX512F-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
6485; AVX512F-NEXT:    testl $1024, %eax # imm = 0x400
6486; AVX512F-NEXT:    je .LBB15_22
6487; AVX512F-NEXT:  .LBB15_21: # %cond.store19
6488; AVX512F-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
6489; AVX512F-NEXT:    testl $2048, %eax # imm = 0x800
6490; AVX512F-NEXT:    je .LBB15_24
6491; AVX512F-NEXT:  .LBB15_23: # %cond.store21
6492; AVX512F-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
6493; AVX512F-NEXT:    testl $4096, %eax # imm = 0x1000
6494; AVX512F-NEXT:    je .LBB15_26
6495; AVX512F-NEXT:  .LBB15_25: # %cond.store23
6496; AVX512F-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
6497; AVX512F-NEXT:    testl $8192, %eax # imm = 0x2000
6498; AVX512F-NEXT:    je .LBB15_28
6499; AVX512F-NEXT:  .LBB15_27: # %cond.store25
6500; AVX512F-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
6501; AVX512F-NEXT:    testl $16384, %eax # imm = 0x4000
6502; AVX512F-NEXT:    je .LBB15_30
6503; AVX512F-NEXT:  .LBB15_29: # %cond.store27
6504; AVX512F-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
6505; AVX512F-NEXT:    testl $32768, %eax # imm = 0x8000
6506; AVX512F-NEXT:    jne .LBB15_31
6507; AVX512F-NEXT:    jmp .LBB15_32
6508; AVX512F-NEXT:  .LBB15_33: # %cond.store31
6509; AVX512F-NEXT:    vpextrb $0, %xmm0, 16(%rdi)
6510; AVX512F-NEXT:    testl $131072, %eax # imm = 0x20000
6511; AVX512F-NEXT:    je .LBB15_36
6512; AVX512F-NEXT:  .LBB15_35: # %cond.store33
6513; AVX512F-NEXT:    vpextrb $1, %xmm0, 17(%rdi)
6514; AVX512F-NEXT:    testl $262144, %eax # imm = 0x40000
6515; AVX512F-NEXT:    je .LBB15_38
6516; AVX512F-NEXT:  .LBB15_37: # %cond.store35
6517; AVX512F-NEXT:    vpextrb $2, %xmm0, 18(%rdi)
6518; AVX512F-NEXT:    testl $524288, %eax # imm = 0x80000
6519; AVX512F-NEXT:    je .LBB15_40
6520; AVX512F-NEXT:  .LBB15_39: # %cond.store37
6521; AVX512F-NEXT:    vpextrb $3, %xmm0, 19(%rdi)
6522; AVX512F-NEXT:    testl $1048576, %eax # imm = 0x100000
6523; AVX512F-NEXT:    je .LBB15_42
6524; AVX512F-NEXT:  .LBB15_41: # %cond.store39
6525; AVX512F-NEXT:    vpextrb $4, %xmm0, 20(%rdi)
6526; AVX512F-NEXT:    testl $2097152, %eax # imm = 0x200000
6527; AVX512F-NEXT:    je .LBB15_44
6528; AVX512F-NEXT:  .LBB15_43: # %cond.store41
6529; AVX512F-NEXT:    vpextrb $5, %xmm0, 21(%rdi)
6530; AVX512F-NEXT:    testl $4194304, %eax # imm = 0x400000
6531; AVX512F-NEXT:    je .LBB15_46
6532; AVX512F-NEXT:  .LBB15_45: # %cond.store43
6533; AVX512F-NEXT:    vpextrb $6, %xmm0, 22(%rdi)
6534; AVX512F-NEXT:    testl $8388608, %eax # imm = 0x800000
6535; AVX512F-NEXT:    je .LBB15_48
6536; AVX512F-NEXT:  .LBB15_47: # %cond.store45
6537; AVX512F-NEXT:    vpextrb $7, %xmm0, 23(%rdi)
6538; AVX512F-NEXT:    testl $16777216, %eax # imm = 0x1000000
6539; AVX512F-NEXT:    je .LBB15_50
6540; AVX512F-NEXT:  .LBB15_49: # %cond.store47
6541; AVX512F-NEXT:    vpextrb $8, %xmm0, 24(%rdi)
6542; AVX512F-NEXT:    testl $33554432, %eax # imm = 0x2000000
6543; AVX512F-NEXT:    je .LBB15_52
6544; AVX512F-NEXT:  .LBB15_51: # %cond.store49
6545; AVX512F-NEXT:    vpextrb $9, %xmm0, 25(%rdi)
6546; AVX512F-NEXT:    testl $67108864, %eax # imm = 0x4000000
6547; AVX512F-NEXT:    je .LBB15_54
6548; AVX512F-NEXT:  .LBB15_53: # %cond.store51
6549; AVX512F-NEXT:    vpextrb $10, %xmm0, 26(%rdi)
6550; AVX512F-NEXT:    testl $134217728, %eax # imm = 0x8000000
6551; AVX512F-NEXT:    je .LBB15_56
6552; AVX512F-NEXT:  .LBB15_55: # %cond.store53
6553; AVX512F-NEXT:    vpextrb $11, %xmm0, 27(%rdi)
6554; AVX512F-NEXT:    testl $268435456, %eax # imm = 0x10000000
6555; AVX512F-NEXT:    je .LBB15_58
6556; AVX512F-NEXT:  .LBB15_57: # %cond.store55
6557; AVX512F-NEXT:    vpextrb $12, %xmm0, 28(%rdi)
6558; AVX512F-NEXT:    testl $536870912, %eax # imm = 0x20000000
6559; AVX512F-NEXT:    je .LBB15_60
6560; AVX512F-NEXT:  .LBB15_59: # %cond.store57
6561; AVX512F-NEXT:    vpextrb $13, %xmm0, 29(%rdi)
6562; AVX512F-NEXT:    testl $1073741824, %eax # imm = 0x40000000
6563; AVX512F-NEXT:    je .LBB15_62
6564; AVX512F-NEXT:  .LBB15_61: # %cond.store59
6565; AVX512F-NEXT:    vpextrb $14, %xmm0, 30(%rdi)
6566; AVX512F-NEXT:    testl $-2147483648, %eax # imm = 0x80000000
6567; AVX512F-NEXT:    je .LBB15_64
6568; AVX512F-NEXT:  .LBB15_63: # %cond.store61
6569; AVX512F-NEXT:    vpextrb $15, %xmm0, 31(%rdi)
6570; AVX512F-NEXT:    vzeroupper
6571; AVX512F-NEXT:    retq
6572;
6573; AVX512BW-LABEL: truncstore_v32i16_v32i8:
6574; AVX512BW:       # %bb.0:
6575; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
6576; AVX512BW-NEXT:    vptestmb %zmm1, %zmm1, %k1
6577; AVX512BW-NEXT:    vpminsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
6578; AVX512BW-NEXT:    vpmaxsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
6579; AVX512BW-NEXT:    vpmovwb %zmm0, (%rdi) {%k1}
6580; AVX512BW-NEXT:    vzeroupper
6581; AVX512BW-NEXT:    retq
6582;
6583; AVX512BWVL-LABEL: truncstore_v32i16_v32i8:
6584; AVX512BWVL:       # %bb.0:
6585; AVX512BWVL-NEXT:    vptestmb %ymm1, %ymm1, %k1
6586; AVX512BWVL-NEXT:    vpminsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
6587; AVX512BWVL-NEXT:    vpmaxsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0
6588; AVX512BWVL-NEXT:    vpmovwb %zmm0, (%rdi) {%k1}
6589; AVX512BWVL-NEXT:    vzeroupper
6590; AVX512BWVL-NEXT:    retq
6591  %a = icmp ne <32 x i8> %mask, zeroinitializer
6592  %b = icmp slt <32 x i16> %x, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
6593  %c = select <32 x i1> %b, <32 x i16> %x, <32 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
6594  %d = icmp sgt <32 x i16> %c, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
6595  %e = select <32 x i1> %d, <32 x i16> %c, <32 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
6596  %f = trunc <32 x i16> %e to <32 x i8>
6597  call void @llvm.masked.store.v32i8.p0v32i8(<32 x i8> %f, <32 x i8>* %p, i32 1, <32 x i1> %a)
6598  ret void
6599}
6600
6601define void @truncstore_v16i16_v16i8(<16 x i16> %x, <16 x i8>* %p, <16 x i8> %mask) {
6602; SSE2-LABEL: truncstore_v16i16_v16i8:
6603; SSE2:       # %bb.0:
6604; SSE2-NEXT:    pxor %xmm3, %xmm3
6605; SSE2-NEXT:    packsswb %xmm1, %xmm0
6606; SSE2-NEXT:    pcmpeqb %xmm2, %xmm3
6607; SSE2-NEXT:    pmovmskb %xmm3, %eax
6608; SSE2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
6609; SSE2-NEXT:    testb $1, %al
6610; SSE2-NEXT:    movd %xmm0, %ecx
6611; SSE2-NEXT:    jne .LBB16_1
6612; SSE2-NEXT:  # %bb.2: # %else
6613; SSE2-NEXT:    testb $2, %al
6614; SSE2-NEXT:    jne .LBB16_3
6615; SSE2-NEXT:  .LBB16_4: # %else2
6616; SSE2-NEXT:    testb $4, %al
6617; SSE2-NEXT:    jne .LBB16_5
6618; SSE2-NEXT:  .LBB16_6: # %else4
6619; SSE2-NEXT:    testb $8, %al
6620; SSE2-NEXT:    je .LBB16_8
6621; SSE2-NEXT:  .LBB16_7: # %cond.store5
6622; SSE2-NEXT:    shrl $24, %ecx
6623; SSE2-NEXT:    movb %cl, 3(%rdi)
6624; SSE2-NEXT:  .LBB16_8: # %else6
6625; SSE2-NEXT:    testb $16, %al
6626; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
6627; SSE2-NEXT:    je .LBB16_10
6628; SSE2-NEXT:  # %bb.9: # %cond.store7
6629; SSE2-NEXT:    movb %cl, 4(%rdi)
6630; SSE2-NEXT:  .LBB16_10: # %else8
6631; SSE2-NEXT:    testb $32, %al
6632; SSE2-NEXT:    je .LBB16_12
6633; SSE2-NEXT:  # %bb.11: # %cond.store9
6634; SSE2-NEXT:    movb %ch, 5(%rdi)
6635; SSE2-NEXT:  .LBB16_12: # %else10
6636; SSE2-NEXT:    testb $64, %al
6637; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
6638; SSE2-NEXT:    je .LBB16_14
6639; SSE2-NEXT:  # %bb.13: # %cond.store11
6640; SSE2-NEXT:    movb %cl, 6(%rdi)
6641; SSE2-NEXT:  .LBB16_14: # %else12
6642; SSE2-NEXT:    testb $-128, %al
6643; SSE2-NEXT:    je .LBB16_16
6644; SSE2-NEXT:  # %bb.15: # %cond.store13
6645; SSE2-NEXT:    movb %ch, 7(%rdi)
6646; SSE2-NEXT:  .LBB16_16: # %else14
6647; SSE2-NEXT:    testl $256, %eax # imm = 0x100
6648; SSE2-NEXT:    pextrw $4, %xmm0, %ecx
6649; SSE2-NEXT:    je .LBB16_18
6650; SSE2-NEXT:  # %bb.17: # %cond.store15
6651; SSE2-NEXT:    movb %cl, 8(%rdi)
6652; SSE2-NEXT:  .LBB16_18: # %else16
6653; SSE2-NEXT:    testl $512, %eax # imm = 0x200
6654; SSE2-NEXT:    je .LBB16_20
6655; SSE2-NEXT:  # %bb.19: # %cond.store17
6656; SSE2-NEXT:    movb %ch, 9(%rdi)
6657; SSE2-NEXT:  .LBB16_20: # %else18
6658; SSE2-NEXT:    testl $1024, %eax # imm = 0x400
6659; SSE2-NEXT:    pextrw $5, %xmm0, %ecx
6660; SSE2-NEXT:    je .LBB16_22
6661; SSE2-NEXT:  # %bb.21: # %cond.store19
6662; SSE2-NEXT:    movb %cl, 10(%rdi)
6663; SSE2-NEXT:  .LBB16_22: # %else20
6664; SSE2-NEXT:    testl $2048, %eax # imm = 0x800
6665; SSE2-NEXT:    je .LBB16_24
6666; SSE2-NEXT:  # %bb.23: # %cond.store21
6667; SSE2-NEXT:    movb %ch, 11(%rdi)
6668; SSE2-NEXT:  .LBB16_24: # %else22
6669; SSE2-NEXT:    testl $4096, %eax # imm = 0x1000
6670; SSE2-NEXT:    pextrw $6, %xmm0, %ecx
6671; SSE2-NEXT:    je .LBB16_26
6672; SSE2-NEXT:  # %bb.25: # %cond.store23
6673; SSE2-NEXT:    movb %cl, 12(%rdi)
6674; SSE2-NEXT:  .LBB16_26: # %else24
6675; SSE2-NEXT:    testl $8192, %eax # imm = 0x2000
6676; SSE2-NEXT:    je .LBB16_28
6677; SSE2-NEXT:  # %bb.27: # %cond.store25
6678; SSE2-NEXT:    movb %ch, 13(%rdi)
6679; SSE2-NEXT:  .LBB16_28: # %else26
6680; SSE2-NEXT:    testl $16384, %eax # imm = 0x4000
6681; SSE2-NEXT:    pextrw $7, %xmm0, %ecx
6682; SSE2-NEXT:    jne .LBB16_29
6683; SSE2-NEXT:  # %bb.30: # %else28
6684; SSE2-NEXT:    testl $32768, %eax # imm = 0x8000
6685; SSE2-NEXT:    jne .LBB16_31
6686; SSE2-NEXT:  .LBB16_32: # %else30
6687; SSE2-NEXT:    retq
6688; SSE2-NEXT:  .LBB16_1: # %cond.store
6689; SSE2-NEXT:    movb %cl, (%rdi)
6690; SSE2-NEXT:    testb $2, %al
6691; SSE2-NEXT:    je .LBB16_4
6692; SSE2-NEXT:  .LBB16_3: # %cond.store1
6693; SSE2-NEXT:    movb %ch, 1(%rdi)
6694; SSE2-NEXT:    testb $4, %al
6695; SSE2-NEXT:    je .LBB16_6
6696; SSE2-NEXT:  .LBB16_5: # %cond.store3
6697; SSE2-NEXT:    movl %ecx, %edx
6698; SSE2-NEXT:    shrl $16, %edx
6699; SSE2-NEXT:    movb %dl, 2(%rdi)
6700; SSE2-NEXT:    testb $8, %al
6701; SSE2-NEXT:    jne .LBB16_7
6702; SSE2-NEXT:    jmp .LBB16_8
6703; SSE2-NEXT:  .LBB16_29: # %cond.store27
6704; SSE2-NEXT:    movb %cl, 14(%rdi)
6705; SSE2-NEXT:    testl $32768, %eax # imm = 0x8000
6706; SSE2-NEXT:    je .LBB16_32
6707; SSE2-NEXT:  .LBB16_31: # %cond.store29
6708; SSE2-NEXT:    movb %ch, 15(%rdi)
6709; SSE2-NEXT:    retq
6710;
6711; SSE4-LABEL: truncstore_v16i16_v16i8:
6712; SSE4:       # %bb.0:
6713; SSE4-NEXT:    pxor %xmm3, %xmm3
6714; SSE4-NEXT:    packsswb %xmm1, %xmm0
6715; SSE4-NEXT:    pcmpeqb %xmm2, %xmm3
6716; SSE4-NEXT:    pmovmskb %xmm3, %eax
6717; SSE4-NEXT:    xorl $65535, %eax # imm = 0xFFFF
6718; SSE4-NEXT:    testb $1, %al
6719; SSE4-NEXT:    jne .LBB16_1
6720; SSE4-NEXT:  # %bb.2: # %else
6721; SSE4-NEXT:    testb $2, %al
6722; SSE4-NEXT:    jne .LBB16_3
6723; SSE4-NEXT:  .LBB16_4: # %else2
6724; SSE4-NEXT:    testb $4, %al
6725; SSE4-NEXT:    jne .LBB16_5
6726; SSE4-NEXT:  .LBB16_6: # %else4
6727; SSE4-NEXT:    testb $8, %al
6728; SSE4-NEXT:    jne .LBB16_7
6729; SSE4-NEXT:  .LBB16_8: # %else6
6730; SSE4-NEXT:    testb $16, %al
6731; SSE4-NEXT:    jne .LBB16_9
6732; SSE4-NEXT:  .LBB16_10: # %else8
6733; SSE4-NEXT:    testb $32, %al
6734; SSE4-NEXT:    jne .LBB16_11
6735; SSE4-NEXT:  .LBB16_12: # %else10
6736; SSE4-NEXT:    testb $64, %al
6737; SSE4-NEXT:    jne .LBB16_13
6738; SSE4-NEXT:  .LBB16_14: # %else12
6739; SSE4-NEXT:    testb $-128, %al
6740; SSE4-NEXT:    jne .LBB16_15
6741; SSE4-NEXT:  .LBB16_16: # %else14
6742; SSE4-NEXT:    testl $256, %eax # imm = 0x100
6743; SSE4-NEXT:    jne .LBB16_17
6744; SSE4-NEXT:  .LBB16_18: # %else16
6745; SSE4-NEXT:    testl $512, %eax # imm = 0x200
6746; SSE4-NEXT:    jne .LBB16_19
6747; SSE4-NEXT:  .LBB16_20: # %else18
6748; SSE4-NEXT:    testl $1024, %eax # imm = 0x400
6749; SSE4-NEXT:    jne .LBB16_21
6750; SSE4-NEXT:  .LBB16_22: # %else20
6751; SSE4-NEXT:    testl $2048, %eax # imm = 0x800
6752; SSE4-NEXT:    jne .LBB16_23
6753; SSE4-NEXT:  .LBB16_24: # %else22
6754; SSE4-NEXT:    testl $4096, %eax # imm = 0x1000
6755; SSE4-NEXT:    jne .LBB16_25
6756; SSE4-NEXT:  .LBB16_26: # %else24
6757; SSE4-NEXT:    testl $8192, %eax # imm = 0x2000
6758; SSE4-NEXT:    jne .LBB16_27
6759; SSE4-NEXT:  .LBB16_28: # %else26
6760; SSE4-NEXT:    testl $16384, %eax # imm = 0x4000
6761; SSE4-NEXT:    jne .LBB16_29
6762; SSE4-NEXT:  .LBB16_30: # %else28
6763; SSE4-NEXT:    testl $32768, %eax # imm = 0x8000
6764; SSE4-NEXT:    jne .LBB16_31
6765; SSE4-NEXT:  .LBB16_32: # %else30
6766; SSE4-NEXT:    retq
6767; SSE4-NEXT:  .LBB16_1: # %cond.store
6768; SSE4-NEXT:    pextrb $0, %xmm0, (%rdi)
6769; SSE4-NEXT:    testb $2, %al
6770; SSE4-NEXT:    je .LBB16_4
6771; SSE4-NEXT:  .LBB16_3: # %cond.store1
6772; SSE4-NEXT:    pextrb $1, %xmm0, 1(%rdi)
6773; SSE4-NEXT:    testb $4, %al
6774; SSE4-NEXT:    je .LBB16_6
6775; SSE4-NEXT:  .LBB16_5: # %cond.store3
6776; SSE4-NEXT:    pextrb $2, %xmm0, 2(%rdi)
6777; SSE4-NEXT:    testb $8, %al
6778; SSE4-NEXT:    je .LBB16_8
6779; SSE4-NEXT:  .LBB16_7: # %cond.store5
6780; SSE4-NEXT:    pextrb $3, %xmm0, 3(%rdi)
6781; SSE4-NEXT:    testb $16, %al
6782; SSE4-NEXT:    je .LBB16_10
6783; SSE4-NEXT:  .LBB16_9: # %cond.store7
6784; SSE4-NEXT:    pextrb $4, %xmm0, 4(%rdi)
6785; SSE4-NEXT:    testb $32, %al
6786; SSE4-NEXT:    je .LBB16_12
6787; SSE4-NEXT:  .LBB16_11: # %cond.store9
6788; SSE4-NEXT:    pextrb $5, %xmm0, 5(%rdi)
6789; SSE4-NEXT:    testb $64, %al
6790; SSE4-NEXT:    je .LBB16_14
6791; SSE4-NEXT:  .LBB16_13: # %cond.store11
6792; SSE4-NEXT:    pextrb $6, %xmm0, 6(%rdi)
6793; SSE4-NEXT:    testb $-128, %al
6794; SSE4-NEXT:    je .LBB16_16
6795; SSE4-NEXT:  .LBB16_15: # %cond.store13
6796; SSE4-NEXT:    pextrb $7, %xmm0, 7(%rdi)
6797; SSE4-NEXT:    testl $256, %eax # imm = 0x100
6798; SSE4-NEXT:    je .LBB16_18
6799; SSE4-NEXT:  .LBB16_17: # %cond.store15
6800; SSE4-NEXT:    pextrb $8, %xmm0, 8(%rdi)
6801; SSE4-NEXT:    testl $512, %eax # imm = 0x200
6802; SSE4-NEXT:    je .LBB16_20
6803; SSE4-NEXT:  .LBB16_19: # %cond.store17
6804; SSE4-NEXT:    pextrb $9, %xmm0, 9(%rdi)
6805; SSE4-NEXT:    testl $1024, %eax # imm = 0x400
6806; SSE4-NEXT:    je .LBB16_22
6807; SSE4-NEXT:  .LBB16_21: # %cond.store19
6808; SSE4-NEXT:    pextrb $10, %xmm0, 10(%rdi)
6809; SSE4-NEXT:    testl $2048, %eax # imm = 0x800
6810; SSE4-NEXT:    je .LBB16_24
6811; SSE4-NEXT:  .LBB16_23: # %cond.store21
6812; SSE4-NEXT:    pextrb $11, %xmm0, 11(%rdi)
6813; SSE4-NEXT:    testl $4096, %eax # imm = 0x1000
6814; SSE4-NEXT:    je .LBB16_26
6815; SSE4-NEXT:  .LBB16_25: # %cond.store23
6816; SSE4-NEXT:    pextrb $12, %xmm0, 12(%rdi)
6817; SSE4-NEXT:    testl $8192, %eax # imm = 0x2000
6818; SSE4-NEXT:    je .LBB16_28
6819; SSE4-NEXT:  .LBB16_27: # %cond.store25
6820; SSE4-NEXT:    pextrb $13, %xmm0, 13(%rdi)
6821; SSE4-NEXT:    testl $16384, %eax # imm = 0x4000
6822; SSE4-NEXT:    je .LBB16_30
6823; SSE4-NEXT:  .LBB16_29: # %cond.store27
6824; SSE4-NEXT:    pextrb $14, %xmm0, 14(%rdi)
6825; SSE4-NEXT:    testl $32768, %eax # imm = 0x8000
6826; SSE4-NEXT:    je .LBB16_32
6827; SSE4-NEXT:  .LBB16_31: # %cond.store29
6828; SSE4-NEXT:    pextrb $15, %xmm0, 15(%rdi)
6829; SSE4-NEXT:    retq
6830;
6831; AVX1-LABEL: truncstore_v16i16_v16i8:
6832; AVX1:       # %bb.0:
6833; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
6834; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
6835; AVX1-NEXT:    vpacksswb %xmm3, %xmm0, %xmm0
6836; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
6837; AVX1-NEXT:    vpmovmskb %xmm1, %eax
6838; AVX1-NEXT:    xorl $65535, %eax # imm = 0xFFFF
6839; AVX1-NEXT:    testb $1, %al
6840; AVX1-NEXT:    jne .LBB16_1
6841; AVX1-NEXT:  # %bb.2: # %else
6842; AVX1-NEXT:    testb $2, %al
6843; AVX1-NEXT:    jne .LBB16_3
6844; AVX1-NEXT:  .LBB16_4: # %else2
6845; AVX1-NEXT:    testb $4, %al
6846; AVX1-NEXT:    jne .LBB16_5
6847; AVX1-NEXT:  .LBB16_6: # %else4
6848; AVX1-NEXT:    testb $8, %al
6849; AVX1-NEXT:    jne .LBB16_7
6850; AVX1-NEXT:  .LBB16_8: # %else6
6851; AVX1-NEXT:    testb $16, %al
6852; AVX1-NEXT:    jne .LBB16_9
6853; AVX1-NEXT:  .LBB16_10: # %else8
6854; AVX1-NEXT:    testb $32, %al
6855; AVX1-NEXT:    jne .LBB16_11
6856; AVX1-NEXT:  .LBB16_12: # %else10
6857; AVX1-NEXT:    testb $64, %al
6858; AVX1-NEXT:    jne .LBB16_13
6859; AVX1-NEXT:  .LBB16_14: # %else12
6860; AVX1-NEXT:    testb $-128, %al
6861; AVX1-NEXT:    jne .LBB16_15
6862; AVX1-NEXT:  .LBB16_16: # %else14
6863; AVX1-NEXT:    testl $256, %eax # imm = 0x100
6864; AVX1-NEXT:    jne .LBB16_17
6865; AVX1-NEXT:  .LBB16_18: # %else16
6866; AVX1-NEXT:    testl $512, %eax # imm = 0x200
6867; AVX1-NEXT:    jne .LBB16_19
6868; AVX1-NEXT:  .LBB16_20: # %else18
6869; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
6870; AVX1-NEXT:    jne .LBB16_21
6871; AVX1-NEXT:  .LBB16_22: # %else20
6872; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
6873; AVX1-NEXT:    jne .LBB16_23
6874; AVX1-NEXT:  .LBB16_24: # %else22
6875; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
6876; AVX1-NEXT:    jne .LBB16_25
6877; AVX1-NEXT:  .LBB16_26: # %else24
6878; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
6879; AVX1-NEXT:    jne .LBB16_27
6880; AVX1-NEXT:  .LBB16_28: # %else26
6881; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
6882; AVX1-NEXT:    jne .LBB16_29
6883; AVX1-NEXT:  .LBB16_30: # %else28
6884; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
6885; AVX1-NEXT:    jne .LBB16_31
6886; AVX1-NEXT:  .LBB16_32: # %else30
6887; AVX1-NEXT:    vzeroupper
6888; AVX1-NEXT:    retq
6889; AVX1-NEXT:  .LBB16_1: # %cond.store
6890; AVX1-NEXT:    vpextrb $0, %xmm0, (%rdi)
6891; AVX1-NEXT:    testb $2, %al
6892; AVX1-NEXT:    je .LBB16_4
6893; AVX1-NEXT:  .LBB16_3: # %cond.store1
6894; AVX1-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
6895; AVX1-NEXT:    testb $4, %al
6896; AVX1-NEXT:    je .LBB16_6
6897; AVX1-NEXT:  .LBB16_5: # %cond.store3
6898; AVX1-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
6899; AVX1-NEXT:    testb $8, %al
6900; AVX1-NEXT:    je .LBB16_8
6901; AVX1-NEXT:  .LBB16_7: # %cond.store5
6902; AVX1-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
6903; AVX1-NEXT:    testb $16, %al
6904; AVX1-NEXT:    je .LBB16_10
6905; AVX1-NEXT:  .LBB16_9: # %cond.store7
6906; AVX1-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
6907; AVX1-NEXT:    testb $32, %al
6908; AVX1-NEXT:    je .LBB16_12
6909; AVX1-NEXT:  .LBB16_11: # %cond.store9
6910; AVX1-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
6911; AVX1-NEXT:    testb $64, %al
6912; AVX1-NEXT:    je .LBB16_14
6913; AVX1-NEXT:  .LBB16_13: # %cond.store11
6914; AVX1-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
6915; AVX1-NEXT:    testb $-128, %al
6916; AVX1-NEXT:    je .LBB16_16
6917; AVX1-NEXT:  .LBB16_15: # %cond.store13
6918; AVX1-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
6919; AVX1-NEXT:    testl $256, %eax # imm = 0x100
6920; AVX1-NEXT:    je .LBB16_18
6921; AVX1-NEXT:  .LBB16_17: # %cond.store15
6922; AVX1-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
6923; AVX1-NEXT:    testl $512, %eax # imm = 0x200
6924; AVX1-NEXT:    je .LBB16_20
6925; AVX1-NEXT:  .LBB16_19: # %cond.store17
6926; AVX1-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
6927; AVX1-NEXT:    testl $1024, %eax # imm = 0x400
6928; AVX1-NEXT:    je .LBB16_22
6929; AVX1-NEXT:  .LBB16_21: # %cond.store19
6930; AVX1-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
6931; AVX1-NEXT:    testl $2048, %eax # imm = 0x800
6932; AVX1-NEXT:    je .LBB16_24
6933; AVX1-NEXT:  .LBB16_23: # %cond.store21
6934; AVX1-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
6935; AVX1-NEXT:    testl $4096, %eax # imm = 0x1000
6936; AVX1-NEXT:    je .LBB16_26
6937; AVX1-NEXT:  .LBB16_25: # %cond.store23
6938; AVX1-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
6939; AVX1-NEXT:    testl $8192, %eax # imm = 0x2000
6940; AVX1-NEXT:    je .LBB16_28
6941; AVX1-NEXT:  .LBB16_27: # %cond.store25
6942; AVX1-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
6943; AVX1-NEXT:    testl $16384, %eax # imm = 0x4000
6944; AVX1-NEXT:    je .LBB16_30
6945; AVX1-NEXT:  .LBB16_29: # %cond.store27
6946; AVX1-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
6947; AVX1-NEXT:    testl $32768, %eax # imm = 0x8000
6948; AVX1-NEXT:    je .LBB16_32
6949; AVX1-NEXT:  .LBB16_31: # %cond.store29
6950; AVX1-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
6951; AVX1-NEXT:    vzeroupper
6952; AVX1-NEXT:    retq
6953;
6954; AVX2-LABEL: truncstore_v16i16_v16i8:
6955; AVX2:       # %bb.0:
6956; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
6957; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
6958; AVX2-NEXT:    vpacksswb %xmm3, %xmm0, %xmm0
6959; AVX2-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
6960; AVX2-NEXT:    vpmovmskb %xmm1, %eax
6961; AVX2-NEXT:    xorl $65535, %eax # imm = 0xFFFF
6962; AVX2-NEXT:    testb $1, %al
6963; AVX2-NEXT:    jne .LBB16_1
6964; AVX2-NEXT:  # %bb.2: # %else
6965; AVX2-NEXT:    testb $2, %al
6966; AVX2-NEXT:    jne .LBB16_3
6967; AVX2-NEXT:  .LBB16_4: # %else2
6968; AVX2-NEXT:    testb $4, %al
6969; AVX2-NEXT:    jne .LBB16_5
6970; AVX2-NEXT:  .LBB16_6: # %else4
6971; AVX2-NEXT:    testb $8, %al
6972; AVX2-NEXT:    jne .LBB16_7
6973; AVX2-NEXT:  .LBB16_8: # %else6
6974; AVX2-NEXT:    testb $16, %al
6975; AVX2-NEXT:    jne .LBB16_9
6976; AVX2-NEXT:  .LBB16_10: # %else8
6977; AVX2-NEXT:    testb $32, %al
6978; AVX2-NEXT:    jne .LBB16_11
6979; AVX2-NEXT:  .LBB16_12: # %else10
6980; AVX2-NEXT:    testb $64, %al
6981; AVX2-NEXT:    jne .LBB16_13
6982; AVX2-NEXT:  .LBB16_14: # %else12
6983; AVX2-NEXT:    testb $-128, %al
6984; AVX2-NEXT:    jne .LBB16_15
6985; AVX2-NEXT:  .LBB16_16: # %else14
6986; AVX2-NEXT:    testl $256, %eax # imm = 0x100
6987; AVX2-NEXT:    jne .LBB16_17
6988; AVX2-NEXT:  .LBB16_18: # %else16
6989; AVX2-NEXT:    testl $512, %eax # imm = 0x200
6990; AVX2-NEXT:    jne .LBB16_19
6991; AVX2-NEXT:  .LBB16_20: # %else18
6992; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
6993; AVX2-NEXT:    jne .LBB16_21
6994; AVX2-NEXT:  .LBB16_22: # %else20
6995; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
6996; AVX2-NEXT:    jne .LBB16_23
6997; AVX2-NEXT:  .LBB16_24: # %else22
6998; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
6999; AVX2-NEXT:    jne .LBB16_25
7000; AVX2-NEXT:  .LBB16_26: # %else24
7001; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
7002; AVX2-NEXT:    jne .LBB16_27
7003; AVX2-NEXT:  .LBB16_28: # %else26
7004; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
7005; AVX2-NEXT:    jne .LBB16_29
7006; AVX2-NEXT:  .LBB16_30: # %else28
7007; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
7008; AVX2-NEXT:    jne .LBB16_31
7009; AVX2-NEXT:  .LBB16_32: # %else30
7010; AVX2-NEXT:    vzeroupper
7011; AVX2-NEXT:    retq
7012; AVX2-NEXT:  .LBB16_1: # %cond.store
7013; AVX2-NEXT:    vpextrb $0, %xmm0, (%rdi)
7014; AVX2-NEXT:    testb $2, %al
7015; AVX2-NEXT:    je .LBB16_4
7016; AVX2-NEXT:  .LBB16_3: # %cond.store1
7017; AVX2-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
7018; AVX2-NEXT:    testb $4, %al
7019; AVX2-NEXT:    je .LBB16_6
7020; AVX2-NEXT:  .LBB16_5: # %cond.store3
7021; AVX2-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
7022; AVX2-NEXT:    testb $8, %al
7023; AVX2-NEXT:    je .LBB16_8
7024; AVX2-NEXT:  .LBB16_7: # %cond.store5
7025; AVX2-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
7026; AVX2-NEXT:    testb $16, %al
7027; AVX2-NEXT:    je .LBB16_10
7028; AVX2-NEXT:  .LBB16_9: # %cond.store7
7029; AVX2-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
7030; AVX2-NEXT:    testb $32, %al
7031; AVX2-NEXT:    je .LBB16_12
7032; AVX2-NEXT:  .LBB16_11: # %cond.store9
7033; AVX2-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
7034; AVX2-NEXT:    testb $64, %al
7035; AVX2-NEXT:    je .LBB16_14
7036; AVX2-NEXT:  .LBB16_13: # %cond.store11
7037; AVX2-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
7038; AVX2-NEXT:    testb $-128, %al
7039; AVX2-NEXT:    je .LBB16_16
7040; AVX2-NEXT:  .LBB16_15: # %cond.store13
7041; AVX2-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
7042; AVX2-NEXT:    testl $256, %eax # imm = 0x100
7043; AVX2-NEXT:    je .LBB16_18
7044; AVX2-NEXT:  .LBB16_17: # %cond.store15
7045; AVX2-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
7046; AVX2-NEXT:    testl $512, %eax # imm = 0x200
7047; AVX2-NEXT:    je .LBB16_20
7048; AVX2-NEXT:  .LBB16_19: # %cond.store17
7049; AVX2-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
7050; AVX2-NEXT:    testl $1024, %eax # imm = 0x400
7051; AVX2-NEXT:    je .LBB16_22
7052; AVX2-NEXT:  .LBB16_21: # %cond.store19
7053; AVX2-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
7054; AVX2-NEXT:    testl $2048, %eax # imm = 0x800
7055; AVX2-NEXT:    je .LBB16_24
7056; AVX2-NEXT:  .LBB16_23: # %cond.store21
7057; AVX2-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
7058; AVX2-NEXT:    testl $4096, %eax # imm = 0x1000
7059; AVX2-NEXT:    je .LBB16_26
7060; AVX2-NEXT:  .LBB16_25: # %cond.store23
7061; AVX2-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
7062; AVX2-NEXT:    testl $8192, %eax # imm = 0x2000
7063; AVX2-NEXT:    je .LBB16_28
7064; AVX2-NEXT:  .LBB16_27: # %cond.store25
7065; AVX2-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
7066; AVX2-NEXT:    testl $16384, %eax # imm = 0x4000
7067; AVX2-NEXT:    je .LBB16_30
7068; AVX2-NEXT:  .LBB16_29: # %cond.store27
7069; AVX2-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
7070; AVX2-NEXT:    testl $32768, %eax # imm = 0x8000
7071; AVX2-NEXT:    je .LBB16_32
7072; AVX2-NEXT:  .LBB16_31: # %cond.store29
7073; AVX2-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
7074; AVX2-NEXT:    vzeroupper
7075; AVX2-NEXT:    retq
7076;
7077; AVX512F-LABEL: truncstore_v16i16_v16i8:
7078; AVX512F:       # %bb.0:
7079; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
7080; AVX512F-NEXT:    vpcmpeqb %xmm2, %xmm1, %xmm1
7081; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm2
7082; AVX512F-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
7083; AVX512F-NEXT:    vpmovmskb %xmm1, %eax
7084; AVX512F-NEXT:    xorl $65535, %eax # imm = 0xFFFF
7085; AVX512F-NEXT:    testb $1, %al
7086; AVX512F-NEXT:    jne .LBB16_1
7087; AVX512F-NEXT:  # %bb.2: # %else
7088; AVX512F-NEXT:    testb $2, %al
7089; AVX512F-NEXT:    jne .LBB16_3
7090; AVX512F-NEXT:  .LBB16_4: # %else2
7091; AVX512F-NEXT:    testb $4, %al
7092; AVX512F-NEXT:    jne .LBB16_5
7093; AVX512F-NEXT:  .LBB16_6: # %else4
7094; AVX512F-NEXT:    testb $8, %al
7095; AVX512F-NEXT:    jne .LBB16_7
7096; AVX512F-NEXT:  .LBB16_8: # %else6
7097; AVX512F-NEXT:    testb $16, %al
7098; AVX512F-NEXT:    jne .LBB16_9
7099; AVX512F-NEXT:  .LBB16_10: # %else8
7100; AVX512F-NEXT:    testb $32, %al
7101; AVX512F-NEXT:    jne .LBB16_11
7102; AVX512F-NEXT:  .LBB16_12: # %else10
7103; AVX512F-NEXT:    testb $64, %al
7104; AVX512F-NEXT:    jne .LBB16_13
7105; AVX512F-NEXT:  .LBB16_14: # %else12
7106; AVX512F-NEXT:    testb $-128, %al
7107; AVX512F-NEXT:    jne .LBB16_15
7108; AVX512F-NEXT:  .LBB16_16: # %else14
7109; AVX512F-NEXT:    testl $256, %eax # imm = 0x100
7110; AVX512F-NEXT:    jne .LBB16_17
7111; AVX512F-NEXT:  .LBB16_18: # %else16
7112; AVX512F-NEXT:    testl $512, %eax # imm = 0x200
7113; AVX512F-NEXT:    jne .LBB16_19
7114; AVX512F-NEXT:  .LBB16_20: # %else18
7115; AVX512F-NEXT:    testl $1024, %eax # imm = 0x400
7116; AVX512F-NEXT:    jne .LBB16_21
7117; AVX512F-NEXT:  .LBB16_22: # %else20
7118; AVX512F-NEXT:    testl $2048, %eax # imm = 0x800
7119; AVX512F-NEXT:    jne .LBB16_23
7120; AVX512F-NEXT:  .LBB16_24: # %else22
7121; AVX512F-NEXT:    testl $4096, %eax # imm = 0x1000
7122; AVX512F-NEXT:    jne .LBB16_25
7123; AVX512F-NEXT:  .LBB16_26: # %else24
7124; AVX512F-NEXT:    testl $8192, %eax # imm = 0x2000
7125; AVX512F-NEXT:    jne .LBB16_27
7126; AVX512F-NEXT:  .LBB16_28: # %else26
7127; AVX512F-NEXT:    testl $16384, %eax # imm = 0x4000
7128; AVX512F-NEXT:    jne .LBB16_29
7129; AVX512F-NEXT:  .LBB16_30: # %else28
7130; AVX512F-NEXT:    testl $32768, %eax # imm = 0x8000
7131; AVX512F-NEXT:    jne .LBB16_31
7132; AVX512F-NEXT:  .LBB16_32: # %else30
7133; AVX512F-NEXT:    vzeroupper
7134; AVX512F-NEXT:    retq
7135; AVX512F-NEXT:  .LBB16_1: # %cond.store
7136; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
7137; AVX512F-NEXT:    testb $2, %al
7138; AVX512F-NEXT:    je .LBB16_4
7139; AVX512F-NEXT:  .LBB16_3: # %cond.store1
7140; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
7141; AVX512F-NEXT:    testb $4, %al
7142; AVX512F-NEXT:    je .LBB16_6
7143; AVX512F-NEXT:  .LBB16_5: # %cond.store3
7144; AVX512F-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
7145; AVX512F-NEXT:    testb $8, %al
7146; AVX512F-NEXT:    je .LBB16_8
7147; AVX512F-NEXT:  .LBB16_7: # %cond.store5
7148; AVX512F-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
7149; AVX512F-NEXT:    testb $16, %al
7150; AVX512F-NEXT:    je .LBB16_10
7151; AVX512F-NEXT:  .LBB16_9: # %cond.store7
7152; AVX512F-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
7153; AVX512F-NEXT:    testb $32, %al
7154; AVX512F-NEXT:    je .LBB16_12
7155; AVX512F-NEXT:  .LBB16_11: # %cond.store9
7156; AVX512F-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
7157; AVX512F-NEXT:    testb $64, %al
7158; AVX512F-NEXT:    je .LBB16_14
7159; AVX512F-NEXT:  .LBB16_13: # %cond.store11
7160; AVX512F-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
7161; AVX512F-NEXT:    testb $-128, %al
7162; AVX512F-NEXT:    je .LBB16_16
7163; AVX512F-NEXT:  .LBB16_15: # %cond.store13
7164; AVX512F-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
7165; AVX512F-NEXT:    testl $256, %eax # imm = 0x100
7166; AVX512F-NEXT:    je .LBB16_18
7167; AVX512F-NEXT:  .LBB16_17: # %cond.store15
7168; AVX512F-NEXT:    vpextrb $8, %xmm0, 8(%rdi)
7169; AVX512F-NEXT:    testl $512, %eax # imm = 0x200
7170; AVX512F-NEXT:    je .LBB16_20
7171; AVX512F-NEXT:  .LBB16_19: # %cond.store17
7172; AVX512F-NEXT:    vpextrb $9, %xmm0, 9(%rdi)
7173; AVX512F-NEXT:    testl $1024, %eax # imm = 0x400
7174; AVX512F-NEXT:    je .LBB16_22
7175; AVX512F-NEXT:  .LBB16_21: # %cond.store19
7176; AVX512F-NEXT:    vpextrb $10, %xmm0, 10(%rdi)
7177; AVX512F-NEXT:    testl $2048, %eax # imm = 0x800
7178; AVX512F-NEXT:    je .LBB16_24
7179; AVX512F-NEXT:  .LBB16_23: # %cond.store21
7180; AVX512F-NEXT:    vpextrb $11, %xmm0, 11(%rdi)
7181; AVX512F-NEXT:    testl $4096, %eax # imm = 0x1000
7182; AVX512F-NEXT:    je .LBB16_26
7183; AVX512F-NEXT:  .LBB16_25: # %cond.store23
7184; AVX512F-NEXT:    vpextrb $12, %xmm0, 12(%rdi)
7185; AVX512F-NEXT:    testl $8192, %eax # imm = 0x2000
7186; AVX512F-NEXT:    je .LBB16_28
7187; AVX512F-NEXT:  .LBB16_27: # %cond.store25
7188; AVX512F-NEXT:    vpextrb $13, %xmm0, 13(%rdi)
7189; AVX512F-NEXT:    testl $16384, %eax # imm = 0x4000
7190; AVX512F-NEXT:    je .LBB16_30
7191; AVX512F-NEXT:  .LBB16_29: # %cond.store27
7192; AVX512F-NEXT:    vpextrb $14, %xmm0, 14(%rdi)
7193; AVX512F-NEXT:    testl $32768, %eax # imm = 0x8000
7194; AVX512F-NEXT:    je .LBB16_32
7195; AVX512F-NEXT:  .LBB16_31: # %cond.store29
7196; AVX512F-NEXT:    vpextrb $15, %xmm0, 15(%rdi)
7197; AVX512F-NEXT:    vzeroupper
7198; AVX512F-NEXT:    retq
7199;
7200; AVX512BW-LABEL: truncstore_v16i16_v16i8:
7201; AVX512BW:       # %bb.0:
7202; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
7203; AVX512BW-NEXT:    vptestmb %zmm1, %zmm1, %k0
7204; AVX512BW-NEXT:    kmovw %k0, %k1
7205; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
7206; AVX512BW-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
7207; AVX512BW-NEXT:    vmovdqu8 %zmm0, (%rdi) {%k1}
7208; AVX512BW-NEXT:    vzeroupper
7209; AVX512BW-NEXT:    retq
7210;
7211; AVX512BWVL-LABEL: truncstore_v16i16_v16i8:
7212; AVX512BWVL:       # %bb.0:
7213; AVX512BWVL-NEXT:    vptestmb %xmm1, %xmm1, %k1
7214; AVX512BWVL-NEXT:    vpminsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
7215; AVX512BWVL-NEXT:    vpmaxsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
7216; AVX512BWVL-NEXT:    vpmovwb %ymm0, (%rdi) {%k1}
7217; AVX512BWVL-NEXT:    vzeroupper
7218; AVX512BWVL-NEXT:    retq
7219  %a = icmp ne <16 x i8> %mask, zeroinitializer
7220  %b = icmp slt <16 x i16> %x, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
7221  %c = select <16 x i1> %b, <16 x i16> %x, <16 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
7222  %d = icmp sgt <16 x i16> %c, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
7223  %e = select <16 x i1> %d, <16 x i16> %c, <16 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
7224  %f = trunc <16 x i16> %e to <16 x i8>
7225  call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %f, <16 x i8>* %p, i32 1, <16 x i1> %a)
7226  ret void
7227}
7228
7229define void @truncstore_v8i16_v8i8(<8 x i16> %x, <8 x i8>* %p, <8 x i16> %mask) {
7230; SSE2-LABEL: truncstore_v8i16_v8i8:
7231; SSE2:       # %bb.0:
7232; SSE2-NEXT:    pxor %xmm2, %xmm2
7233; SSE2-NEXT:    packsswb %xmm0, %xmm0
7234; SSE2-NEXT:    pcmpeqw %xmm1, %xmm2
7235; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
7236; SSE2-NEXT:    pxor %xmm2, %xmm1
7237; SSE2-NEXT:    packsswb %xmm1, %xmm1
7238; SSE2-NEXT:    pmovmskb %xmm1, %eax
7239; SSE2-NEXT:    testb $1, %al
7240; SSE2-NEXT:    movd %xmm0, %ecx
7241; SSE2-NEXT:    jne .LBB17_1
7242; SSE2-NEXT:  # %bb.2: # %else
7243; SSE2-NEXT:    testb $2, %al
7244; SSE2-NEXT:    jne .LBB17_3
7245; SSE2-NEXT:  .LBB17_4: # %else2
7246; SSE2-NEXT:    testb $4, %al
7247; SSE2-NEXT:    jne .LBB17_5
7248; SSE2-NEXT:  .LBB17_6: # %else4
7249; SSE2-NEXT:    testb $8, %al
7250; SSE2-NEXT:    je .LBB17_8
7251; SSE2-NEXT:  .LBB17_7: # %cond.store5
7252; SSE2-NEXT:    shrl $24, %ecx
7253; SSE2-NEXT:    movb %cl, 3(%rdi)
7254; SSE2-NEXT:  .LBB17_8: # %else6
7255; SSE2-NEXT:    testb $16, %al
7256; SSE2-NEXT:    pextrw $2, %xmm0, %ecx
7257; SSE2-NEXT:    je .LBB17_10
7258; SSE2-NEXT:  # %bb.9: # %cond.store7
7259; SSE2-NEXT:    movb %cl, 4(%rdi)
7260; SSE2-NEXT:  .LBB17_10: # %else8
7261; SSE2-NEXT:    testb $32, %al
7262; SSE2-NEXT:    je .LBB17_12
7263; SSE2-NEXT:  # %bb.11: # %cond.store9
7264; SSE2-NEXT:    movb %ch, 5(%rdi)
7265; SSE2-NEXT:  .LBB17_12: # %else10
7266; SSE2-NEXT:    testb $64, %al
7267; SSE2-NEXT:    pextrw $3, %xmm0, %ecx
7268; SSE2-NEXT:    jne .LBB17_13
7269; SSE2-NEXT:  # %bb.14: # %else12
7270; SSE2-NEXT:    testb $-128, %al
7271; SSE2-NEXT:    jne .LBB17_15
7272; SSE2-NEXT:  .LBB17_16: # %else14
7273; SSE2-NEXT:    retq
7274; SSE2-NEXT:  .LBB17_1: # %cond.store
7275; SSE2-NEXT:    movb %cl, (%rdi)
7276; SSE2-NEXT:    testb $2, %al
7277; SSE2-NEXT:    je .LBB17_4
7278; SSE2-NEXT:  .LBB17_3: # %cond.store1
7279; SSE2-NEXT:    movb %ch, 1(%rdi)
7280; SSE2-NEXT:    testb $4, %al
7281; SSE2-NEXT:    je .LBB17_6
7282; SSE2-NEXT:  .LBB17_5: # %cond.store3
7283; SSE2-NEXT:    movl %ecx, %edx
7284; SSE2-NEXT:    shrl $16, %edx
7285; SSE2-NEXT:    movb %dl, 2(%rdi)
7286; SSE2-NEXT:    testb $8, %al
7287; SSE2-NEXT:    jne .LBB17_7
7288; SSE2-NEXT:    jmp .LBB17_8
7289; SSE2-NEXT:  .LBB17_13: # %cond.store11
7290; SSE2-NEXT:    movb %cl, 6(%rdi)
7291; SSE2-NEXT:    testb $-128, %al
7292; SSE2-NEXT:    je .LBB17_16
7293; SSE2-NEXT:  .LBB17_15: # %cond.store13
7294; SSE2-NEXT:    movb %ch, 7(%rdi)
7295; SSE2-NEXT:    retq
7296;
7297; SSE4-LABEL: truncstore_v8i16_v8i8:
7298; SSE4:       # %bb.0:
7299; SSE4-NEXT:    pxor %xmm2, %xmm2
7300; SSE4-NEXT:    packsswb %xmm0, %xmm0
7301; SSE4-NEXT:    pcmpeqw %xmm1, %xmm2
7302; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
7303; SSE4-NEXT:    pxor %xmm2, %xmm1
7304; SSE4-NEXT:    packsswb %xmm1, %xmm1
7305; SSE4-NEXT:    pmovmskb %xmm1, %eax
7306; SSE4-NEXT:    testb $1, %al
7307; SSE4-NEXT:    jne .LBB17_1
7308; SSE4-NEXT:  # %bb.2: # %else
7309; SSE4-NEXT:    testb $2, %al
7310; SSE4-NEXT:    jne .LBB17_3
7311; SSE4-NEXT:  .LBB17_4: # %else2
7312; SSE4-NEXT:    testb $4, %al
7313; SSE4-NEXT:    jne .LBB17_5
7314; SSE4-NEXT:  .LBB17_6: # %else4
7315; SSE4-NEXT:    testb $8, %al
7316; SSE4-NEXT:    jne .LBB17_7
7317; SSE4-NEXT:  .LBB17_8: # %else6
7318; SSE4-NEXT:    testb $16, %al
7319; SSE4-NEXT:    jne .LBB17_9
7320; SSE4-NEXT:  .LBB17_10: # %else8
7321; SSE4-NEXT:    testb $32, %al
7322; SSE4-NEXT:    jne .LBB17_11
7323; SSE4-NEXT:  .LBB17_12: # %else10
7324; SSE4-NEXT:    testb $64, %al
7325; SSE4-NEXT:    jne .LBB17_13
7326; SSE4-NEXT:  .LBB17_14: # %else12
7327; SSE4-NEXT:    testb $-128, %al
7328; SSE4-NEXT:    jne .LBB17_15
7329; SSE4-NEXT:  .LBB17_16: # %else14
7330; SSE4-NEXT:    retq
7331; SSE4-NEXT:  .LBB17_1: # %cond.store
7332; SSE4-NEXT:    pextrb $0, %xmm0, (%rdi)
7333; SSE4-NEXT:    testb $2, %al
7334; SSE4-NEXT:    je .LBB17_4
7335; SSE4-NEXT:  .LBB17_3: # %cond.store1
7336; SSE4-NEXT:    pextrb $1, %xmm0, 1(%rdi)
7337; SSE4-NEXT:    testb $4, %al
7338; SSE4-NEXT:    je .LBB17_6
7339; SSE4-NEXT:  .LBB17_5: # %cond.store3
7340; SSE4-NEXT:    pextrb $2, %xmm0, 2(%rdi)
7341; SSE4-NEXT:    testb $8, %al
7342; SSE4-NEXT:    je .LBB17_8
7343; SSE4-NEXT:  .LBB17_7: # %cond.store5
7344; SSE4-NEXT:    pextrb $3, %xmm0, 3(%rdi)
7345; SSE4-NEXT:    testb $16, %al
7346; SSE4-NEXT:    je .LBB17_10
7347; SSE4-NEXT:  .LBB17_9: # %cond.store7
7348; SSE4-NEXT:    pextrb $4, %xmm0, 4(%rdi)
7349; SSE4-NEXT:    testb $32, %al
7350; SSE4-NEXT:    je .LBB17_12
7351; SSE4-NEXT:  .LBB17_11: # %cond.store9
7352; SSE4-NEXT:    pextrb $5, %xmm0, 5(%rdi)
7353; SSE4-NEXT:    testb $64, %al
7354; SSE4-NEXT:    je .LBB17_14
7355; SSE4-NEXT:  .LBB17_13: # %cond.store11
7356; SSE4-NEXT:    pextrb $6, %xmm0, 6(%rdi)
7357; SSE4-NEXT:    testb $-128, %al
7358; SSE4-NEXT:    je .LBB17_16
7359; SSE4-NEXT:  .LBB17_15: # %cond.store13
7360; SSE4-NEXT:    pextrb $7, %xmm0, 7(%rdi)
7361; SSE4-NEXT:    retq
7362;
7363; AVX-LABEL: truncstore_v8i16_v8i8:
7364; AVX:       # %bb.0:
7365; AVX-NEXT:    vpxor %xmm2, %xmm2, %xmm2
7366; AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
7367; AVX-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm1
7368; AVX-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
7369; AVX-NEXT:    vpxor %xmm2, %xmm1, %xmm1
7370; AVX-NEXT:    vpacksswb %xmm1, %xmm1, %xmm1
7371; AVX-NEXT:    vpmovmskb %xmm1, %eax
7372; AVX-NEXT:    testb $1, %al
7373; AVX-NEXT:    jne .LBB17_1
7374; AVX-NEXT:  # %bb.2: # %else
7375; AVX-NEXT:    testb $2, %al
7376; AVX-NEXT:    jne .LBB17_3
7377; AVX-NEXT:  .LBB17_4: # %else2
7378; AVX-NEXT:    testb $4, %al
7379; AVX-NEXT:    jne .LBB17_5
7380; AVX-NEXT:  .LBB17_6: # %else4
7381; AVX-NEXT:    testb $8, %al
7382; AVX-NEXT:    jne .LBB17_7
7383; AVX-NEXT:  .LBB17_8: # %else6
7384; AVX-NEXT:    testb $16, %al
7385; AVX-NEXT:    jne .LBB17_9
7386; AVX-NEXT:  .LBB17_10: # %else8
7387; AVX-NEXT:    testb $32, %al
7388; AVX-NEXT:    jne .LBB17_11
7389; AVX-NEXT:  .LBB17_12: # %else10
7390; AVX-NEXT:    testb $64, %al
7391; AVX-NEXT:    jne .LBB17_13
7392; AVX-NEXT:  .LBB17_14: # %else12
7393; AVX-NEXT:    testb $-128, %al
7394; AVX-NEXT:    jne .LBB17_15
7395; AVX-NEXT:  .LBB17_16: # %else14
7396; AVX-NEXT:    retq
7397; AVX-NEXT:  .LBB17_1: # %cond.store
7398; AVX-NEXT:    vpextrb $0, %xmm0, (%rdi)
7399; AVX-NEXT:    testb $2, %al
7400; AVX-NEXT:    je .LBB17_4
7401; AVX-NEXT:  .LBB17_3: # %cond.store1
7402; AVX-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
7403; AVX-NEXT:    testb $4, %al
7404; AVX-NEXT:    je .LBB17_6
7405; AVX-NEXT:  .LBB17_5: # %cond.store3
7406; AVX-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
7407; AVX-NEXT:    testb $8, %al
7408; AVX-NEXT:    je .LBB17_8
7409; AVX-NEXT:  .LBB17_7: # %cond.store5
7410; AVX-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
7411; AVX-NEXT:    testb $16, %al
7412; AVX-NEXT:    je .LBB17_10
7413; AVX-NEXT:  .LBB17_9: # %cond.store7
7414; AVX-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
7415; AVX-NEXT:    testb $32, %al
7416; AVX-NEXT:    je .LBB17_12
7417; AVX-NEXT:  .LBB17_11: # %cond.store9
7418; AVX-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
7419; AVX-NEXT:    testb $64, %al
7420; AVX-NEXT:    je .LBB17_14
7421; AVX-NEXT:  .LBB17_13: # %cond.store11
7422; AVX-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
7423; AVX-NEXT:    testb $-128, %al
7424; AVX-NEXT:    je .LBB17_16
7425; AVX-NEXT:  .LBB17_15: # %cond.store13
7426; AVX-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
7427; AVX-NEXT:    retq
7428;
7429; AVX512F-LABEL: truncstore_v8i16_v8i8:
7430; AVX512F:       # %bb.0:
7431; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
7432; AVX512F-NEXT:    vpcmpeqw %xmm2, %xmm1, %xmm1
7433; AVX512F-NEXT:    vpternlogq $15, %zmm1, %zmm1, %zmm1
7434; AVX512F-NEXT:    vpmovsxwq %xmm1, %zmm1
7435; AVX512F-NEXT:    vptestmq %zmm1, %zmm1, %k0
7436; AVX512F-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
7437; AVX512F-NEXT:    kmovw %k0, %eax
7438; AVX512F-NEXT:    testb $1, %al
7439; AVX512F-NEXT:    jne .LBB17_1
7440; AVX512F-NEXT:  # %bb.2: # %else
7441; AVX512F-NEXT:    testb $2, %al
7442; AVX512F-NEXT:    jne .LBB17_3
7443; AVX512F-NEXT:  .LBB17_4: # %else2
7444; AVX512F-NEXT:    testb $4, %al
7445; AVX512F-NEXT:    jne .LBB17_5
7446; AVX512F-NEXT:  .LBB17_6: # %else4
7447; AVX512F-NEXT:    testb $8, %al
7448; AVX512F-NEXT:    jne .LBB17_7
7449; AVX512F-NEXT:  .LBB17_8: # %else6
7450; AVX512F-NEXT:    testb $16, %al
7451; AVX512F-NEXT:    jne .LBB17_9
7452; AVX512F-NEXT:  .LBB17_10: # %else8
7453; AVX512F-NEXT:    testb $32, %al
7454; AVX512F-NEXT:    jne .LBB17_11
7455; AVX512F-NEXT:  .LBB17_12: # %else10
7456; AVX512F-NEXT:    testb $64, %al
7457; AVX512F-NEXT:    jne .LBB17_13
7458; AVX512F-NEXT:  .LBB17_14: # %else12
7459; AVX512F-NEXT:    testb $-128, %al
7460; AVX512F-NEXT:    jne .LBB17_15
7461; AVX512F-NEXT:  .LBB17_16: # %else14
7462; AVX512F-NEXT:    vzeroupper
7463; AVX512F-NEXT:    retq
7464; AVX512F-NEXT:  .LBB17_1: # %cond.store
7465; AVX512F-NEXT:    vpextrb $0, %xmm0, (%rdi)
7466; AVX512F-NEXT:    testb $2, %al
7467; AVX512F-NEXT:    je .LBB17_4
7468; AVX512F-NEXT:  .LBB17_3: # %cond.store1
7469; AVX512F-NEXT:    vpextrb $1, %xmm0, 1(%rdi)
7470; AVX512F-NEXT:    testb $4, %al
7471; AVX512F-NEXT:    je .LBB17_6
7472; AVX512F-NEXT:  .LBB17_5: # %cond.store3
7473; AVX512F-NEXT:    vpextrb $2, %xmm0, 2(%rdi)
7474; AVX512F-NEXT:    testb $8, %al
7475; AVX512F-NEXT:    je .LBB17_8
7476; AVX512F-NEXT:  .LBB17_7: # %cond.store5
7477; AVX512F-NEXT:    vpextrb $3, %xmm0, 3(%rdi)
7478; AVX512F-NEXT:    testb $16, %al
7479; AVX512F-NEXT:    je .LBB17_10
7480; AVX512F-NEXT:  .LBB17_9: # %cond.store7
7481; AVX512F-NEXT:    vpextrb $4, %xmm0, 4(%rdi)
7482; AVX512F-NEXT:    testb $32, %al
7483; AVX512F-NEXT:    je .LBB17_12
7484; AVX512F-NEXT:  .LBB17_11: # %cond.store9
7485; AVX512F-NEXT:    vpextrb $5, %xmm0, 5(%rdi)
7486; AVX512F-NEXT:    testb $64, %al
7487; AVX512F-NEXT:    je .LBB17_14
7488; AVX512F-NEXT:  .LBB17_13: # %cond.store11
7489; AVX512F-NEXT:    vpextrb $6, %xmm0, 6(%rdi)
7490; AVX512F-NEXT:    testb $-128, %al
7491; AVX512F-NEXT:    je .LBB17_16
7492; AVX512F-NEXT:  .LBB17_15: # %cond.store13
7493; AVX512F-NEXT:    vpextrb $7, %xmm0, 7(%rdi)
7494; AVX512F-NEXT:    vzeroupper
7495; AVX512F-NEXT:    retq
7496;
7497; AVX512BW-LABEL: truncstore_v8i16_v8i8:
7498; AVX512BW:       # %bb.0:
7499; AVX512BW-NEXT:    # kill: def $xmm1 killed $xmm1 def $zmm1
7500; AVX512BW-NEXT:    vptestmw %zmm1, %zmm1, %k0
7501; AVX512BW-NEXT:    kshiftlq $56, %k0, %k0
7502; AVX512BW-NEXT:    kshiftrq $56, %k0, %k1
7503; AVX512BW-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
7504; AVX512BW-NEXT:    vmovdqu8 %zmm0, (%rdi) {%k1}
7505; AVX512BW-NEXT:    vzeroupper
7506; AVX512BW-NEXT:    retq
7507;
7508; AVX512BWVL-LABEL: truncstore_v8i16_v8i8:
7509; AVX512BWVL:       # %bb.0:
7510; AVX512BWVL-NEXT:    vptestmw %xmm1, %xmm1, %k1
7511; AVX512BWVL-NEXT:    vpminsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
7512; AVX512BWVL-NEXT:    vpmaxsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
7513; AVX512BWVL-NEXT:    vpmovwb %xmm0, (%rdi) {%k1}
7514; AVX512BWVL-NEXT:    retq
7515  %a = icmp ne <8 x i16> %mask, zeroinitializer
7516  %b = icmp slt <8 x i16> %x, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
7517  %c = select <8 x i1> %b, <8 x i16> %x, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
7518  %d = icmp sgt <8 x i16> %c, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
7519  %e = select <8 x i1> %d, <8 x i16> %c, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128>
7520  %f = trunc <8 x i16> %e to <8 x i8>
7521  call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %f, <8 x i8>* %p, i32 1, <8 x i1> %a)
7522  ret void
7523}
7524
7525declare void @llvm.masked.store.v8i32.p0v8i32(<8 x i32>, <8 x i32>*, i32, <8 x i1>)
7526declare void @llvm.masked.store.v8i16.p0v8i16(<8 x i16>, <8 x i16>*, i32, <8 x i1>)
7527declare void @llvm.masked.store.v8i8.p0v8i8(<8 x i8>, <8 x i8>*, i32, <8 x i1>)
7528declare void @llvm.masked.store.v4i32.p0v4i32(<4 x i32>, <4 x i32>*, i32, <4 x i1>)
7529declare void @llvm.masked.store.v4i16.p0v4i16(<4 x i16>, <4 x i16>*, i32, <4 x i1>)
7530declare void @llvm.masked.store.v4i8.p0v4i8(<4 x i8>, <4 x i8>*, i32, <4 x i1>)
7531declare void @llvm.masked.store.v2i32.p0v2i32(<2 x i32>, <2 x i32>*, i32, <2 x i1>)
7532declare void @llvm.masked.store.v2i16.p0v2i16(<2 x i16>, <2 x i16>*, i32, <2 x i1>)
7533declare void @llvm.masked.store.v2i8.p0v2i8(<2 x i8>, <2 x i8>*, i32, <2 x i1>)
7534declare void @llvm.masked.store.v16i16.p0v16i16(<16 x i16>, <16 x i16>*, i32, <16 x i1>)
7535declare void @llvm.masked.store.v16i8.p0v16i8(<16 x i8>, <16 x i8>*, i32, <16 x i1>)
7536declare void @llvm.masked.store.v32i8.p0v32i8(<32 x i8>, <32 x i8>*, i32, <32 x i1>)
7537