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=ALL --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=ALL,AVX,AVX2,AVX2-SLOW
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fast-variable-shuffle | FileCheck %s --check-prefixes=ALL,AVX,AVX2,AVX2-FAST
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+fast-variable-shuffle | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512BW
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+fast-variable-shuffle | FileCheck %s --check-prefixes=ALL,AVX,AVX512,AVX512DQ
9
10;
11; add
12;
13
14define <4 x i32> @trunc_add_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {
15; SSE-LABEL: trunc_add_v4i64_v4i32:
16; SSE:       # %bb.0:
17; SSE-NEXT:    paddq %xmm3, %xmm1
18; SSE-NEXT:    paddq %xmm2, %xmm0
19; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
20; SSE-NEXT:    retq
21;
22; AVX1-LABEL: trunc_add_v4i64_v4i32:
23; AVX1:       # %bb.0:
24; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
25; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
26; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
27; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
28; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
29; AVX1-NEXT:    vzeroupper
30; AVX1-NEXT:    retq
31;
32; AVX2-SLOW-LABEL: trunc_add_v4i64_v4i32:
33; AVX2-SLOW:       # %bb.0:
34; AVX2-SLOW-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
35; AVX2-SLOW-NEXT:    vextracti128 $1, %ymm0, %xmm1
36; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
37; AVX2-SLOW-NEXT:    vzeroupper
38; AVX2-SLOW-NEXT:    retq
39;
40; AVX2-FAST-LABEL: trunc_add_v4i64_v4i32:
41; AVX2-FAST:       # %bb.0:
42; AVX2-FAST-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
43; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
44; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
45; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
46; AVX2-FAST-NEXT:    vzeroupper
47; AVX2-FAST-NEXT:    retq
48;
49; AVX512-LABEL: trunc_add_v4i64_v4i32:
50; AVX512:       # %bb.0:
51; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
52; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
53; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
54; AVX512-NEXT:    vzeroupper
55; AVX512-NEXT:    retq
56  %1 = add <4 x i64> %a0, %a1
57  %2 = trunc <4 x i64> %1 to <4 x i32>
58  ret <4 x i32> %2
59}
60
61define <8 x i16> @trunc_add_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {
62; SSE-LABEL: trunc_add_v8i64_v8i16:
63; SSE:       # %bb.0:
64; SSE-NEXT:    paddq %xmm6, %xmm2
65; SSE-NEXT:    paddq %xmm7, %xmm3
66; SSE-NEXT:    paddq %xmm4, %xmm0
67; SSE-NEXT:    paddq %xmm5, %xmm1
68; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
69; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
70; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
71; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
72; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
73; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
74; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
75; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
76; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
77; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
78; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
79; SSE-NEXT:    retq
80;
81; AVX1-LABEL: trunc_add_v8i64_v8i16:
82; AVX1:       # %bb.0:
83; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm4
84; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
85; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
86; AVX1-NEXT:    vpaddq %xmm2, %xmm0, %xmm0
87; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm2
88; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
89; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
90; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1
91; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
92; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7]
93; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]
94; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
95; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7]
96; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0],xmm3[1,2,3],xmm4[4],xmm3[5,6,7]
97; AVX1-NEXT:    vpackusdw %xmm0, %xmm2, %xmm0
98; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
99; AVX1-NEXT:    vzeroupper
100; AVX1-NEXT:    retq
101;
102; AVX2-SLOW-LABEL: trunc_add_v8i64_v8i16:
103; AVX2-SLOW:       # %bb.0:
104; AVX2-SLOW-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
105; AVX2-SLOW-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
106; AVX2-SLOW-NEXT:    vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
107; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
108; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
109; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
110; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
111; AVX2-SLOW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
112; AVX2-SLOW-NEXT:    vzeroupper
113; AVX2-SLOW-NEXT:    retq
114;
115; AVX2-FAST-LABEL: trunc_add_v8i64_v8i16:
116; AVX2-FAST:       # %bb.0:
117; AVX2-FAST-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
118; AVX2-FAST-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
119; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
120; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
121; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
122; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
123; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
124; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
125; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
126; AVX2-FAST-NEXT:    vzeroupper
127; AVX2-FAST-NEXT:    retq
128;
129; AVX512-LABEL: trunc_add_v8i64_v8i16:
130; AVX512:       # %bb.0:
131; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
132; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
133; AVX512-NEXT:    vzeroupper
134; AVX512-NEXT:    retq
135  %1 = add <8 x i64> %a0, %a1
136  %2 = trunc <8 x i64> %1 to <8 x i16>
137  ret <8 x i16> %2
138}
139
140define <8 x i16> @trunc_add_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {
141; SSE-LABEL: trunc_add_v8i32_v8i16:
142; SSE:       # %bb.0:
143; SSE-NEXT:    paddd %xmm2, %xmm0
144; SSE-NEXT:    paddd %xmm3, %xmm1
145; SSE-NEXT:    pslld $16, %xmm1
146; SSE-NEXT:    psrad $16, %xmm1
147; SSE-NEXT:    pslld $16, %xmm0
148; SSE-NEXT:    psrad $16, %xmm0
149; SSE-NEXT:    packssdw %xmm1, %xmm0
150; SSE-NEXT:    retq
151;
152; AVX1-LABEL: trunc_add_v8i32_v8i16:
153; AVX1:       # %bb.0:
154; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm2
155; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
156; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
157; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
158; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
159; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
160; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
161; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
162; AVX1-NEXT:    vzeroupper
163; AVX1-NEXT:    retq
164;
165; AVX2-LABEL: trunc_add_v8i32_v8i16:
166; AVX2:       # %bb.0:
167; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
168; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
169; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
170; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
171; AVX2-NEXT:    vzeroupper
172; AVX2-NEXT:    retq
173;
174; AVX512-LABEL: trunc_add_v8i32_v8i16:
175; AVX512:       # %bb.0:
176; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
177; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
178; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
179; AVX512-NEXT:    vzeroupper
180; AVX512-NEXT:    retq
181  %1 = add <8 x i32> %a0, %a1
182  %2 = trunc <8 x i32> %1 to <8 x i16>
183  ret <8 x i16> %2
184}
185
186define <16 x i8> @trunc_add_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {
187; SSE-LABEL: trunc_add_v16i64_v16i8:
188; SSE:       # %bb.0:
189; SSE-NEXT:    paddq {{[0-9]+}}(%rsp), %xmm0
190; SSE-NEXT:    paddq {{[0-9]+}}(%rsp), %xmm1
191; SSE-NEXT:    paddq {{[0-9]+}}(%rsp), %xmm2
192; SSE-NEXT:    paddq {{[0-9]+}}(%rsp), %xmm3
193; SSE-NEXT:    paddq {{[0-9]+}}(%rsp), %xmm4
194; SSE-NEXT:    paddq {{[0-9]+}}(%rsp), %xmm5
195; SSE-NEXT:    paddq {{[0-9]+}}(%rsp), %xmm6
196; SSE-NEXT:    paddq {{[0-9]+}}(%rsp), %xmm7
197; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
198; SSE-NEXT:    pand %xmm8, %xmm7
199; SSE-NEXT:    pand %xmm8, %xmm6
200; SSE-NEXT:    packuswb %xmm7, %xmm6
201; SSE-NEXT:    pand %xmm8, %xmm5
202; SSE-NEXT:    pand %xmm8, %xmm4
203; SSE-NEXT:    packuswb %xmm5, %xmm4
204; SSE-NEXT:    packuswb %xmm6, %xmm4
205; SSE-NEXT:    pand %xmm8, %xmm3
206; SSE-NEXT:    pand %xmm8, %xmm2
207; SSE-NEXT:    packuswb %xmm3, %xmm2
208; SSE-NEXT:    pand %xmm8, %xmm1
209; SSE-NEXT:    pand %xmm8, %xmm0
210; SSE-NEXT:    packuswb %xmm1, %xmm0
211; SSE-NEXT:    packuswb %xmm2, %xmm0
212; SSE-NEXT:    packuswb %xmm4, %xmm0
213; SSE-NEXT:    retq
214;
215; AVX1-LABEL: trunc_add_v16i64_v16i8:
216; AVX1:       # %bb.0:
217; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm8
218; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm4
219; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
220; AVX1-NEXT:    vpaddq %xmm4, %xmm0, %xmm0
221; AVX1-NEXT:    vpaddq %xmm5, %xmm1, %xmm4
222; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm5
223; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
224; AVX1-NEXT:    vpaddq %xmm5, %xmm1, %xmm1
225; AVX1-NEXT:    vpaddq %xmm6, %xmm2, %xmm5
226; AVX1-NEXT:    vextractf128 $1, %ymm6, %xmm6
227; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
228; AVX1-NEXT:    vpaddq %xmm6, %xmm2, %xmm2
229; AVX1-NEXT:    vpaddq %xmm7, %xmm3, %xmm6
230; AVX1-NEXT:    vextractf128 $1, %ymm7, %xmm7
231; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
232; AVX1-NEXT:    vpaddq %xmm7, %xmm3, %xmm3
233; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [255,255]
234; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
235; AVX1-NEXT:    vpand %xmm7, %xmm6, %xmm6
236; AVX1-NEXT:    vpackusdw %xmm3, %xmm6, %xmm3
237; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
238; AVX1-NEXT:    vpand %xmm7, %xmm5, %xmm5
239; AVX1-NEXT:    vpackusdw %xmm2, %xmm5, %xmm2
240; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
241; AVX1-NEXT:    vpand %xmm7, %xmm1, %xmm1
242; AVX1-NEXT:    vpand %xmm7, %xmm4, %xmm3
243; AVX1-NEXT:    vpackusdw %xmm1, %xmm3, %xmm1
244; AVX1-NEXT:    vpand %xmm7, %xmm0, %xmm0
245; AVX1-NEXT:    vpand %xmm7, %xmm8, %xmm3
246; AVX1-NEXT:    vpackusdw %xmm0, %xmm3, %xmm0
247; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
248; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
249; AVX1-NEXT:    vzeroupper
250; AVX1-NEXT:    retq
251;
252; AVX2-SLOW-LABEL: trunc_add_v16i64_v16i8:
253; AVX2-SLOW:       # %bb.0:
254; AVX2-SLOW-NEXT:    vpaddq %ymm5, %ymm1, %ymm1
255; AVX2-SLOW-NEXT:    vpaddq %ymm4, %ymm0, %ymm0
256; AVX2-SLOW-NEXT:    vpaddq %ymm7, %ymm3, %ymm3
257; AVX2-SLOW-NEXT:    vpaddq %ymm6, %ymm2, %ymm2
258; AVX2-SLOW-NEXT:    vperm2i128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
259; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
260; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
261; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
262; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
263; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
264; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
265; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
266; AVX2-SLOW-NEXT:    vperm2i128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
267; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
268; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
269; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
270; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
271; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
272; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
273; AVX2-SLOW-NEXT:    vzeroupper
274; AVX2-SLOW-NEXT:    retq
275;
276; AVX2-FAST-LABEL: trunc_add_v16i64_v16i8:
277; AVX2-FAST:       # %bb.0:
278; AVX2-FAST-NEXT:    vpaddq %ymm5, %ymm1, %ymm1
279; AVX2-FAST-NEXT:    vpaddq %ymm4, %ymm0, %ymm0
280; AVX2-FAST-NEXT:    vpaddq %ymm7, %ymm3, %ymm3
281; AVX2-FAST-NEXT:    vpaddq %ymm6, %ymm2, %ymm2
282; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
283; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
284; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
285; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
286; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
287; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
288; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
289; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
290; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
291; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
292; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
293; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
294; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
295; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
296; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
297; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
298; AVX2-FAST-NEXT:    vzeroupper
299; AVX2-FAST-NEXT:    retq
300;
301; AVX512-LABEL: trunc_add_v16i64_v16i8:
302; AVX512:       # %bb.0:
303; AVX512-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
304; AVX512-NEXT:    vpaddq %zmm3, %zmm1, %zmm1
305; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
306; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
307; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
308; AVX512-NEXT:    vzeroupper
309; AVX512-NEXT:    retq
310  %1 = add <16 x i64> %a0, %a1
311  %2 = trunc <16 x i64> %1 to <16 x i8>
312  ret <16 x i8> %2
313}
314
315define <16 x i8> @trunc_add_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {
316; SSE-LABEL: trunc_add_v16i32_v16i8:
317; SSE:       # %bb.0:
318; SSE-NEXT:    paddd %xmm4, %xmm0
319; SSE-NEXT:    paddd %xmm5, %xmm1
320; SSE-NEXT:    paddd %xmm6, %xmm2
321; SSE-NEXT:    paddd %xmm7, %xmm3
322; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
323; SSE-NEXT:    pand %xmm4, %xmm3
324; SSE-NEXT:    pand %xmm4, %xmm2
325; SSE-NEXT:    packuswb %xmm3, %xmm2
326; SSE-NEXT:    pand %xmm4, %xmm1
327; SSE-NEXT:    pand %xmm4, %xmm0
328; SSE-NEXT:    packuswb %xmm1, %xmm0
329; SSE-NEXT:    packuswb %xmm2, %xmm0
330; SSE-NEXT:    retq
331;
332; AVX1-LABEL: trunc_add_v16i32_v16i8:
333; AVX1:       # %bb.0:
334; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm4
335; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
336; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
337; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
338; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm2
339; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
340; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
341; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
342; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255]
343; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
344; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
345; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
346; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
347; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm2
348; AVX1-NEXT:    vpackusdw %xmm0, %xmm2, %xmm0
349; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
350; AVX1-NEXT:    vzeroupper
351; AVX1-NEXT:    retq
352;
353; AVX2-LABEL: trunc_add_v16i32_v16i8:
354; AVX2:       # %bb.0:
355; AVX2-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
356; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
357; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
358; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
359; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
360; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
361; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
362; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
363; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
364; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
365; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
366; AVX2-NEXT:    vzeroupper
367; AVX2-NEXT:    retq
368;
369; AVX512-LABEL: trunc_add_v16i32_v16i8:
370; AVX512:       # %bb.0:
371; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
372; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
373; AVX512-NEXT:    vzeroupper
374; AVX512-NEXT:    retq
375  %1 = add <16 x i32> %a0, %a1
376  %2 = trunc <16 x i32> %1 to <16 x i8>
377  ret <16 x i8> %2
378}
379
380define <16 x i8> @trunc_add_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {
381; SSE-LABEL: trunc_add_v16i16_v16i8:
382; SSE:       # %bb.0:
383; SSE-NEXT:    paddw %xmm2, %xmm0
384; SSE-NEXT:    paddw %xmm3, %xmm1
385; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
386; SSE-NEXT:    pand %xmm2, %xmm1
387; SSE-NEXT:    pand %xmm2, %xmm0
388; SSE-NEXT:    packuswb %xmm1, %xmm0
389; SSE-NEXT:    retq
390;
391; AVX1-LABEL: trunc_add_v16i16_v16i8:
392; AVX1:       # %bb.0:
393; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm2
394; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
395; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
396; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
397; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
398; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
399; AVX1-NEXT:    vpand %xmm1, %xmm2, %xmm1
400; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
401; AVX1-NEXT:    vzeroupper
402; AVX1-NEXT:    retq
403;
404; AVX2-LABEL: trunc_add_v16i16_v16i8:
405; AVX2:       # %bb.0:
406; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
407; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
408; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
409; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
410; AVX2-NEXT:    vzeroupper
411; AVX2-NEXT:    retq
412;
413; AVX512F-LABEL: trunc_add_v16i16_v16i8:
414; AVX512F:       # %bb.0:
415; AVX512F-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
416; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
417; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
418; AVX512F-NEXT:    vzeroupper
419; AVX512F-NEXT:    retq
420;
421; AVX512BW-LABEL: trunc_add_v16i16_v16i8:
422; AVX512BW:       # %bb.0:
423; AVX512BW-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
424; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
425; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
426; AVX512BW-NEXT:    vzeroupper
427; AVX512BW-NEXT:    retq
428;
429; AVX512DQ-LABEL: trunc_add_v16i16_v16i8:
430; AVX512DQ:       # %bb.0:
431; AVX512DQ-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
432; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
433; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
434; AVX512DQ-NEXT:    vzeroupper
435; AVX512DQ-NEXT:    retq
436  %1 = add <16 x i16> %a0, %a1
437  %2 = trunc <16 x i16> %1 to <16 x i8>
438  ret <16 x i8> %2
439}
440
441define <8 x i16> @trunc_add_v8i32_v8i16_sext_8i8(<16 x i8> %a0, <8 x i32> %a1) {
442; SSE-LABEL: trunc_add_v8i32_v8i16_sext_8i8:
443; SSE:       # %bb.0:
444; SSE-NEXT:    pslld $16, %xmm2
445; SSE-NEXT:    psrad $16, %xmm2
446; SSE-NEXT:    pslld $16, %xmm1
447; SSE-NEXT:    psrad $16, %xmm1
448; SSE-NEXT:    packssdw %xmm2, %xmm1
449; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
450; SSE-NEXT:    psraw $8, %xmm0
451; SSE-NEXT:    paddw %xmm1, %xmm0
452; SSE-NEXT:    retq
453;
454; AVX1-LABEL: trunc_add_v8i32_v8i16_sext_8i8:
455; AVX1:       # %bb.0:
456; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
457; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
458; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
459; AVX1-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
460; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
461; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
462; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
463; AVX1-NEXT:    vzeroupper
464; AVX1-NEXT:    retq
465;
466; AVX2-LABEL: trunc_add_v8i32_v8i16_sext_8i8:
467; AVX2:       # %bb.0:
468; AVX2-NEXT:    vpmovsxbw %xmm0, %xmm0
469; AVX2-NEXT:    vpshufb {{.*#+}} ymm1 = ymm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
470; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
471; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
472; AVX2-NEXT:    vzeroupper
473; AVX2-NEXT:    retq
474;
475; AVX512-LABEL: trunc_add_v8i32_v8i16_sext_8i8:
476; AVX512:       # %bb.0:
477; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
478; AVX512-NEXT:    vpmovdw %zmm1, %ymm1
479; AVX512-NEXT:    vpmovsxbw %xmm0, %xmm0
480; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
481; AVX512-NEXT:    vzeroupper
482; AVX512-NEXT:    retq
483  %1 = shufflevector <16 x i8> %a0, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
484  %2 = sext <8 x i8> %1 to <8 x i32>
485  %3 = add <8 x i32> %2, %a1
486  %4 = trunc <8 x i32> %3 to <8 x i16>
487  ret <8 x i16> %4
488}
489
490;
491; add to constant
492;
493
494define <4 x i32> @trunc_add_const_v4i64_v4i32(<4 x i64> %a0) nounwind {
495; SSE-LABEL: trunc_add_const_v4i64_v4i32:
496; SSE:       # %bb.0:
497; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
498; SSE-NEXT:    paddd {{.*}}(%rip), %xmm0
499; SSE-NEXT:    retq
500;
501; AVX1-LABEL: trunc_add_const_v4i64_v4i32:
502; AVX1:       # %bb.0:
503; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
504; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
505; AVX1-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
506; AVX1-NEXT:    vzeroupper
507; AVX1-NEXT:    retq
508;
509; AVX2-SLOW-LABEL: trunc_add_const_v4i64_v4i32:
510; AVX2-SLOW:       # %bb.0:
511; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
512; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
513; AVX2-SLOW-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
514; AVX2-SLOW-NEXT:    vzeroupper
515; AVX2-SLOW-NEXT:    retq
516;
517; AVX2-FAST-LABEL: trunc_add_const_v4i64_v4i32:
518; AVX2-FAST:       # %bb.0:
519; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
520; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
521; AVX2-FAST-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
522; AVX2-FAST-NEXT:    vzeroupper
523; AVX2-FAST-NEXT:    retq
524;
525; AVX512-LABEL: trunc_add_const_v4i64_v4i32:
526; AVX512:       # %bb.0:
527; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
528; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
529; AVX512-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
530; AVX512-NEXT:    vzeroupper
531; AVX512-NEXT:    retq
532  %1 = add <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>
533  %2 = trunc <4 x i64> %1 to <4 x i32>
534  ret <4 x i32> %2
535}
536
537define <8 x i16> @trunc_add_const_v8i64_v8i16(<8 x i64> %a0) nounwind {
538; SSE-LABEL: trunc_add_const_v8i64_v8i16:
539; SSE:       # %bb.0:
540; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
541; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
542; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
543; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
544; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
545; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
546; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
547; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
548; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
549; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
550; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
551; SSE-NEXT:    paddw {{.*}}(%rip), %xmm0
552; SSE-NEXT:    retq
553;
554; AVX1-LABEL: trunc_add_const_v8i64_v8i16:
555; AVX1:       # %bb.0:
556; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
557; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
558; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
559; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
560; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
561; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
562; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
563; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
564; AVX1-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
565; AVX1-NEXT:    vzeroupper
566; AVX1-NEXT:    retq
567;
568; AVX2-SLOW-LABEL: trunc_add_const_v8i64_v8i16:
569; AVX2-SLOW:       # %bb.0:
570; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
571; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
572; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
573; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
574; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
575; AVX2-SLOW-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
576; AVX2-SLOW-NEXT:    vzeroupper
577; AVX2-SLOW-NEXT:    retq
578;
579; AVX2-FAST-LABEL: trunc_add_const_v8i64_v8i16:
580; AVX2-FAST:       # %bb.0:
581; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
582; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
583; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
584; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
585; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
586; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
587; AVX2-FAST-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
588; AVX2-FAST-NEXT:    vzeroupper
589; AVX2-FAST-NEXT:    retq
590;
591; AVX512-LABEL: trunc_add_const_v8i64_v8i16:
592; AVX512:       # %bb.0:
593; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
594; AVX512-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
595; AVX512-NEXT:    vzeroupper
596; AVX512-NEXT:    retq
597  %1 = add <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>
598  %2 = trunc <8 x i64> %1 to <8 x i16>
599  ret <8 x i16> %2
600}
601
602define <8 x i16> @trunc_add_const_v8i32_v8i16(<8 x i32> %a0) nounwind {
603; SSE-LABEL: trunc_add_const_v8i32_v8i16:
604; SSE:       # %bb.0:
605; SSE-NEXT:    pslld $16, %xmm1
606; SSE-NEXT:    psrad $16, %xmm1
607; SSE-NEXT:    pslld $16, %xmm0
608; SSE-NEXT:    psrad $16, %xmm0
609; SSE-NEXT:    packssdw %xmm1, %xmm0
610; SSE-NEXT:    paddw {{.*}}(%rip), %xmm0
611; SSE-NEXT:    retq
612;
613; AVX1-LABEL: trunc_add_const_v8i32_v8i16:
614; AVX1:       # %bb.0:
615; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
616; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
617; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
618; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
619; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
620; AVX1-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
621; AVX1-NEXT:    vzeroupper
622; AVX1-NEXT:    retq
623;
624; AVX2-LABEL: trunc_add_const_v8i32_v8i16:
625; AVX2:       # %bb.0:
626; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
627; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
628; AVX2-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
629; AVX2-NEXT:    vzeroupper
630; AVX2-NEXT:    retq
631;
632; AVX512-LABEL: trunc_add_const_v8i32_v8i16:
633; AVX512:       # %bb.0:
634; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
635; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
636; AVX512-NEXT:    vpaddw {{.*}}(%rip), %xmm0, %xmm0
637; AVX512-NEXT:    vzeroupper
638; AVX512-NEXT:    retq
639  %1 = add <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
640  %2 = trunc <8 x i32> %1 to <8 x i16>
641  ret <8 x i16> %2
642}
643
644define <16 x i8> @trunc_add_const_v16i64_v16i8(<16 x i64> %a0) nounwind {
645; SSE-LABEL: trunc_add_const_v16i64_v16i8:
646; SSE:       # %bb.0:
647; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
648; SSE-NEXT:    pand %xmm8, %xmm7
649; SSE-NEXT:    pand %xmm8, %xmm6
650; SSE-NEXT:    packuswb %xmm7, %xmm6
651; SSE-NEXT:    pand %xmm8, %xmm5
652; SSE-NEXT:    pand %xmm8, %xmm4
653; SSE-NEXT:    packuswb %xmm5, %xmm4
654; SSE-NEXT:    packuswb %xmm6, %xmm4
655; SSE-NEXT:    pand %xmm8, %xmm3
656; SSE-NEXT:    pand %xmm8, %xmm2
657; SSE-NEXT:    packuswb %xmm3, %xmm2
658; SSE-NEXT:    pand %xmm8, %xmm1
659; SSE-NEXT:    pand %xmm8, %xmm0
660; SSE-NEXT:    packuswb %xmm1, %xmm0
661; SSE-NEXT:    packuswb %xmm2, %xmm0
662; SSE-NEXT:    packuswb %xmm4, %xmm0
663; SSE-NEXT:    paddb {{.*}}(%rip), %xmm0
664; SSE-NEXT:    retq
665;
666; AVX1-LABEL: trunc_add_const_v16i64_v16i8:
667; AVX1:       # %bb.0:
668; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [255,255,255,255]
669; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
670; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
671; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
672; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
673; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
674; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
675; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
676; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1
677; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
678; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
679; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0
680; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
681; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
682; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
683; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
684; AVX1-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
685; AVX1-NEXT:    vzeroupper
686; AVX1-NEXT:    retq
687;
688; AVX2-SLOW-LABEL: trunc_add_const_v16i64_v16i8:
689; AVX2-SLOW:       # %bb.0:
690; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
691; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
692; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
693; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
694; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
695; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
696; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
697; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
698; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
699; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
700; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
701; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
702; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
703; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
704; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
705; AVX2-SLOW-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
706; AVX2-SLOW-NEXT:    vzeroupper
707; AVX2-SLOW-NEXT:    retq
708;
709; AVX2-FAST-LABEL: trunc_add_const_v16i64_v16i8:
710; AVX2-FAST:       # %bb.0:
711; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
712; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
713; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
714; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
715; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
716; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
717; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
718; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
719; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
720; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
721; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
722; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
723; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
724; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
725; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
726; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
727; AVX2-FAST-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
728; AVX2-FAST-NEXT:    vzeroupper
729; AVX2-FAST-NEXT:    retq
730;
731; AVX512-LABEL: trunc_add_const_v16i64_v16i8:
732; AVX512:       # %bb.0:
733; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
734; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
735; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
736; AVX512-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
737; AVX512-NEXT:    vzeroupper
738; AVX512-NEXT:    retq
739  %1 = add <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>
740  %2 = trunc <16 x i64> %1 to <16 x i8>
741  ret <16 x i8> %2
742}
743
744define <16 x i8> @trunc_add_const_v16i32_v16i8(<16 x i32> %a0) nounwind {
745; SSE-LABEL: trunc_add_const_v16i32_v16i8:
746; SSE:       # %bb.0:
747; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
748; SSE-NEXT:    pand %xmm4, %xmm3
749; SSE-NEXT:    pand %xmm4, %xmm2
750; SSE-NEXT:    packuswb %xmm3, %xmm2
751; SSE-NEXT:    pand %xmm4, %xmm1
752; SSE-NEXT:    pand %xmm4, %xmm0
753; SSE-NEXT:    packuswb %xmm1, %xmm0
754; SSE-NEXT:    packuswb %xmm2, %xmm0
755; SSE-NEXT:    paddb {{.*}}(%rip), %xmm0
756; SSE-NEXT:    retq
757;
758; AVX1-LABEL: trunc_add_const_v16i32_v16i8:
759; AVX1:       # %bb.0:
760; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
761; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
762; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
763; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
764; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
765; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
766; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
767; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
768; AVX1-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
769; AVX1-NEXT:    vzeroupper
770; AVX1-NEXT:    retq
771;
772; AVX2-LABEL: trunc_add_const_v16i32_v16i8:
773; AVX2:       # %bb.0:
774; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
775; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
776; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
777; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
778; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
779; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
780; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
781; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
782; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
783; AVX2-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
784; AVX2-NEXT:    vzeroupper
785; AVX2-NEXT:    retq
786;
787; AVX512-LABEL: trunc_add_const_v16i32_v16i8:
788; AVX512:       # %bb.0:
789; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
790; AVX512-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
791; AVX512-NEXT:    vzeroupper
792; AVX512-NEXT:    retq
793  %1 = add <16 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
794  %2 = trunc <16 x i32> %1 to <16 x i8>
795  ret <16 x i8> %2
796}
797
798define <16 x i8> @trunc_add_const_v16i16_v16i8(<16 x i16> %a0) nounwind {
799; SSE-LABEL: trunc_add_const_v16i16_v16i8:
800; SSE:       # %bb.0:
801; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
802; SSE-NEXT:    pand %xmm2, %xmm1
803; SSE-NEXT:    pand %xmm2, %xmm0
804; SSE-NEXT:    packuswb %xmm1, %xmm0
805; SSE-NEXT:    paddb {{.*}}(%rip), %xmm0
806; SSE-NEXT:    retq
807;
808; AVX1-LABEL: trunc_add_const_v16i16_v16i8:
809; AVX1:       # %bb.0:
810; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
811; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
812; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
813; AVX1-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
814; AVX1-NEXT:    vzeroupper
815; AVX1-NEXT:    retq
816;
817; AVX2-LABEL: trunc_add_const_v16i16_v16i8:
818; AVX2:       # %bb.0:
819; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
820; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
821; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
822; AVX2-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
823; AVX2-NEXT:    vzeroupper
824; AVX2-NEXT:    retq
825;
826; AVX512F-LABEL: trunc_add_const_v16i16_v16i8:
827; AVX512F:       # %bb.0:
828; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
829; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
830; AVX512F-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
831; AVX512F-NEXT:    vzeroupper
832; AVX512F-NEXT:    retq
833;
834; AVX512BW-LABEL: trunc_add_const_v16i16_v16i8:
835; AVX512BW:       # %bb.0:
836; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
837; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
838; AVX512BW-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
839; AVX512BW-NEXT:    vzeroupper
840; AVX512BW-NEXT:    retq
841;
842; AVX512DQ-LABEL: trunc_add_const_v16i16_v16i8:
843; AVX512DQ:       # %bb.0:
844; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
845; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
846; AVX512DQ-NEXT:    vpaddb {{.*}}(%rip), %xmm0, %xmm0
847; AVX512DQ-NEXT:    vzeroupper
848; AVX512DQ-NEXT:    retq
849  %1 = add <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
850  %2 = trunc <16 x i16> %1 to <16 x i8>
851  ret <16 x i8> %2
852}
853
854;
855; sub
856;
857
858define <4 x i32> @trunc_sub_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {
859; SSE-LABEL: trunc_sub_v4i64_v4i32:
860; SSE:       # %bb.0:
861; SSE-NEXT:    psubq %xmm3, %xmm1
862; SSE-NEXT:    psubq %xmm2, %xmm0
863; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
864; SSE-NEXT:    retq
865;
866; AVX1-LABEL: trunc_sub_v4i64_v4i32:
867; AVX1:       # %bb.0:
868; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
869; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
870; AVX1-NEXT:    vpsubq %xmm2, %xmm3, %xmm2
871; AVX1-NEXT:    vpsubq %xmm1, %xmm0, %xmm0
872; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
873; AVX1-NEXT:    vzeroupper
874; AVX1-NEXT:    retq
875;
876; AVX2-SLOW-LABEL: trunc_sub_v4i64_v4i32:
877; AVX2-SLOW:       # %bb.0:
878; AVX2-SLOW-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
879; AVX2-SLOW-NEXT:    vextracti128 $1, %ymm0, %xmm1
880; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
881; AVX2-SLOW-NEXT:    vzeroupper
882; AVX2-SLOW-NEXT:    retq
883;
884; AVX2-FAST-LABEL: trunc_sub_v4i64_v4i32:
885; AVX2-FAST:       # %bb.0:
886; AVX2-FAST-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
887; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
888; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
889; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
890; AVX2-FAST-NEXT:    vzeroupper
891; AVX2-FAST-NEXT:    retq
892;
893; AVX512-LABEL: trunc_sub_v4i64_v4i32:
894; AVX512:       # %bb.0:
895; AVX512-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
896; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
897; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
898; AVX512-NEXT:    vzeroupper
899; AVX512-NEXT:    retq
900  %1 = sub <4 x i64> %a0, %a1
901  %2 = trunc <4 x i64> %1 to <4 x i32>
902  ret <4 x i32> %2
903}
904
905define <8 x i16> @trunc_sub_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {
906; SSE-LABEL: trunc_sub_v8i64_v8i16:
907; SSE:       # %bb.0:
908; SSE-NEXT:    psubq %xmm6, %xmm2
909; SSE-NEXT:    psubq %xmm7, %xmm3
910; SSE-NEXT:    psubq %xmm4, %xmm0
911; SSE-NEXT:    psubq %xmm5, %xmm1
912; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
913; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
914; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
915; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
916; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
917; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
918; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
919; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
920; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
921; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
922; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
923; SSE-NEXT:    retq
924;
925; AVX1-LABEL: trunc_sub_v8i64_v8i16:
926; AVX1:       # %bb.0:
927; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm4
928; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
929; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
930; AVX1-NEXT:    vpsubq %xmm2, %xmm0, %xmm0
931; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm2
932; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
933; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
934; AVX1-NEXT:    vpsubq %xmm3, %xmm1, %xmm1
935; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
936; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7]
937; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]
938; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
939; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7]
940; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0],xmm3[1,2,3],xmm4[4],xmm3[5,6,7]
941; AVX1-NEXT:    vpackusdw %xmm0, %xmm2, %xmm0
942; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
943; AVX1-NEXT:    vzeroupper
944; AVX1-NEXT:    retq
945;
946; AVX2-SLOW-LABEL: trunc_sub_v8i64_v8i16:
947; AVX2-SLOW:       # %bb.0:
948; AVX2-SLOW-NEXT:    vpsubq %ymm3, %ymm1, %ymm1
949; AVX2-SLOW-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
950; AVX2-SLOW-NEXT:    vperm2i128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
951; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
952; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
953; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
954; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
955; AVX2-SLOW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
956; AVX2-SLOW-NEXT:    vzeroupper
957; AVX2-SLOW-NEXT:    retq
958;
959; AVX2-FAST-LABEL: trunc_sub_v8i64_v8i16:
960; AVX2-FAST:       # %bb.0:
961; AVX2-FAST-NEXT:    vpsubq %ymm3, %ymm1, %ymm1
962; AVX2-FAST-NEXT:    vpsubq %ymm2, %ymm0, %ymm0
963; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
964; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
965; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
966; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
967; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
968; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
969; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
970; AVX2-FAST-NEXT:    vzeroupper
971; AVX2-FAST-NEXT:    retq
972;
973; AVX512-LABEL: trunc_sub_v8i64_v8i16:
974; AVX512:       # %bb.0:
975; AVX512-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
976; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
977; AVX512-NEXT:    vzeroupper
978; AVX512-NEXT:    retq
979  %1 = sub <8 x i64> %a0, %a1
980  %2 = trunc <8 x i64> %1 to <8 x i16>
981  ret <8 x i16> %2
982}
983
984define <8 x i16> @trunc_sub_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {
985; SSE-LABEL: trunc_sub_v8i32_v8i16:
986; SSE:       # %bb.0:
987; SSE-NEXT:    psubd %xmm2, %xmm0
988; SSE-NEXT:    psubd %xmm3, %xmm1
989; SSE-NEXT:    pslld $16, %xmm1
990; SSE-NEXT:    psrad $16, %xmm1
991; SSE-NEXT:    pslld $16, %xmm0
992; SSE-NEXT:    psrad $16, %xmm0
993; SSE-NEXT:    packssdw %xmm1, %xmm0
994; SSE-NEXT:    retq
995;
996; AVX1-LABEL: trunc_sub_v8i32_v8i16:
997; AVX1:       # %bb.0:
998; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm2
999; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1000; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1001; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
1002; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1003; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1004; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
1005; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1006; AVX1-NEXT:    vzeroupper
1007; AVX1-NEXT:    retq
1008;
1009; AVX2-LABEL: trunc_sub_v8i32_v8i16:
1010; AVX2:       # %bb.0:
1011; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1012; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
1013; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1014; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1015; AVX2-NEXT:    vzeroupper
1016; AVX2-NEXT:    retq
1017;
1018; AVX512-LABEL: trunc_sub_v8i32_v8i16:
1019; AVX512:       # %bb.0:
1020; AVX512-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1021; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
1022; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1023; AVX512-NEXT:    vzeroupper
1024; AVX512-NEXT:    retq
1025  %1 = sub <8 x i32> %a0, %a1
1026  %2 = trunc <8 x i32> %1 to <8 x i16>
1027  ret <8 x i16> %2
1028}
1029
1030define <16 x i8> @trunc_sub_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {
1031; SSE-LABEL: trunc_sub_v16i64_v16i8:
1032; SSE:       # %bb.0:
1033; SSE-NEXT:    psubq {{[0-9]+}}(%rsp), %xmm0
1034; SSE-NEXT:    psubq {{[0-9]+}}(%rsp), %xmm1
1035; SSE-NEXT:    psubq {{[0-9]+}}(%rsp), %xmm2
1036; SSE-NEXT:    psubq {{[0-9]+}}(%rsp), %xmm3
1037; SSE-NEXT:    psubq {{[0-9]+}}(%rsp), %xmm4
1038; SSE-NEXT:    psubq {{[0-9]+}}(%rsp), %xmm5
1039; SSE-NEXT:    psubq {{[0-9]+}}(%rsp), %xmm6
1040; SSE-NEXT:    psubq {{[0-9]+}}(%rsp), %xmm7
1041; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1042; SSE-NEXT:    pand %xmm8, %xmm7
1043; SSE-NEXT:    pand %xmm8, %xmm6
1044; SSE-NEXT:    packuswb %xmm7, %xmm6
1045; SSE-NEXT:    pand %xmm8, %xmm5
1046; SSE-NEXT:    pand %xmm8, %xmm4
1047; SSE-NEXT:    packuswb %xmm5, %xmm4
1048; SSE-NEXT:    packuswb %xmm6, %xmm4
1049; SSE-NEXT:    pand %xmm8, %xmm3
1050; SSE-NEXT:    pand %xmm8, %xmm2
1051; SSE-NEXT:    packuswb %xmm3, %xmm2
1052; SSE-NEXT:    pand %xmm8, %xmm1
1053; SSE-NEXT:    pand %xmm8, %xmm0
1054; SSE-NEXT:    packuswb %xmm1, %xmm0
1055; SSE-NEXT:    packuswb %xmm2, %xmm0
1056; SSE-NEXT:    packuswb %xmm4, %xmm0
1057; SSE-NEXT:    retq
1058;
1059; AVX1-LABEL: trunc_sub_v16i64_v16i8:
1060; AVX1:       # %bb.0:
1061; AVX1-NEXT:    vpsubq %xmm4, %xmm0, %xmm8
1062; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm4
1063; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1064; AVX1-NEXT:    vpsubq %xmm4, %xmm0, %xmm0
1065; AVX1-NEXT:    vpsubq %xmm5, %xmm1, %xmm4
1066; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm5
1067; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1068; AVX1-NEXT:    vpsubq %xmm5, %xmm1, %xmm1
1069; AVX1-NEXT:    vpsubq %xmm6, %xmm2, %xmm5
1070; AVX1-NEXT:    vextractf128 $1, %ymm6, %xmm6
1071; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
1072; AVX1-NEXT:    vpsubq %xmm6, %xmm2, %xmm2
1073; AVX1-NEXT:    vpsubq %xmm7, %xmm3, %xmm6
1074; AVX1-NEXT:    vextractf128 $1, %ymm7, %xmm7
1075; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1076; AVX1-NEXT:    vpsubq %xmm7, %xmm3, %xmm3
1077; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [255,255]
1078; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
1079; AVX1-NEXT:    vpand %xmm7, %xmm6, %xmm6
1080; AVX1-NEXT:    vpackusdw %xmm3, %xmm6, %xmm3
1081; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
1082; AVX1-NEXT:    vpand %xmm7, %xmm5, %xmm5
1083; AVX1-NEXT:    vpackusdw %xmm2, %xmm5, %xmm2
1084; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1085; AVX1-NEXT:    vpand %xmm7, %xmm1, %xmm1
1086; AVX1-NEXT:    vpand %xmm7, %xmm4, %xmm3
1087; AVX1-NEXT:    vpackusdw %xmm1, %xmm3, %xmm1
1088; AVX1-NEXT:    vpand %xmm7, %xmm0, %xmm0
1089; AVX1-NEXT:    vpand %xmm7, %xmm8, %xmm3
1090; AVX1-NEXT:    vpackusdw %xmm0, %xmm3, %xmm0
1091; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1092; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1093; AVX1-NEXT:    vzeroupper
1094; AVX1-NEXT:    retq
1095;
1096; AVX2-SLOW-LABEL: trunc_sub_v16i64_v16i8:
1097; AVX2-SLOW:       # %bb.0:
1098; AVX2-SLOW-NEXT:    vpsubq %ymm5, %ymm1, %ymm1
1099; AVX2-SLOW-NEXT:    vpsubq %ymm4, %ymm0, %ymm0
1100; AVX2-SLOW-NEXT:    vpsubq %ymm7, %ymm3, %ymm3
1101; AVX2-SLOW-NEXT:    vpsubq %ymm6, %ymm2, %ymm2
1102; AVX2-SLOW-NEXT:    vperm2i128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
1103; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
1104; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
1105; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1106; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
1107; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
1108; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
1109; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
1110; AVX2-SLOW-NEXT:    vperm2i128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
1111; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1112; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
1113; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
1114; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1115; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
1116; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1117; AVX2-SLOW-NEXT:    vzeroupper
1118; AVX2-SLOW-NEXT:    retq
1119;
1120; AVX2-FAST-LABEL: trunc_sub_v16i64_v16i8:
1121; AVX2-FAST:       # %bb.0:
1122; AVX2-FAST-NEXT:    vpsubq %ymm5, %ymm1, %ymm1
1123; AVX2-FAST-NEXT:    vpsubq %ymm4, %ymm0, %ymm0
1124; AVX2-FAST-NEXT:    vpsubq %ymm7, %ymm3, %ymm3
1125; AVX2-FAST-NEXT:    vpsubq %ymm6, %ymm2, %ymm2
1126; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
1127; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
1128; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
1129; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
1130; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1131; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
1132; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
1133; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
1134; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
1135; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
1136; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
1137; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1138; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
1139; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1140; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
1141; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1142; AVX2-FAST-NEXT:    vzeroupper
1143; AVX2-FAST-NEXT:    retq
1144;
1145; AVX512-LABEL: trunc_sub_v16i64_v16i8:
1146; AVX512:       # %bb.0:
1147; AVX512-NEXT:    vpsubq %zmm2, %zmm0, %zmm0
1148; AVX512-NEXT:    vpsubq %zmm3, %zmm1, %zmm1
1149; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
1150; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
1151; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1152; AVX512-NEXT:    vzeroupper
1153; AVX512-NEXT:    retq
1154  %1 = sub <16 x i64> %a0, %a1
1155  %2 = trunc <16 x i64> %1 to <16 x i8>
1156  ret <16 x i8> %2
1157}
1158
1159define <16 x i8> @trunc_sub_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {
1160; SSE-LABEL: trunc_sub_v16i32_v16i8:
1161; SSE:       # %bb.0:
1162; SSE-NEXT:    psubd %xmm4, %xmm0
1163; SSE-NEXT:    psubd %xmm5, %xmm1
1164; SSE-NEXT:    psubd %xmm6, %xmm2
1165; SSE-NEXT:    psubd %xmm7, %xmm3
1166; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
1167; SSE-NEXT:    pand %xmm4, %xmm3
1168; SSE-NEXT:    pand %xmm4, %xmm2
1169; SSE-NEXT:    packuswb %xmm3, %xmm2
1170; SSE-NEXT:    pand %xmm4, %xmm1
1171; SSE-NEXT:    pand %xmm4, %xmm0
1172; SSE-NEXT:    packuswb %xmm1, %xmm0
1173; SSE-NEXT:    packuswb %xmm2, %xmm0
1174; SSE-NEXT:    retq
1175;
1176; AVX1-LABEL: trunc_sub_v16i32_v16i8:
1177; AVX1:       # %bb.0:
1178; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm4
1179; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
1180; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1181; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm0
1182; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm2
1183; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1184; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1185; AVX1-NEXT:    vpsubd %xmm3, %xmm1, %xmm1
1186; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255]
1187; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
1188; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
1189; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
1190; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
1191; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm2
1192; AVX1-NEXT:    vpackusdw %xmm0, %xmm2, %xmm0
1193; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1194; AVX1-NEXT:    vzeroupper
1195; AVX1-NEXT:    retq
1196;
1197; AVX2-LABEL: trunc_sub_v16i32_v16i8:
1198; AVX2:       # %bb.0:
1199; AVX2-NEXT:    vpsubd %ymm2, %ymm0, %ymm0
1200; AVX2-NEXT:    vpsubd %ymm3, %ymm1, %ymm1
1201; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1202; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
1203; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
1204; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
1205; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
1206; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
1207; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1208; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
1209; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1210; AVX2-NEXT:    vzeroupper
1211; AVX2-NEXT:    retq
1212;
1213; AVX512-LABEL: trunc_sub_v16i32_v16i8:
1214; AVX512:       # %bb.0:
1215; AVX512-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
1216; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
1217; AVX512-NEXT:    vzeroupper
1218; AVX512-NEXT:    retq
1219  %1 = sub <16 x i32> %a0, %a1
1220  %2 = trunc <16 x i32> %1 to <16 x i8>
1221  ret <16 x i8> %2
1222}
1223
1224define <16 x i8> @trunc_sub_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {
1225; SSE-LABEL: trunc_sub_v16i16_v16i8:
1226; SSE:       # %bb.0:
1227; SSE-NEXT:    psubw %xmm2, %xmm0
1228; SSE-NEXT:    psubw %xmm3, %xmm1
1229; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1230; SSE-NEXT:    pand %xmm2, %xmm1
1231; SSE-NEXT:    pand %xmm2, %xmm0
1232; SSE-NEXT:    packuswb %xmm1, %xmm0
1233; SSE-NEXT:    retq
1234;
1235; AVX1-LABEL: trunc_sub_v16i16_v16i8:
1236; AVX1:       # %bb.0:
1237; AVX1-NEXT:    vpsubw %xmm1, %xmm0, %xmm2
1238; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1239; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1240; AVX1-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
1241; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1242; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
1243; AVX1-NEXT:    vpand %xmm1, %xmm2, %xmm1
1244; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
1245; AVX1-NEXT:    vzeroupper
1246; AVX1-NEXT:    retq
1247;
1248; AVX2-LABEL: trunc_sub_v16i16_v16i8:
1249; AVX2:       # %bb.0:
1250; AVX2-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
1251; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1252; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1253; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1254; AVX2-NEXT:    vzeroupper
1255; AVX2-NEXT:    retq
1256;
1257; AVX512F-LABEL: trunc_sub_v16i16_v16i8:
1258; AVX512F:       # %bb.0:
1259; AVX512F-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
1260; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1261; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
1262; AVX512F-NEXT:    vzeroupper
1263; AVX512F-NEXT:    retq
1264;
1265; AVX512BW-LABEL: trunc_sub_v16i16_v16i8:
1266; AVX512BW:       # %bb.0:
1267; AVX512BW-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
1268; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1269; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1270; AVX512BW-NEXT:    vzeroupper
1271; AVX512BW-NEXT:    retq
1272;
1273; AVX512DQ-LABEL: trunc_sub_v16i16_v16i8:
1274; AVX512DQ:       # %bb.0:
1275; AVX512DQ-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
1276; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1277; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1278; AVX512DQ-NEXT:    vzeroupper
1279; AVX512DQ-NEXT:    retq
1280  %1 = sub <16 x i16> %a0, %a1
1281  %2 = trunc <16 x i16> %1 to <16 x i8>
1282  ret <16 x i8> %2
1283}
1284
1285define <16 x i8> @trunc_ext_sub_v16i16_v16i8(<16 x i8> %x, <16 x i8> %y) {
1286; SSE-LABEL: trunc_ext_sub_v16i16_v16i8:
1287; SSE:       # %bb.0:
1288; SSE-NEXT:    psubb %xmm1, %xmm0
1289; SSE-NEXT:    retq
1290;
1291; AVX-LABEL: trunc_ext_sub_v16i16_v16i8:
1292; AVX:       # %bb.0:
1293; AVX-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
1294; AVX-NEXT:    retq
1295  %a = zext <16 x i8> %x to <16 x i16>
1296  %b = zext <16 x i8> %y to <16 x i16>
1297  %c = sub <16 x i16> %a, %b
1298  %d = trunc <16 x i16> %c to <16 x i8>
1299  ret <16 x i8> %d
1300}
1301
1302;
1303; sub to constant
1304;
1305
1306define <4 x i32> @trunc_sub_const_v4i64_v4i32(<4 x i64> %a0) nounwind {
1307; SSE-LABEL: trunc_sub_const_v4i64_v4i32:
1308; SSE:       # %bb.0:
1309; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1310; SSE-NEXT:    psubd {{.*}}(%rip), %xmm0
1311; SSE-NEXT:    retq
1312;
1313; AVX1-LABEL: trunc_sub_const_v4i64_v4i32:
1314; AVX1:       # %bb.0:
1315; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1316; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1317; AVX1-NEXT:    vpsubd {{.*}}(%rip), %xmm0, %xmm0
1318; AVX1-NEXT:    vzeroupper
1319; AVX1-NEXT:    retq
1320;
1321; AVX2-SLOW-LABEL: trunc_sub_const_v4i64_v4i32:
1322; AVX2-SLOW:       # %bb.0:
1323; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
1324; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1325; AVX2-SLOW-NEXT:    vpsubd {{.*}}(%rip), %xmm0, %xmm0
1326; AVX2-SLOW-NEXT:    vzeroupper
1327; AVX2-SLOW-NEXT:    retq
1328;
1329; AVX2-FAST-LABEL: trunc_sub_const_v4i64_v4i32:
1330; AVX2-FAST:       # %bb.0:
1331; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
1332; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
1333; AVX2-FAST-NEXT:    vpsubd {{.*}}(%rip), %xmm0, %xmm0
1334; AVX2-FAST-NEXT:    vzeroupper
1335; AVX2-FAST-NEXT:    retq
1336;
1337; AVX512-LABEL: trunc_sub_const_v4i64_v4i32:
1338; AVX512:       # %bb.0:
1339; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1340; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
1341; AVX512-NEXT:    vpsubd {{.*}}(%rip), %xmm0, %xmm0
1342; AVX512-NEXT:    vzeroupper
1343; AVX512-NEXT:    retq
1344  %1 = sub <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>
1345  %2 = trunc <4 x i64> %1 to <4 x i32>
1346  ret <4 x i32> %2
1347}
1348
1349define <8 x i16> @trunc_sub_const_v8i64_v8i16(<8 x i64> %a0) nounwind {
1350; SSE-LABEL: trunc_sub_const_v8i64_v8i16:
1351; SSE:       # %bb.0:
1352; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1353; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1354; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1355; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
1356; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
1357; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
1358; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
1359; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1360; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1361; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1362; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
1363; SSE-NEXT:    psubw {{.*}}(%rip), %xmm0
1364; SSE-NEXT:    retq
1365;
1366; AVX1-LABEL: trunc_sub_const_v8i64_v8i16:
1367; AVX1:       # %bb.0:
1368; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
1369; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
1370; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1371; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1372; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
1373; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1374; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1375; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1376; AVX1-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
1377; AVX1-NEXT:    vzeroupper
1378; AVX1-NEXT:    retq
1379;
1380; AVX2-SLOW-LABEL: trunc_sub_const_v8i64_v8i16:
1381; AVX2-SLOW:       # %bb.0:
1382; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
1383; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1384; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
1385; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
1386; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1387; AVX2-SLOW-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
1388; AVX2-SLOW-NEXT:    vzeroupper
1389; AVX2-SLOW-NEXT:    retq
1390;
1391; AVX2-FAST-LABEL: trunc_sub_const_v8i64_v8i16:
1392; AVX2-FAST:       # %bb.0:
1393; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
1394; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
1395; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
1396; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1397; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
1398; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1399; AVX2-FAST-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
1400; AVX2-FAST-NEXT:    vzeroupper
1401; AVX2-FAST-NEXT:    retq
1402;
1403; AVX512-LABEL: trunc_sub_const_v8i64_v8i16:
1404; AVX512:       # %bb.0:
1405; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
1406; AVX512-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
1407; AVX512-NEXT:    vzeroupper
1408; AVX512-NEXT:    retq
1409  %1 = sub <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>
1410  %2 = trunc <8 x i64> %1 to <8 x i16>
1411  ret <8 x i16> %2
1412}
1413
1414define <8 x i16> @trunc_sub_const_v8i32_v8i16(<8 x i32> %a0) nounwind {
1415; SSE-LABEL: trunc_sub_const_v8i32_v8i16:
1416; SSE:       # %bb.0:
1417; SSE-NEXT:    pslld $16, %xmm1
1418; SSE-NEXT:    psrad $16, %xmm1
1419; SSE-NEXT:    pslld $16, %xmm0
1420; SSE-NEXT:    psrad $16, %xmm0
1421; SSE-NEXT:    packssdw %xmm1, %xmm0
1422; SSE-NEXT:    psubw {{.*}}(%rip), %xmm0
1423; SSE-NEXT:    retq
1424;
1425; AVX1-LABEL: trunc_sub_const_v8i32_v8i16:
1426; AVX1:       # %bb.0:
1427; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1428; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1429; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
1430; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
1431; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1432; AVX1-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
1433; AVX1-NEXT:    vzeroupper
1434; AVX1-NEXT:    retq
1435;
1436; AVX2-LABEL: trunc_sub_const_v8i32_v8i16:
1437; AVX2:       # %bb.0:
1438; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
1439; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1440; AVX2-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
1441; AVX2-NEXT:    vzeroupper
1442; AVX2-NEXT:    retq
1443;
1444; AVX512-LABEL: trunc_sub_const_v8i32_v8i16:
1445; AVX512:       # %bb.0:
1446; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1447; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
1448; AVX512-NEXT:    vpsubw {{.*}}(%rip), %xmm0, %xmm0
1449; AVX512-NEXT:    vzeroupper
1450; AVX512-NEXT:    retq
1451  %1 = sub <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
1452  %2 = trunc <8 x i32> %1 to <8 x i16>
1453  ret <8 x i16> %2
1454}
1455
1456define <16 x i8> @trunc_sub_const_v16i64_v16i8(<16 x i64> %a0) nounwind {
1457; SSE-LABEL: trunc_sub_const_v16i64_v16i8:
1458; SSE:       # %bb.0:
1459; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1460; SSE-NEXT:    pand %xmm8, %xmm7
1461; SSE-NEXT:    pand %xmm8, %xmm6
1462; SSE-NEXT:    packuswb %xmm7, %xmm6
1463; SSE-NEXT:    pand %xmm8, %xmm5
1464; SSE-NEXT:    pand %xmm8, %xmm4
1465; SSE-NEXT:    packuswb %xmm5, %xmm4
1466; SSE-NEXT:    packuswb %xmm6, %xmm4
1467; SSE-NEXT:    pand %xmm8, %xmm3
1468; SSE-NEXT:    pand %xmm8, %xmm2
1469; SSE-NEXT:    packuswb %xmm3, %xmm2
1470; SSE-NEXT:    pand %xmm8, %xmm1
1471; SSE-NEXT:    pand %xmm8, %xmm0
1472; SSE-NEXT:    packuswb %xmm1, %xmm0
1473; SSE-NEXT:    packuswb %xmm2, %xmm0
1474; SSE-NEXT:    packuswb %xmm4, %xmm0
1475; SSE-NEXT:    psubb {{.*}}(%rip), %xmm0
1476; SSE-NEXT:    retq
1477;
1478; AVX1-LABEL: trunc_sub_const_v16i64_v16i8:
1479; AVX1:       # %bb.0:
1480; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [255,255,255,255]
1481; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
1482; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
1483; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
1484; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
1485; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1486; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
1487; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1488; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1
1489; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1490; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1491; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0
1492; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1493; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
1494; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1495; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1496; AVX1-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1497; AVX1-NEXT:    vzeroupper
1498; AVX1-NEXT:    retq
1499;
1500; AVX2-SLOW-LABEL: trunc_sub_const_v16i64_v16i8:
1501; AVX2-SLOW:       # %bb.0:
1502; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
1503; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1504; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
1505; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1506; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
1507; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
1508; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
1509; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
1510; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
1511; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1512; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
1513; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
1514; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1515; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
1516; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1517; AVX2-SLOW-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1518; AVX2-SLOW-NEXT:    vzeroupper
1519; AVX2-SLOW-NEXT:    retq
1520;
1521; AVX2-FAST-LABEL: trunc_sub_const_v16i64_v16i8:
1522; AVX2-FAST:       # %bb.0:
1523; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
1524; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
1525; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
1526; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
1527; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1528; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
1529; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
1530; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
1531; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
1532; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
1533; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
1534; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1535; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
1536; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1537; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
1538; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
1539; AVX2-FAST-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1540; AVX2-FAST-NEXT:    vzeroupper
1541; AVX2-FAST-NEXT:    retq
1542;
1543; AVX512-LABEL: trunc_sub_const_v16i64_v16i8:
1544; AVX512:       # %bb.0:
1545; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
1546; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
1547; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1548; AVX512-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1549; AVX512-NEXT:    vzeroupper
1550; AVX512-NEXT:    retq
1551  %1 = sub <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>
1552  %2 = trunc <16 x i64> %1 to <16 x i8>
1553  ret <16 x i8> %2
1554}
1555
1556define <16 x i8> @trunc_sub_const_v16i32_v16i8(<16 x i32> %a0) nounwind {
1557; SSE-LABEL: trunc_sub_const_v16i32_v16i8:
1558; SSE:       # %bb.0:
1559; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
1560; SSE-NEXT:    pand %xmm4, %xmm3
1561; SSE-NEXT:    pand %xmm4, %xmm2
1562; SSE-NEXT:    packuswb %xmm3, %xmm2
1563; SSE-NEXT:    pand %xmm4, %xmm1
1564; SSE-NEXT:    pand %xmm4, %xmm0
1565; SSE-NEXT:    packuswb %xmm1, %xmm0
1566; SSE-NEXT:    packuswb %xmm2, %xmm0
1567; SSE-NEXT:    psubb {{.*}}(%rip), %xmm0
1568; SSE-NEXT:    retq
1569;
1570; AVX1-LABEL: trunc_sub_const_v16i32_v16i8:
1571; AVX1:       # %bb.0:
1572; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
1573; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
1574; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1575; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1576; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
1577; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1578; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
1579; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1580; AVX1-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1581; AVX1-NEXT:    vzeroupper
1582; AVX1-NEXT:    retq
1583;
1584; AVX2-LABEL: trunc_sub_const_v16i32_v16i8:
1585; AVX2:       # %bb.0:
1586; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1587; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
1588; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
1589; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
1590; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
1591; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
1592; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1593; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
1594; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1595; AVX2-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1596; AVX2-NEXT:    vzeroupper
1597; AVX2-NEXT:    retq
1598;
1599; AVX512-LABEL: trunc_sub_const_v16i32_v16i8:
1600; AVX512:       # %bb.0:
1601; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
1602; AVX512-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1603; AVX512-NEXT:    vzeroupper
1604; AVX512-NEXT:    retq
1605  %1 = sub <16 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1606  %2 = trunc <16 x i32> %1 to <16 x i8>
1607  ret <16 x i8> %2
1608}
1609
1610define <16 x i8> @trunc_sub_const_v16i16_v16i8(<16 x i16> %a0) nounwind {
1611; SSE-LABEL: trunc_sub_const_v16i16_v16i8:
1612; SSE:       # %bb.0:
1613; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1614; SSE-NEXT:    pand %xmm2, %xmm1
1615; SSE-NEXT:    pand %xmm2, %xmm0
1616; SSE-NEXT:    packuswb %xmm1, %xmm0
1617; SSE-NEXT:    psubb {{.*}}(%rip), %xmm0
1618; SSE-NEXT:    retq
1619;
1620; AVX1-LABEL: trunc_sub_const_v16i16_v16i8:
1621; AVX1:       # %bb.0:
1622; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1623; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
1624; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1625; AVX1-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1626; AVX1-NEXT:    vzeroupper
1627; AVX1-NEXT:    retq
1628;
1629; AVX2-LABEL: trunc_sub_const_v16i16_v16i8:
1630; AVX2:       # %bb.0:
1631; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1632; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1633; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
1634; AVX2-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1635; AVX2-NEXT:    vzeroupper
1636; AVX2-NEXT:    retq
1637;
1638; AVX512F-LABEL: trunc_sub_const_v16i16_v16i8:
1639; AVX512F:       # %bb.0:
1640; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1641; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
1642; AVX512F-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1643; AVX512F-NEXT:    vzeroupper
1644; AVX512F-NEXT:    retq
1645;
1646; AVX512BW-LABEL: trunc_sub_const_v16i16_v16i8:
1647; AVX512BW:       # %bb.0:
1648; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1649; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
1650; AVX512BW-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1651; AVX512BW-NEXT:    vzeroupper
1652; AVX512BW-NEXT:    retq
1653;
1654; AVX512DQ-LABEL: trunc_sub_const_v16i16_v16i8:
1655; AVX512DQ:       # %bb.0:
1656; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1657; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1658; AVX512DQ-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1659; AVX512DQ-NEXT:    vzeroupper
1660; AVX512DQ-NEXT:    retq
1661  %1 = sub <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
1662  %2 = trunc <16 x i16> %1 to <16 x i8>
1663  ret <16 x i8> %2
1664}
1665
1666define <16 x i8> @trunc_ext_sub_const_rhs_v16i16_v16i8(<16 x i8> %x) {
1667; SSE-LABEL: trunc_ext_sub_const_rhs_v16i16_v16i8:
1668; SSE:       # %bb.0:
1669; SSE-NEXT:    psubb {{.*}}(%rip), %xmm0
1670; SSE-NEXT:    retq
1671;
1672; AVX-LABEL: trunc_ext_sub_const_rhs_v16i16_v16i8:
1673; AVX:       # %bb.0:
1674; AVX-NEXT:    vpsubb {{.*}}(%rip), %xmm0, %xmm0
1675; AVX-NEXT:    retq
1676  %a = zext <16 x i8> %x to <16 x i16>
1677  %b = sub <16 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
1678  %c = trunc <16 x i16> %b to <16 x i8>
1679  ret <16 x i8> %c
1680}
1681
1682define <16 x i8> @trunc_ext_sub_const_lhs_v16i16_v16i8(<16 x i8> %x) {
1683; SSE-LABEL: trunc_ext_sub_const_lhs_v16i16_v16i8:
1684; SSE:       # %bb.0:
1685; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1686; SSE-NEXT:    psubb %xmm0, %xmm1
1687; SSE-NEXT:    movdqa %xmm1, %xmm0
1688; SSE-NEXT:    retq
1689;
1690; AVX-LABEL: trunc_ext_sub_const_lhs_v16i16_v16i8:
1691; AVX:       # %bb.0:
1692; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
1693; AVX-NEXT:    vpsubb %xmm0, %xmm1, %xmm0
1694; AVX-NEXT:    retq
1695  %a = zext <16 x i8> %x to <16 x i16>
1696  %b = sub <16 x i16> <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>, %a
1697  %c = trunc <16 x i16> %b to <16 x i8>
1698  ret <16 x i8> %c
1699}
1700
1701;
1702; mul
1703;
1704
1705define <4 x i32> @trunc_mul_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {
1706; SSE-LABEL: trunc_mul_v4i64_v4i32:
1707; SSE:       # %bb.0:
1708; SSE-NEXT:    pmuludq %xmm3, %xmm1
1709; SSE-NEXT:    pmuludq %xmm2, %xmm0
1710; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
1711; SSE-NEXT:    retq
1712;
1713; AVX1-LABEL: trunc_mul_v4i64_v4i32:
1714; AVX1:       # %bb.0:
1715; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1716; AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
1717; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1718; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
1719; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1720; AVX1-NEXT:    vzeroupper
1721; AVX1-NEXT:    retq
1722;
1723; AVX2-SLOW-LABEL: trunc_mul_v4i64_v4i32:
1724; AVX2-SLOW:       # %bb.0:
1725; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm2
1726; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
1727; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm2
1728; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
1729; AVX2-SLOW-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1730; AVX2-SLOW-NEXT:    vzeroupper
1731; AVX2-SLOW-NEXT:    retq
1732;
1733; AVX2-FAST-LABEL: trunc_mul_v4i64_v4i32:
1734; AVX2-FAST:       # %bb.0:
1735; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
1736; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
1737; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
1738; AVX2-FAST-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1739; AVX2-FAST-NEXT:    vzeroupper
1740; AVX2-FAST-NEXT:    retq
1741;
1742; AVX512F-LABEL: trunc_mul_v4i64_v4i32:
1743; AVX512F:       # %bb.0:
1744; AVX512F-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1745; AVX512F-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1746; AVX512F-NEXT:    vpmovqd %zmm1, %ymm1
1747; AVX512F-NEXT:    vpmovqd %zmm0, %ymm0
1748; AVX512F-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1749; AVX512F-NEXT:    vzeroupper
1750; AVX512F-NEXT:    retq
1751;
1752; AVX512BW-LABEL: trunc_mul_v4i64_v4i32:
1753; AVX512BW:       # %bb.0:
1754; AVX512BW-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1755; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1756; AVX512BW-NEXT:    vpmovqd %zmm1, %ymm1
1757; AVX512BW-NEXT:    vpmovqd %zmm0, %ymm0
1758; AVX512BW-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1759; AVX512BW-NEXT:    vzeroupper
1760; AVX512BW-NEXT:    retq
1761;
1762; AVX512DQ-LABEL: trunc_mul_v4i64_v4i32:
1763; AVX512DQ:       # %bb.0:
1764; AVX512DQ-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
1765; AVX512DQ-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
1766; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
1767; AVX512DQ-NEXT:    vpmovqd %zmm0, %ymm0
1768; AVX512DQ-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1769; AVX512DQ-NEXT:    vzeroupper
1770; AVX512DQ-NEXT:    retq
1771  %1 = mul <4 x i64> %a0, %a1
1772  %2 = trunc <4 x i64> %1 to <4 x i32>
1773  ret <4 x i32> %2
1774}
1775
1776define <8 x i16> @trunc_mul_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {
1777; SSE-LABEL: trunc_mul_v8i64_v8i16:
1778; SSE:       # %bb.0:
1779; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
1780; SSE-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,2,2,3,4,5,6,7]
1781; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
1782; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,2,2,3,4,5,6,7]
1783; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
1784; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,2,2,3]
1785; SSE-NEXT:    pshuflw {{.*#+}} xmm5 = xmm5[0,1,0,2,4,5,6,7]
1786; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
1787; SSE-NEXT:    pshuflw {{.*#+}} xmm6 = xmm6[0,1,0,2,4,5,6,7]
1788; SSE-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
1789; SSE-NEXT:    movsd {{.*#+}} xmm6 = xmm4[0],xmm6[1]
1790; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1791; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
1792; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1793; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
1794; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
1795; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
1796; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
1797; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
1798; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
1799; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1800; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
1801; SSE-NEXT:    pmullw %xmm6, %xmm0
1802; SSE-NEXT:    retq
1803;
1804; AVX1-LABEL: trunc_mul_v8i64_v8i16:
1805; AVX1:       # %bb.0:
1806; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [65535,65535,65535,65535]
1807; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
1808; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
1809; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
1810; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
1811; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
1812; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
1813; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
1814; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1
1815; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1816; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
1817; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0
1818; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1819; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
1820; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
1821; AVX1-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
1822; AVX1-NEXT:    vzeroupper
1823; AVX1-NEXT:    retq
1824;
1825; AVX2-SLOW-LABEL: trunc_mul_v8i64_v8i16:
1826; AVX2-SLOW:       # %bb.0:
1827; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
1828; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
1829; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
1830; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1831; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
1832; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
1833; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm0[2,3],ymm1[2,3]
1834; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1835; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm4[0,2],ymm0[4,6],ymm4[4,6]
1836; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
1837; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1838; AVX2-SLOW-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
1839; AVX2-SLOW-NEXT:    vzeroupper
1840; AVX2-SLOW-NEXT:    retq
1841;
1842; AVX2-FAST-LABEL: trunc_mul_v8i64_v8i16:
1843; AVX2-FAST:       # %bb.0:
1844; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
1845; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
1846; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
1847; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
1848; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
1849; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
1850; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
1851; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
1852; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
1853; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1854; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
1855; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1856; AVX2-FAST-NEXT:    vpmullw %xmm2, %xmm0, %xmm0
1857; AVX2-FAST-NEXT:    vzeroupper
1858; AVX2-FAST-NEXT:    retq
1859;
1860; AVX512F-LABEL: trunc_mul_v8i64_v8i16:
1861; AVX512F:       # %bb.0:
1862; AVX512F-NEXT:    vpmovqw %zmm1, %xmm1
1863; AVX512F-NEXT:    vpmovqw %zmm0, %xmm0
1864; AVX512F-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1865; AVX512F-NEXT:    vzeroupper
1866; AVX512F-NEXT:    retq
1867;
1868; AVX512BW-LABEL: trunc_mul_v8i64_v8i16:
1869; AVX512BW:       # %bb.0:
1870; AVX512BW-NEXT:    vpmovqw %zmm1, %xmm1
1871; AVX512BW-NEXT:    vpmovqw %zmm0, %xmm0
1872; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
1873; AVX512BW-NEXT:    vzeroupper
1874; AVX512BW-NEXT:    retq
1875;
1876; AVX512DQ-LABEL: trunc_mul_v8i64_v8i16:
1877; AVX512DQ:       # %bb.0:
1878; AVX512DQ-NEXT:    vpmullq %zmm1, %zmm0, %zmm0
1879; AVX512DQ-NEXT:    vpmovqw %zmm0, %xmm0
1880; AVX512DQ-NEXT:    vzeroupper
1881; AVX512DQ-NEXT:    retq
1882  %1 = mul <8 x i64> %a0, %a1
1883  %2 = trunc <8 x i64> %1 to <8 x i16>
1884  ret <8 x i16> %2
1885}
1886
1887define <8 x i16> @trunc_mul_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {
1888; SSE-LABEL: trunc_mul_v8i32_v8i16:
1889; SSE:       # %bb.0:
1890; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
1891; SSE-NEXT:    pmuludq %xmm2, %xmm0
1892; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1893; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
1894; SSE-NEXT:    pmuludq %xmm4, %xmm2
1895; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
1896; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1897; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
1898; SSE-NEXT:    pmuludq %xmm3, %xmm1
1899; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1900; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
1901; SSE-NEXT:    pmuludq %xmm2, %xmm3
1902; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
1903; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1904; SSE-NEXT:    pslld $16, %xmm1
1905; SSE-NEXT:    psrad $16, %xmm1
1906; SSE-NEXT:    pslld $16, %xmm0
1907; SSE-NEXT:    psrad $16, %xmm0
1908; SSE-NEXT:    packssdw %xmm1, %xmm0
1909; SSE-NEXT:    retq
1910;
1911; AVX1-LABEL: trunc_mul_v8i32_v8i16:
1912; AVX1:       # %bb.0:
1913; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm2
1914; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1915; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1916; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
1917; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
1918; AVX1-NEXT:    vpshufb %xmm1, %xmm0, %xmm0
1919; AVX1-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
1920; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
1921; AVX1-NEXT:    vzeroupper
1922; AVX1-NEXT:    retq
1923;
1924; AVX2-LABEL: trunc_mul_v8i32_v8i16:
1925; AVX2:       # %bb.0:
1926; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1927; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
1928; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
1929; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1930; AVX2-NEXT:    vzeroupper
1931; AVX2-NEXT:    retq
1932;
1933; AVX512-LABEL: trunc_mul_v8i32_v8i16:
1934; AVX512:       # %bb.0:
1935; AVX512-NEXT:    vpmulld %ymm1, %ymm0, %ymm0
1936; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
1937; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
1938; AVX512-NEXT:    vzeroupper
1939; AVX512-NEXT:    retq
1940  %1 = mul <8 x i32> %a0, %a1
1941  %2 = trunc <8 x i32> %1 to <8 x i16>
1942  ret <8 x i16> %2
1943}
1944
1945define <16 x i8> @trunc_mul_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {
1946; SSE-LABEL: trunc_mul_v16i64_v16i8:
1947; SSE:       # %bb.0:
1948; SSE-NEXT:    pmuludq {{[0-9]+}}(%rsp), %xmm0
1949; SSE-NEXT:    pmuludq {{[0-9]+}}(%rsp), %xmm1
1950; SSE-NEXT:    pmuludq {{[0-9]+}}(%rsp), %xmm2
1951; SSE-NEXT:    pmuludq {{[0-9]+}}(%rsp), %xmm3
1952; SSE-NEXT:    pmuludq {{[0-9]+}}(%rsp), %xmm4
1953; SSE-NEXT:    pmuludq {{[0-9]+}}(%rsp), %xmm5
1954; SSE-NEXT:    pmuludq {{[0-9]+}}(%rsp), %xmm6
1955; SSE-NEXT:    pmuludq {{[0-9]+}}(%rsp), %xmm7
1956; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
1957; SSE-NEXT:    pand %xmm8, %xmm7
1958; SSE-NEXT:    pand %xmm8, %xmm6
1959; SSE-NEXT:    packuswb %xmm7, %xmm6
1960; SSE-NEXT:    pand %xmm8, %xmm5
1961; SSE-NEXT:    pand %xmm8, %xmm4
1962; SSE-NEXT:    packuswb %xmm5, %xmm4
1963; SSE-NEXT:    packuswb %xmm6, %xmm4
1964; SSE-NEXT:    pand %xmm8, %xmm3
1965; SSE-NEXT:    pand %xmm8, %xmm2
1966; SSE-NEXT:    packuswb %xmm3, %xmm2
1967; SSE-NEXT:    pand %xmm8, %xmm1
1968; SSE-NEXT:    pand %xmm8, %xmm0
1969; SSE-NEXT:    packuswb %xmm1, %xmm0
1970; SSE-NEXT:    packuswb %xmm2, %xmm0
1971; SSE-NEXT:    packuswb %xmm4, %xmm0
1972; SSE-NEXT:    retq
1973;
1974; AVX1-LABEL: trunc_mul_v16i64_v16i8:
1975; AVX1:       # %bb.0:
1976; AVX1-NEXT:    vpmuludq %xmm4, %xmm0, %xmm8
1977; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm4
1978; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1979; AVX1-NEXT:    vpmuludq %xmm4, %xmm0, %xmm0
1980; AVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm4
1981; AVX1-NEXT:    vextractf128 $1, %ymm5, %xmm5
1982; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1983; AVX1-NEXT:    vpmuludq %xmm5, %xmm1, %xmm1
1984; AVX1-NEXT:    vpmuludq %xmm6, %xmm2, %xmm5
1985; AVX1-NEXT:    vextractf128 $1, %ymm6, %xmm6
1986; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
1987; AVX1-NEXT:    vpmuludq %xmm6, %xmm2, %xmm2
1988; AVX1-NEXT:    vpmuludq %xmm7, %xmm3, %xmm6
1989; AVX1-NEXT:    vextractf128 $1, %ymm7, %xmm7
1990; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1991; AVX1-NEXT:    vpmuludq %xmm7, %xmm3, %xmm3
1992; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [255,255]
1993; AVX1-NEXT:    vpand %xmm7, %xmm3, %xmm3
1994; AVX1-NEXT:    vpand %xmm7, %xmm6, %xmm6
1995; AVX1-NEXT:    vpackusdw %xmm3, %xmm6, %xmm3
1996; AVX1-NEXT:    vpand %xmm7, %xmm2, %xmm2
1997; AVX1-NEXT:    vpand %xmm7, %xmm5, %xmm5
1998; AVX1-NEXT:    vpackusdw %xmm2, %xmm5, %xmm2
1999; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
2000; AVX1-NEXT:    vpand %xmm7, %xmm1, %xmm1
2001; AVX1-NEXT:    vpand %xmm7, %xmm4, %xmm3
2002; AVX1-NEXT:    vpackusdw %xmm1, %xmm3, %xmm1
2003; AVX1-NEXT:    vpand %xmm7, %xmm0, %xmm0
2004; AVX1-NEXT:    vpand %xmm7, %xmm8, %xmm3
2005; AVX1-NEXT:    vpackusdw %xmm0, %xmm3, %xmm0
2006; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2007; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2008; AVX1-NEXT:    vzeroupper
2009; AVX1-NEXT:    retq
2010;
2011; AVX2-SLOW-LABEL: trunc_mul_v16i64_v16i8:
2012; AVX2-SLOW:       # %bb.0:
2013; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm7, %xmm8
2014; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm8 = xmm7[0,2],xmm8[0,2]
2015; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm3, %xmm7
2016; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm3 = xmm3[0,2],xmm7[0,2]
2017; AVX2-SLOW-NEXT:    vpmulld %xmm8, %xmm3, %xmm3
2018; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm6, %xmm7
2019; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm6 = xmm6[0,2],xmm7[0,2]
2020; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm2, %xmm7
2021; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm7[0,2]
2022; AVX2-SLOW-NEXT:    vpmulld %xmm6, %xmm2, %xmm2
2023; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
2024; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
2025; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
2026; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
2027; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
2028; AVX2-SLOW-NEXT:    vpand %xmm6, %xmm2, %xmm2
2029; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm5, %xmm7
2030; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm5 = xmm5[0,2],xmm7[0,2]
2031; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm7
2032; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm7[0,2]
2033; AVX2-SLOW-NEXT:    vpmulld %xmm5, %xmm1, %xmm1
2034; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm4, %xmm5
2035; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm4 = xmm4[0,2],xmm5[0,2]
2036; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm5
2037; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]
2038; AVX2-SLOW-NEXT:    vpmulld %xmm4, %xmm0, %xmm0
2039; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2040; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
2041; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2042; AVX2-SLOW-NEXT:    vpand %xmm6, %xmm0, %xmm0
2043; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2044; AVX2-SLOW-NEXT:    vzeroupper
2045; AVX2-SLOW-NEXT:    retq
2046;
2047; AVX2-FAST-LABEL: trunc_mul_v16i64_v16i8:
2048; AVX2-FAST:       # %bb.0:
2049; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm8 = [0,2,4,6,4,6,6,7]
2050; AVX2-FAST-NEXT:    vpermd %ymm7, %ymm8, %ymm7
2051; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm8, %ymm3
2052; AVX2-FAST-NEXT:    vpmulld %xmm7, %xmm3, %xmm3
2053; AVX2-FAST-NEXT:    vpermd %ymm6, %ymm8, %ymm6
2054; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm8, %ymm2
2055; AVX2-FAST-NEXT:    vpmulld %xmm6, %xmm2, %xmm2
2056; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
2057; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
2058; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
2059; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
2060; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
2061; AVX2-FAST-NEXT:    vpand %xmm6, %xmm2, %xmm2
2062; AVX2-FAST-NEXT:    vpermd %ymm5, %ymm8, %ymm5
2063; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm8, %ymm1
2064; AVX2-FAST-NEXT:    vpmulld %xmm5, %xmm1, %xmm1
2065; AVX2-FAST-NEXT:    vpermd %ymm4, %ymm8, %ymm4
2066; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm8, %ymm0
2067; AVX2-FAST-NEXT:    vpmulld %xmm4, %xmm0, %xmm0
2068; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2069; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
2070; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2071; AVX2-FAST-NEXT:    vpand %xmm6, %xmm0, %xmm0
2072; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2073; AVX2-FAST-NEXT:    vzeroupper
2074; AVX2-FAST-NEXT:    retq
2075;
2076; AVX512F-LABEL: trunc_mul_v16i64_v16i8:
2077; AVX512F:       # %bb.0:
2078; AVX512F-NEXT:    vpmuludq %zmm2, %zmm0, %zmm0
2079; AVX512F-NEXT:    vpmuludq %zmm3, %zmm1, %zmm1
2080; AVX512F-NEXT:    vpmovqb %zmm1, %xmm1
2081; AVX512F-NEXT:    vpmovqb %zmm0, %xmm0
2082; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2083; AVX512F-NEXT:    vzeroupper
2084; AVX512F-NEXT:    retq
2085;
2086; AVX512BW-LABEL: trunc_mul_v16i64_v16i8:
2087; AVX512BW:       # %bb.0:
2088; AVX512BW-NEXT:    vpmuludq %zmm2, %zmm0, %zmm0
2089; AVX512BW-NEXT:    vpmuludq %zmm3, %zmm1, %zmm1
2090; AVX512BW-NEXT:    vpmovqb %zmm1, %xmm1
2091; AVX512BW-NEXT:    vpmovqb %zmm0, %xmm0
2092; AVX512BW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2093; AVX512BW-NEXT:    vzeroupper
2094; AVX512BW-NEXT:    retq
2095;
2096; AVX512DQ-LABEL: trunc_mul_v16i64_v16i8:
2097; AVX512DQ:       # %bb.0:
2098; AVX512DQ-NEXT:    vpmullq %zmm2, %zmm0, %zmm0
2099; AVX512DQ-NEXT:    vpmullq %zmm3, %zmm1, %zmm1
2100; AVX512DQ-NEXT:    vpmovqb %zmm1, %xmm1
2101; AVX512DQ-NEXT:    vpmovqb %zmm0, %xmm0
2102; AVX512DQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2103; AVX512DQ-NEXT:    vzeroupper
2104; AVX512DQ-NEXT:    retq
2105  %1 = mul <16 x i64> %a0, %a1
2106  %2 = trunc <16 x i64> %1 to <16 x i8>
2107  ret <16 x i8> %2
2108}
2109
2110define <16 x i8> @trunc_mul_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {
2111; SSE-LABEL: trunc_mul_v16i32_v16i8:
2112; SSE:       # %bb.0:
2113; SSE-NEXT:    pshufd {{.*#+}} xmm8 = xmm0[1,1,3,3]
2114; SSE-NEXT:    pmuludq %xmm4, %xmm0
2115; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2116; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2117; SSE-NEXT:    pmuludq %xmm8, %xmm4
2118; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
2119; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
2120; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
2121; SSE-NEXT:    pmuludq %xmm5, %xmm1
2122; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
2123; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
2124; SSE-NEXT:    pmuludq %xmm4, %xmm5
2125; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3]
2126; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
2127; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
2128; SSE-NEXT:    pmuludq %xmm6, %xmm2
2129; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
2130; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
2131; SSE-NEXT:    pmuludq %xmm4, %xmm5
2132; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3]
2133; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2134; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
2135; SSE-NEXT:    pmuludq %xmm7, %xmm3
2136; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
2137; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
2138; SSE-NEXT:    pmuludq %xmm4, %xmm5
2139; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[0,2,2,3]
2140; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
2141; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
2142; SSE-NEXT:    pand %xmm4, %xmm3
2143; SSE-NEXT:    pand %xmm4, %xmm2
2144; SSE-NEXT:    packuswb %xmm3, %xmm2
2145; SSE-NEXT:    pand %xmm4, %xmm1
2146; SSE-NEXT:    pand %xmm4, %xmm0
2147; SSE-NEXT:    packuswb %xmm1, %xmm0
2148; SSE-NEXT:    packuswb %xmm2, %xmm0
2149; SSE-NEXT:    retq
2150;
2151; AVX1-LABEL: trunc_mul_v16i32_v16i8:
2152; AVX1:       # %bb.0:
2153; AVX1-NEXT:    vpmulld %xmm2, %xmm0, %xmm4
2154; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
2155; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2156; AVX1-NEXT:    vpmulld %xmm2, %xmm0, %xmm0
2157; AVX1-NEXT:    vpmulld %xmm3, %xmm1, %xmm2
2158; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
2159; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2160; AVX1-NEXT:    vpmulld %xmm3, %xmm1, %xmm1
2161; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255]
2162; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
2163; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
2164; AVX1-NEXT:    vpackusdw %xmm1, %xmm2, %xmm1
2165; AVX1-NEXT:    vpand %xmm3, %xmm0, %xmm0
2166; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm2
2167; AVX1-NEXT:    vpackusdw %xmm0, %xmm2, %xmm0
2168; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2169; AVX1-NEXT:    vzeroupper
2170; AVX1-NEXT:    retq
2171;
2172; AVX2-LABEL: trunc_mul_v16i32_v16i8:
2173; AVX2:       # %bb.0:
2174; AVX2-NEXT:    vpmulld %ymm2, %ymm0, %ymm0
2175; AVX2-NEXT:    vpmulld %ymm3, %ymm1, %ymm1
2176; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
2177; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2178; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
2179; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2180; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
2181; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2182; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2183; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
2184; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2185; AVX2-NEXT:    vzeroupper
2186; AVX2-NEXT:    retq
2187;
2188; AVX512-LABEL: trunc_mul_v16i32_v16i8:
2189; AVX512:       # %bb.0:
2190; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
2191; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
2192; AVX512-NEXT:    vzeroupper
2193; AVX512-NEXT:    retq
2194  %1 = mul <16 x i32> %a0, %a1
2195  %2 = trunc <16 x i32> %1 to <16 x i8>
2196  ret <16 x i8> %2
2197}
2198
2199define <16 x i8> @trunc_mul_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {
2200; SSE-LABEL: trunc_mul_v16i16_v16i8:
2201; SSE:       # %bb.0:
2202; SSE-NEXT:    pmullw %xmm2, %xmm0
2203; SSE-NEXT:    pmullw %xmm3, %xmm1
2204; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2205; SSE-NEXT:    pand %xmm2, %xmm1
2206; SSE-NEXT:    pand %xmm2, %xmm0
2207; SSE-NEXT:    packuswb %xmm1, %xmm0
2208; SSE-NEXT:    retq
2209;
2210; AVX1-LABEL: trunc_mul_v16i16_v16i8:
2211; AVX1:       # %bb.0:
2212; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm2
2213; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2214; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2215; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2216; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
2217; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
2218; AVX1-NEXT:    vpand %xmm1, %xmm2, %xmm1
2219; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
2220; AVX1-NEXT:    vzeroupper
2221; AVX1-NEXT:    retq
2222;
2223; AVX2-LABEL: trunc_mul_v16i16_v16i8:
2224; AVX2:       # %bb.0:
2225; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2226; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
2227; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2228; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2229; AVX2-NEXT:    vzeroupper
2230; AVX2-NEXT:    retq
2231;
2232; AVX512F-LABEL: trunc_mul_v16i16_v16i8:
2233; AVX512F:       # %bb.0:
2234; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2235; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
2236; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2237; AVX512F-NEXT:    vzeroupper
2238; AVX512F-NEXT:    retq
2239;
2240; AVX512BW-LABEL: trunc_mul_v16i16_v16i8:
2241; AVX512BW:       # %bb.0:
2242; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2243; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
2244; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2245; AVX512BW-NEXT:    vzeroupper
2246; AVX512BW-NEXT:    retq
2247;
2248; AVX512DQ-LABEL: trunc_mul_v16i16_v16i8:
2249; AVX512DQ:       # %bb.0:
2250; AVX512DQ-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
2251; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
2252; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
2253; AVX512DQ-NEXT:    vzeroupper
2254; AVX512DQ-NEXT:    retq
2255  %1 = mul <16 x i16> %a0, %a1
2256  %2 = trunc <16 x i16> %1 to <16 x i8>
2257  ret <16 x i8> %2
2258}
2259
2260define <8 x i16> @trunc_mul_v8i32_v8i16_zext_8i8(<16 x i8> %a0, <8 x i32> %a1) {
2261; SSE-LABEL: trunc_mul_v8i32_v8i16_zext_8i8:
2262; SSE:       # %bb.0:
2263; SSE-NEXT:    pxor %xmm3, %xmm3
2264; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
2265; SSE-NEXT:    pslld $16, %xmm2
2266; SSE-NEXT:    psrad $16, %xmm2
2267; SSE-NEXT:    pslld $16, %xmm1
2268; SSE-NEXT:    psrad $16, %xmm1
2269; SSE-NEXT:    packssdw %xmm2, %xmm1
2270; SSE-NEXT:    pmullw %xmm1, %xmm0
2271; SSE-NEXT:    retq
2272;
2273; AVX1-LABEL: trunc_mul_v8i32_v8i16_zext_8i8:
2274; AVX1:       # %bb.0:
2275; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
2276; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2277; AVX1-NEXT:    vpshufb %xmm3, %xmm2, %xmm2
2278; AVX1-NEXT:    vpshufb %xmm3, %xmm1, %xmm1
2279; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
2280; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2281; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2282; AVX1-NEXT:    vzeroupper
2283; AVX1-NEXT:    retq
2284;
2285; AVX2-LABEL: trunc_mul_v8i32_v8i16_zext_8i8:
2286; AVX2:       # %bb.0:
2287; AVX2-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2288; AVX2-NEXT:    vpshufb {{.*#+}} ymm1 = ymm1[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
2289; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
2290; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2291; AVX2-NEXT:    vzeroupper
2292; AVX2-NEXT:    retq
2293;
2294; AVX512-LABEL: trunc_mul_v8i32_v8i16_zext_8i8:
2295; AVX512:       # %bb.0:
2296; AVX512-NEXT:    # kill: def $ymm1 killed $ymm1 def $zmm1
2297; AVX512-NEXT:    vpmovdw %zmm1, %ymm1
2298; AVX512-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
2299; AVX512-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
2300; AVX512-NEXT:    vzeroupper
2301; AVX512-NEXT:    retq
2302  %1 = shufflevector <16 x i8> %a0, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2303  %2 = zext <8 x i8> %1 to <8 x i32>
2304  %3 = mul <8 x i32> %2, %a1
2305  %4 = trunc <8 x i32> %3 to <8 x i16>
2306  ret <8 x i16> %4
2307}
2308
2309;
2310; mul to constant
2311;
2312
2313define <4 x i32> @trunc_mul_const_v4i64_v4i32(<4 x i64> %a0) nounwind {
2314; SSE-LABEL: trunc_mul_const_v4i64_v4i32:
2315; SSE:       # %bb.0:
2316; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm1
2317; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm0
2318; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
2319; SSE-NEXT:    retq
2320;
2321; AVX1-LABEL: trunc_mul_const_v4i64_v4i32:
2322; AVX1:       # %bb.0:
2323; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2324; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
2325; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
2326; AVX1-NEXT:    vzeroupper
2327; AVX1-NEXT:    retq
2328;
2329; AVX2-SLOW-LABEL: trunc_mul_const_v4i64_v4i32:
2330; AVX2-SLOW:       # %bb.0:
2331; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
2332; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
2333; AVX2-SLOW-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
2334; AVX2-SLOW-NEXT:    vzeroupper
2335; AVX2-SLOW-NEXT:    retq
2336;
2337; AVX2-FAST-LABEL: trunc_mul_const_v4i64_v4i32:
2338; AVX2-FAST:       # %bb.0:
2339; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
2340; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm1, %ymm0
2341; AVX2-FAST-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
2342; AVX2-FAST-NEXT:    vzeroupper
2343; AVX2-FAST-NEXT:    retq
2344;
2345; AVX512-LABEL: trunc_mul_const_v4i64_v4i32:
2346; AVX512:       # %bb.0:
2347; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2348; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
2349; AVX512-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
2350; AVX512-NEXT:    vzeroupper
2351; AVX512-NEXT:    retq
2352  %1 = mul <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>
2353  %2 = trunc <4 x i64> %1 to <4 x i32>
2354  ret <4 x i32> %2
2355}
2356
2357define <8 x i16> @trunc_mul_const_v8i64_v8i16(<8 x i64> %a0) nounwind {
2358; SSE-LABEL: trunc_mul_const_v8i64_v8i16:
2359; SSE:       # %bb.0:
2360; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
2361; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
2362; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2363; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
2364; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
2365; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
2366; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
2367; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
2368; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
2369; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2370; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
2371; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm0
2372; SSE-NEXT:    retq
2373;
2374; AVX1-LABEL: trunc_mul_const_v8i64_v8i16:
2375; AVX1:       # %bb.0:
2376; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
2377; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
2378; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
2379; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
2380; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
2381; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2382; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2383; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2384; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2385; AVX1-NEXT:    vzeroupper
2386; AVX1-NEXT:    retq
2387;
2388; AVX2-SLOW-LABEL: trunc_mul_const_v8i64_v8i16:
2389; AVX2-SLOW:       # %bb.0:
2390; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
2391; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2392; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
2393; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
2394; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2395; AVX2-SLOW-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2396; AVX2-SLOW-NEXT:    vzeroupper
2397; AVX2-SLOW-NEXT:    retq
2398;
2399; AVX2-FAST-LABEL: trunc_mul_const_v8i64_v8i16:
2400; AVX2-FAST:       # %bb.0:
2401; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
2402; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
2403; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
2404; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2405; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
2406; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2407; AVX2-FAST-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2408; AVX2-FAST-NEXT:    vzeroupper
2409; AVX2-FAST-NEXT:    retq
2410;
2411; AVX512-LABEL: trunc_mul_const_v8i64_v8i16:
2412; AVX512:       # %bb.0:
2413; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
2414; AVX512-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2415; AVX512-NEXT:    vzeroupper
2416; AVX512-NEXT:    retq
2417  %1 = mul <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>
2418  %2 = trunc <8 x i64> %1 to <8 x i16>
2419  ret <8 x i16> %2
2420}
2421
2422define <8 x i16> @trunc_mul_const_v8i32_v8i16(<8 x i32> %a0) nounwind {
2423; SSE-LABEL: trunc_mul_const_v8i32_v8i16:
2424; SSE:       # %bb.0:
2425; SSE-NEXT:    pslld $16, %xmm1
2426; SSE-NEXT:    psrad $16, %xmm1
2427; SSE-NEXT:    pslld $16, %xmm0
2428; SSE-NEXT:    psrad $16, %xmm0
2429; SSE-NEXT:    packssdw %xmm1, %xmm0
2430; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm0
2431; SSE-NEXT:    retq
2432;
2433; AVX1-LABEL: trunc_mul_const_v8i32_v8i16:
2434; AVX1:       # %bb.0:
2435; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2436; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2437; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2438; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2439; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2440; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2441; AVX1-NEXT:    vzeroupper
2442; AVX1-NEXT:    retq
2443;
2444; AVX2-LABEL: trunc_mul_const_v8i32_v8i16:
2445; AVX2:       # %bb.0:
2446; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
2447; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2448; AVX2-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2449; AVX2-NEXT:    vzeroupper
2450; AVX2-NEXT:    retq
2451;
2452; AVX512-LABEL: trunc_mul_const_v8i32_v8i16:
2453; AVX512:       # %bb.0:
2454; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
2455; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
2456; AVX512-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2457; AVX512-NEXT:    vzeroupper
2458; AVX512-NEXT:    retq
2459  %1 = mul <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
2460  %2 = trunc <8 x i32> %1 to <8 x i16>
2461  ret <8 x i16> %2
2462}
2463
2464define <16 x i8> @trunc_mul_const_v16i64_v16i8(<16 x i64> %a0) nounwind {
2465; SSE-LABEL: trunc_mul_const_v16i64_v16i8:
2466; SSE:       # %bb.0:
2467; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm0
2468; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm1
2469; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm2
2470; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm3
2471; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm4
2472; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm5
2473; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm6
2474; SSE-NEXT:    pmuludq {{.*}}(%rip), %xmm7
2475; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
2476; SSE-NEXT:    pand %xmm8, %xmm7
2477; SSE-NEXT:    pand %xmm8, %xmm6
2478; SSE-NEXT:    packuswb %xmm7, %xmm6
2479; SSE-NEXT:    pand %xmm8, %xmm5
2480; SSE-NEXT:    pand %xmm8, %xmm4
2481; SSE-NEXT:    packuswb %xmm5, %xmm4
2482; SSE-NEXT:    packuswb %xmm6, %xmm4
2483; SSE-NEXT:    pand %xmm8, %xmm3
2484; SSE-NEXT:    pand %xmm8, %xmm2
2485; SSE-NEXT:    packuswb %xmm3, %xmm2
2486; SSE-NEXT:    pand %xmm8, %xmm1
2487; SSE-NEXT:    pand %xmm8, %xmm0
2488; SSE-NEXT:    packuswb %xmm1, %xmm0
2489; SSE-NEXT:    packuswb %xmm2, %xmm0
2490; SSE-NEXT:    packuswb %xmm4, %xmm0
2491; SSE-NEXT:    retq
2492;
2493; AVX1-LABEL: trunc_mul_const_v16i64_v16i8:
2494; AVX1:       # %bb.0:
2495; AVX1-NEXT:    vpmuludq {{.*}}(%rip), %xmm0, %xmm8
2496; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2497; AVX1-NEXT:    vpmuludq {{.*}}(%rip), %xmm0, %xmm0
2498; AVX1-NEXT:    vpmuludq {{.*}}(%rip), %xmm1, %xmm5
2499; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2500; AVX1-NEXT:    vpmuludq {{.*}}(%rip), %xmm1, %xmm1
2501; AVX1-NEXT:    vpmuludq {{.*}}(%rip), %xmm2, %xmm6
2502; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
2503; AVX1-NEXT:    vpmuludq {{.*}}(%rip), %xmm2, %xmm2
2504; AVX1-NEXT:    vpmuludq {{.*}}(%rip), %xmm3, %xmm7
2505; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
2506; AVX1-NEXT:    vpmuludq {{.*}}(%rip), %xmm3, %xmm3
2507; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255]
2508; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
2509; AVX1-NEXT:    vpand %xmm4, %xmm7, %xmm7
2510; AVX1-NEXT:    vpackusdw %xmm3, %xmm7, %xmm3
2511; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2512; AVX1-NEXT:    vpand %xmm4, %xmm6, %xmm6
2513; AVX1-NEXT:    vpackusdw %xmm2, %xmm6, %xmm2
2514; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
2515; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2516; AVX1-NEXT:    vpand %xmm4, %xmm5, %xmm3
2517; AVX1-NEXT:    vpackusdw %xmm1, %xmm3, %xmm1
2518; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2519; AVX1-NEXT:    vpand %xmm4, %xmm8, %xmm3
2520; AVX1-NEXT:    vpackusdw %xmm0, %xmm3, %xmm0
2521; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2522; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2523; AVX1-NEXT:    vzeroupper
2524; AVX1-NEXT:    retq
2525;
2526; AVX2-SLOW-LABEL: trunc_mul_const_v16i64_v16i8:
2527; AVX2-SLOW:       # %bb.0:
2528; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm2, %xmm4
2529; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[0,2],xmm4[0,2]
2530; AVX2-SLOW-NEXT:    vpmulld {{.*}}(%rip), %xmm2, %xmm2
2531; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm3, %xmm4
2532; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm3 = xmm3[0,2],xmm4[0,2]
2533; AVX2-SLOW-NEXT:    vpmulld {{.*}}(%rip), %xmm3, %xmm3
2534; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
2535; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
2536; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
2537; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
2538; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2539; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
2540; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm5
2541; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm5[0,2]
2542; AVX2-SLOW-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
2543; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm1, %xmm5
2544; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm5[0,2]
2545; AVX2-SLOW-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
2546; AVX2-SLOW-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2547; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
2548; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2549; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
2550; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2551; AVX2-SLOW-NEXT:    vzeroupper
2552; AVX2-SLOW-NEXT:    retq
2553;
2554; AVX2-FAST-LABEL: trunc_mul_const_v16i64_v16i8:
2555; AVX2-FAST:       # %bb.0:
2556; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
2557; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
2558; AVX2-FAST-NEXT:    vpmulld {{.*}}(%rip), %xmm2, %xmm2
2559; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
2560; AVX2-FAST-NEXT:    vpmulld {{.*}}(%rip), %xmm3, %xmm3
2561; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
2562; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
2563; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
2564; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
2565; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
2566; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
2567; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
2568; AVX2-FAST-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
2569; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
2570; AVX2-FAST-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
2571; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2572; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
2573; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2574; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
2575; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2576; AVX2-FAST-NEXT:    vzeroupper
2577; AVX2-FAST-NEXT:    retq
2578;
2579; AVX512F-LABEL: trunc_mul_const_v16i64_v16i8:
2580; AVX512F:       # %bb.0:
2581; AVX512F-NEXT:    vpmuludq {{.*}}(%rip), %zmm0, %zmm0
2582; AVX512F-NEXT:    vpmuludq {{.*}}(%rip), %zmm1, %zmm1
2583; AVX512F-NEXT:    vpmovqb %zmm1, %xmm1
2584; AVX512F-NEXT:    vpmovqb %zmm0, %xmm0
2585; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2586; AVX512F-NEXT:    vzeroupper
2587; AVX512F-NEXT:    retq
2588;
2589; AVX512BW-LABEL: trunc_mul_const_v16i64_v16i8:
2590; AVX512BW:       # %bb.0:
2591; AVX512BW-NEXT:    vpmuludq {{.*}}(%rip), %zmm0, %zmm0
2592; AVX512BW-NEXT:    vpmuludq {{.*}}(%rip), %zmm1, %zmm1
2593; AVX512BW-NEXT:    vpmovqb %zmm1, %xmm1
2594; AVX512BW-NEXT:    vpmovqb %zmm0, %xmm0
2595; AVX512BW-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2596; AVX512BW-NEXT:    vzeroupper
2597; AVX512BW-NEXT:    retq
2598;
2599; AVX512DQ-LABEL: trunc_mul_const_v16i64_v16i8:
2600; AVX512DQ:       # %bb.0:
2601; AVX512DQ-NEXT:    vpmullq {{.*}}(%rip), %zmm0, %zmm0
2602; AVX512DQ-NEXT:    vpmullq {{.*}}(%rip), %zmm1, %zmm1
2603; AVX512DQ-NEXT:    vpmovqb %zmm1, %xmm1
2604; AVX512DQ-NEXT:    vpmovqb %zmm0, %xmm0
2605; AVX512DQ-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2606; AVX512DQ-NEXT:    vzeroupper
2607; AVX512DQ-NEXT:    retq
2608  %1 = mul <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>
2609  %2 = trunc <16 x i64> %1 to <16 x i8>
2610  ret <16 x i8> %2
2611}
2612
2613define <16 x i8> @trunc_mul_const_v16i32_v16i8(<16 x i32> %a0) nounwind {
2614; SSE-LABEL: trunc_mul_const_v16i32_v16i8:
2615; SSE:       # %bb.0:
2616; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [0,1,2,3]
2617; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
2618; SSE-NEXT:    pmuludq %xmm4, %xmm0
2619; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2620; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2621; SSE-NEXT:    pmuludq %xmm5, %xmm4
2622; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
2623; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
2624; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [4,5,6,7]
2625; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
2626; SSE-NEXT:    pmuludq %xmm4, %xmm1
2627; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
2628; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2629; SSE-NEXT:    pmuludq %xmm5, %xmm4
2630; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
2631; SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
2632; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [8,9,10,11]
2633; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
2634; SSE-NEXT:    pmuludq %xmm4, %xmm2
2635; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
2636; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2637; SSE-NEXT:    pmuludq %xmm5, %xmm4
2638; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
2639; SSE-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
2640; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [12,13,14,15]
2641; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
2642; SSE-NEXT:    pmuludq %xmm4, %xmm3
2643; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
2644; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
2645; SSE-NEXT:    pmuludq %xmm5, %xmm4
2646; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
2647; SSE-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
2648; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
2649; SSE-NEXT:    pand %xmm4, %xmm3
2650; SSE-NEXT:    pand %xmm4, %xmm2
2651; SSE-NEXT:    packuswb %xmm3, %xmm2
2652; SSE-NEXT:    pand %xmm4, %xmm1
2653; SSE-NEXT:    pand %xmm4, %xmm0
2654; SSE-NEXT:    packuswb %xmm1, %xmm0
2655; SSE-NEXT:    packuswb %xmm2, %xmm0
2656; SSE-NEXT:    retq
2657;
2658; AVX1-LABEL: trunc_mul_const_v16i32_v16i8:
2659; AVX1:       # %bb.0:
2660; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm2
2661; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2662; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
2663; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm3
2664; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
2665; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
2666; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255]
2667; AVX1-NEXT:    vpand %xmm4, %xmm1, %xmm1
2668; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
2669; AVX1-NEXT:    vpackusdw %xmm1, %xmm3, %xmm1
2670; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
2671; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
2672; AVX1-NEXT:    vpackusdw %xmm0, %xmm2, %xmm0
2673; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2674; AVX1-NEXT:    vzeroupper
2675; AVX1-NEXT:    retq
2676;
2677; AVX2-LABEL: trunc_mul_const_v16i32_v16i8:
2678; AVX2:       # %bb.0:
2679; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
2680; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
2681; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
2682; AVX2-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
2683; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
2684; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
2685; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
2686; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2687; AVX2-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2688; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
2689; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2690; AVX2-NEXT:    vzeroupper
2691; AVX2-NEXT:    retq
2692;
2693; AVX512-LABEL: trunc_mul_const_v16i32_v16i8:
2694; AVX512:       # %bb.0:
2695; AVX512-NEXT:    vpmulld {{.*}}(%rip), %zmm0, %zmm0
2696; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
2697; AVX512-NEXT:    vzeroupper
2698; AVX512-NEXT:    retq
2699  %1 = mul <16 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2700  %2 = trunc <16 x i32> %1 to <16 x i8>
2701  ret <16 x i8> %2
2702}
2703
2704define <16 x i8> @trunc_mul_const_v16i16_v16i8(<16 x i16> %a0) nounwind {
2705; SSE-LABEL: trunc_mul_const_v16i16_v16i8:
2706; SSE:       # %bb.0:
2707; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm0
2708; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm1
2709; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2710; SSE-NEXT:    pand %xmm2, %xmm1
2711; SSE-NEXT:    pand %xmm2, %xmm0
2712; SSE-NEXT:    packuswb %xmm1, %xmm0
2713; SSE-NEXT:    retq
2714;
2715; AVX1-LABEL: trunc_mul_const_v16i16_v16i8:
2716; AVX1:       # %bb.0:
2717; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm1
2718; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
2719; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
2720; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
2721; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
2722; AVX1-NEXT:    vpand %xmm2, %xmm1, %xmm1
2723; AVX1-NEXT:    vpackuswb %xmm0, %xmm1, %xmm0
2724; AVX1-NEXT:    vzeroupper
2725; AVX1-NEXT:    retq
2726;
2727; AVX2-LABEL: trunc_mul_const_v16i16_v16i8:
2728; AVX2:       # %bb.0:
2729; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
2730; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
2731; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2732; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
2733; AVX2-NEXT:    vzeroupper
2734; AVX2-NEXT:    retq
2735;
2736; AVX512F-LABEL: trunc_mul_const_v16i16_v16i8:
2737; AVX512F:       # %bb.0:
2738; AVX512F-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
2739; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
2740; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
2741; AVX512F-NEXT:    vzeroupper
2742; AVX512F-NEXT:    retq
2743;
2744; AVX512BW-LABEL: trunc_mul_const_v16i16_v16i8:
2745; AVX512BW:       # %bb.0:
2746; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
2747; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
2748; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2749; AVX512BW-NEXT:    vzeroupper
2750; AVX512BW-NEXT:    retq
2751;
2752; AVX512DQ-LABEL: trunc_mul_const_v16i16_v16i8:
2753; AVX512DQ:       # %bb.0:
2754; AVX512DQ-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
2755; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
2756; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
2757; AVX512DQ-NEXT:    vzeroupper
2758; AVX512DQ-NEXT:    retq
2759  %1 = mul <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
2760  %2 = trunc <16 x i16> %1 to <16 x i8>
2761  ret <16 x i8> %2
2762}
2763
2764;
2765; and
2766;
2767
2768define <4 x i32> @trunc_and_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {
2769; SSE-LABEL: trunc_and_v4i64_v4i32:
2770; SSE:       # %bb.0:
2771; SSE-NEXT:    andps %xmm3, %xmm1
2772; SSE-NEXT:    andps %xmm2, %xmm0
2773; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
2774; SSE-NEXT:    retq
2775;
2776; AVX1-LABEL: trunc_and_v4i64_v4i32:
2777; AVX1:       # %bb.0:
2778; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
2779; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2780; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
2781; AVX1-NEXT:    vzeroupper
2782; AVX1-NEXT:    retq
2783;
2784; AVX2-SLOW-LABEL: trunc_and_v4i64_v4i32:
2785; AVX2-SLOW:       # %bb.0:
2786; AVX2-SLOW-NEXT:    vandps %ymm1, %ymm0, %ymm0
2787; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
2788; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
2789; AVX2-SLOW-NEXT:    vzeroupper
2790; AVX2-SLOW-NEXT:    retq
2791;
2792; AVX2-FAST-LABEL: trunc_and_v4i64_v4i32:
2793; AVX2-FAST:       # %bb.0:
2794; AVX2-FAST-NEXT:    vandps %ymm1, %ymm0, %ymm0
2795; AVX2-FAST-NEXT:    vmovaps {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
2796; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
2797; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2798; AVX2-FAST-NEXT:    vzeroupper
2799; AVX2-FAST-NEXT:    retq
2800;
2801; AVX512-LABEL: trunc_and_v4i64_v4i32:
2802; AVX512:       # %bb.0:
2803; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
2804; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
2805; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2806; AVX512-NEXT:    vzeroupper
2807; AVX512-NEXT:    retq
2808  %1 = and <4 x i64> %a0, %a1
2809  %2 = trunc <4 x i64> %1 to <4 x i32>
2810  ret <4 x i32> %2
2811}
2812
2813define <8 x i16> @trunc_and_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {
2814; SSE-LABEL: trunc_and_v8i64_v8i16:
2815; SSE:       # %bb.0:
2816; SSE-NEXT:    pand %xmm6, %xmm2
2817; SSE-NEXT:    pand %xmm7, %xmm3
2818; SSE-NEXT:    pand %xmm4, %xmm0
2819; SSE-NEXT:    pand %xmm5, %xmm1
2820; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
2821; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
2822; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2823; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
2824; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
2825; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
2826; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
2827; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
2828; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
2829; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2830; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
2831; SSE-NEXT:    retq
2832;
2833; AVX1-LABEL: trunc_and_v8i64_v8i16:
2834; AVX1:       # %bb.0:
2835; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [65535,65535,65535,65535]
2836; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
2837; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
2838; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
2839; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
2840; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
2841; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
2842; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
2843; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
2844; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2845; AVX1-NEXT:    vzeroupper
2846; AVX1-NEXT:    retq
2847;
2848; AVX2-SLOW-LABEL: trunc_and_v8i64_v8i16:
2849; AVX2-SLOW:       # %bb.0:
2850; AVX2-SLOW-NEXT:    vandps %ymm3, %ymm1, %ymm1
2851; AVX2-SLOW-NEXT:    vandps %ymm2, %ymm0, %ymm0
2852; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
2853; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2854; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
2855; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
2856; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2857; AVX2-SLOW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2858; AVX2-SLOW-NEXT:    vzeroupper
2859; AVX2-SLOW-NEXT:    retq
2860;
2861; AVX2-FAST-LABEL: trunc_and_v8i64_v8i16:
2862; AVX2-FAST:       # %bb.0:
2863; AVX2-FAST-NEXT:    vpand %ymm3, %ymm1, %ymm1
2864; AVX2-FAST-NEXT:    vpand %ymm2, %ymm0, %ymm0
2865; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
2866; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
2867; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
2868; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2869; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
2870; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2871; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2872; AVX2-FAST-NEXT:    vzeroupper
2873; AVX2-FAST-NEXT:    retq
2874;
2875; AVX512-LABEL: trunc_and_v8i64_v8i16:
2876; AVX512:       # %bb.0:
2877; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm0
2878; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
2879; AVX512-NEXT:    vzeroupper
2880; AVX512-NEXT:    retq
2881  %1 = and <8 x i64> %a0, %a1
2882  %2 = trunc <8 x i64> %1 to <8 x i16>
2883  ret <8 x i16> %2
2884}
2885
2886define <8 x i16> @trunc_and_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {
2887; SSE-LABEL: trunc_and_v8i32_v8i16:
2888; SSE:       # %bb.0:
2889; SSE-NEXT:    pand %xmm2, %xmm0
2890; SSE-NEXT:    pand %xmm3, %xmm1
2891; SSE-NEXT:    pslld $16, %xmm1
2892; SSE-NEXT:    psrad $16, %xmm1
2893; SSE-NEXT:    pslld $16, %xmm0
2894; SSE-NEXT:    psrad $16, %xmm0
2895; SSE-NEXT:    packssdw %xmm1, %xmm0
2896; SSE-NEXT:    retq
2897;
2898; AVX1-LABEL: trunc_and_v8i32_v8i16:
2899; AVX1:       # %bb.0:
2900; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
2901; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2902; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
2903; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
2904; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
2905; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
2906; AVX1-NEXT:    vzeroupper
2907; AVX1-NEXT:    retq
2908;
2909; AVX2-LABEL: trunc_and_v8i32_v8i16:
2910; AVX2:       # %bb.0:
2911; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
2912; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
2913; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
2914; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2915; AVX2-NEXT:    vzeroupper
2916; AVX2-NEXT:    retq
2917;
2918; AVX512-LABEL: trunc_and_v8i32_v8i16:
2919; AVX512:       # %bb.0:
2920; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm0
2921; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
2922; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
2923; AVX512-NEXT:    vzeroupper
2924; AVX512-NEXT:    retq
2925  %1 = and <8 x i32> %a0, %a1
2926  %2 = trunc <8 x i32> %1 to <8 x i16>
2927  ret <8 x i16> %2
2928}
2929
2930define <16 x i8> @trunc_and_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {
2931; SSE-LABEL: trunc_and_v16i64_v16i8:
2932; SSE:       # %bb.0:
2933; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm0
2934; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm1
2935; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm2
2936; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm3
2937; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm4
2938; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm5
2939; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm6
2940; SSE-NEXT:    pand {{[0-9]+}}(%rsp), %xmm7
2941; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
2942; SSE-NEXT:    pand %xmm8, %xmm7
2943; SSE-NEXT:    pand %xmm8, %xmm6
2944; SSE-NEXT:    packuswb %xmm7, %xmm6
2945; SSE-NEXT:    pand %xmm8, %xmm5
2946; SSE-NEXT:    pand %xmm8, %xmm4
2947; SSE-NEXT:    packuswb %xmm5, %xmm4
2948; SSE-NEXT:    packuswb %xmm6, %xmm4
2949; SSE-NEXT:    pand %xmm8, %xmm3
2950; SSE-NEXT:    pand %xmm8, %xmm2
2951; SSE-NEXT:    packuswb %xmm3, %xmm2
2952; SSE-NEXT:    pand %xmm8, %xmm1
2953; SSE-NEXT:    pand %xmm8, %xmm0
2954; SSE-NEXT:    packuswb %xmm1, %xmm0
2955; SSE-NEXT:    packuswb %xmm2, %xmm0
2956; SSE-NEXT:    packuswb %xmm4, %xmm0
2957; SSE-NEXT:    retq
2958;
2959; AVX1-LABEL: trunc_and_v16i64_v16i8:
2960; AVX1:       # %bb.0:
2961; AVX1-NEXT:    vmovaps {{.*#+}} ymm8 = [255,255,255,255]
2962; AVX1-NEXT:    vandps %ymm7, %ymm8, %ymm7
2963; AVX1-NEXT:    vandps %ymm7, %ymm3, %ymm3
2964; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm7
2965; AVX1-NEXT:    vpackusdw %xmm7, %xmm3, %xmm3
2966; AVX1-NEXT:    vandps %ymm6, %ymm8, %ymm6
2967; AVX1-NEXT:    vandps %ymm6, %ymm2, %ymm2
2968; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm6
2969; AVX1-NEXT:    vpackusdw %xmm6, %xmm2, %xmm2
2970; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
2971; AVX1-NEXT:    vandps %ymm5, %ymm8, %ymm3
2972; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
2973; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
2974; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
2975; AVX1-NEXT:    vandps %ymm4, %ymm8, %ymm3
2976; AVX1-NEXT:    vandps %ymm3, %ymm0, %ymm0
2977; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
2978; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
2979; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
2980; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
2981; AVX1-NEXT:    vzeroupper
2982; AVX1-NEXT:    retq
2983;
2984; AVX2-SLOW-LABEL: trunc_and_v16i64_v16i8:
2985; AVX2-SLOW:       # %bb.0:
2986; AVX2-SLOW-NEXT:    vandps %ymm5, %ymm1, %ymm1
2987; AVX2-SLOW-NEXT:    vandps %ymm4, %ymm0, %ymm0
2988; AVX2-SLOW-NEXT:    vandps %ymm7, %ymm3, %ymm3
2989; AVX2-SLOW-NEXT:    vandps %ymm6, %ymm2, %ymm2
2990; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
2991; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
2992; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
2993; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
2994; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
2995; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
2996; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
2997; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
2998; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
2999; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3000; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
3001; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
3002; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3003; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
3004; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3005; AVX2-SLOW-NEXT:    vzeroupper
3006; AVX2-SLOW-NEXT:    retq
3007;
3008; AVX2-FAST-LABEL: trunc_and_v16i64_v16i8:
3009; AVX2-FAST:       # %bb.0:
3010; AVX2-FAST-NEXT:    vpand %ymm5, %ymm1, %ymm1
3011; AVX2-FAST-NEXT:    vpand %ymm4, %ymm0, %ymm0
3012; AVX2-FAST-NEXT:    vpand %ymm7, %ymm3, %ymm3
3013; AVX2-FAST-NEXT:    vpand %ymm6, %ymm2, %ymm2
3014; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
3015; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
3016; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
3017; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
3018; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
3019; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
3020; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
3021; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
3022; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
3023; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
3024; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
3025; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3026; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
3027; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3028; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
3029; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3030; AVX2-FAST-NEXT:    vzeroupper
3031; AVX2-FAST-NEXT:    retq
3032;
3033; AVX512-LABEL: trunc_and_v16i64_v16i8:
3034; AVX512:       # %bb.0:
3035; AVX512-NEXT:    vpandq %zmm2, %zmm0, %zmm0
3036; AVX512-NEXT:    vpandq %zmm3, %zmm1, %zmm1
3037; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
3038; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
3039; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3040; AVX512-NEXT:    vzeroupper
3041; AVX512-NEXT:    retq
3042  %1 = and <16 x i64> %a0, %a1
3043  %2 = trunc <16 x i64> %1 to <16 x i8>
3044  ret <16 x i8> %2
3045}
3046
3047define <16 x i8> @trunc_and_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {
3048; SSE-LABEL: trunc_and_v16i32_v16i8:
3049; SSE:       # %bb.0:
3050; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
3051; SSE-NEXT:    pand %xmm8, %xmm7
3052; SSE-NEXT:    pand %xmm3, %xmm7
3053; SSE-NEXT:    pand %xmm8, %xmm6
3054; SSE-NEXT:    pand %xmm2, %xmm6
3055; SSE-NEXT:    packuswb %xmm7, %xmm6
3056; SSE-NEXT:    pand %xmm8, %xmm5
3057; SSE-NEXT:    pand %xmm1, %xmm5
3058; SSE-NEXT:    pand %xmm8, %xmm4
3059; SSE-NEXT:    pand %xmm4, %xmm0
3060; SSE-NEXT:    packuswb %xmm5, %xmm0
3061; SSE-NEXT:    packuswb %xmm6, %xmm0
3062; SSE-NEXT:    retq
3063;
3064; AVX1-LABEL: trunc_and_v16i32_v16i8:
3065; AVX1:       # %bb.0:
3066; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255]
3067; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
3068; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
3069; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3070; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3071; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
3072; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
3073; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3074; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3075; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3076; AVX1-NEXT:    vzeroupper
3077; AVX1-NEXT:    retq
3078;
3079; AVX2-LABEL: trunc_and_v16i32_v16i8:
3080; AVX2:       # %bb.0:
3081; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
3082; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm1
3083; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
3084; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
3085; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
3086; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
3087; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
3088; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
3089; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3090; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
3091; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3092; AVX2-NEXT:    vzeroupper
3093; AVX2-NEXT:    retq
3094;
3095; AVX512-LABEL: trunc_and_v16i32_v16i8:
3096; AVX512:       # %bb.0:
3097; AVX512-NEXT:    vpandd %zmm1, %zmm0, %zmm0
3098; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
3099; AVX512-NEXT:    vzeroupper
3100; AVX512-NEXT:    retq
3101  %1 = and <16 x i32> %a0, %a1
3102  %2 = trunc <16 x i32> %1 to <16 x i8>
3103  ret <16 x i8> %2
3104}
3105
3106define <16 x i8> @trunc_and_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {
3107; SSE-LABEL: trunc_and_v16i16_v16i8:
3108; SSE:       # %bb.0:
3109; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
3110; SSE-NEXT:    pand %xmm4, %xmm3
3111; SSE-NEXT:    pand %xmm1, %xmm3
3112; SSE-NEXT:    pand %xmm4, %xmm2
3113; SSE-NEXT:    pand %xmm2, %xmm0
3114; SSE-NEXT:    packuswb %xmm3, %xmm0
3115; SSE-NEXT:    retq
3116;
3117; AVX1-LABEL: trunc_and_v16i16_v16i8:
3118; AVX1:       # %bb.0:
3119; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
3120; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
3121; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3122; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3123; AVX1-NEXT:    vzeroupper
3124; AVX1-NEXT:    retq
3125;
3126; AVX2-LABEL: trunc_and_v16i16_v16i8:
3127; AVX2:       # %bb.0:
3128; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm0
3129; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3130; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3131; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3132; AVX2-NEXT:    vzeroupper
3133; AVX2-NEXT:    retq
3134;
3135; AVX512F-LABEL: trunc_and_v16i16_v16i8:
3136; AVX512F:       # %bb.0:
3137; AVX512F-NEXT:    vpand %ymm1, %ymm0, %ymm0
3138; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3139; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3140; AVX512F-NEXT:    vzeroupper
3141; AVX512F-NEXT:    retq
3142;
3143; AVX512BW-LABEL: trunc_and_v16i16_v16i8:
3144; AVX512BW:       # %bb.0:
3145; AVX512BW-NEXT:    vpand %ymm1, %ymm0, %ymm0
3146; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
3147; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3148; AVX512BW-NEXT:    vzeroupper
3149; AVX512BW-NEXT:    retq
3150;
3151; AVX512DQ-LABEL: trunc_and_v16i16_v16i8:
3152; AVX512DQ:       # %bb.0:
3153; AVX512DQ-NEXT:    vpand %ymm1, %ymm0, %ymm0
3154; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3155; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
3156; AVX512DQ-NEXT:    vzeroupper
3157; AVX512DQ-NEXT:    retq
3158  %1 = and <16 x i16> %a0, %a1
3159  %2 = trunc <16 x i16> %1 to <16 x i8>
3160  ret <16 x i8> %2
3161}
3162
3163;
3164; and to constant
3165;
3166
3167define <4 x i32> @trunc_and_const_v4i64_v4i32(<4 x i64> %a0) nounwind {
3168; SSE-LABEL: trunc_and_const_v4i64_v4i32:
3169; SSE:       # %bb.0:
3170; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3171; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
3172; SSE-NEXT:    retq
3173;
3174; AVX1-LABEL: trunc_and_const_v4i64_v4i32:
3175; AVX1:       # %bb.0:
3176; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3177; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3178; AVX1-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
3179; AVX1-NEXT:    vzeroupper
3180; AVX1-NEXT:    retq
3181;
3182; AVX2-SLOW-LABEL: trunc_and_const_v4i64_v4i32:
3183; AVX2-SLOW:       # %bb.0:
3184; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
3185; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3186; AVX2-SLOW-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
3187; AVX2-SLOW-NEXT:    vzeroupper
3188; AVX2-SLOW-NEXT:    retq
3189;
3190; AVX2-FAST-LABEL: trunc_and_const_v4i64_v4i32:
3191; AVX2-FAST:       # %bb.0:
3192; AVX2-FAST-NEXT:    vmovaps {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
3193; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
3194; AVX2-FAST-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
3195; AVX2-FAST-NEXT:    vzeroupper
3196; AVX2-FAST-NEXT:    retq
3197;
3198; AVX512-LABEL: trunc_and_const_v4i64_v4i32:
3199; AVX512:       # %bb.0:
3200; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3201; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
3202; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3203; AVX512-NEXT:    vzeroupper
3204; AVX512-NEXT:    retq
3205  %1 = and <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>
3206  %2 = trunc <4 x i64> %1 to <4 x i32>
3207  ret <4 x i32> %2
3208}
3209
3210define <8 x i16> @trunc_and_const_v8i64_v8i16(<8 x i64> %a0) nounwind {
3211; SSE-LABEL: trunc_and_const_v8i64_v8i16:
3212; SSE:       # %bb.0:
3213; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3214; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
3215; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3216; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
3217; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
3218; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
3219; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
3220; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
3221; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
3222; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3223; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
3224; SSE-NEXT:    andpd {{.*}}(%rip), %xmm0
3225; SSE-NEXT:    retq
3226;
3227; AVX1-LABEL: trunc_and_const_v8i64_v8i16:
3228; AVX1:       # %bb.0:
3229; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
3230; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
3231; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3232; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3233; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
3234; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3235; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3236; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3237; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3238; AVX1-NEXT:    vzeroupper
3239; AVX1-NEXT:    retq
3240;
3241; AVX2-SLOW-LABEL: trunc_and_const_v8i64_v8i16:
3242; AVX2-SLOW:       # %bb.0:
3243; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
3244; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3245; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
3246; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
3247; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3248; AVX2-SLOW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3249; AVX2-SLOW-NEXT:    vzeroupper
3250; AVX2-SLOW-NEXT:    retq
3251;
3252; AVX2-FAST-LABEL: trunc_and_const_v8i64_v8i16:
3253; AVX2-FAST:       # %bb.0:
3254; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
3255; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
3256; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
3257; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3258; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
3259; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3260; AVX2-FAST-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3261; AVX2-FAST-NEXT:    vzeroupper
3262; AVX2-FAST-NEXT:    retq
3263;
3264; AVX512-LABEL: trunc_and_const_v8i64_v8i16:
3265; AVX512:       # %bb.0:
3266; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
3267; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3268; AVX512-NEXT:    vzeroupper
3269; AVX512-NEXT:    retq
3270  %1 = and <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>
3271  %2 = trunc <8 x i64> %1 to <8 x i16>
3272  ret <8 x i16> %2
3273}
3274
3275define <8 x i16> @trunc_and_const_v8i32_v8i16(<8 x i32> %a0) nounwind {
3276; SSE-LABEL: trunc_and_const_v8i32_v8i16:
3277; SSE:       # %bb.0:
3278; SSE-NEXT:    pslld $16, %xmm1
3279; SSE-NEXT:    psrad $16, %xmm1
3280; SSE-NEXT:    pslld $16, %xmm0
3281; SSE-NEXT:    psrad $16, %xmm0
3282; SSE-NEXT:    packssdw %xmm1, %xmm0
3283; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
3284; SSE-NEXT:    retq
3285;
3286; AVX1-LABEL: trunc_and_const_v8i32_v8i16:
3287; AVX1:       # %bb.0:
3288; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3289; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
3290; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
3291; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
3292; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3293; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3294; AVX1-NEXT:    vzeroupper
3295; AVX1-NEXT:    retq
3296;
3297; AVX2-LABEL: trunc_and_const_v8i32_v8i16:
3298; AVX2:       # %bb.0:
3299; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
3300; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3301; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3302; AVX2-NEXT:    vzeroupper
3303; AVX2-NEXT:    retq
3304;
3305; AVX512-LABEL: trunc_and_const_v8i32_v8i16:
3306; AVX512:       # %bb.0:
3307; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3308; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
3309; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3310; AVX512-NEXT:    vzeroupper
3311; AVX512-NEXT:    retq
3312  %1 = and <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
3313  %2 = trunc <8 x i32> %1 to <8 x i16>
3314  ret <8 x i16> %2
3315}
3316
3317define <16 x i8> @trunc_and_const_v16i64_v16i8(<16 x i64> %a0) nounwind {
3318; SSE-LABEL: trunc_and_const_v16i64_v16i8:
3319; SSE:       # %bb.0:
3320; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
3321; SSE-NEXT:    pand %xmm8, %xmm7
3322; SSE-NEXT:    pand %xmm8, %xmm6
3323; SSE-NEXT:    packuswb %xmm7, %xmm6
3324; SSE-NEXT:    pand %xmm8, %xmm5
3325; SSE-NEXT:    pand %xmm8, %xmm4
3326; SSE-NEXT:    packuswb %xmm5, %xmm4
3327; SSE-NEXT:    packuswb %xmm6, %xmm4
3328; SSE-NEXT:    pand %xmm8, %xmm3
3329; SSE-NEXT:    pand %xmm8, %xmm2
3330; SSE-NEXT:    packuswb %xmm3, %xmm2
3331; SSE-NEXT:    pand %xmm8, %xmm1
3332; SSE-NEXT:    pand %xmm8, %xmm0
3333; SSE-NEXT:    packuswb %xmm1, %xmm0
3334; SSE-NEXT:    packuswb %xmm2, %xmm0
3335; SSE-NEXT:    packuswb %xmm4, %xmm0
3336; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
3337; SSE-NEXT:    retq
3338;
3339; AVX1-LABEL: trunc_and_const_v16i64_v16i8:
3340; AVX1:       # %bb.0:
3341; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [255,255,255,255]
3342; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
3343; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
3344; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
3345; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
3346; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
3347; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
3348; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
3349; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1
3350; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3351; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3352; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0
3353; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
3354; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
3355; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3356; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3357; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3358; AVX1-NEXT:    vzeroupper
3359; AVX1-NEXT:    retq
3360;
3361; AVX2-SLOW-LABEL: trunc_and_const_v16i64_v16i8:
3362; AVX2-SLOW:       # %bb.0:
3363; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
3364; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
3365; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
3366; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
3367; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
3368; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
3369; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
3370; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
3371; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
3372; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3373; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
3374; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
3375; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3376; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
3377; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3378; AVX2-SLOW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3379; AVX2-SLOW-NEXT:    vzeroupper
3380; AVX2-SLOW-NEXT:    retq
3381;
3382; AVX2-FAST-LABEL: trunc_and_const_v16i64_v16i8:
3383; AVX2-FAST:       # %bb.0:
3384; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
3385; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
3386; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
3387; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
3388; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
3389; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
3390; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
3391; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
3392; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
3393; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
3394; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
3395; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3396; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
3397; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3398; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
3399; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3400; AVX2-FAST-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3401; AVX2-FAST-NEXT:    vzeroupper
3402; AVX2-FAST-NEXT:    retq
3403;
3404; AVX512-LABEL: trunc_and_const_v16i64_v16i8:
3405; AVX512:       # %bb.0:
3406; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
3407; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
3408; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3409; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3410; AVX512-NEXT:    vzeroupper
3411; AVX512-NEXT:    retq
3412  %1 = and <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>
3413  %2 = trunc <16 x i64> %1 to <16 x i8>
3414  ret <16 x i8> %2
3415}
3416
3417define <16 x i8> @trunc_and_const_v16i32_v16i8(<16 x i32> %a0) nounwind {
3418; SSE-LABEL: trunc_and_const_v16i32_v16i8:
3419; SSE:       # %bb.0:
3420; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
3421; SSE-NEXT:    pand %xmm4, %xmm3
3422; SSE-NEXT:    pand %xmm4, %xmm2
3423; SSE-NEXT:    packuswb %xmm3, %xmm2
3424; SSE-NEXT:    pand %xmm4, %xmm1
3425; SSE-NEXT:    pand %xmm4, %xmm0
3426; SSE-NEXT:    packuswb %xmm1, %xmm0
3427; SSE-NEXT:    packuswb %xmm2, %xmm0
3428; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
3429; SSE-NEXT:    retq
3430;
3431; AVX1-LABEL: trunc_and_const_v16i32_v16i8:
3432; AVX1:       # %bb.0:
3433; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
3434; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
3435; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3436; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3437; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
3438; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3439; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3440; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3441; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3442; AVX1-NEXT:    vzeroupper
3443; AVX1-NEXT:    retq
3444;
3445; AVX2-LABEL: trunc_and_const_v16i32_v16i8:
3446; AVX2:       # %bb.0:
3447; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
3448; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
3449; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
3450; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
3451; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
3452; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
3453; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3454; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
3455; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3456; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3457; AVX2-NEXT:    vzeroupper
3458; AVX2-NEXT:    retq
3459;
3460; AVX512-LABEL: trunc_and_const_v16i32_v16i8:
3461; AVX512:       # %bb.0:
3462; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
3463; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3464; AVX512-NEXT:    vzeroupper
3465; AVX512-NEXT:    retq
3466  %1 = and <16 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
3467  %2 = trunc <16 x i32> %1 to <16 x i8>
3468  ret <16 x i8> %2
3469}
3470
3471define <16 x i8> @trunc_and_const_v16i16_v16i8(<16 x i16> %a0) nounwind {
3472; SSE-LABEL: trunc_and_const_v16i16_v16i8:
3473; SSE:       # %bb.0:
3474; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
3475; SSE-NEXT:    pand %xmm2, %xmm1
3476; SSE-NEXT:    pand %xmm2, %xmm0
3477; SSE-NEXT:    packuswb %xmm1, %xmm0
3478; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
3479; SSE-NEXT:    retq
3480;
3481; AVX1-LABEL: trunc_and_const_v16i16_v16i8:
3482; AVX1:       # %bb.0:
3483; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
3484; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3485; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3486; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3487; AVX1-NEXT:    vzeroupper
3488; AVX1-NEXT:    retq
3489;
3490; AVX2-LABEL: trunc_and_const_v16i16_v16i8:
3491; AVX2:       # %bb.0:
3492; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3493; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3494; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3495; AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3496; AVX2-NEXT:    vzeroupper
3497; AVX2-NEXT:    retq
3498;
3499; AVX512F-LABEL: trunc_and_const_v16i16_v16i8:
3500; AVX512F:       # %bb.0:
3501; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3502; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3503; AVX512F-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3504; AVX512F-NEXT:    vzeroupper
3505; AVX512F-NEXT:    retq
3506;
3507; AVX512BW-LABEL: trunc_and_const_v16i16_v16i8:
3508; AVX512BW:       # %bb.0:
3509; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3510; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
3511; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3512; AVX512BW-NEXT:    vzeroupper
3513; AVX512BW-NEXT:    retq
3514;
3515; AVX512DQ-LABEL: trunc_and_const_v16i16_v16i8:
3516; AVX512DQ:       # %bb.0:
3517; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3518; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
3519; AVX512DQ-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
3520; AVX512DQ-NEXT:    vzeroupper
3521; AVX512DQ-NEXT:    retq
3522  %1 = and <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
3523  %2 = trunc <16 x i16> %1 to <16 x i8>
3524  ret <16 x i8> %2
3525}
3526
3527;
3528; xor
3529;
3530
3531define <4 x i32> @trunc_xor_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {
3532; SSE-LABEL: trunc_xor_v4i64_v4i32:
3533; SSE:       # %bb.0:
3534; SSE-NEXT:    xorps %xmm3, %xmm1
3535; SSE-NEXT:    xorps %xmm2, %xmm0
3536; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3537; SSE-NEXT:    retq
3538;
3539; AVX1-LABEL: trunc_xor_v4i64_v4i32:
3540; AVX1:       # %bb.0:
3541; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
3542; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3543; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3544; AVX1-NEXT:    vzeroupper
3545; AVX1-NEXT:    retq
3546;
3547; AVX2-SLOW-LABEL: trunc_xor_v4i64_v4i32:
3548; AVX2-SLOW:       # %bb.0:
3549; AVX2-SLOW-NEXT:    vxorps %ymm1, %ymm0, %ymm0
3550; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
3551; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3552; AVX2-SLOW-NEXT:    vzeroupper
3553; AVX2-SLOW-NEXT:    retq
3554;
3555; AVX2-FAST-LABEL: trunc_xor_v4i64_v4i32:
3556; AVX2-FAST:       # %bb.0:
3557; AVX2-FAST-NEXT:    vxorps %ymm1, %ymm0, %ymm0
3558; AVX2-FAST-NEXT:    vmovaps {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
3559; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
3560; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3561; AVX2-FAST-NEXT:    vzeroupper
3562; AVX2-FAST-NEXT:    retq
3563;
3564; AVX512-LABEL: trunc_xor_v4i64_v4i32:
3565; AVX512:       # %bb.0:
3566; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
3567; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
3568; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3569; AVX512-NEXT:    vzeroupper
3570; AVX512-NEXT:    retq
3571  %1 = xor <4 x i64> %a0, %a1
3572  %2 = trunc <4 x i64> %1 to <4 x i32>
3573  ret <4 x i32> %2
3574}
3575
3576define <8 x i16> @trunc_xor_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {
3577; SSE-LABEL: trunc_xor_v8i64_v8i16:
3578; SSE:       # %bb.0:
3579; SSE-NEXT:    pxor %xmm6, %xmm2
3580; SSE-NEXT:    pxor %xmm7, %xmm3
3581; SSE-NEXT:    pxor %xmm4, %xmm0
3582; SSE-NEXT:    pxor %xmm5, %xmm1
3583; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3584; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
3585; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3586; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
3587; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
3588; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
3589; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
3590; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
3591; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
3592; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3593; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
3594; SSE-NEXT:    retq
3595;
3596; AVX1-LABEL: trunc_xor_v8i64_v8i16:
3597; AVX1:       # %bb.0:
3598; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
3599; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
3600; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
3601; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
3602; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3603; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3604; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
3605; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3606; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3607; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3608; AVX1-NEXT:    vzeroupper
3609; AVX1-NEXT:    retq
3610;
3611; AVX2-SLOW-LABEL: trunc_xor_v8i64_v8i16:
3612; AVX2-SLOW:       # %bb.0:
3613; AVX2-SLOW-NEXT:    vxorps %ymm3, %ymm1, %ymm1
3614; AVX2-SLOW-NEXT:    vxorps %ymm2, %ymm0, %ymm0
3615; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
3616; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3617; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
3618; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
3619; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3620; AVX2-SLOW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3621; AVX2-SLOW-NEXT:    vzeroupper
3622; AVX2-SLOW-NEXT:    retq
3623;
3624; AVX2-FAST-LABEL: trunc_xor_v8i64_v8i16:
3625; AVX2-FAST:       # %bb.0:
3626; AVX2-FAST-NEXT:    vpxor %ymm3, %ymm1, %ymm1
3627; AVX2-FAST-NEXT:    vpxor %ymm2, %ymm0, %ymm0
3628; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
3629; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
3630; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
3631; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3632; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
3633; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3634; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3635; AVX2-FAST-NEXT:    vzeroupper
3636; AVX2-FAST-NEXT:    retq
3637;
3638; AVX512-LABEL: trunc_xor_v8i64_v8i16:
3639; AVX512:       # %bb.0:
3640; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
3641; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
3642; AVX512-NEXT:    vzeroupper
3643; AVX512-NEXT:    retq
3644  %1 = xor <8 x i64> %a0, %a1
3645  %2 = trunc <8 x i64> %1 to <8 x i16>
3646  ret <8 x i16> %2
3647}
3648
3649define <8 x i16> @trunc_xor_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {
3650; SSE-LABEL: trunc_xor_v8i32_v8i16:
3651; SSE:       # %bb.0:
3652; SSE-NEXT:    pxor %xmm2, %xmm0
3653; SSE-NEXT:    pxor %xmm3, %xmm1
3654; SSE-NEXT:    pslld $16, %xmm1
3655; SSE-NEXT:    psrad $16, %xmm1
3656; SSE-NEXT:    pslld $16, %xmm0
3657; SSE-NEXT:    psrad $16, %xmm0
3658; SSE-NEXT:    packssdw %xmm1, %xmm0
3659; SSE-NEXT:    retq
3660;
3661; AVX1-LABEL: trunc_xor_v8i32_v8i16:
3662; AVX1:       # %bb.0:
3663; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
3664; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3665; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
3666; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
3667; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
3668; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3669; AVX1-NEXT:    vzeroupper
3670; AVX1-NEXT:    retq
3671;
3672; AVX2-LABEL: trunc_xor_v8i32_v8i16:
3673; AVX2:       # %bb.0:
3674; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
3675; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
3676; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3677; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3678; AVX2-NEXT:    vzeroupper
3679; AVX2-NEXT:    retq
3680;
3681; AVX512-LABEL: trunc_xor_v8i32_v8i16:
3682; AVX512:       # %bb.0:
3683; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
3684; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
3685; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3686; AVX512-NEXT:    vzeroupper
3687; AVX512-NEXT:    retq
3688  %1 = xor <8 x i32> %a0, %a1
3689  %2 = trunc <8 x i32> %1 to <8 x i16>
3690  ret <8 x i16> %2
3691}
3692
3693define <16 x i8> @trunc_xor_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {
3694; SSE-LABEL: trunc_xor_v16i64_v16i8:
3695; SSE:       # %bb.0:
3696; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm0
3697; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm1
3698; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm2
3699; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm3
3700; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm4
3701; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm5
3702; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm6
3703; SSE-NEXT:    pxor {{[0-9]+}}(%rsp), %xmm7
3704; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
3705; SSE-NEXT:    pand %xmm8, %xmm7
3706; SSE-NEXT:    pand %xmm8, %xmm6
3707; SSE-NEXT:    packuswb %xmm7, %xmm6
3708; SSE-NEXT:    pand %xmm8, %xmm5
3709; SSE-NEXT:    pand %xmm8, %xmm4
3710; SSE-NEXT:    packuswb %xmm5, %xmm4
3711; SSE-NEXT:    packuswb %xmm6, %xmm4
3712; SSE-NEXT:    pand %xmm8, %xmm3
3713; SSE-NEXT:    pand %xmm8, %xmm2
3714; SSE-NEXT:    packuswb %xmm3, %xmm2
3715; SSE-NEXT:    pand %xmm8, %xmm1
3716; SSE-NEXT:    pand %xmm8, %xmm0
3717; SSE-NEXT:    packuswb %xmm1, %xmm0
3718; SSE-NEXT:    packuswb %xmm2, %xmm0
3719; SSE-NEXT:    packuswb %xmm4, %xmm0
3720; SSE-NEXT:    retq
3721;
3722; AVX1-LABEL: trunc_xor_v16i64_v16i8:
3723; AVX1:       # %bb.0:
3724; AVX1-NEXT:    vxorps %ymm4, %ymm0, %ymm0
3725; AVX1-NEXT:    vxorps %ymm5, %ymm1, %ymm1
3726; AVX1-NEXT:    vxorps %ymm6, %ymm2, %ymm2
3727; AVX1-NEXT:    vxorps %ymm7, %ymm3, %ymm3
3728; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [255,255,255,255]
3729; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
3730; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
3731; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
3732; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
3733; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
3734; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
3735; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
3736; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1
3737; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3738; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3739; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0
3740; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
3741; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
3742; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
3743; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3744; AVX1-NEXT:    vzeroupper
3745; AVX1-NEXT:    retq
3746;
3747; AVX2-SLOW-LABEL: trunc_xor_v16i64_v16i8:
3748; AVX2-SLOW:       # %bb.0:
3749; AVX2-SLOW-NEXT:    vxorps %ymm5, %ymm1, %ymm1
3750; AVX2-SLOW-NEXT:    vxorps %ymm4, %ymm0, %ymm0
3751; AVX2-SLOW-NEXT:    vxorps %ymm7, %ymm3, %ymm3
3752; AVX2-SLOW-NEXT:    vxorps %ymm6, %ymm2, %ymm2
3753; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
3754; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
3755; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
3756; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
3757; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
3758; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
3759; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
3760; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
3761; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
3762; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
3763; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
3764; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
3765; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3766; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
3767; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3768; AVX2-SLOW-NEXT:    vzeroupper
3769; AVX2-SLOW-NEXT:    retq
3770;
3771; AVX2-FAST-LABEL: trunc_xor_v16i64_v16i8:
3772; AVX2-FAST:       # %bb.0:
3773; AVX2-FAST-NEXT:    vpxor %ymm5, %ymm1, %ymm1
3774; AVX2-FAST-NEXT:    vpxor %ymm4, %ymm0, %ymm0
3775; AVX2-FAST-NEXT:    vpxor %ymm7, %ymm3, %ymm3
3776; AVX2-FAST-NEXT:    vpxor %ymm6, %ymm2, %ymm2
3777; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
3778; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
3779; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
3780; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
3781; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
3782; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
3783; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
3784; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
3785; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
3786; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
3787; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
3788; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
3789; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
3790; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3791; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
3792; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
3793; AVX2-FAST-NEXT:    vzeroupper
3794; AVX2-FAST-NEXT:    retq
3795;
3796; AVX512-LABEL: trunc_xor_v16i64_v16i8:
3797; AVX512:       # %bb.0:
3798; AVX512-NEXT:    vpxorq %zmm2, %zmm0, %zmm0
3799; AVX512-NEXT:    vpxorq %zmm3, %zmm1, %zmm1
3800; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
3801; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
3802; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
3803; AVX512-NEXT:    vzeroupper
3804; AVX512-NEXT:    retq
3805  %1 = xor <16 x i64> %a0, %a1
3806  %2 = trunc <16 x i64> %1 to <16 x i8>
3807  ret <16 x i8> %2
3808}
3809
3810define <16 x i8> @trunc_xor_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {
3811; SSE-LABEL: trunc_xor_v16i32_v16i8:
3812; SSE:       # %bb.0:
3813; SSE-NEXT:    pxor %xmm4, %xmm0
3814; SSE-NEXT:    pxor %xmm5, %xmm1
3815; SSE-NEXT:    pxor %xmm6, %xmm2
3816; SSE-NEXT:    pxor %xmm7, %xmm3
3817; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
3818; SSE-NEXT:    pand %xmm4, %xmm3
3819; SSE-NEXT:    pand %xmm4, %xmm2
3820; SSE-NEXT:    packuswb %xmm3, %xmm2
3821; SSE-NEXT:    pand %xmm4, %xmm1
3822; SSE-NEXT:    pand %xmm4, %xmm0
3823; SSE-NEXT:    packuswb %xmm1, %xmm0
3824; SSE-NEXT:    packuswb %xmm2, %xmm0
3825; SSE-NEXT:    retq
3826;
3827; AVX1-LABEL: trunc_xor_v16i32_v16i8:
3828; AVX1:       # %bb.0:
3829; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
3830; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
3831; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
3832; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
3833; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3834; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3835; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
3836; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3837; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3838; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3839; AVX1-NEXT:    vzeroupper
3840; AVX1-NEXT:    retq
3841;
3842; AVX2-LABEL: trunc_xor_v16i32_v16i8:
3843; AVX2:       # %bb.0:
3844; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
3845; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
3846; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
3847; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
3848; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
3849; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
3850; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
3851; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
3852; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
3853; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
3854; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3855; AVX2-NEXT:    vzeroupper
3856; AVX2-NEXT:    retq
3857;
3858; AVX512-LABEL: trunc_xor_v16i32_v16i8:
3859; AVX512:       # %bb.0:
3860; AVX512-NEXT:    vpxord %zmm1, %zmm0, %zmm0
3861; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
3862; AVX512-NEXT:    vzeroupper
3863; AVX512-NEXT:    retq
3864  %1 = xor <16 x i32> %a0, %a1
3865  %2 = trunc <16 x i32> %1 to <16 x i8>
3866  ret <16 x i8> %2
3867}
3868
3869define <16 x i8> @trunc_xor_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {
3870; SSE-LABEL: trunc_xor_v16i16_v16i8:
3871; SSE:       # %bb.0:
3872; SSE-NEXT:    pxor %xmm2, %xmm0
3873; SSE-NEXT:    pxor %xmm3, %xmm1
3874; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
3875; SSE-NEXT:    pand %xmm2, %xmm1
3876; SSE-NEXT:    pand %xmm2, %xmm0
3877; SSE-NEXT:    packuswb %xmm1, %xmm0
3878; SSE-NEXT:    retq
3879;
3880; AVX1-LABEL: trunc_xor_v16i16_v16i8:
3881; AVX1:       # %bb.0:
3882; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
3883; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
3884; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3885; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3886; AVX1-NEXT:    vzeroupper
3887; AVX1-NEXT:    retq
3888;
3889; AVX2-LABEL: trunc_xor_v16i16_v16i8:
3890; AVX2:       # %bb.0:
3891; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
3892; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
3893; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
3894; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
3895; AVX2-NEXT:    vzeroupper
3896; AVX2-NEXT:    retq
3897;
3898; AVX512F-LABEL: trunc_xor_v16i16_v16i8:
3899; AVX512F:       # %bb.0:
3900; AVX512F-NEXT:    vpxor %ymm1, %ymm0, %ymm0
3901; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3902; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
3903; AVX512F-NEXT:    vzeroupper
3904; AVX512F-NEXT:    retq
3905;
3906; AVX512BW-LABEL: trunc_xor_v16i16_v16i8:
3907; AVX512BW:       # %bb.0:
3908; AVX512BW-NEXT:    vpxor %ymm1, %ymm0, %ymm0
3909; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
3910; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
3911; AVX512BW-NEXT:    vzeroupper
3912; AVX512BW-NEXT:    retq
3913;
3914; AVX512DQ-LABEL: trunc_xor_v16i16_v16i8:
3915; AVX512DQ:       # %bb.0:
3916; AVX512DQ-NEXT:    vpxor %ymm1, %ymm0, %ymm0
3917; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
3918; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
3919; AVX512DQ-NEXT:    vzeroupper
3920; AVX512DQ-NEXT:    retq
3921  %1 = xor <16 x i16> %a0, %a1
3922  %2 = trunc <16 x i16> %1 to <16 x i8>
3923  ret <16 x i8> %2
3924}
3925
3926;
3927; xor to constant
3928;
3929
3930define <4 x i32> @trunc_xor_const_v4i64_v4i32(<4 x i64> %a0) nounwind {
3931; SSE-LABEL: trunc_xor_const_v4i64_v4i32:
3932; SSE:       # %bb.0:
3933; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3934; SSE-NEXT:    xorps {{.*}}(%rip), %xmm0
3935; SSE-NEXT:    retq
3936;
3937; AVX1-LABEL: trunc_xor_const_v4i64_v4i32:
3938; AVX1:       # %bb.0:
3939; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
3940; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3941; AVX1-NEXT:    vxorps {{.*}}(%rip), %xmm0, %xmm0
3942; AVX1-NEXT:    vzeroupper
3943; AVX1-NEXT:    retq
3944;
3945; AVX2-SLOW-LABEL: trunc_xor_const_v4i64_v4i32:
3946; AVX2-SLOW:       # %bb.0:
3947; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
3948; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
3949; AVX2-SLOW-NEXT:    vxorps {{.*}}(%rip), %xmm0, %xmm0
3950; AVX2-SLOW-NEXT:    vzeroupper
3951; AVX2-SLOW-NEXT:    retq
3952;
3953; AVX2-FAST-LABEL: trunc_xor_const_v4i64_v4i32:
3954; AVX2-FAST:       # %bb.0:
3955; AVX2-FAST-NEXT:    vmovaps {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
3956; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
3957; AVX2-FAST-NEXT:    vxorps {{.*}}(%rip), %xmm0, %xmm0
3958; AVX2-FAST-NEXT:    vzeroupper
3959; AVX2-FAST-NEXT:    retq
3960;
3961; AVX512-LABEL: trunc_xor_const_v4i64_v4i32:
3962; AVX512:       # %bb.0:
3963; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
3964; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
3965; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
3966; AVX512-NEXT:    vzeroupper
3967; AVX512-NEXT:    retq
3968  %1 = xor <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>
3969  %2 = trunc <4 x i64> %1 to <4 x i32>
3970  ret <4 x i32> %2
3971}
3972
3973define <8 x i16> @trunc_xor_const_v8i64_v8i16(<8 x i64> %a0) nounwind {
3974; SSE-LABEL: trunc_xor_const_v8i64_v8i16:
3975; SSE:       # %bb.0:
3976; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
3977; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
3978; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
3979; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
3980; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
3981; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
3982; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
3983; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
3984; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
3985; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3986; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
3987; SSE-NEXT:    xorpd {{.*}}(%rip), %xmm0
3988; SSE-NEXT:    retq
3989;
3990; AVX1-LABEL: trunc_xor_const_v8i64_v8i16:
3991; AVX1:       # %bb.0:
3992; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
3993; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
3994; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
3995; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
3996; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
3997; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
3998; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
3999; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4000; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4001; AVX1-NEXT:    vzeroupper
4002; AVX1-NEXT:    retq
4003;
4004; AVX2-SLOW-LABEL: trunc_xor_const_v8i64_v8i16:
4005; AVX2-SLOW:       # %bb.0:
4006; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
4007; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4008; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
4009; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4010; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4011; AVX2-SLOW-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4012; AVX2-SLOW-NEXT:    vzeroupper
4013; AVX2-SLOW-NEXT:    retq
4014;
4015; AVX2-FAST-LABEL: trunc_xor_const_v8i64_v8i16:
4016; AVX2-FAST:       # %bb.0:
4017; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
4018; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
4019; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
4020; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4021; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4022; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4023; AVX2-FAST-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4024; AVX2-FAST-NEXT:    vzeroupper
4025; AVX2-FAST-NEXT:    retq
4026;
4027; AVX512-LABEL: trunc_xor_const_v8i64_v8i16:
4028; AVX512:       # %bb.0:
4029; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
4030; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4031; AVX512-NEXT:    vzeroupper
4032; AVX512-NEXT:    retq
4033  %1 = xor <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>
4034  %2 = trunc <8 x i64> %1 to <8 x i16>
4035  ret <8 x i16> %2
4036}
4037
4038define <8 x i16> @trunc_xor_const_v8i32_v8i16(<8 x i32> %a0) nounwind {
4039; SSE-LABEL: trunc_xor_const_v8i32_v8i16:
4040; SSE:       # %bb.0:
4041; SSE-NEXT:    pslld $16, %xmm1
4042; SSE-NEXT:    psrad $16, %xmm1
4043; SSE-NEXT:    pslld $16, %xmm0
4044; SSE-NEXT:    psrad $16, %xmm0
4045; SSE-NEXT:    packssdw %xmm1, %xmm0
4046; SSE-NEXT:    pxor {{.*}}(%rip), %xmm0
4047; SSE-NEXT:    retq
4048;
4049; AVX1-LABEL: trunc_xor_const_v8i32_v8i16:
4050; AVX1:       # %bb.0:
4051; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4052; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
4053; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
4054; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
4055; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4056; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4057; AVX1-NEXT:    vzeroupper
4058; AVX1-NEXT:    retq
4059;
4060; AVX2-LABEL: trunc_xor_const_v8i32_v8i16:
4061; AVX2:       # %bb.0:
4062; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4063; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4064; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4065; AVX2-NEXT:    vzeroupper
4066; AVX2-NEXT:    retq
4067;
4068; AVX512-LABEL: trunc_xor_const_v8i32_v8i16:
4069; AVX512:       # %bb.0:
4070; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
4071; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
4072; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4073; AVX512-NEXT:    vzeroupper
4074; AVX512-NEXT:    retq
4075  %1 = xor <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
4076  %2 = trunc <8 x i32> %1 to <8 x i16>
4077  ret <8 x i16> %2
4078}
4079
4080define <16 x i8> @trunc_xor_const_v16i64_v16i8(<16 x i64> %a0) nounwind {
4081; SSE-LABEL: trunc_xor_const_v16i64_v16i8:
4082; SSE:       # %bb.0:
4083; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
4084; SSE-NEXT:    pand %xmm8, %xmm7
4085; SSE-NEXT:    pand %xmm8, %xmm6
4086; SSE-NEXT:    packuswb %xmm7, %xmm6
4087; SSE-NEXT:    pand %xmm8, %xmm5
4088; SSE-NEXT:    pand %xmm8, %xmm4
4089; SSE-NEXT:    packuswb %xmm5, %xmm4
4090; SSE-NEXT:    packuswb %xmm6, %xmm4
4091; SSE-NEXT:    pand %xmm8, %xmm3
4092; SSE-NEXT:    pand %xmm8, %xmm2
4093; SSE-NEXT:    packuswb %xmm3, %xmm2
4094; SSE-NEXT:    pand %xmm8, %xmm1
4095; SSE-NEXT:    pand %xmm8, %xmm0
4096; SSE-NEXT:    packuswb %xmm1, %xmm0
4097; SSE-NEXT:    packuswb %xmm2, %xmm0
4098; SSE-NEXT:    packuswb %xmm4, %xmm0
4099; SSE-NEXT:    pxor {{.*}}(%rip), %xmm0
4100; SSE-NEXT:    retq
4101;
4102; AVX1-LABEL: trunc_xor_const_v16i64_v16i8:
4103; AVX1:       # %bb.0:
4104; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [255,255,255,255]
4105; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
4106; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
4107; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
4108; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
4109; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
4110; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
4111; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
4112; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1
4113; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4114; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4115; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0
4116; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
4117; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
4118; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4119; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4120; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4121; AVX1-NEXT:    vzeroupper
4122; AVX1-NEXT:    retq
4123;
4124; AVX2-SLOW-LABEL: trunc_xor_const_v16i64_v16i8:
4125; AVX2-SLOW:       # %bb.0:
4126; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
4127; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
4128; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
4129; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4130; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
4131; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
4132; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
4133; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
4134; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
4135; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4136; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
4137; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
4138; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4139; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
4140; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4141; AVX2-SLOW-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4142; AVX2-SLOW-NEXT:    vzeroupper
4143; AVX2-SLOW-NEXT:    retq
4144;
4145; AVX2-FAST-LABEL: trunc_xor_const_v16i64_v16i8:
4146; AVX2-FAST:       # %bb.0:
4147; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
4148; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
4149; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
4150; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
4151; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4152; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
4153; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
4154; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
4155; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
4156; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
4157; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
4158; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4159; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
4160; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4161; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
4162; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4163; AVX2-FAST-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4164; AVX2-FAST-NEXT:    vzeroupper
4165; AVX2-FAST-NEXT:    retq
4166;
4167; AVX512-LABEL: trunc_xor_const_v16i64_v16i8:
4168; AVX512:       # %bb.0:
4169; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
4170; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
4171; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4172; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4173; AVX512-NEXT:    vzeroupper
4174; AVX512-NEXT:    retq
4175  %1 = xor <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>
4176  %2 = trunc <16 x i64> %1 to <16 x i8>
4177  ret <16 x i8> %2
4178}
4179
4180define <16 x i8> @trunc_xor_const_v16i32_v16i8(<16 x i32> %a0) nounwind {
4181; SSE-LABEL: trunc_xor_const_v16i32_v16i8:
4182; SSE:       # %bb.0:
4183; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
4184; SSE-NEXT:    pand %xmm4, %xmm3
4185; SSE-NEXT:    pand %xmm4, %xmm2
4186; SSE-NEXT:    packuswb %xmm3, %xmm2
4187; SSE-NEXT:    pand %xmm4, %xmm1
4188; SSE-NEXT:    pand %xmm4, %xmm0
4189; SSE-NEXT:    packuswb %xmm1, %xmm0
4190; SSE-NEXT:    packuswb %xmm2, %xmm0
4191; SSE-NEXT:    pxor {{.*}}(%rip), %xmm0
4192; SSE-NEXT:    retq
4193;
4194; AVX1-LABEL: trunc_xor_const_v16i32_v16i8:
4195; AVX1:       # %bb.0:
4196; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
4197; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
4198; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4199; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4200; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
4201; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4202; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4203; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4204; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4205; AVX1-NEXT:    vzeroupper
4206; AVX1-NEXT:    retq
4207;
4208; AVX2-LABEL: trunc_xor_const_v16i32_v16i8:
4209; AVX2:       # %bb.0:
4210; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4211; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
4212; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
4213; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
4214; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
4215; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
4216; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4217; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
4218; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4219; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4220; AVX2-NEXT:    vzeroupper
4221; AVX2-NEXT:    retq
4222;
4223; AVX512-LABEL: trunc_xor_const_v16i32_v16i8:
4224; AVX512:       # %bb.0:
4225; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
4226; AVX512-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4227; AVX512-NEXT:    vzeroupper
4228; AVX512-NEXT:    retq
4229  %1 = xor <16 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
4230  %2 = trunc <16 x i32> %1 to <16 x i8>
4231  ret <16 x i8> %2
4232}
4233
4234define <16 x i8> @trunc_xor_const_v16i16_v16i8(<16 x i16> %a0) nounwind {
4235; SSE-LABEL: trunc_xor_const_v16i16_v16i8:
4236; SSE:       # %bb.0:
4237; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4238; SSE-NEXT:    pand %xmm2, %xmm1
4239; SSE-NEXT:    pand %xmm2, %xmm0
4240; SSE-NEXT:    packuswb %xmm1, %xmm0
4241; SSE-NEXT:    pxor {{.*}}(%rip), %xmm0
4242; SSE-NEXT:    retq
4243;
4244; AVX1-LABEL: trunc_xor_const_v16i16_v16i8:
4245; AVX1:       # %bb.0:
4246; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
4247; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4248; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4249; AVX1-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4250; AVX1-NEXT:    vzeroupper
4251; AVX1-NEXT:    retq
4252;
4253; AVX2-LABEL: trunc_xor_const_v16i16_v16i8:
4254; AVX2:       # %bb.0:
4255; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
4256; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4257; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4258; AVX2-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4259; AVX2-NEXT:    vzeroupper
4260; AVX2-NEXT:    retq
4261;
4262; AVX512F-LABEL: trunc_xor_const_v16i16_v16i8:
4263; AVX512F:       # %bb.0:
4264; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
4265; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4266; AVX512F-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4267; AVX512F-NEXT:    vzeroupper
4268; AVX512F-NEXT:    retq
4269;
4270; AVX512BW-LABEL: trunc_xor_const_v16i16_v16i8:
4271; AVX512BW:       # %bb.0:
4272; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
4273; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
4274; AVX512BW-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4275; AVX512BW-NEXT:    vzeroupper
4276; AVX512BW-NEXT:    retq
4277;
4278; AVX512DQ-LABEL: trunc_xor_const_v16i16_v16i8:
4279; AVX512DQ:       # %bb.0:
4280; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
4281; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
4282; AVX512DQ-NEXT:    vpxor {{.*}}(%rip), %xmm0, %xmm0
4283; AVX512DQ-NEXT:    vzeroupper
4284; AVX512DQ-NEXT:    retq
4285  %1 = xor <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
4286  %2 = trunc <16 x i16> %1 to <16 x i8>
4287  ret <16 x i8> %2
4288}
4289
4290;
4291; or
4292;
4293
4294define <4 x i32> @trunc_or_v4i64_v4i32(<4 x i64> %a0, <4 x i64> %a1) nounwind {
4295; SSE-LABEL: trunc_or_v4i64_v4i32:
4296; SSE:       # %bb.0:
4297; SSE-NEXT:    orps %xmm3, %xmm1
4298; SSE-NEXT:    orps %xmm2, %xmm0
4299; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
4300; SSE-NEXT:    retq
4301;
4302; AVX1-LABEL: trunc_or_v4i64_v4i32:
4303; AVX1:       # %bb.0:
4304; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4305; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4306; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
4307; AVX1-NEXT:    vzeroupper
4308; AVX1-NEXT:    retq
4309;
4310; AVX2-SLOW-LABEL: trunc_or_v4i64_v4i32:
4311; AVX2-SLOW:       # %bb.0:
4312; AVX2-SLOW-NEXT:    vorps %ymm1, %ymm0, %ymm0
4313; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
4314; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
4315; AVX2-SLOW-NEXT:    vzeroupper
4316; AVX2-SLOW-NEXT:    retq
4317;
4318; AVX2-FAST-LABEL: trunc_or_v4i64_v4i32:
4319; AVX2-FAST:       # %bb.0:
4320; AVX2-FAST-NEXT:    vorps %ymm1, %ymm0, %ymm0
4321; AVX2-FAST-NEXT:    vmovaps {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
4322; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
4323; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4324; AVX2-FAST-NEXT:    vzeroupper
4325; AVX2-FAST-NEXT:    retq
4326;
4327; AVX512-LABEL: trunc_or_v4i64_v4i32:
4328; AVX512:       # %bb.0:
4329; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
4330; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
4331; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4332; AVX512-NEXT:    vzeroupper
4333; AVX512-NEXT:    retq
4334  %1 = or <4 x i64> %a0, %a1
4335  %2 = trunc <4 x i64> %1 to <4 x i32>
4336  ret <4 x i32> %2
4337}
4338
4339define <8 x i16> @trunc_or_v8i64_v8i16(<8 x i64> %a0, <8 x i64> %a1) nounwind {
4340; SSE-LABEL: trunc_or_v8i64_v8i16:
4341; SSE:       # %bb.0:
4342; SSE-NEXT:    por %xmm6, %xmm2
4343; SSE-NEXT:    por %xmm7, %xmm3
4344; SSE-NEXT:    por %xmm4, %xmm0
4345; SSE-NEXT:    por %xmm5, %xmm1
4346; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
4347; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
4348; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
4349; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
4350; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
4351; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
4352; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
4353; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
4354; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
4355; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4356; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
4357; SSE-NEXT:    retq
4358;
4359; AVX1-LABEL: trunc_or_v8i64_v8i16:
4360; AVX1:       # %bb.0:
4361; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0
4362; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm1
4363; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
4364; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
4365; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4366; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4367; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
4368; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4369; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4370; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4371; AVX1-NEXT:    vzeroupper
4372; AVX1-NEXT:    retq
4373;
4374; AVX2-SLOW-LABEL: trunc_or_v8i64_v8i16:
4375; AVX2-SLOW:       # %bb.0:
4376; AVX2-SLOW-NEXT:    vorps %ymm3, %ymm1, %ymm1
4377; AVX2-SLOW-NEXT:    vorps %ymm2, %ymm0, %ymm0
4378; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
4379; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4380; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
4381; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4382; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4383; AVX2-SLOW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4384; AVX2-SLOW-NEXT:    vzeroupper
4385; AVX2-SLOW-NEXT:    retq
4386;
4387; AVX2-FAST-LABEL: trunc_or_v8i64_v8i16:
4388; AVX2-FAST:       # %bb.0:
4389; AVX2-FAST-NEXT:    vpor %ymm3, %ymm1, %ymm1
4390; AVX2-FAST-NEXT:    vpor %ymm2, %ymm0, %ymm0
4391; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
4392; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
4393; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
4394; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4395; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4396; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4397; AVX2-FAST-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4398; AVX2-FAST-NEXT:    vzeroupper
4399; AVX2-FAST-NEXT:    retq
4400;
4401; AVX512-LABEL: trunc_or_v8i64_v8i16:
4402; AVX512:       # %bb.0:
4403; AVX512-NEXT:    vporq %zmm1, %zmm0, %zmm0
4404; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
4405; AVX512-NEXT:    vzeroupper
4406; AVX512-NEXT:    retq
4407  %1 = or <8 x i64> %a0, %a1
4408  %2 = trunc <8 x i64> %1 to <8 x i16>
4409  ret <8 x i16> %2
4410}
4411
4412define <8 x i16> @trunc_or_v8i32_v8i16(<8 x i32> %a0, <8 x i32> %a1) nounwind {
4413; SSE-LABEL: trunc_or_v8i32_v8i16:
4414; SSE:       # %bb.0:
4415; SSE-NEXT:    por %xmm2, %xmm0
4416; SSE-NEXT:    por %xmm3, %xmm1
4417; SSE-NEXT:    pslld $16, %xmm1
4418; SSE-NEXT:    psrad $16, %xmm1
4419; SSE-NEXT:    pslld $16, %xmm0
4420; SSE-NEXT:    psrad $16, %xmm0
4421; SSE-NEXT:    packssdw %xmm1, %xmm0
4422; SSE-NEXT:    retq
4423;
4424; AVX1-LABEL: trunc_or_v8i32_v8i16:
4425; AVX1:       # %bb.0:
4426; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4427; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4428; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
4429; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
4430; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
4431; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4432; AVX1-NEXT:    vzeroupper
4433; AVX1-NEXT:    retq
4434;
4435; AVX2-LABEL: trunc_or_v8i32_v8i16:
4436; AVX2:       # %bb.0:
4437; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4438; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4439; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4440; AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4441; AVX2-NEXT:    vzeroupper
4442; AVX2-NEXT:    retq
4443;
4444; AVX512-LABEL: trunc_or_v8i32_v8i16:
4445; AVX512:       # %bb.0:
4446; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm0
4447; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
4448; AVX512-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4449; AVX512-NEXT:    vzeroupper
4450; AVX512-NEXT:    retq
4451  %1 = or <8 x i32> %a0, %a1
4452  %2 = trunc <8 x i32> %1 to <8 x i16>
4453  ret <8 x i16> %2
4454}
4455
4456define <16 x i8> @trunc_or_v16i64_v16i8(<16 x i64> %a0, <16 x i64> %a1) nounwind {
4457; SSE-LABEL: trunc_or_v16i64_v16i8:
4458; SSE:       # %bb.0:
4459; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm0
4460; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm1
4461; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm2
4462; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm3
4463; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm4
4464; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm5
4465; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm6
4466; SSE-NEXT:    por {{[0-9]+}}(%rsp), %xmm7
4467; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
4468; SSE-NEXT:    pand %xmm8, %xmm7
4469; SSE-NEXT:    pand %xmm8, %xmm6
4470; SSE-NEXT:    packuswb %xmm7, %xmm6
4471; SSE-NEXT:    pand %xmm8, %xmm5
4472; SSE-NEXT:    pand %xmm8, %xmm4
4473; SSE-NEXT:    packuswb %xmm5, %xmm4
4474; SSE-NEXT:    packuswb %xmm6, %xmm4
4475; SSE-NEXT:    pand %xmm8, %xmm3
4476; SSE-NEXT:    pand %xmm8, %xmm2
4477; SSE-NEXT:    packuswb %xmm3, %xmm2
4478; SSE-NEXT:    pand %xmm8, %xmm1
4479; SSE-NEXT:    pand %xmm8, %xmm0
4480; SSE-NEXT:    packuswb %xmm1, %xmm0
4481; SSE-NEXT:    packuswb %xmm2, %xmm0
4482; SSE-NEXT:    packuswb %xmm4, %xmm0
4483; SSE-NEXT:    retq
4484;
4485; AVX1-LABEL: trunc_or_v16i64_v16i8:
4486; AVX1:       # %bb.0:
4487; AVX1-NEXT:    vorps %ymm4, %ymm0, %ymm0
4488; AVX1-NEXT:    vorps %ymm5, %ymm1, %ymm1
4489; AVX1-NEXT:    vorps %ymm6, %ymm2, %ymm2
4490; AVX1-NEXT:    vorps %ymm7, %ymm3, %ymm3
4491; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [255,255,255,255]
4492; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
4493; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
4494; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
4495; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
4496; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
4497; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
4498; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
4499; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1
4500; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4501; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4502; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0
4503; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
4504; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
4505; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4506; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4507; AVX1-NEXT:    vzeroupper
4508; AVX1-NEXT:    retq
4509;
4510; AVX2-SLOW-LABEL: trunc_or_v16i64_v16i8:
4511; AVX2-SLOW:       # %bb.0:
4512; AVX2-SLOW-NEXT:    vorps %ymm5, %ymm1, %ymm1
4513; AVX2-SLOW-NEXT:    vorps %ymm4, %ymm0, %ymm0
4514; AVX2-SLOW-NEXT:    vorps %ymm7, %ymm3, %ymm3
4515; AVX2-SLOW-NEXT:    vorps %ymm6, %ymm2, %ymm2
4516; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
4517; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
4518; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
4519; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4520; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
4521; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
4522; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
4523; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
4524; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
4525; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4526; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
4527; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
4528; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4529; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
4530; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4531; AVX2-SLOW-NEXT:    vzeroupper
4532; AVX2-SLOW-NEXT:    retq
4533;
4534; AVX2-FAST-LABEL: trunc_or_v16i64_v16i8:
4535; AVX2-FAST:       # %bb.0:
4536; AVX2-FAST-NEXT:    vpor %ymm5, %ymm1, %ymm1
4537; AVX2-FAST-NEXT:    vpor %ymm4, %ymm0, %ymm0
4538; AVX2-FAST-NEXT:    vpor %ymm7, %ymm3, %ymm3
4539; AVX2-FAST-NEXT:    vpor %ymm6, %ymm2, %ymm2
4540; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
4541; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
4542; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
4543; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
4544; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4545; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
4546; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
4547; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
4548; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
4549; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
4550; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
4551; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4552; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
4553; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4554; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
4555; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4556; AVX2-FAST-NEXT:    vzeroupper
4557; AVX2-FAST-NEXT:    retq
4558;
4559; AVX512-LABEL: trunc_or_v16i64_v16i8:
4560; AVX512:       # %bb.0:
4561; AVX512-NEXT:    vporq %zmm2, %zmm0, %zmm0
4562; AVX512-NEXT:    vporq %zmm3, %zmm1, %zmm1
4563; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
4564; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
4565; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4566; AVX512-NEXT:    vzeroupper
4567; AVX512-NEXT:    retq
4568  %1 = or <16 x i64> %a0, %a1
4569  %2 = trunc <16 x i64> %1 to <16 x i8>
4570  ret <16 x i8> %2
4571}
4572
4573define <16 x i8> @trunc_or_v16i32_v16i8(<16 x i32> %a0, <16 x i32> %a1) nounwind {
4574; SSE-LABEL: trunc_or_v16i32_v16i8:
4575; SSE:       # %bb.0:
4576; SSE-NEXT:    por %xmm4, %xmm0
4577; SSE-NEXT:    por %xmm5, %xmm1
4578; SSE-NEXT:    por %xmm6, %xmm2
4579; SSE-NEXT:    por %xmm7, %xmm3
4580; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
4581; SSE-NEXT:    pand %xmm4, %xmm3
4582; SSE-NEXT:    pand %xmm4, %xmm2
4583; SSE-NEXT:    packuswb %xmm3, %xmm2
4584; SSE-NEXT:    pand %xmm4, %xmm1
4585; SSE-NEXT:    pand %xmm4, %xmm0
4586; SSE-NEXT:    packuswb %xmm1, %xmm0
4587; SSE-NEXT:    packuswb %xmm2, %xmm0
4588; SSE-NEXT:    retq
4589;
4590; AVX1-LABEL: trunc_or_v16i32_v16i8:
4591; AVX1:       # %bb.0:
4592; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm0
4593; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm1
4594; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
4595; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
4596; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4597; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4598; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
4599; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4600; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4601; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4602; AVX1-NEXT:    vzeroupper
4603; AVX1-NEXT:    retq
4604;
4605; AVX2-LABEL: trunc_or_v16i32_v16i8:
4606; AVX2:       # %bb.0:
4607; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm0
4608; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm1
4609; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4610; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
4611; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
4612; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
4613; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
4614; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
4615; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4616; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
4617; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4618; AVX2-NEXT:    vzeroupper
4619; AVX2-NEXT:    retq
4620;
4621; AVX512-LABEL: trunc_or_v16i32_v16i8:
4622; AVX512:       # %bb.0:
4623; AVX512-NEXT:    vpord %zmm1, %zmm0, %zmm0
4624; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
4625; AVX512-NEXT:    vzeroupper
4626; AVX512-NEXT:    retq
4627  %1 = or <16 x i32> %a0, %a1
4628  %2 = trunc <16 x i32> %1 to <16 x i8>
4629  ret <16 x i8> %2
4630}
4631
4632define <16 x i8> @trunc_or_v16i16_v16i8(<16 x i16> %a0, <16 x i16> %a1) nounwind {
4633; SSE-LABEL: trunc_or_v16i16_v16i8:
4634; SSE:       # %bb.0:
4635; SSE-NEXT:    por %xmm2, %xmm0
4636; SSE-NEXT:    por %xmm3, %xmm1
4637; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
4638; SSE-NEXT:    pand %xmm2, %xmm1
4639; SSE-NEXT:    pand %xmm2, %xmm0
4640; SSE-NEXT:    packuswb %xmm1, %xmm0
4641; SSE-NEXT:    retq
4642;
4643; AVX1-LABEL: trunc_or_v16i16_v16i8:
4644; AVX1:       # %bb.0:
4645; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm0
4646; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
4647; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4648; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4649; AVX1-NEXT:    vzeroupper
4650; AVX1-NEXT:    retq
4651;
4652; AVX2-LABEL: trunc_or_v16i16_v16i8:
4653; AVX2:       # %bb.0:
4654; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
4655; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
4656; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
4657; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4658; AVX2-NEXT:    vzeroupper
4659; AVX2-NEXT:    retq
4660;
4661; AVX512F-LABEL: trunc_or_v16i16_v16i8:
4662; AVX512F:       # %bb.0:
4663; AVX512F-NEXT:    vpor %ymm1, %ymm0, %ymm0
4664; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
4665; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
4666; AVX512F-NEXT:    vzeroupper
4667; AVX512F-NEXT:    retq
4668;
4669; AVX512BW-LABEL: trunc_or_v16i16_v16i8:
4670; AVX512BW:       # %bb.0:
4671; AVX512BW-NEXT:    vpor %ymm1, %ymm0, %ymm0
4672; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
4673; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
4674; AVX512BW-NEXT:    vzeroupper
4675; AVX512BW-NEXT:    retq
4676;
4677; AVX512DQ-LABEL: trunc_or_v16i16_v16i8:
4678; AVX512DQ:       # %bb.0:
4679; AVX512DQ-NEXT:    vpor %ymm1, %ymm0, %ymm0
4680; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
4681; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
4682; AVX512DQ-NEXT:    vzeroupper
4683; AVX512DQ-NEXT:    retq
4684  %1 = or <16 x i16> %a0, %a1
4685  %2 = trunc <16 x i16> %1 to <16 x i8>
4686  ret <16 x i8> %2
4687}
4688
4689;
4690; or to constant
4691;
4692
4693define <4 x i32> @trunc_or_const_v4i64_v4i32(<4 x i64> %a0) nounwind {
4694; SSE-LABEL: trunc_or_const_v4i64_v4i32:
4695; SSE:       # %bb.0:
4696; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
4697; SSE-NEXT:    orps {{.*}}(%rip), %xmm0
4698; SSE-NEXT:    retq
4699;
4700; AVX1-LABEL: trunc_or_const_v4i64_v4i32:
4701; AVX1:       # %bb.0:
4702; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4703; AVX1-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
4704; AVX1-NEXT:    vorps {{.*}}(%rip), %xmm0, %xmm0
4705; AVX1-NEXT:    vzeroupper
4706; AVX1-NEXT:    retq
4707;
4708; AVX2-SLOW-LABEL: trunc_or_const_v4i64_v4i32:
4709; AVX2-SLOW:       # %bb.0:
4710; AVX2-SLOW-NEXT:    vextractf128 $1, %ymm0, %xmm1
4711; AVX2-SLOW-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
4712; AVX2-SLOW-NEXT:    vorps {{.*}}(%rip), %xmm0, %xmm0
4713; AVX2-SLOW-NEXT:    vzeroupper
4714; AVX2-SLOW-NEXT:    retq
4715;
4716; AVX2-FAST-LABEL: trunc_or_const_v4i64_v4i32:
4717; AVX2-FAST:       # %bb.0:
4718; AVX2-FAST-NEXT:    vmovaps {{.*#+}} ymm1 = <0,2,4,6,u,u,u,u>
4719; AVX2-FAST-NEXT:    vpermps %ymm0, %ymm1, %ymm0
4720; AVX2-FAST-NEXT:    vorps {{.*}}(%rip), %xmm0, %xmm0
4721; AVX2-FAST-NEXT:    vzeroupper
4722; AVX2-FAST-NEXT:    retq
4723;
4724; AVX512-LABEL: trunc_or_const_v4i64_v4i32:
4725; AVX512:       # %bb.0:
4726; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
4727; AVX512-NEXT:    vpmovqd %zmm0, %ymm0
4728; AVX512-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4729; AVX512-NEXT:    vzeroupper
4730; AVX512-NEXT:    retq
4731  %1 = or <4 x i64> %a0, <i64 0, i64 1, i64 2, i64 3>
4732  %2 = trunc <4 x i64> %1 to <4 x i32>
4733  ret <4 x i32> %2
4734}
4735
4736define <8 x i16> @trunc_or_const_v8i64_v8i16(<8 x i64> %a0) nounwind {
4737; SSE-LABEL: trunc_or_const_v8i64_v8i16:
4738; SSE:       # %bb.0:
4739; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
4740; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7]
4741; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
4742; SSE-NEXT:    pshuflw {{.*#+}} xmm4 = xmm0[0,2,2,3,4,5,6,7]
4743; SSE-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1]
4744; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
4745; SSE-NEXT:    pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7]
4746; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
4747; SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7]
4748; SSE-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
4749; SSE-NEXT:    movsd {{.*#+}} xmm0 = xmm4[0],xmm0[1]
4750; SSE-NEXT:    orpd {{.*}}(%rip), %xmm0
4751; SSE-NEXT:    retq
4752;
4753; AVX1-LABEL: trunc_or_const_v8i64_v8i16:
4754; AVX1:       # %bb.0:
4755; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [65535,65535,65535,65535]
4756; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
4757; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4758; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4759; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
4760; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4761; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4762; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4763; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4764; AVX1-NEXT:    vzeroupper
4765; AVX1-NEXT:    retq
4766;
4767; AVX2-SLOW-LABEL: trunc_or_const_v8i64_v8i16:
4768; AVX2-SLOW:       # %bb.0:
4769; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm2 = ymm0[2,3],ymm1[2,3]
4770; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4771; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm2[0,2],ymm0[4,6],ymm2[4,6]
4772; AVX2-SLOW-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4773; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4774; AVX2-SLOW-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4775; AVX2-SLOW-NEXT:    vzeroupper
4776; AVX2-SLOW-NEXT:    retq
4777;
4778; AVX2-FAST-LABEL: trunc_or_const_v8i64_v8i16:
4779; AVX2-FAST:       # %bb.0:
4780; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,2,4,6,4,6,6,7]
4781; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm2, %ymm0
4782; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm2, %ymm1
4783; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4784; AVX2-FAST-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4785; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4786; AVX2-FAST-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4787; AVX2-FAST-NEXT:    vzeroupper
4788; AVX2-FAST-NEXT:    retq
4789;
4790; AVX512-LABEL: trunc_or_const_v8i64_v8i16:
4791; AVX512:       # %bb.0:
4792; AVX512-NEXT:    vpmovqw %zmm0, %xmm0
4793; AVX512-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4794; AVX512-NEXT:    vzeroupper
4795; AVX512-NEXT:    retq
4796  %1 = or <8 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7>
4797  %2 = trunc <8 x i64> %1 to <8 x i16>
4798  ret <8 x i16> %2
4799}
4800
4801define <8 x i16> @trunc_or_const_v8i32_v8i16(<8 x i32> %a0) nounwind {
4802; SSE-LABEL: trunc_or_const_v8i32_v8i16:
4803; SSE:       # %bb.0:
4804; SSE-NEXT:    pslld $16, %xmm1
4805; SSE-NEXT:    psrad $16, %xmm1
4806; SSE-NEXT:    pslld $16, %xmm0
4807; SSE-NEXT:    psrad $16, %xmm0
4808; SSE-NEXT:    packssdw %xmm1, %xmm0
4809; SSE-NEXT:    por {{.*}}(%rip), %xmm0
4810; SSE-NEXT:    retq
4811;
4812; AVX1-LABEL: trunc_or_const_v8i32_v8i16:
4813; AVX1:       # %bb.0:
4814; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
4815; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
4816; AVX1-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
4817; AVX1-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
4818; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4819; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4820; AVX1-NEXT:    vzeroupper
4821; AVX1-NEXT:    retq
4822;
4823; AVX2-LABEL: trunc_or_const_v8i32_v8i16:
4824; AVX2:       # %bb.0:
4825; AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
4826; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4827; AVX2-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4828; AVX2-NEXT:    vzeroupper
4829; AVX2-NEXT:    retq
4830;
4831; AVX512-LABEL: trunc_or_const_v8i32_v8i16:
4832; AVX512:       # %bb.0:
4833; AVX512-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
4834; AVX512-NEXT:    vpmovdw %zmm0, %ymm0
4835; AVX512-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4836; AVX512-NEXT:    vzeroupper
4837; AVX512-NEXT:    retq
4838  %1 = or <8 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
4839  %2 = trunc <8 x i32> %1 to <8 x i16>
4840  ret <8 x i16> %2
4841}
4842
4843define <16 x i8> @trunc_or_const_v16i64_v16i8(<16 x i64> %a0) nounwind {
4844; SSE-LABEL: trunc_or_const_v16i64_v16i8:
4845; SSE:       # %bb.0:
4846; SSE-NEXT:    movdqa {{.*#+}} xmm8 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0]
4847; SSE-NEXT:    pand %xmm8, %xmm7
4848; SSE-NEXT:    pand %xmm8, %xmm6
4849; SSE-NEXT:    packuswb %xmm7, %xmm6
4850; SSE-NEXT:    pand %xmm8, %xmm5
4851; SSE-NEXT:    pand %xmm8, %xmm4
4852; SSE-NEXT:    packuswb %xmm5, %xmm4
4853; SSE-NEXT:    packuswb %xmm6, %xmm4
4854; SSE-NEXT:    pand %xmm8, %xmm3
4855; SSE-NEXT:    pand %xmm8, %xmm2
4856; SSE-NEXT:    packuswb %xmm3, %xmm2
4857; SSE-NEXT:    pand %xmm8, %xmm1
4858; SSE-NEXT:    pand %xmm8, %xmm0
4859; SSE-NEXT:    packuswb %xmm1, %xmm0
4860; SSE-NEXT:    packuswb %xmm2, %xmm0
4861; SSE-NEXT:    packuswb %xmm4, %xmm0
4862; SSE-NEXT:    por {{.*}}(%rip), %xmm0
4863; SSE-NEXT:    retq
4864;
4865; AVX1-LABEL: trunc_or_const_v16i64_v16i8:
4866; AVX1:       # %bb.0:
4867; AVX1-NEXT:    vmovaps {{.*#+}} ymm4 = [255,255,255,255]
4868; AVX1-NEXT:    vandps %ymm4, %ymm3, %ymm3
4869; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm5
4870; AVX1-NEXT:    vpackusdw %xmm5, %xmm3, %xmm3
4871; AVX1-NEXT:    vandps %ymm4, %ymm2, %ymm2
4872; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
4873; AVX1-NEXT:    vpackusdw %xmm5, %xmm2, %xmm2
4874; AVX1-NEXT:    vpackusdw %xmm3, %xmm2, %xmm2
4875; AVX1-NEXT:    vandps %ymm4, %ymm1, %ymm1
4876; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4877; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4878; AVX1-NEXT:    vandps %ymm4, %ymm0, %ymm0
4879; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
4880; AVX1-NEXT:    vpackusdw %xmm3, %xmm0, %xmm0
4881; AVX1-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
4882; AVX1-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4883; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4884; AVX1-NEXT:    vzeroupper
4885; AVX1-NEXT:    retq
4886;
4887; AVX2-SLOW-LABEL: trunc_or_const_v16i64_v16i8:
4888; AVX2-SLOW:       # %bb.0:
4889; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm4 = ymm2[2,3],ymm3[2,3]
4890; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
4891; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm2 = ymm2[0,2],ymm4[0,2],ymm2[4,6],ymm4[4,6]
4892; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4893; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
4894; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
4895; AVX2-SLOW-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
4896; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm2, %xmm2
4897; AVX2-SLOW-NEXT:    vperm2f128 {{.*#+}} ymm5 = ymm0[2,3],ymm1[2,3]
4898; AVX2-SLOW-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
4899; AVX2-SLOW-NEXT:    vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm5[0,2],ymm0[4,6],ymm5[4,6]
4900; AVX2-SLOW-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
4901; AVX2-SLOW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4902; AVX2-SLOW-NEXT:    vpand %xmm4, %xmm0, %xmm0
4903; AVX2-SLOW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4904; AVX2-SLOW-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4905; AVX2-SLOW-NEXT:    vzeroupper
4906; AVX2-SLOW-NEXT:    retq
4907;
4908; AVX2-FAST-LABEL: trunc_or_const_v16i64_v16i8:
4909; AVX2-FAST:       # %bb.0:
4910; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,2,4,6,4,6,6,7]
4911; AVX2-FAST-NEXT:    vpermd %ymm2, %ymm4, %ymm2
4912; AVX2-FAST-NEXT:    vpermd %ymm3, %ymm4, %ymm3
4913; AVX2-FAST-NEXT:    vinserti128 $1, %xmm3, %ymm2, %ymm2
4914; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} ymm3 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4915; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm2, %ymm2
4916; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3]
4917; AVX2-FAST-NEXT:    vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255]
4918; AVX2-FAST-NEXT:    vpand %xmm5, %xmm2, %xmm2
4919; AVX2-FAST-NEXT:    vpermd %ymm0, %ymm4, %ymm0
4920; AVX2-FAST-NEXT:    vpermd %ymm1, %ymm4, %ymm1
4921; AVX2-FAST-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
4922; AVX2-FAST-NEXT:    vpshufb %ymm3, %ymm0, %ymm0
4923; AVX2-FAST-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4924; AVX2-FAST-NEXT:    vpand %xmm5, %xmm0, %xmm0
4925; AVX2-FAST-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
4926; AVX2-FAST-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4927; AVX2-FAST-NEXT:    vzeroupper
4928; AVX2-FAST-NEXT:    retq
4929;
4930; AVX512-LABEL: trunc_or_const_v16i64_v16i8:
4931; AVX512:       # %bb.0:
4932; AVX512-NEXT:    vpmovqb %zmm1, %xmm1
4933; AVX512-NEXT:    vpmovqb %zmm0, %xmm0
4934; AVX512-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
4935; AVX512-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4936; AVX512-NEXT:    vzeroupper
4937; AVX512-NEXT:    retq
4938  %1 = or <16 x i64> %a0, <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>
4939  %2 = trunc <16 x i64> %1 to <16 x i8>
4940  ret <16 x i8> %2
4941}
4942
4943define <16 x i8> @trunc_or_const_v16i32_v16i8(<16 x i32> %a0) nounwind {
4944; SSE-LABEL: trunc_or_const_v16i32_v16i8:
4945; SSE:       # %bb.0:
4946; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0]
4947; SSE-NEXT:    pand %xmm4, %xmm3
4948; SSE-NEXT:    pand %xmm4, %xmm2
4949; SSE-NEXT:    packuswb %xmm3, %xmm2
4950; SSE-NEXT:    pand %xmm4, %xmm1
4951; SSE-NEXT:    pand %xmm4, %xmm0
4952; SSE-NEXT:    packuswb %xmm1, %xmm0
4953; SSE-NEXT:    packuswb %xmm2, %xmm0
4954; SSE-NEXT:    por {{.*}}(%rip), %xmm0
4955; SSE-NEXT:    retq
4956;
4957; AVX1-LABEL: trunc_or_const_v16i32_v16i8:
4958; AVX1:       # %bb.0:
4959; AVX1-NEXT:    vmovaps {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255]
4960; AVX1-NEXT:    vandps %ymm2, %ymm1, %ymm1
4961; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
4962; AVX1-NEXT:    vpackusdw %xmm3, %xmm1, %xmm1
4963; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
4964; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
4965; AVX1-NEXT:    vpackusdw %xmm2, %xmm0, %xmm0
4966; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4967; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4968; AVX1-NEXT:    vzeroupper
4969; AVX1-NEXT:    retq
4970;
4971; AVX2-LABEL: trunc_or_const_v16i32_v16i8:
4972; AVX2:       # %bb.0:
4973; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31]
4974; AVX2-NEXT:    vpshufb %ymm2, %ymm1, %ymm1
4975; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3]
4976; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
4977; AVX2-NEXT:    vpand %xmm3, %xmm1, %xmm1
4978; AVX2-NEXT:    vpshufb %ymm2, %ymm0, %ymm0
4979; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
4980; AVX2-NEXT:    vpand %xmm3, %xmm0, %xmm0
4981; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
4982; AVX2-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4983; AVX2-NEXT:    vzeroupper
4984; AVX2-NEXT:    retq
4985;
4986; AVX512-LABEL: trunc_or_const_v16i32_v16i8:
4987; AVX512:       # %bb.0:
4988; AVX512-NEXT:    vpmovdb %zmm0, %xmm0
4989; AVX512-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
4990; AVX512-NEXT:    vzeroupper
4991; AVX512-NEXT:    retq
4992  %1 = or <16 x i32> %a0, <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
4993  %2 = trunc <16 x i32> %1 to <16 x i8>
4994  ret <16 x i8> %2
4995}
4996
4997define <16 x i8> @trunc_or_const_v16i16_v16i8(<16 x i16> %a0) nounwind {
4998; SSE-LABEL: trunc_or_const_v16i16_v16i8:
4999; SSE:       # %bb.0:
5000; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
5001; SSE-NEXT:    pand %xmm2, %xmm1
5002; SSE-NEXT:    pand %xmm2, %xmm0
5003; SSE-NEXT:    packuswb %xmm1, %xmm0
5004; SSE-NEXT:    por {{.*}}(%rip), %xmm0
5005; SSE-NEXT:    retq
5006;
5007; AVX1-LABEL: trunc_or_const_v16i16_v16i8:
5008; AVX1:       # %bb.0:
5009; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
5010; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
5011; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
5012; AVX1-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
5013; AVX1-NEXT:    vzeroupper
5014; AVX1-NEXT:    retq
5015;
5016; AVX2-LABEL: trunc_or_const_v16i16_v16i8:
5017; AVX2:       # %bb.0:
5018; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
5019; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
5020; AVX2-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
5021; AVX2-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
5022; AVX2-NEXT:    vzeroupper
5023; AVX2-NEXT:    retq
5024;
5025; AVX512F-LABEL: trunc_or_const_v16i16_v16i8:
5026; AVX512F:       # %bb.0:
5027; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
5028; AVX512F-NEXT:    vpmovdb %zmm0, %xmm0
5029; AVX512F-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
5030; AVX512F-NEXT:    vzeroupper
5031; AVX512F-NEXT:    retq
5032;
5033; AVX512BW-LABEL: trunc_or_const_v16i16_v16i8:
5034; AVX512BW:       # %bb.0:
5035; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
5036; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
5037; AVX512BW-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
5038; AVX512BW-NEXT:    vzeroupper
5039; AVX512BW-NEXT:    retq
5040;
5041; AVX512DQ-LABEL: trunc_or_const_v16i16_v16i8:
5042; AVX512DQ:       # %bb.0:
5043; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
5044; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
5045; AVX512DQ-NEXT:    vpor {{.*}}(%rip), %xmm0, %xmm0
5046; AVX512DQ-NEXT:    vzeroupper
5047; AVX512DQ-NEXT:    retq
5048  %1 = or <16 x i16> %a0, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15>
5049  %2 = trunc <16 x i16> %1 to <16 x i8>
5050  ret <16 x i8> %2
5051}
5052
5053;
5054; complex patterns - often created by vectorizer
5055;
5056
5057define <4 x i32> @mul_add_const_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
5058; SSE-LABEL: mul_add_const_v4i64_v4i32:
5059; SSE:       # %bb.0:
5060; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]
5061; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3]
5062; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,1,3]
5063; SSE-NEXT:    pmuludq %xmm2, %xmm0
5064; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3]
5065; SSE-NEXT:    pmuludq %xmm3, %xmm1
5066; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
5067; SSE-NEXT:    paddd {{.*}}(%rip), %xmm0
5068; SSE-NEXT:    retq
5069;
5070; AVX-LABEL: mul_add_const_v4i64_v4i32:
5071; AVX:       # %bb.0:
5072; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
5073; AVX-NEXT:    vpaddd {{.*}}(%rip), %xmm0, %xmm0
5074; AVX-NEXT:    retq
5075  %1 = sext <4 x i32> %a0 to <4 x i64>
5076  %2 = sext <4 x i32> %a1 to <4 x i64>
5077  %3 = mul <4 x i64> %1, %2
5078  %4 = add <4 x i64> %3, <i64 -3, i64 -1, i64 1, i64 3>
5079  %5 = trunc <4 x i64> %4 to <4 x i32>
5080  ret <4 x i32> %5
5081}
5082
5083define <4 x i32> @mul_add_self_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
5084; SSE-LABEL: mul_add_self_v4i64_v4i32:
5085; SSE:       # %bb.0:
5086; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]
5087; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3]
5088; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,1,1,3]
5089; SSE-NEXT:    pmuludq %xmm2, %xmm0
5090; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3]
5091; SSE-NEXT:    pmuludq %xmm3, %xmm1
5092; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
5093; SSE-NEXT:    paddd %xmm0, %xmm0
5094; SSE-NEXT:    retq
5095;
5096; AVX-LABEL: mul_add_self_v4i64_v4i32:
5097; AVX:       # %bb.0:
5098; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
5099; AVX-NEXT:    vpaddd %xmm0, %xmm0, %xmm0
5100; AVX-NEXT:    retq
5101  %1 = sext <4 x i32> %a0 to <4 x i64>
5102  %2 = sext <4 x i32> %a1 to <4 x i64>
5103  %3 = mul <4 x i64> %1, %2
5104  %4 = add <4 x i64> %3, %3
5105  %5 = trunc <4 x i64> %4 to <4 x i32>
5106  ret <4 x i32> %5
5107}
5108
5109define <4 x i32> @mul_add_multiuse_v4i64_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
5110; SSE-LABEL: mul_add_multiuse_v4i64_v4i32:
5111; SSE:       # %bb.0:
5112; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,1,3]
5113; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,1,3,3]
5114; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[0,1,1,3]
5115; SSE-NEXT:    pmuludq %xmm2, %xmm4
5116; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,1,3,3]
5117; SSE-NEXT:    pmuludq %xmm3, %xmm1
5118; SSE-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm1[0,2]
5119; SSE-NEXT:    paddd %xmm4, %xmm0
5120; SSE-NEXT:    retq
5121;
5122; AVX-LABEL: mul_add_multiuse_v4i64_v4i32:
5123; AVX:       # %bb.0:
5124; AVX-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
5125; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
5126; AVX-NEXT:    retq
5127  %1 = sext <4 x i32> %a0 to <4 x i64>
5128  %2 = sext <4 x i32> %a1 to <4 x i64>
5129  %3 = mul <4 x i64> %1, %2
5130  %4 = add <4 x i64> %1, %3
5131  %5 = trunc <4 x i64> %4 to <4 x i32>
5132  ret <4 x i32> %5
5133}
5134