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