1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=CHECK,SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=CHECK,SSSE3
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=CHECK,SSE41
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=CHECK,AVX,AVX1
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK,AVX,AVX2
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512,AVX512F
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw,+avx512vl,+fast-variable-shuffle | FileCheck %s --check-prefixes=CHECK,AVX512,AVX512BW
9
10declare {<1 x i32>, <1 x i1>} @llvm.smul.with.overflow.v1i32(<1 x i32>, <1 x i32>)
11declare {<2 x i32>, <2 x i1>} @llvm.smul.with.overflow.v2i32(<2 x i32>, <2 x i32>)
12declare {<3 x i32>, <3 x i1>} @llvm.smul.with.overflow.v3i32(<3 x i32>, <3 x i32>)
13declare {<4 x i32>, <4 x i1>} @llvm.smul.with.overflow.v4i32(<4 x i32>, <4 x i32>)
14declare {<6 x i32>, <6 x i1>} @llvm.smul.with.overflow.v6i32(<6 x i32>, <6 x i32>)
15declare {<8 x i32>, <8 x i1>} @llvm.smul.with.overflow.v8i32(<8 x i32>, <8 x i32>)
16declare {<16 x i32>, <16 x i1>} @llvm.smul.with.overflow.v16i32(<16 x i32>, <16 x i32>)
17
18declare {<16 x i8>, <16 x i1>} @llvm.smul.with.overflow.v16i8(<16 x i8>, <16 x i8>)
19declare {<32 x i8>, <32 x i1>} @llvm.smul.with.overflow.v32i8(<32 x i8>, <32 x i8>)
20declare {<64 x i8>, <64 x i1>} @llvm.smul.with.overflow.v64i8(<64 x i8>, <64 x i8>)
21declare {<8 x i16>, <8 x i1>} @llvm.smul.with.overflow.v8i16(<8 x i16>, <8 x i16>)
22declare {<2 x i64>, <2 x i1>} @llvm.smul.with.overflow.v2i64(<2 x i64>, <2 x i64>)
23
24declare {<4 x i24>, <4 x i1>} @llvm.smul.with.overflow.v4i24(<4 x i24>, <4 x i24>)
25declare {<4 x i1>, <4 x i1>} @llvm.smul.with.overflow.v4i1(<4 x i1>, <4 x i1>)
26declare {<2 x i128>, <2 x i1>} @llvm.smul.with.overflow.v2i128(<2 x i128>, <2 x i128>)
27
28define <1 x i32> @smulo_v1i32(<1 x i32> %a0, <1 x i32> %a1, <1 x i32>* %p2) nounwind {
29; CHECK-LABEL: smulo_v1i32:
30; CHECK:       # %bb.0:
31; CHECK-NEXT:    xorl %eax, %eax
32; CHECK-NEXT:    imull %esi, %edi
33; CHECK-NEXT:    seto %al
34; CHECK-NEXT:    negl %eax
35; CHECK-NEXT:    movl %edi, (%rdx)
36; CHECK-NEXT:    retq
37  %t = call {<1 x i32>, <1 x i1>} @llvm.smul.with.overflow.v1i32(<1 x i32> %a0, <1 x i32> %a1)
38  %val = extractvalue {<1 x i32>, <1 x i1>} %t, 0
39  %obit = extractvalue {<1 x i32>, <1 x i1>} %t, 1
40  %res = sext <1 x i1> %obit to <1 x i32>
41  store <1 x i32> %val, <1 x i32>* %p2
42  ret <1 x i32> %res
43}
44
45define <2 x i32> @smulo_v2i32(<2 x i32> %a0, <2 x i32> %a1, <2 x i32>* %p2) nounwind {
46; SSE2-LABEL: smulo_v2i32:
47; SSE2:       # %bb.0:
48; SSE2-NEXT:    pxor %xmm2, %xmm2
49; SSE2-NEXT:    pxor %xmm3, %xmm3
50; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
51; SSE2-NEXT:    pand %xmm0, %xmm3
52; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
53; SSE2-NEXT:    pand %xmm1, %xmm2
54; SSE2-NEXT:    paddd %xmm3, %xmm2
55; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
56; SSE2-NEXT:    pmuludq %xmm1, %xmm0
57; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
58; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
59; SSE2-NEXT:    pmuludq %xmm3, %xmm1
60; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
61; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
62; SSE2-NEXT:    psubd %xmm2, %xmm4
63; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
64; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
65; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
66; SSE2-NEXT:    movq %xmm0, (%rdi)
67; SSE2-NEXT:    movdqa %xmm0, %xmm1
68; SSE2-NEXT:    psrad $31, %xmm1
69; SSE2-NEXT:    pcmpeqd %xmm4, %xmm1
70; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
71; SSE2-NEXT:    pxor %xmm1, %xmm0
72; SSE2-NEXT:    retq
73;
74; SSSE3-LABEL: smulo_v2i32:
75; SSSE3:       # %bb.0:
76; SSSE3-NEXT:    pxor %xmm2, %xmm2
77; SSSE3-NEXT:    pxor %xmm3, %xmm3
78; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
79; SSSE3-NEXT:    pand %xmm0, %xmm3
80; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
81; SSSE3-NEXT:    pand %xmm1, %xmm2
82; SSSE3-NEXT:    paddd %xmm3, %xmm2
83; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
84; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
85; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
86; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
87; SSSE3-NEXT:    pmuludq %xmm3, %xmm1
88; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
89; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
90; SSSE3-NEXT:    psubd %xmm2, %xmm4
91; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
92; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
93; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
94; SSSE3-NEXT:    movq %xmm0, (%rdi)
95; SSSE3-NEXT:    movdqa %xmm0, %xmm1
96; SSSE3-NEXT:    psrad $31, %xmm1
97; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm1
98; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm0
99; SSSE3-NEXT:    pxor %xmm1, %xmm0
100; SSSE3-NEXT:    retq
101;
102; SSE41-LABEL: smulo_v2i32:
103; SSE41:       # %bb.0:
104; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
105; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
106; SSE41-NEXT:    pmuldq %xmm2, %xmm3
107; SSE41-NEXT:    movdqa %xmm0, %xmm2
108; SSE41-NEXT:    pmuldq %xmm1, %xmm2
109; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
110; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
111; SSE41-NEXT:    pmulld %xmm1, %xmm0
112; SSE41-NEXT:    movq %xmm0, (%rdi)
113; SSE41-NEXT:    psrad $31, %xmm0
114; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
115; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
116; SSE41-NEXT:    pxor %xmm1, %xmm0
117; SSE41-NEXT:    retq
118;
119; AVX1-LABEL: smulo_v2i32:
120; AVX1:       # %bb.0:
121; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
122; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
123; AVX1-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
124; AVX1-NEXT:    vpmuldq %xmm1, %xmm0, %xmm3
125; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
126; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
127; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
128; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm0
129; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
130; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
131; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
132; AVX1-NEXT:    vmovq %xmm1, (%rdi)
133; AVX1-NEXT:    retq
134;
135; AVX2-LABEL: smulo_v2i32:
136; AVX2:       # %bb.0:
137; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
138; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
139; AVX2-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
140; AVX2-NEXT:    vpmuldq %xmm1, %xmm0, %xmm3
141; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
142; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
143; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
144; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm0
145; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
146; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
147; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
148; AVX2-NEXT:    vmovq %xmm1, (%rdi)
149; AVX2-NEXT:    retq
150;
151; AVX512-LABEL: smulo_v2i32:
152; AVX512:       # %bb.0:
153; AVX512-NEXT:    vpmuldq %xmm1, %xmm0, %xmm2
154; AVX512-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
155; AVX512-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
156; AVX512-NEXT:    vpmuldq %xmm3, %xmm4, %xmm3
157; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,5,3,7]
158; AVX512-NEXT:    vpermi2d %xmm3, %xmm2, %xmm4
159; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
160; AVX512-NEXT:    vpsrad $31, %xmm1, %xmm0
161; AVX512-NEXT:    vpcmpneqd %xmm0, %xmm4, %k1
162; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
163; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
164; AVX512-NEXT:    vmovq %xmm1, (%rdi)
165; AVX512-NEXT:    retq
166  %t = call {<2 x i32>, <2 x i1>} @llvm.smul.with.overflow.v2i32(<2 x i32> %a0, <2 x i32> %a1)
167  %val = extractvalue {<2 x i32>, <2 x i1>} %t, 0
168  %obit = extractvalue {<2 x i32>, <2 x i1>} %t, 1
169  %res = sext <2 x i1> %obit to <2 x i32>
170  store <2 x i32> %val, <2 x i32>* %p2
171  ret <2 x i32> %res
172}
173
174define <3 x i32> @smulo_v3i32(<3 x i32> %a0, <3 x i32> %a1, <3 x i32>* %p2) nounwind {
175; SSE2-LABEL: smulo_v3i32:
176; SSE2:       # %bb.0:
177; SSE2-NEXT:    pxor %xmm2, %xmm2
178; SSE2-NEXT:    pxor %xmm3, %xmm3
179; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
180; SSE2-NEXT:    pand %xmm0, %xmm3
181; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
182; SSE2-NEXT:    pand %xmm1, %xmm2
183; SSE2-NEXT:    paddd %xmm3, %xmm2
184; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
185; SSE2-NEXT:    pmuludq %xmm1, %xmm0
186; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
187; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
188; SSE2-NEXT:    pmuludq %xmm3, %xmm1
189; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
190; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
191; SSE2-NEXT:    psubd %xmm2, %xmm4
192; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
193; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
194; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
195; SSE2-NEXT:    movq %xmm2, (%rdi)
196; SSE2-NEXT:    psrad $31, %xmm2
197; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
198; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
199; SSE2-NEXT:    pxor %xmm2, %xmm1
200; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
201; SSE2-NEXT:    movd %xmm0, 8(%rdi)
202; SSE2-NEXT:    movdqa %xmm1, %xmm0
203; SSE2-NEXT:    retq
204;
205; SSSE3-LABEL: smulo_v3i32:
206; SSSE3:       # %bb.0:
207; SSSE3-NEXT:    pxor %xmm2, %xmm2
208; SSSE3-NEXT:    pxor %xmm3, %xmm3
209; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
210; SSSE3-NEXT:    pand %xmm0, %xmm3
211; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
212; SSSE3-NEXT:    pand %xmm1, %xmm2
213; SSSE3-NEXT:    paddd %xmm3, %xmm2
214; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
215; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
216; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
217; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
218; SSSE3-NEXT:    pmuludq %xmm3, %xmm1
219; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
220; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
221; SSSE3-NEXT:    psubd %xmm2, %xmm4
222; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
223; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
224; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
225; SSSE3-NEXT:    movq %xmm2, (%rdi)
226; SSSE3-NEXT:    psrad $31, %xmm2
227; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
228; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
229; SSSE3-NEXT:    pxor %xmm2, %xmm1
230; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
231; SSSE3-NEXT:    movd %xmm0, 8(%rdi)
232; SSSE3-NEXT:    movdqa %xmm1, %xmm0
233; SSSE3-NEXT:    retq
234;
235; SSE41-LABEL: smulo_v3i32:
236; SSE41:       # %bb.0:
237; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
238; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
239; SSE41-NEXT:    pmuldq %xmm2, %xmm3
240; SSE41-NEXT:    movdqa %xmm0, %xmm2
241; SSE41-NEXT:    pmuldq %xmm1, %xmm2
242; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
243; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
244; SSE41-NEXT:    pmulld %xmm1, %xmm0
245; SSE41-NEXT:    pextrd $2, %xmm0, 8(%rdi)
246; SSE41-NEXT:    movq %xmm0, (%rdi)
247; SSE41-NEXT:    psrad $31, %xmm0
248; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
249; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
250; SSE41-NEXT:    pxor %xmm1, %xmm0
251; SSE41-NEXT:    retq
252;
253; AVX1-LABEL: smulo_v3i32:
254; AVX1:       # %bb.0:
255; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
256; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
257; AVX1-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
258; AVX1-NEXT:    vpmuldq %xmm1, %xmm0, %xmm3
259; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
260; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
261; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
262; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm0
263; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
264; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
265; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
266; AVX1-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
267; AVX1-NEXT:    vmovq %xmm1, (%rdi)
268; AVX1-NEXT:    retq
269;
270; AVX2-LABEL: smulo_v3i32:
271; AVX2:       # %bb.0:
272; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
273; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
274; AVX2-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
275; AVX2-NEXT:    vpmuldq %xmm1, %xmm0, %xmm3
276; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
277; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
278; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
279; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm0
280; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
281; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
282; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
283; AVX2-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
284; AVX2-NEXT:    vmovq %xmm1, (%rdi)
285; AVX2-NEXT:    retq
286;
287; AVX512-LABEL: smulo_v3i32:
288; AVX512:       # %bb.0:
289; AVX512-NEXT:    vpmuldq %xmm1, %xmm0, %xmm2
290; AVX512-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
291; AVX512-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
292; AVX512-NEXT:    vpmuldq %xmm3, %xmm4, %xmm3
293; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,5,3,7]
294; AVX512-NEXT:    vpermi2d %xmm3, %xmm2, %xmm4
295; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
296; AVX512-NEXT:    vpsrad $31, %xmm1, %xmm0
297; AVX512-NEXT:    vpcmpneqd %xmm0, %xmm4, %k1
298; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
299; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
300; AVX512-NEXT:    vpextrd $2, %xmm1, 8(%rdi)
301; AVX512-NEXT:    vmovq %xmm1, (%rdi)
302; AVX512-NEXT:    retq
303  %t = call {<3 x i32>, <3 x i1>} @llvm.smul.with.overflow.v3i32(<3 x i32> %a0, <3 x i32> %a1)
304  %val = extractvalue {<3 x i32>, <3 x i1>} %t, 0
305  %obit = extractvalue {<3 x i32>, <3 x i1>} %t, 1
306  %res = sext <3 x i1> %obit to <3 x i32>
307  store <3 x i32> %val, <3 x i32>* %p2
308  ret <3 x i32> %res
309}
310
311define <4 x i32> @smulo_v4i32(<4 x i32> %a0, <4 x i32> %a1, <4 x i32>* %p2) nounwind {
312; SSE2-LABEL: smulo_v4i32:
313; SSE2:       # %bb.0:
314; SSE2-NEXT:    pxor %xmm2, %xmm2
315; SSE2-NEXT:    pxor %xmm3, %xmm3
316; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
317; SSE2-NEXT:    pand %xmm0, %xmm3
318; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
319; SSE2-NEXT:    pand %xmm1, %xmm2
320; SSE2-NEXT:    paddd %xmm3, %xmm2
321; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
322; SSE2-NEXT:    pmuludq %xmm1, %xmm0
323; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
324; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
325; SSE2-NEXT:    pmuludq %xmm3, %xmm1
326; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
327; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
328; SSE2-NEXT:    psubd %xmm2, %xmm4
329; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
330; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
331; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
332; SSE2-NEXT:    movdqa %xmm0, (%rdi)
333; SSE2-NEXT:    movdqa %xmm0, %xmm1
334; SSE2-NEXT:    psrad $31, %xmm1
335; SSE2-NEXT:    pcmpeqd %xmm4, %xmm1
336; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
337; SSE2-NEXT:    pxor %xmm1, %xmm0
338; SSE2-NEXT:    retq
339;
340; SSSE3-LABEL: smulo_v4i32:
341; SSSE3:       # %bb.0:
342; SSSE3-NEXT:    pxor %xmm2, %xmm2
343; SSSE3-NEXT:    pxor %xmm3, %xmm3
344; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm3
345; SSSE3-NEXT:    pand %xmm0, %xmm3
346; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
347; SSSE3-NEXT:    pand %xmm1, %xmm2
348; SSSE3-NEXT:    paddd %xmm3, %xmm2
349; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
350; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
351; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,3,2,3]
352; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
353; SSSE3-NEXT:    pmuludq %xmm3, %xmm1
354; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
355; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
356; SSSE3-NEXT:    psubd %xmm2, %xmm4
357; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
358; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
359; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
360; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
361; SSSE3-NEXT:    movdqa %xmm0, %xmm1
362; SSSE3-NEXT:    psrad $31, %xmm1
363; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm1
364; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm0
365; SSSE3-NEXT:    pxor %xmm1, %xmm0
366; SSSE3-NEXT:    retq
367;
368; SSE41-LABEL: smulo_v4i32:
369; SSE41:       # %bb.0:
370; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
371; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
372; SSE41-NEXT:    pmuldq %xmm2, %xmm3
373; SSE41-NEXT:    movdqa %xmm0, %xmm2
374; SSE41-NEXT:    pmuldq %xmm1, %xmm2
375; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
376; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
377; SSE41-NEXT:    pmulld %xmm1, %xmm0
378; SSE41-NEXT:    movdqa %xmm0, (%rdi)
379; SSE41-NEXT:    psrad $31, %xmm0
380; SSE41-NEXT:    pcmpeqd %xmm2, %xmm0
381; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
382; SSE41-NEXT:    pxor %xmm1, %xmm0
383; SSE41-NEXT:    retq
384;
385; AVX1-LABEL: smulo_v4i32:
386; AVX1:       # %bb.0:
387; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
388; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
389; AVX1-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
390; AVX1-NEXT:    vpmuldq %xmm1, %xmm0, %xmm3
391; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
392; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
393; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
394; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm0
395; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
396; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
397; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
398; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
399; AVX1-NEXT:    retq
400;
401; AVX2-LABEL: smulo_v4i32:
402; AVX2:       # %bb.0:
403; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
404; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
405; AVX2-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
406; AVX2-NEXT:    vpmuldq %xmm1, %xmm0, %xmm3
407; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
408; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
409; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
410; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm0
411; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
412; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
413; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
414; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
415; AVX2-NEXT:    retq
416;
417; AVX512-LABEL: smulo_v4i32:
418; AVX512:       # %bb.0:
419; AVX512-NEXT:    vpmuldq %xmm1, %xmm0, %xmm2
420; AVX512-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
421; AVX512-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
422; AVX512-NEXT:    vpmuldq %xmm3, %xmm4, %xmm3
423; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,5,3,7]
424; AVX512-NEXT:    vpermi2d %xmm3, %xmm2, %xmm4
425; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
426; AVX512-NEXT:    vpsrad $31, %xmm1, %xmm0
427; AVX512-NEXT:    vpcmpneqd %xmm0, %xmm4, %k1
428; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
429; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
430; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
431; AVX512-NEXT:    retq
432  %t = call {<4 x i32>, <4 x i1>} @llvm.smul.with.overflow.v4i32(<4 x i32> %a0, <4 x i32> %a1)
433  %val = extractvalue {<4 x i32>, <4 x i1>} %t, 0
434  %obit = extractvalue {<4 x i32>, <4 x i1>} %t, 1
435  %res = sext <4 x i1> %obit to <4 x i32>
436  store <4 x i32> %val, <4 x i32>* %p2
437  ret <4 x i32> %res
438}
439
440define <6 x i32> @smulo_v6i32(<6 x i32> %a0, <6 x i32> %a1, <6 x i32>* %p2) nounwind {
441; SSE2-LABEL: smulo_v6i32:
442; SSE2:       # %bb.0:
443; SSE2-NEXT:    movq %rdi, %rax
444; SSE2-NEXT:    movd %r8d, %xmm0
445; SSE2-NEXT:    movd %ecx, %xmm1
446; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
447; SSE2-NEXT:    movd %edx, %xmm0
448; SSE2-NEXT:    movd %esi, %xmm2
449; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
450; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
451; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
452; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
453; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
454; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
455; SSE2-NEXT:    movd {{.*#+}} xmm5 = mem[0],zero,zero,zero
456; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
457; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm1[0]
458; SSE2-NEXT:    movd %r9d, %xmm10
459; SSE2-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
460; SSE2-NEXT:    movdqa %xmm10, %xmm9
461; SSE2-NEXT:    punpckldq {{.*#+}} xmm9 = xmm9[0],xmm1[0],xmm9[1],xmm1[1]
462; SSE2-NEXT:    movd {{.*#+}} xmm8 = mem[0],zero,zero,zero
463; SSE2-NEXT:    movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
464; SSE2-NEXT:    pmuludq %xmm6, %xmm10
465; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm8[0],xmm6[1],xmm8[1]
466; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
467; SSE2-NEXT:    pxor %xmm7, %xmm7
468; SSE2-NEXT:    pxor %xmm4, %xmm4
469; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
470; SSE2-NEXT:    pand %xmm2, %xmm4
471; SSE2-NEXT:    pxor %xmm3, %xmm3
472; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
473; SSE2-NEXT:    pand %xmm5, %xmm3
474; SSE2-NEXT:    paddd %xmm4, %xmm3
475; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
476; SSE2-NEXT:    pmuludq %xmm5, %xmm2
477; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3]
478; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
479; SSE2-NEXT:    pmuludq %xmm4, %xmm5
480; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,3,2,3]
481; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
482; SSE2-NEXT:    psubd %xmm3, %xmm0
483; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
484; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[0,2,2,3]
485; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
486; SSE2-NEXT:    movdqa %xmm2, (%rcx)
487; SSE2-NEXT:    psrad $31, %xmm2
488; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
489; SSE2-NEXT:    pcmpeqd %xmm0, %xmm0
490; SSE2-NEXT:    pxor %xmm0, %xmm2
491; SSE2-NEXT:    pxor %xmm3, %xmm3
492; SSE2-NEXT:    pcmpgtd %xmm6, %xmm3
493; SSE2-NEXT:    pand %xmm9, %xmm3
494; SSE2-NEXT:    pcmpgtd %xmm9, %xmm7
495; SSE2-NEXT:    pand %xmm6, %xmm7
496; SSE2-NEXT:    paddd %xmm3, %xmm7
497; SSE2-NEXT:    pmuludq %xmm8, %xmm1
498; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
499; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[1,3,2,3]
500; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
501; SSE2-NEXT:    psubd %xmm7, %xmm4
502; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
503; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm10[0,2,2,3]
504; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
505; SSE2-NEXT:    movq %xmm3, 16(%rcx)
506; SSE2-NEXT:    psrad $31, %xmm3
507; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
508; SSE2-NEXT:    pxor %xmm0, %xmm3
509; SSE2-NEXT:    movq %xmm3, 16(%rdi)
510; SSE2-NEXT:    movdqa %xmm2, (%rdi)
511; SSE2-NEXT:    retq
512;
513; SSSE3-LABEL: smulo_v6i32:
514; SSSE3:       # %bb.0:
515; SSSE3-NEXT:    movq %rdi, %rax
516; SSSE3-NEXT:    movd %r8d, %xmm0
517; SSSE3-NEXT:    movd %ecx, %xmm1
518; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
519; SSSE3-NEXT:    movd %edx, %xmm0
520; SSSE3-NEXT:    movd %esi, %xmm2
521; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
522; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
523; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
524; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
525; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
526; SSSE3-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
527; SSSE3-NEXT:    movd {{.*#+}} xmm5 = mem[0],zero,zero,zero
528; SSSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
529; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm5 = xmm5[0],xmm1[0]
530; SSSE3-NEXT:    movd %r9d, %xmm10
531; SSSE3-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
532; SSSE3-NEXT:    movdqa %xmm10, %xmm9
533; SSSE3-NEXT:    punpckldq {{.*#+}} xmm9 = xmm9[0],xmm1[0],xmm9[1],xmm1[1]
534; SSSE3-NEXT:    movd {{.*#+}} xmm8 = mem[0],zero,zero,zero
535; SSSE3-NEXT:    movd {{.*#+}} xmm6 = mem[0],zero,zero,zero
536; SSSE3-NEXT:    pmuludq %xmm6, %xmm10
537; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm8[0],xmm6[1],xmm8[1]
538; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
539; SSSE3-NEXT:    pxor %xmm7, %xmm7
540; SSSE3-NEXT:    pxor %xmm4, %xmm4
541; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm4
542; SSSE3-NEXT:    pand %xmm2, %xmm4
543; SSSE3-NEXT:    pxor %xmm3, %xmm3
544; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm3
545; SSSE3-NEXT:    pand %xmm5, %xmm3
546; SSSE3-NEXT:    paddd %xmm4, %xmm3
547; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
548; SSSE3-NEXT:    pmuludq %xmm5, %xmm2
549; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,3,2,3]
550; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
551; SSSE3-NEXT:    pmuludq %xmm4, %xmm5
552; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,3,2,3]
553; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
554; SSSE3-NEXT:    psubd %xmm3, %xmm0
555; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
556; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[0,2,2,3]
557; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
558; SSSE3-NEXT:    movdqa %xmm2, (%rcx)
559; SSSE3-NEXT:    psrad $31, %xmm2
560; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm2
561; SSSE3-NEXT:    pcmpeqd %xmm0, %xmm0
562; SSSE3-NEXT:    pxor %xmm0, %xmm2
563; SSSE3-NEXT:    pxor %xmm3, %xmm3
564; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm3
565; SSSE3-NEXT:    pand %xmm9, %xmm3
566; SSSE3-NEXT:    pcmpgtd %xmm9, %xmm7
567; SSSE3-NEXT:    pand %xmm6, %xmm7
568; SSSE3-NEXT:    paddd %xmm3, %xmm7
569; SSSE3-NEXT:    pmuludq %xmm8, %xmm1
570; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,3,2,3]
571; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm10[1,3,2,3]
572; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
573; SSSE3-NEXT:    psubd %xmm7, %xmm4
574; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
575; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm10[0,2,2,3]
576; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
577; SSSE3-NEXT:    movq %xmm3, 16(%rcx)
578; SSSE3-NEXT:    psrad $31, %xmm3
579; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm3
580; SSSE3-NEXT:    pxor %xmm0, %xmm3
581; SSSE3-NEXT:    movq %xmm3, 16(%rdi)
582; SSSE3-NEXT:    movdqa %xmm2, (%rdi)
583; SSSE3-NEXT:    retq
584;
585; SSE41-LABEL: smulo_v6i32:
586; SSE41:       # %bb.0:
587; SSE41-NEXT:    movq %rdi, %rax
588; SSE41-NEXT:    movd %esi, %xmm2
589; SSE41-NEXT:    pinsrd $1, %edx, %xmm2
590; SSE41-NEXT:    pinsrd $2, %ecx, %xmm2
591; SSE41-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
592; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm1
593; SSE41-NEXT:    pinsrd $2, {{[0-9]+}}(%rsp), %xmm1
594; SSE41-NEXT:    movdqa %xmm1, %xmm0
595; SSE41-NEXT:    pmuldq %xmm2, %xmm1
596; SSE41-NEXT:    pinsrd $3, %r8d, %xmm2
597; SSE41-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
598; SSE41-NEXT:    movd %r9d, %xmm4
599; SSE41-NEXT:    movdqa %xmm4, %xmm5
600; SSE41-NEXT:    pmuldq %xmm3, %xmm4
601; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm3
602; SSE41-NEXT:    pinsrd $1, {{[0-9]+}}(%rsp), %xmm5
603; SSE41-NEXT:    pmulld %xmm3, %xmm5
604; SSE41-NEXT:    pinsrd $3, {{[0-9]+}}(%rsp), %xmm0
605; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
606; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
607; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
608; SSE41-NEXT:    pmuldq %xmm3, %xmm6
609; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
610; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm6[2,3],xmm1[4,5],xmm6[6,7]
611; SSE41-NEXT:    pmulld %xmm2, %xmm0
612; SSE41-NEXT:    movdqa %xmm0, (%rcx)
613; SSE41-NEXT:    psrad $31, %xmm0
614; SSE41-NEXT:    pcmpeqd %xmm1, %xmm0
615; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
616; SSE41-NEXT:    pxor %xmm1, %xmm0
617; SSE41-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
618; SSE41-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
619; SSE41-NEXT:    pmuldq %xmm2, %xmm3
620; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
621; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
622; SSE41-NEXT:    movq %xmm5, 16(%rcx)
623; SSE41-NEXT:    psrad $31, %xmm5
624; SSE41-NEXT:    pcmpeqd %xmm2, %xmm5
625; SSE41-NEXT:    pxor %xmm1, %xmm5
626; SSE41-NEXT:    movq %xmm5, 16(%rdi)
627; SSE41-NEXT:    movdqa %xmm0, (%rdi)
628; SSE41-NEXT:    retq
629;
630; AVX1-LABEL: smulo_v6i32:
631; AVX1:       # %bb.0:
632; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
633; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
634; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
635; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
636; AVX1-NEXT:    vpmuldq %xmm3, %xmm5, %xmm3
637; AVX1-NEXT:    vpmuldq %xmm2, %xmm4, %xmm5
638; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
639; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm5[0,1],xmm3[2,3],xmm5[4,5],xmm3[6,7]
640; AVX1-NEXT:    vpmulld %xmm2, %xmm4, %xmm2
641; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm4
642; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm3, %xmm3
643; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
644; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
645; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
646; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
647; AVX1-NEXT:    vpmuldq %xmm5, %xmm6, %xmm5
648; AVX1-NEXT:    vpmuldq %xmm1, %xmm0, %xmm6
649; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
650; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7]
651; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
652; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm0
653; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm5, %xmm0
654; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
655; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
656; AVX1-NEXT:    vmovq %xmm2, 16(%rdi)
657; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
658; AVX1-NEXT:    retq
659;
660; AVX2-LABEL: smulo_v6i32:
661; AVX2:       # %bb.0:
662; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
663; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
664; AVX2-NEXT:    vpmuldq %ymm2, %ymm3, %ymm2
665; AVX2-NEXT:    vpmuldq %ymm1, %ymm0, %ymm3
666; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm3[1,1,3,3,5,5,7,7]
667; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7]
668; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm1
669; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm0
670; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm2, %ymm0
671; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
672; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
673; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
674; AVX2-NEXT:    vmovq %xmm2, 16(%rdi)
675; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
676; AVX2-NEXT:    retq
677;
678; AVX512-LABEL: smulo_v6i32:
679; AVX512:       # %bb.0:
680; AVX512-NEXT:    vpmuldq %ymm1, %ymm0, %ymm2
681; AVX512-NEXT:    vpshufd {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7]
682; AVX512-NEXT:    vpshufd {{.*#+}} ymm4 = ymm0[1,1,3,3,5,5,7,7]
683; AVX512-NEXT:    vpmuldq %ymm3, %ymm4, %ymm3
684; AVX512-NEXT:    vmovdqa {{.*#+}} ymm4 = [1,9,3,11,5,13,7,15]
685; AVX512-NEXT:    vpermi2d %ymm3, %ymm2, %ymm4
686; AVX512-NEXT:    vpmulld %ymm1, %ymm0, %ymm1
687; AVX512-NEXT:    vpsrad $31, %ymm1, %ymm0
688; AVX512-NEXT:    vpcmpneqd %ymm0, %ymm4, %k1
689; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
690; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
691; AVX512-NEXT:    vextracti128 $1, %ymm1, %xmm2
692; AVX512-NEXT:    vmovq %xmm2, 16(%rdi)
693; AVX512-NEXT:    vmovdqa %xmm1, (%rdi)
694; AVX512-NEXT:    retq
695  %t = call {<6 x i32>, <6 x i1>} @llvm.smul.with.overflow.v6i32(<6 x i32> %a0, <6 x i32> %a1)
696  %val = extractvalue {<6 x i32>, <6 x i1>} %t, 0
697  %obit = extractvalue {<6 x i32>, <6 x i1>} %t, 1
698  %res = sext <6 x i1> %obit to <6 x i32>
699  store <6 x i32> %val, <6 x i32>* %p2
700  ret <6 x i32> %res
701}
702
703define <8 x i32> @smulo_v8i32(<8 x i32> %a0, <8 x i32> %a1, <8 x i32>* %p2) nounwind {
704; SSE2-LABEL: smulo_v8i32:
705; SSE2:       # %bb.0:
706; SSE2-NEXT:    pxor %xmm4, %xmm4
707; SSE2-NEXT:    pxor %xmm5, %xmm5
708; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
709; SSE2-NEXT:    pand %xmm0, %xmm5
710; SSE2-NEXT:    pxor %xmm6, %xmm6
711; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
712; SSE2-NEXT:    pand %xmm2, %xmm6
713; SSE2-NEXT:    paddd %xmm5, %xmm6
714; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
715; SSE2-NEXT:    pmuludq %xmm2, %xmm0
716; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3]
717; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
718; SSE2-NEXT:    pmuludq %xmm7, %xmm2
719; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,3,2,3]
720; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
721; SSE2-NEXT:    psubd %xmm6, %xmm5
722; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
723; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
724; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
725; SSE2-NEXT:    movdqa %xmm0, (%rdi)
726; SSE2-NEXT:    psrad $31, %xmm0
727; SSE2-NEXT:    pcmpeqd %xmm5, %xmm0
728; SSE2-NEXT:    pcmpeqd %xmm2, %xmm2
729; SSE2-NEXT:    pxor %xmm2, %xmm0
730; SSE2-NEXT:    pxor %xmm5, %xmm5
731; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
732; SSE2-NEXT:    pand %xmm1, %xmm5
733; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
734; SSE2-NEXT:    pand %xmm3, %xmm4
735; SSE2-NEXT:    paddd %xmm5, %xmm4
736; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
737; SSE2-NEXT:    pmuludq %xmm3, %xmm1
738; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,3,2,3]
739; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
740; SSE2-NEXT:    pmuludq %xmm5, %xmm3
741; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3]
742; SSE2-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
743; SSE2-NEXT:    psubd %xmm4, %xmm6
744; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
745; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
746; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
747; SSE2-NEXT:    movdqa %xmm1, 16(%rdi)
748; SSE2-NEXT:    psrad $31, %xmm1
749; SSE2-NEXT:    pcmpeqd %xmm6, %xmm1
750; SSE2-NEXT:    pxor %xmm2, %xmm1
751; SSE2-NEXT:    retq
752;
753; SSSE3-LABEL: smulo_v8i32:
754; SSSE3:       # %bb.0:
755; SSSE3-NEXT:    pxor %xmm4, %xmm4
756; SSSE3-NEXT:    pxor %xmm5, %xmm5
757; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
758; SSSE3-NEXT:    pand %xmm0, %xmm5
759; SSSE3-NEXT:    pxor %xmm6, %xmm6
760; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm6
761; SSSE3-NEXT:    pand %xmm2, %xmm6
762; SSSE3-NEXT:    paddd %xmm5, %xmm6
763; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
764; SSSE3-NEXT:    pmuludq %xmm2, %xmm0
765; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3]
766; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
767; SSSE3-NEXT:    pmuludq %xmm7, %xmm2
768; SSSE3-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,3,2,3]
769; SSSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
770; SSSE3-NEXT:    psubd %xmm6, %xmm5
771; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
772; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
773; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
774; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
775; SSSE3-NEXT:    psrad $31, %xmm0
776; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm0
777; SSSE3-NEXT:    pcmpeqd %xmm2, %xmm2
778; SSSE3-NEXT:    pxor %xmm2, %xmm0
779; SSSE3-NEXT:    pxor %xmm5, %xmm5
780; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm5
781; SSSE3-NEXT:    pand %xmm1, %xmm5
782; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
783; SSSE3-NEXT:    pand %xmm3, %xmm4
784; SSSE3-NEXT:    paddd %xmm5, %xmm4
785; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
786; SSSE3-NEXT:    pmuludq %xmm3, %xmm1
787; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,3,2,3]
788; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
789; SSSE3-NEXT:    pmuludq %xmm5, %xmm3
790; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3]
791; SSSE3-NEXT:    punpckldq {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1]
792; SSSE3-NEXT:    psubd %xmm4, %xmm6
793; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
794; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
795; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
796; SSSE3-NEXT:    movdqa %xmm1, 16(%rdi)
797; SSSE3-NEXT:    psrad $31, %xmm1
798; SSSE3-NEXT:    pcmpeqd %xmm6, %xmm1
799; SSSE3-NEXT:    pxor %xmm2, %xmm1
800; SSSE3-NEXT:    retq
801;
802; SSE41-LABEL: smulo_v8i32:
803; SSE41:       # %bb.0:
804; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
805; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
806; SSE41-NEXT:    pmuldq %xmm4, %xmm5
807; SSE41-NEXT:    movdqa %xmm0, %xmm4
808; SSE41-NEXT:    pmuldq %xmm2, %xmm4
809; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
810; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
811; SSE41-NEXT:    pmulld %xmm2, %xmm0
812; SSE41-NEXT:    movdqa %xmm0, (%rdi)
813; SSE41-NEXT:    psrad $31, %xmm0
814; SSE41-NEXT:    pcmpeqd %xmm4, %xmm0
815; SSE41-NEXT:    pcmpeqd %xmm2, %xmm2
816; SSE41-NEXT:    pxor %xmm2, %xmm0
817; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
818; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
819; SSE41-NEXT:    pmuldq %xmm4, %xmm5
820; SSE41-NEXT:    movdqa %xmm1, %xmm4
821; SSE41-NEXT:    pmuldq %xmm3, %xmm4
822; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
823; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
824; SSE41-NEXT:    pmulld %xmm3, %xmm1
825; SSE41-NEXT:    movdqa %xmm1, 16(%rdi)
826; SSE41-NEXT:    psrad $31, %xmm1
827; SSE41-NEXT:    pcmpeqd %xmm4, %xmm1
828; SSE41-NEXT:    pxor %xmm2, %xmm1
829; SSE41-NEXT:    retq
830;
831; AVX1-LABEL: smulo_v8i32:
832; AVX1:       # %bb.0:
833; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
834; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
835; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm4
836; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
837; AVX1-NEXT:    vpmuldq %xmm3, %xmm5, %xmm3
838; AVX1-NEXT:    vpmuldq %xmm2, %xmm4, %xmm5
839; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
840; AVX1-NEXT:    vpblendw {{.*#+}} xmm3 = xmm5[0,1],xmm3[2,3],xmm5[4,5],xmm3[6,7]
841; AVX1-NEXT:    vpmulld %xmm2, %xmm4, %xmm2
842; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm4
843; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm3, %xmm3
844; AVX1-NEXT:    vpcmpeqd %xmm4, %xmm4, %xmm4
845; AVX1-NEXT:    vpxor %xmm4, %xmm3, %xmm3
846; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
847; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
848; AVX1-NEXT:    vpmuldq %xmm5, %xmm6, %xmm5
849; AVX1-NEXT:    vpmuldq %xmm1, %xmm0, %xmm6
850; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
851; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7]
852; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
853; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm0
854; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm5, %xmm0
855; AVX1-NEXT:    vpxor %xmm4, %xmm0, %xmm0
856; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm0, %ymm0
857; AVX1-NEXT:    vmovdqa %xmm2, 16(%rdi)
858; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
859; AVX1-NEXT:    retq
860;
861; AVX2-LABEL: smulo_v8i32:
862; AVX2:       # %bb.0:
863; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
864; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
865; AVX2-NEXT:    vpmuldq %ymm2, %ymm3, %ymm2
866; AVX2-NEXT:    vpmuldq %ymm1, %ymm0, %ymm3
867; AVX2-NEXT:    vpshufd {{.*#+}} ymm3 = ymm3[1,1,3,3,5,5,7,7]
868; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm3[0],ymm2[1],ymm3[2],ymm2[3],ymm3[4],ymm2[5],ymm3[6],ymm2[7]
869; AVX2-NEXT:    vpmulld %ymm1, %ymm0, %ymm1
870; AVX2-NEXT:    vpsrad $31, %ymm1, %ymm0
871; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm2, %ymm0
872; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
873; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
874; AVX2-NEXT:    vmovdqa %ymm1, (%rdi)
875; AVX2-NEXT:    retq
876;
877; AVX512-LABEL: smulo_v8i32:
878; AVX512:       # %bb.0:
879; AVX512-NEXT:    vpmuldq %ymm1, %ymm0, %ymm2
880; AVX512-NEXT:    vpshufd {{.*#+}} ymm3 = ymm1[1,1,3,3,5,5,7,7]
881; AVX512-NEXT:    vpshufd {{.*#+}} ymm4 = ymm0[1,1,3,3,5,5,7,7]
882; AVX512-NEXT:    vpmuldq %ymm3, %ymm4, %ymm3
883; AVX512-NEXT:    vmovdqa {{.*#+}} ymm4 = [1,9,3,11,5,13,7,15]
884; AVX512-NEXT:    vpermi2d %ymm3, %ymm2, %ymm4
885; AVX512-NEXT:    vpmulld %ymm1, %ymm0, %ymm1
886; AVX512-NEXT:    vpsrad $31, %ymm1, %ymm0
887; AVX512-NEXT:    vpcmpneqd %ymm0, %ymm4, %k1
888; AVX512-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
889; AVX512-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
890; AVX512-NEXT:    vmovdqa %ymm1, (%rdi)
891; AVX512-NEXT:    retq
892  %t = call {<8 x i32>, <8 x i1>} @llvm.smul.with.overflow.v8i32(<8 x i32> %a0, <8 x i32> %a1)
893  %val = extractvalue {<8 x i32>, <8 x i1>} %t, 0
894  %obit = extractvalue {<8 x i32>, <8 x i1>} %t, 1
895  %res = sext <8 x i1> %obit to <8 x i32>
896  store <8 x i32> %val, <8 x i32>* %p2
897  ret <8 x i32> %res
898}
899
900define <16 x i32> @smulo_v16i32(<16 x i32> %a0, <16 x i32> %a1, <16 x i32>* %p2) nounwind {
901; SSE2-LABEL: smulo_v16i32:
902; SSE2:       # %bb.0:
903; SSE2-NEXT:    pxor %xmm8, %xmm8
904; SSE2-NEXT:    pxor %xmm9, %xmm9
905; SSE2-NEXT:    pcmpgtd %xmm4, %xmm9
906; SSE2-NEXT:    pand %xmm0, %xmm9
907; SSE2-NEXT:    pxor %xmm10, %xmm10
908; SSE2-NEXT:    pcmpgtd %xmm0, %xmm10
909; SSE2-NEXT:    pand %xmm4, %xmm10
910; SSE2-NEXT:    paddd %xmm9, %xmm10
911; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
912; SSE2-NEXT:    pmuludq %xmm4, %xmm0
913; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,3,2,3]
914; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm4[1,1,3,3]
915; SSE2-NEXT:    pmuludq %xmm11, %xmm12
916; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[1,3,2,3]
917; SSE2-NEXT:    punpckldq {{.*#+}} xmm9 = xmm9[0],xmm4[0],xmm9[1],xmm4[1]
918; SSE2-NEXT:    psubd %xmm10, %xmm9
919; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
920; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3]
921; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
922; SSE2-NEXT:    movdqa %xmm0, (%rdi)
923; SSE2-NEXT:    psrad $31, %xmm0
924; SSE2-NEXT:    pcmpeqd %xmm9, %xmm0
925; SSE2-NEXT:    pcmpeqd %xmm9, %xmm9
926; SSE2-NEXT:    pxor %xmm9, %xmm0
927; SSE2-NEXT:    pxor %xmm10, %xmm10
928; SSE2-NEXT:    pcmpgtd %xmm5, %xmm10
929; SSE2-NEXT:    pand %xmm1, %xmm10
930; SSE2-NEXT:    pxor %xmm4, %xmm4
931; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
932; SSE2-NEXT:    pand %xmm5, %xmm4
933; SSE2-NEXT:    paddd %xmm10, %xmm4
934; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3]
935; SSE2-NEXT:    pmuludq %xmm5, %xmm1
936; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm1[1,3,2,3]
937; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm5[1,1,3,3]
938; SSE2-NEXT:    pmuludq %xmm10, %xmm12
939; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm12[1,3,2,3]
940; SSE2-NEXT:    punpckldq {{.*#+}} xmm11 = xmm11[0],xmm5[0],xmm11[1],xmm5[1]
941; SSE2-NEXT:    psubd %xmm4, %xmm11
942; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
943; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3]
944; SSE2-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
945; SSE2-NEXT:    movdqa %xmm1, 16(%rdi)
946; SSE2-NEXT:    psrad $31, %xmm1
947; SSE2-NEXT:    pcmpeqd %xmm11, %xmm1
948; SSE2-NEXT:    pxor %xmm9, %xmm1
949; SSE2-NEXT:    pxor %xmm4, %xmm4
950; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
951; SSE2-NEXT:    pand %xmm2, %xmm4
952; SSE2-NEXT:    pxor %xmm5, %xmm5
953; SSE2-NEXT:    pcmpgtd %xmm2, %xmm5
954; SSE2-NEXT:    pand %xmm6, %xmm5
955; SSE2-NEXT:    paddd %xmm4, %xmm5
956; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm2[1,1,3,3]
957; SSE2-NEXT:    pmuludq %xmm6, %xmm2
958; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3]
959; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3]
960; SSE2-NEXT:    pmuludq %xmm10, %xmm11
961; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm11[1,3,2,3]
962; SSE2-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
963; SSE2-NEXT:    psubd %xmm5, %xmm4
964; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
965; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm11[0,2,2,3]
966; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
967; SSE2-NEXT:    movdqa %xmm2, 32(%rdi)
968; SSE2-NEXT:    psrad $31, %xmm2
969; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
970; SSE2-NEXT:    pxor %xmm9, %xmm2
971; SSE2-NEXT:    pxor %xmm4, %xmm4
972; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
973; SSE2-NEXT:    pand %xmm3, %xmm4
974; SSE2-NEXT:    pcmpgtd %xmm3, %xmm8
975; SSE2-NEXT:    pand %xmm7, %xmm8
976; SSE2-NEXT:    paddd %xmm4, %xmm8
977; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
978; SSE2-NEXT:    pmuludq %xmm7, %xmm3
979; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3]
980; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
981; SSE2-NEXT:    pmuludq %xmm4, %xmm6
982; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,3,2,3]
983; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1]
984; SSE2-NEXT:    psubd %xmm8, %xmm5
985; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
986; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,2,2,3]
987; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
988; SSE2-NEXT:    movdqa %xmm3, 48(%rdi)
989; SSE2-NEXT:    psrad $31, %xmm3
990; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
991; SSE2-NEXT:    pxor %xmm9, %xmm3
992; SSE2-NEXT:    retq
993;
994; SSSE3-LABEL: smulo_v16i32:
995; SSSE3:       # %bb.0:
996; SSSE3-NEXT:    pxor %xmm8, %xmm8
997; SSSE3-NEXT:    pxor %xmm9, %xmm9
998; SSSE3-NEXT:    pcmpgtd %xmm4, %xmm9
999; SSSE3-NEXT:    pand %xmm0, %xmm9
1000; SSSE3-NEXT:    pxor %xmm10, %xmm10
1001; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm10
1002; SSSE3-NEXT:    pand %xmm4, %xmm10
1003; SSSE3-NEXT:    paddd %xmm9, %xmm10
1004; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm0[1,1,3,3]
1005; SSSE3-NEXT:    pmuludq %xmm4, %xmm0
1006; SSSE3-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,3,2,3]
1007; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm4[1,1,3,3]
1008; SSSE3-NEXT:    pmuludq %xmm11, %xmm12
1009; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[1,3,2,3]
1010; SSSE3-NEXT:    punpckldq {{.*#+}} xmm9 = xmm9[0],xmm4[0],xmm9[1],xmm4[1]
1011; SSSE3-NEXT:    psubd %xmm10, %xmm9
1012; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
1013; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3]
1014; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
1015; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
1016; SSSE3-NEXT:    psrad $31, %xmm0
1017; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm0
1018; SSSE3-NEXT:    pcmpeqd %xmm9, %xmm9
1019; SSSE3-NEXT:    pxor %xmm9, %xmm0
1020; SSSE3-NEXT:    pxor %xmm10, %xmm10
1021; SSSE3-NEXT:    pcmpgtd %xmm5, %xmm10
1022; SSSE3-NEXT:    pand %xmm1, %xmm10
1023; SSSE3-NEXT:    pxor %xmm4, %xmm4
1024; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm4
1025; SSSE3-NEXT:    pand %xmm5, %xmm4
1026; SSSE3-NEXT:    paddd %xmm10, %xmm4
1027; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3]
1028; SSSE3-NEXT:    pmuludq %xmm5, %xmm1
1029; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm1[1,3,2,3]
1030; SSSE3-NEXT:    pshufd {{.*#+}} xmm12 = xmm5[1,1,3,3]
1031; SSSE3-NEXT:    pmuludq %xmm10, %xmm12
1032; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm12[1,3,2,3]
1033; SSSE3-NEXT:    punpckldq {{.*#+}} xmm11 = xmm11[0],xmm5[0],xmm11[1],xmm5[1]
1034; SSSE3-NEXT:    psubd %xmm4, %xmm11
1035; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
1036; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm12[0,2,2,3]
1037; SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
1038; SSSE3-NEXT:    movdqa %xmm1, 16(%rdi)
1039; SSSE3-NEXT:    psrad $31, %xmm1
1040; SSSE3-NEXT:    pcmpeqd %xmm11, %xmm1
1041; SSSE3-NEXT:    pxor %xmm9, %xmm1
1042; SSSE3-NEXT:    pxor %xmm4, %xmm4
1043; SSSE3-NEXT:    pcmpgtd %xmm6, %xmm4
1044; SSSE3-NEXT:    pand %xmm2, %xmm4
1045; SSSE3-NEXT:    pxor %xmm5, %xmm5
1046; SSSE3-NEXT:    pcmpgtd %xmm2, %xmm5
1047; SSSE3-NEXT:    pand %xmm6, %xmm5
1048; SSSE3-NEXT:    paddd %xmm4, %xmm5
1049; SSSE3-NEXT:    pshufd {{.*#+}} xmm10 = xmm2[1,1,3,3]
1050; SSSE3-NEXT:    pmuludq %xmm6, %xmm2
1051; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3]
1052; SSSE3-NEXT:    pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3]
1053; SSSE3-NEXT:    pmuludq %xmm10, %xmm11
1054; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm11[1,3,2,3]
1055; SSSE3-NEXT:    punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
1056; SSSE3-NEXT:    psubd %xmm5, %xmm4
1057; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
1058; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm11[0,2,2,3]
1059; SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
1060; SSSE3-NEXT:    movdqa %xmm2, 32(%rdi)
1061; SSSE3-NEXT:    psrad $31, %xmm2
1062; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm2
1063; SSSE3-NEXT:    pxor %xmm9, %xmm2
1064; SSSE3-NEXT:    pxor %xmm4, %xmm4
1065; SSSE3-NEXT:    pcmpgtd %xmm7, %xmm4
1066; SSSE3-NEXT:    pand %xmm3, %xmm4
1067; SSSE3-NEXT:    pcmpgtd %xmm3, %xmm8
1068; SSSE3-NEXT:    pand %xmm7, %xmm8
1069; SSSE3-NEXT:    paddd %xmm4, %xmm8
1070; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,1,3,3]
1071; SSSE3-NEXT:    pmuludq %xmm7, %xmm3
1072; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,3,2,3]
1073; SSSE3-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1074; SSSE3-NEXT:    pmuludq %xmm4, %xmm6
1075; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,3,2,3]
1076; SSSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1]
1077; SSSE3-NEXT:    psubd %xmm8, %xmm5
1078; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
1079; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,2,2,3]
1080; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
1081; SSSE3-NEXT:    movdqa %xmm3, 48(%rdi)
1082; SSSE3-NEXT:    psrad $31, %xmm3
1083; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
1084; SSSE3-NEXT:    pxor %xmm9, %xmm3
1085; SSSE3-NEXT:    retq
1086;
1087; SSE41-LABEL: smulo_v16i32:
1088; SSE41:       # %bb.0:
1089; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[1,1,3,3]
1090; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm0[1,1,3,3]
1091; SSE41-NEXT:    pmuldq %xmm8, %xmm9
1092; SSE41-NEXT:    movdqa %xmm0, %xmm8
1093; SSE41-NEXT:    pmuldq %xmm4, %xmm8
1094; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
1095; SSE41-NEXT:    pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7]
1096; SSE41-NEXT:    pmulld %xmm4, %xmm0
1097; SSE41-NEXT:    movdqa %xmm0, (%rdi)
1098; SSE41-NEXT:    psrad $31, %xmm0
1099; SSE41-NEXT:    pcmpeqd %xmm8, %xmm0
1100; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
1101; SSE41-NEXT:    pxor %xmm8, %xmm0
1102; SSE41-NEXT:    pshufd {{.*#+}} xmm9 = xmm5[1,1,3,3]
1103; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3]
1104; SSE41-NEXT:    pmuldq %xmm9, %xmm10
1105; SSE41-NEXT:    movdqa %xmm1, %xmm4
1106; SSE41-NEXT:    pmuldq %xmm5, %xmm4
1107; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1108; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm10[2,3],xmm4[4,5],xmm10[6,7]
1109; SSE41-NEXT:    pmulld %xmm5, %xmm1
1110; SSE41-NEXT:    movdqa %xmm1, 16(%rdi)
1111; SSE41-NEXT:    psrad $31, %xmm1
1112; SSE41-NEXT:    pcmpeqd %xmm4, %xmm1
1113; SSE41-NEXT:    pxor %xmm8, %xmm1
1114; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
1115; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
1116; SSE41-NEXT:    pmuldq %xmm4, %xmm5
1117; SSE41-NEXT:    movdqa %xmm2, %xmm4
1118; SSE41-NEXT:    pmuldq %xmm6, %xmm4
1119; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1120; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1121; SSE41-NEXT:    pmulld %xmm6, %xmm2
1122; SSE41-NEXT:    movdqa %xmm2, 32(%rdi)
1123; SSE41-NEXT:    psrad $31, %xmm2
1124; SSE41-NEXT:    pcmpeqd %xmm4, %xmm2
1125; SSE41-NEXT:    pxor %xmm8, %xmm2
1126; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
1127; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
1128; SSE41-NEXT:    pmuldq %xmm4, %xmm5
1129; SSE41-NEXT:    movdqa %xmm3, %xmm4
1130; SSE41-NEXT:    pmuldq %xmm7, %xmm4
1131; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
1132; SSE41-NEXT:    pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1133; SSE41-NEXT:    pmulld %xmm7, %xmm3
1134; SSE41-NEXT:    movdqa %xmm3, 48(%rdi)
1135; SSE41-NEXT:    psrad $31, %xmm3
1136; SSE41-NEXT:    pcmpeqd %xmm4, %xmm3
1137; SSE41-NEXT:    pxor %xmm8, %xmm3
1138; SSE41-NEXT:    retq
1139;
1140; AVX1-LABEL: smulo_v16i32:
1141; AVX1:       # %bb.0:
1142; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
1143; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm4[1,1,3,3]
1144; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm6
1145; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm6[1,1,3,3]
1146; AVX1-NEXT:    vpmuldq %xmm5, %xmm7, %xmm5
1147; AVX1-NEXT:    vpmuldq %xmm4, %xmm6, %xmm7
1148; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1149; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm7[0,1],xmm5[2,3],xmm7[4,5],xmm5[6,7]
1150; AVX1-NEXT:    vpmulld %xmm4, %xmm6, %xmm8
1151; AVX1-NEXT:    vpsrad $31, %xmm8, %xmm6
1152; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm5, %xmm6
1153; AVX1-NEXT:    vpcmpeqd %xmm9, %xmm9, %xmm9
1154; AVX1-NEXT:    vpxor %xmm6, %xmm9, %xmm6
1155; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
1156; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
1157; AVX1-NEXT:    vpmuldq %xmm7, %xmm4, %xmm4
1158; AVX1-NEXT:    vpmuldq %xmm3, %xmm1, %xmm7
1159; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1160; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm7[0,1],xmm4[2,3],xmm7[4,5],xmm4[6,7]
1161; AVX1-NEXT:    vpmulld %xmm3, %xmm1, %xmm3
1162; AVX1-NEXT:    vpsrad $31, %xmm3, %xmm1
1163; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm4, %xmm1
1164; AVX1-NEXT:    vpxor %xmm1, %xmm9, %xmm1
1165; AVX1-NEXT:    vpackssdw %xmm6, %xmm1, %xmm1
1166; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1167; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
1168; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm7
1169; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
1170; AVX1-NEXT:    vpmuldq %xmm6, %xmm5, %xmm5
1171; AVX1-NEXT:    vpmuldq %xmm4, %xmm7, %xmm6
1172; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
1173; AVX1-NEXT:    vpblendw {{.*#+}} xmm5 = xmm6[0,1],xmm5[2,3],xmm6[4,5],xmm5[6,7]
1174; AVX1-NEXT:    vpmulld %xmm4, %xmm7, %xmm4
1175; AVX1-NEXT:    vpsrad $31, %xmm4, %xmm6
1176; AVX1-NEXT:    vpcmpeqd %xmm6, %xmm5, %xmm5
1177; AVX1-NEXT:    vpxor %xmm5, %xmm9, %xmm5
1178; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm2[1,1,3,3]
1179; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm0[1,1,3,3]
1180; AVX1-NEXT:    vpmuldq %xmm6, %xmm7, %xmm6
1181; AVX1-NEXT:    vpmuldq %xmm2, %xmm0, %xmm7
1182; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
1183; AVX1-NEXT:    vpblendw {{.*#+}} xmm6 = xmm7[0,1],xmm6[2,3],xmm7[4,5],xmm6[6,7]
1184; AVX1-NEXT:    vpmulld %xmm2, %xmm0, %xmm2
1185; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm0
1186; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm6, %xmm0
1187; AVX1-NEXT:    vpxor %xmm0, %xmm9, %xmm0
1188; AVX1-NEXT:    vpackssdw %xmm5, %xmm0, %xmm0
1189; AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
1190; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm5
1191; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
1192; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
1193; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm5, %ymm0
1194; AVX1-NEXT:    vpacksswb %xmm1, %xmm1, %xmm1
1195; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm5
1196; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
1197; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
1198; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm5, %ymm1
1199; AVX1-NEXT:    vmovdqa %xmm8, 48(%rdi)
1200; AVX1-NEXT:    vmovdqa %xmm3, 32(%rdi)
1201; AVX1-NEXT:    vmovdqa %xmm4, 16(%rdi)
1202; AVX1-NEXT:    vmovdqa %xmm2, (%rdi)
1203; AVX1-NEXT:    retq
1204;
1205; AVX2-LABEL: smulo_v16i32:
1206; AVX2:       # %bb.0:
1207; AVX2-NEXT:    vpshufd {{.*#+}} ymm4 = ymm3[1,1,3,3,5,5,7,7]
1208; AVX2-NEXT:    vpshufd {{.*#+}} ymm5 = ymm1[1,1,3,3,5,5,7,7]
1209; AVX2-NEXT:    vpmuldq %ymm4, %ymm5, %ymm4
1210; AVX2-NEXT:    vpmuldq %ymm3, %ymm1, %ymm5
1211; AVX2-NEXT:    vpshufd {{.*#+}} ymm5 = ymm5[1,1,3,3,5,5,7,7]
1212; AVX2-NEXT:    vpblendd {{.*#+}} ymm4 = ymm5[0],ymm4[1],ymm5[2],ymm4[3],ymm5[4],ymm4[5],ymm5[6],ymm4[7]
1213; AVX2-NEXT:    vpmulld %ymm3, %ymm1, %ymm3
1214; AVX2-NEXT:    vpsrad $31, %ymm3, %ymm1
1215; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm4, %ymm1
1216; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm4, %ymm4
1217; AVX2-NEXT:    vpxor %ymm4, %ymm1, %ymm1
1218; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm5
1219; AVX2-NEXT:    vpackssdw %xmm5, %xmm1, %xmm1
1220; AVX2-NEXT:    vpshufd {{.*#+}} ymm5 = ymm2[1,1,3,3,5,5,7,7]
1221; AVX2-NEXT:    vpshufd {{.*#+}} ymm6 = ymm0[1,1,3,3,5,5,7,7]
1222; AVX2-NEXT:    vpmuldq %ymm5, %ymm6, %ymm5
1223; AVX2-NEXT:    vpmuldq %ymm2, %ymm0, %ymm6
1224; AVX2-NEXT:    vpshufd {{.*#+}} ymm6 = ymm6[1,1,3,3,5,5,7,7]
1225; AVX2-NEXT:    vpblendd {{.*#+}} ymm5 = ymm6[0],ymm5[1],ymm6[2],ymm5[3],ymm6[4],ymm5[5],ymm6[6],ymm5[7]
1226; AVX2-NEXT:    vpmulld %ymm2, %ymm0, %ymm2
1227; AVX2-NEXT:    vpsrad $31, %ymm2, %ymm0
1228; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm5, %ymm0
1229; AVX2-NEXT:    vpxor %ymm4, %ymm0, %ymm0
1230; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm4
1231; AVX2-NEXT:    vpackssdw %xmm4, %xmm0, %xmm0
1232; AVX2-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
1233; AVX2-NEXT:    vpmovsxbd %xmm0, %ymm0
1234; AVX2-NEXT:    vpacksswb %xmm1, %xmm1, %xmm1
1235; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1
1236; AVX2-NEXT:    vmovdqa %ymm3, 32(%rdi)
1237; AVX2-NEXT:    vmovdqa %ymm2, (%rdi)
1238; AVX2-NEXT:    retq
1239;
1240; AVX512-LABEL: smulo_v16i32:
1241; AVX512:       # %bb.0:
1242; AVX512-NEXT:    vpmuldq %zmm1, %zmm0, %zmm2
1243; AVX512-NEXT:    vpshufd {{.*#+}} zmm3 = zmm1[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
1244; AVX512-NEXT:    vpshufd {{.*#+}} zmm4 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
1245; AVX512-NEXT:    vpmuldq %zmm3, %zmm4, %zmm3
1246; AVX512-NEXT:    vmovdqa64 {{.*#+}} zmm4 = [1,17,3,19,5,21,7,23,9,25,11,27,13,29,15,31]
1247; AVX512-NEXT:    vpermi2d %zmm3, %zmm2, %zmm4
1248; AVX512-NEXT:    vpmulld %zmm1, %zmm0, %zmm1
1249; AVX512-NEXT:    vpsrad $31, %zmm1, %zmm0
1250; AVX512-NEXT:    vpcmpneqd %zmm0, %zmm4, %k1
1251; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1252; AVX512-NEXT:    vmovdqa64 %zmm1, (%rdi)
1253; AVX512-NEXT:    retq
1254  %t = call {<16 x i32>, <16 x i1>} @llvm.smul.with.overflow.v16i32(<16 x i32> %a0, <16 x i32> %a1)
1255  %val = extractvalue {<16 x i32>, <16 x i1>} %t, 0
1256  %obit = extractvalue {<16 x i32>, <16 x i1>} %t, 1
1257  %res = sext <16 x i1> %obit to <16 x i32>
1258  store <16 x i32> %val, <16 x i32>* %p2
1259  ret <16 x i32> %res
1260}
1261
1262define <16 x i32> @smulo_v16i8(<16 x i8> %a0, <16 x i8> %a1, <16 x i8>* %p2) nounwind {
1263; SSE2-LABEL: smulo_v16i8:
1264; SSE2:       # %bb.0:
1265; SSE2-NEXT:    pxor %xmm2, %xmm2
1266; SSE2-NEXT:    pxor %xmm3, %xmm3
1267; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
1268; SSE2-NEXT:    pxor %xmm5, %xmm5
1269; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
1270; SSE2-NEXT:    pmulhw %xmm3, %xmm5
1271; SSE2-NEXT:    movdqa %xmm5, %xmm3
1272; SSE2-NEXT:    psrlw $8, %xmm3
1273; SSE2-NEXT:    pxor %xmm6, %xmm6
1274; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1],xmm6[2],xmm1[2],xmm6[3],xmm1[3],xmm6[4],xmm1[4],xmm6[5],xmm1[5],xmm6[6],xmm1[6],xmm6[7],xmm1[7]
1275; SSE2-NEXT:    pxor %xmm4, %xmm4
1276; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
1277; SSE2-NEXT:    pmulhw %xmm6, %xmm4
1278; SSE2-NEXT:    movdqa %xmm4, %xmm0
1279; SSE2-NEXT:    psrlw $8, %xmm0
1280; SSE2-NEXT:    packuswb %xmm3, %xmm0
1281; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1282; SSE2-NEXT:    pand %xmm1, %xmm5
1283; SSE2-NEXT:    pand %xmm1, %xmm4
1284; SSE2-NEXT:    packuswb %xmm5, %xmm4
1285; SSE2-NEXT:    pcmpgtb %xmm4, %xmm2
1286; SSE2-NEXT:    pcmpeqb %xmm0, %xmm2
1287; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
1288; SSE2-NEXT:    pxor %xmm2, %xmm3
1289; SSE2-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]
1290; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1291; SSE2-NEXT:    psrad $24, %xmm0
1292; SSE2-NEXT:    movdqa %xmm3, %xmm1
1293; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1294; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
1295; SSE2-NEXT:    pslld $31, %xmm1
1296; SSE2-NEXT:    psrad $31, %xmm1
1297; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1298; SSE2-NEXT:    movdqa %xmm3, %xmm2
1299; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
1300; SSE2-NEXT:    pslld $31, %xmm2
1301; SSE2-NEXT:    psrad $31, %xmm2
1302; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
1303; SSE2-NEXT:    pslld $31, %xmm3
1304; SSE2-NEXT:    psrad $31, %xmm3
1305; SSE2-NEXT:    movdqa %xmm4, (%rdi)
1306; SSE2-NEXT:    retq
1307;
1308; SSSE3-LABEL: smulo_v16i8:
1309; SSSE3:       # %bb.0:
1310; SSSE3-NEXT:    pxor %xmm2, %xmm2
1311; SSSE3-NEXT:    pxor %xmm3, %xmm3
1312; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
1313; SSSE3-NEXT:    pxor %xmm5, %xmm5
1314; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
1315; SSSE3-NEXT:    pmulhw %xmm3, %xmm5
1316; SSSE3-NEXT:    movdqa %xmm5, %xmm3
1317; SSSE3-NEXT:    psrlw $8, %xmm3
1318; SSSE3-NEXT:    pxor %xmm6, %xmm6
1319; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1],xmm6[2],xmm1[2],xmm6[3],xmm1[3],xmm6[4],xmm1[4],xmm6[5],xmm1[5],xmm6[6],xmm1[6],xmm6[7],xmm1[7]
1320; SSSE3-NEXT:    pxor %xmm4, %xmm4
1321; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
1322; SSSE3-NEXT:    pmulhw %xmm6, %xmm4
1323; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1324; SSSE3-NEXT:    psrlw $8, %xmm0
1325; SSSE3-NEXT:    packuswb %xmm3, %xmm0
1326; SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1327; SSSE3-NEXT:    pand %xmm1, %xmm5
1328; SSSE3-NEXT:    pand %xmm1, %xmm4
1329; SSSE3-NEXT:    packuswb %xmm5, %xmm4
1330; SSSE3-NEXT:    pcmpgtb %xmm4, %xmm2
1331; SSSE3-NEXT:    pcmpeqb %xmm0, %xmm2
1332; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm3
1333; SSSE3-NEXT:    pxor %xmm2, %xmm3
1334; SSSE3-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]
1335; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
1336; SSSE3-NEXT:    psrad $24, %xmm0
1337; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1338; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1339; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
1340; SSSE3-NEXT:    pslld $31, %xmm1
1341; SSSE3-NEXT:    psrad $31, %xmm1
1342; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1343; SSSE3-NEXT:    movdqa %xmm3, %xmm2
1344; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
1345; SSSE3-NEXT:    pslld $31, %xmm2
1346; SSSE3-NEXT:    psrad $31, %xmm2
1347; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
1348; SSSE3-NEXT:    pslld $31, %xmm3
1349; SSSE3-NEXT:    psrad $31, %xmm3
1350; SSSE3-NEXT:    movdqa %xmm4, (%rdi)
1351; SSSE3-NEXT:    retq
1352;
1353; SSE41-LABEL: smulo_v16i8:
1354; SSE41:       # %bb.0:
1355; SSE41-NEXT:    pxor %xmm2, %xmm2
1356; SSE41-NEXT:    pxor %xmm3, %xmm3
1357; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
1358; SSE41-NEXT:    pxor %xmm5, %xmm5
1359; SSE41-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
1360; SSE41-NEXT:    pmulhw %xmm3, %xmm5
1361; SSE41-NEXT:    movdqa %xmm5, %xmm3
1362; SSE41-NEXT:    psrlw $8, %xmm3
1363; SSE41-NEXT:    pxor %xmm6, %xmm6
1364; SSE41-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1],xmm6[2],xmm1[2],xmm6[3],xmm1[3],xmm6[4],xmm1[4],xmm6[5],xmm1[5],xmm6[6],xmm1[6],xmm6[7],xmm1[7]
1365; SSE41-NEXT:    pxor %xmm4, %xmm4
1366; SSE41-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
1367; SSE41-NEXT:    pmulhw %xmm6, %xmm4
1368; SSE41-NEXT:    movdqa %xmm4, %xmm0
1369; SSE41-NEXT:    psrlw $8, %xmm0
1370; SSE41-NEXT:    packuswb %xmm3, %xmm0
1371; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
1372; SSE41-NEXT:    pand %xmm1, %xmm5
1373; SSE41-NEXT:    pand %xmm1, %xmm4
1374; SSE41-NEXT:    packuswb %xmm5, %xmm4
1375; SSE41-NEXT:    pcmpgtb %xmm4, %xmm2
1376; SSE41-NEXT:    pcmpeqb %xmm0, %xmm2
1377; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
1378; SSE41-NEXT:    pxor %xmm2, %xmm3
1379; SSE41-NEXT:    pmovsxbd %xmm3, %xmm0
1380; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
1381; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
1382; SSE41-NEXT:    pslld $31, %xmm1
1383; SSE41-NEXT:    psrad $31, %xmm1
1384; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[2,3,2,3]
1385; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
1386; SSE41-NEXT:    pslld $31, %xmm2
1387; SSE41-NEXT:    psrad $31, %xmm2
1388; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
1389; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
1390; SSE41-NEXT:    pslld $31, %xmm3
1391; SSE41-NEXT:    psrad $31, %xmm3
1392; SSE41-NEXT:    movdqa %xmm4, (%rdi)
1393; SSE41-NEXT:    retq
1394;
1395; AVX1-LABEL: smulo_v16i8:
1396; AVX1:       # %bb.0:
1397; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1398; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
1399; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
1400; AVX1-NEXT:    vpmulhw %xmm3, %xmm4, %xmm3
1401; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm4
1402; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1403; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1404; AVX1-NEXT:    vpmulhw %xmm1, %xmm0, %xmm0
1405; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1406; AVX1-NEXT:    vpackuswb %xmm4, %xmm1, %xmm1
1407; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
1408; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
1409; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
1410; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm3
1411; AVX1-NEXT:    vpcmpgtb %xmm3, %xmm2, %xmm0
1412; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1413; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1414; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm1
1415; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm0
1416; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]
1417; AVX1-NEXT:    vpmovsxbd %xmm2, %xmm2
1418; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1419; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
1420; AVX1-NEXT:    vpmovsxbd %xmm2, %xmm2
1421; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]
1422; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
1423; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm2, %ymm1
1424; AVX1-NEXT:    vmovdqa %xmm3, (%rdi)
1425; AVX1-NEXT:    retq
1426;
1427; AVX2-LABEL: smulo_v16i8:
1428; AVX2:       # %bb.0:
1429; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm1
1430; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
1431; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
1432; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm1
1433; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm2
1434; AVX2-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
1435; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
1436; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
1437; AVX2-NEXT:    vpackuswb %xmm2, %xmm0, %xmm2
1438; AVX2-NEXT:    vpxor %xmm0, %xmm0, %xmm0
1439; AVX2-NEXT:    vpcmpgtb %xmm2, %xmm0, %xmm0
1440; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1441; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
1442; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm1
1443; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm0
1444; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1445; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1
1446; AVX2-NEXT:    vmovdqa %xmm2, (%rdi)
1447; AVX2-NEXT:    retq
1448;
1449; AVX512F-LABEL: smulo_v16i8:
1450; AVX512F:       # %bb.0:
1451; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm1
1452; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
1453; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm1
1454; AVX512F-NEXT:    vpsraw $8, %ymm1, %ymm0
1455; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
1456; AVX512F-NEXT:    vpsllw $8, %ymm1, %ymm2
1457; AVX512F-NEXT:    vpsraw $15, %ymm2, %ymm2
1458; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm2
1459; AVX512F-NEXT:    vpcmpneqd %zmm0, %zmm2, %k1
1460; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1461; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
1462; AVX512F-NEXT:    vpmovdb %zmm1, (%rdi)
1463; AVX512F-NEXT:    retq
1464;
1465; AVX512BW-LABEL: smulo_v16i8:
1466; AVX512BW:       # %bb.0:
1467; AVX512BW-NEXT:    vpmovsxbw %xmm1, %ymm1
1468; AVX512BW-NEXT:    vpmovsxbw %xmm0, %ymm0
1469; AVX512BW-NEXT:    vpmullw %ymm1, %ymm0, %ymm1
1470; AVX512BW-NEXT:    vpsraw $8, %ymm1, %ymm0
1471; AVX512BW-NEXT:    vpsllw $8, %ymm1, %ymm2
1472; AVX512BW-NEXT:    vpsraw $15, %ymm2, %ymm2
1473; AVX512BW-NEXT:    vpcmpneqw %ymm0, %ymm2, %k1
1474; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1475; AVX512BW-NEXT:    vpmovwb %ymm1, (%rdi)
1476; AVX512BW-NEXT:    retq
1477  %t = call {<16 x i8>, <16 x i1>} @llvm.smul.with.overflow.v16i8(<16 x i8> %a0, <16 x i8> %a1)
1478  %val = extractvalue {<16 x i8>, <16 x i1>} %t, 0
1479  %obit = extractvalue {<16 x i8>, <16 x i1>} %t, 1
1480  %res = sext <16 x i1> %obit to <16 x i32>
1481  store <16 x i8> %val, <16 x i8>* %p2
1482  ret <16 x i32> %res
1483}
1484
1485define <32 x i32> @smulo_v32i8(<32 x i8> %a0, <32 x i8> %a1, <32 x i8>* %p2) nounwind {
1486; SSE2-LABEL: smulo_v32i8:
1487; SSE2:       # %bb.0:
1488; SSE2-NEXT:    movq %rdi, %rax
1489; SSE2-NEXT:    pxor %xmm4, %xmm4
1490; SSE2-NEXT:    pxor %xmm5, %xmm5
1491; SSE2-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15]
1492; SSE2-NEXT:    pxor %xmm6, %xmm6
1493; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
1494; SSE2-NEXT:    pmulhw %xmm5, %xmm6
1495; SSE2-NEXT:    movdqa %xmm6, %xmm5
1496; SSE2-NEXT:    psrlw $8, %xmm5
1497; SSE2-NEXT:    pxor %xmm7, %xmm7
1498; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1],xmm7[2],xmm3[2],xmm7[3],xmm3[3],xmm7[4],xmm3[4],xmm7[5],xmm3[5],xmm7[6],xmm3[6],xmm7[7],xmm3[7]
1499; SSE2-NEXT:    pxor %xmm10, %xmm10
1500; SSE2-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm1[0],xmm10[1],xmm1[1],xmm10[2],xmm1[2],xmm10[3],xmm1[3],xmm10[4],xmm1[4],xmm10[5],xmm1[5],xmm10[6],xmm1[6],xmm10[7],xmm1[7]
1501; SSE2-NEXT:    pmulhw %xmm7, %xmm10
1502; SSE2-NEXT:    movdqa %xmm10, %xmm7
1503; SSE2-NEXT:    psrlw $8, %xmm7
1504; SSE2-NEXT:    packuswb %xmm5, %xmm7
1505; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255]
1506; SSE2-NEXT:    pand %xmm9, %xmm6
1507; SSE2-NEXT:    pand %xmm9, %xmm10
1508; SSE2-NEXT:    packuswb %xmm6, %xmm10
1509; SSE2-NEXT:    pxor %xmm3, %xmm3
1510; SSE2-NEXT:    pcmpgtb %xmm10, %xmm3
1511; SSE2-NEXT:    pcmpeqb %xmm7, %xmm3
1512; SSE2-NEXT:    pcmpeqd %xmm8, %xmm8
1513; SSE2-NEXT:    pxor %xmm8, %xmm3
1514; SSE2-NEXT:    pxor %xmm7, %xmm7
1515; SSE2-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm2[8],xmm7[9],xmm2[9],xmm7[10],xmm2[10],xmm7[11],xmm2[11],xmm7[12],xmm2[12],xmm7[13],xmm2[13],xmm7[14],xmm2[14],xmm7[15],xmm2[15]
1516; SSE2-NEXT:    pxor %xmm6, %xmm6
1517; SSE2-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
1518; SSE2-NEXT:    pmulhw %xmm7, %xmm6
1519; SSE2-NEXT:    movdqa %xmm6, %xmm7
1520; SSE2-NEXT:    psrlw $8, %xmm7
1521; SSE2-NEXT:    pxor %xmm5, %xmm5
1522; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7]
1523; SSE2-NEXT:    pxor %xmm11, %xmm11
1524; SSE2-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm0[0],xmm11[1],xmm0[1],xmm11[2],xmm0[2],xmm11[3],xmm0[3],xmm11[4],xmm0[4],xmm11[5],xmm0[5],xmm11[6],xmm0[6],xmm11[7],xmm0[7]
1525; SSE2-NEXT:    pmulhw %xmm5, %xmm11
1526; SSE2-NEXT:    movdqa %xmm11, %xmm0
1527; SSE2-NEXT:    psrlw $8, %xmm0
1528; SSE2-NEXT:    packuswb %xmm7, %xmm0
1529; SSE2-NEXT:    pand %xmm9, %xmm6
1530; SSE2-NEXT:    pand %xmm9, %xmm11
1531; SSE2-NEXT:    packuswb %xmm6, %xmm11
1532; SSE2-NEXT:    pcmpgtb %xmm11, %xmm4
1533; SSE2-NEXT:    pcmpeqb %xmm0, %xmm4
1534; SSE2-NEXT:    pxor %xmm8, %xmm4
1535; SSE2-NEXT:    movdqa %xmm4, %xmm0
1536; SSE2-NEXT:    punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm4[0],xmm8[1],xmm4[1],xmm8[2],xmm4[2],xmm8[3],xmm4[3],xmm8[4],xmm4[4],xmm8[5],xmm4[5],xmm8[6],xmm4[6],xmm8[7],xmm4[7]
1537; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1538; SSE2-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
1539; SSE2-NEXT:    pslld $31, %xmm4
1540; SSE2-NEXT:    psrad $31, %xmm4
1541; SSE2-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1542; SSE2-NEXT:    movdqa %xmm0, %xmm6
1543; SSE2-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3]
1544; SSE2-NEXT:    pslld $31, %xmm6
1545; SSE2-NEXT:    psrad $31, %xmm6
1546; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1547; SSE2-NEXT:    pslld $31, %xmm0
1548; SSE2-NEXT:    psrad $31, %xmm0
1549; SSE2-NEXT:    movdqa %xmm3, %xmm7
1550; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1551; SSE2-NEXT:    punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
1552; SSE2-NEXT:    pslld $31, %xmm7
1553; SSE2-NEXT:    psrad $31, %xmm7
1554; SSE2-NEXT:    punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm3[0],xmm9[1],xmm3[1],xmm9[2],xmm3[2],xmm9[3],xmm3[3],xmm9[4],xmm3[4],xmm9[5],xmm3[5],xmm9[6],xmm3[6],xmm9[7],xmm3[7]
1555; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1556; SSE2-NEXT:    movdqa %xmm3, %xmm1
1557; SSE2-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1558; SSE2-NEXT:    pslld $31, %xmm1
1559; SSE2-NEXT:    psrad $31, %xmm1
1560; SSE2-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
1561; SSE2-NEXT:    pslld $31, %xmm3
1562; SSE2-NEXT:    psrad $31, %xmm3
1563; SSE2-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3]
1564; SSE2-NEXT:    psrad $24, %xmm5
1565; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm9[0],xmm2[1],xmm9[1],xmm2[2],xmm9[2],xmm2[3],xmm9[3]
1566; SSE2-NEXT:    psrad $24, %xmm2
1567; SSE2-NEXT:    movdqa %xmm10, 16(%rsi)
1568; SSE2-NEXT:    movdqa %xmm11, (%rsi)
1569; SSE2-NEXT:    movdqa %xmm2, 64(%rdi)
1570; SSE2-NEXT:    movdqa %xmm5, (%rdi)
1571; SSE2-NEXT:    movdqa %xmm3, 112(%rdi)
1572; SSE2-NEXT:    movdqa %xmm1, 96(%rdi)
1573; SSE2-NEXT:    movdqa %xmm7, 80(%rdi)
1574; SSE2-NEXT:    movdqa %xmm0, 48(%rdi)
1575; SSE2-NEXT:    movdqa %xmm6, 32(%rdi)
1576; SSE2-NEXT:    movdqa %xmm4, 16(%rdi)
1577; SSE2-NEXT:    retq
1578;
1579; SSSE3-LABEL: smulo_v32i8:
1580; SSSE3:       # %bb.0:
1581; SSSE3-NEXT:    movq %rdi, %rax
1582; SSSE3-NEXT:    pxor %xmm4, %xmm4
1583; SSSE3-NEXT:    pxor %xmm5, %xmm5
1584; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15]
1585; SSSE3-NEXT:    pxor %xmm6, %xmm6
1586; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
1587; SSSE3-NEXT:    pmulhw %xmm5, %xmm6
1588; SSSE3-NEXT:    movdqa %xmm6, %xmm5
1589; SSSE3-NEXT:    psrlw $8, %xmm5
1590; SSSE3-NEXT:    pxor %xmm7, %xmm7
1591; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1],xmm7[2],xmm3[2],xmm7[3],xmm3[3],xmm7[4],xmm3[4],xmm7[5],xmm3[5],xmm7[6],xmm3[6],xmm7[7],xmm3[7]
1592; SSSE3-NEXT:    pxor %xmm10, %xmm10
1593; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm1[0],xmm10[1],xmm1[1],xmm10[2],xmm1[2],xmm10[3],xmm1[3],xmm10[4],xmm1[4],xmm10[5],xmm1[5],xmm10[6],xmm1[6],xmm10[7],xmm1[7]
1594; SSSE3-NEXT:    pmulhw %xmm7, %xmm10
1595; SSSE3-NEXT:    movdqa %xmm10, %xmm7
1596; SSSE3-NEXT:    psrlw $8, %xmm7
1597; SSSE3-NEXT:    packuswb %xmm5, %xmm7
1598; SSSE3-NEXT:    movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255]
1599; SSSE3-NEXT:    pand %xmm9, %xmm6
1600; SSSE3-NEXT:    pand %xmm9, %xmm10
1601; SSSE3-NEXT:    packuswb %xmm6, %xmm10
1602; SSSE3-NEXT:    pxor %xmm3, %xmm3
1603; SSSE3-NEXT:    pcmpgtb %xmm10, %xmm3
1604; SSSE3-NEXT:    pcmpeqb %xmm7, %xmm3
1605; SSSE3-NEXT:    pcmpeqd %xmm8, %xmm8
1606; SSSE3-NEXT:    pxor %xmm8, %xmm3
1607; SSSE3-NEXT:    pxor %xmm7, %xmm7
1608; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm2[8],xmm7[9],xmm2[9],xmm7[10],xmm2[10],xmm7[11],xmm2[11],xmm7[12],xmm2[12],xmm7[13],xmm2[13],xmm7[14],xmm2[14],xmm7[15],xmm2[15]
1609; SSSE3-NEXT:    pxor %xmm6, %xmm6
1610; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
1611; SSSE3-NEXT:    pmulhw %xmm7, %xmm6
1612; SSSE3-NEXT:    movdqa %xmm6, %xmm7
1613; SSSE3-NEXT:    psrlw $8, %xmm7
1614; SSSE3-NEXT:    pxor %xmm5, %xmm5
1615; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7]
1616; SSSE3-NEXT:    pxor %xmm11, %xmm11
1617; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm0[0],xmm11[1],xmm0[1],xmm11[2],xmm0[2],xmm11[3],xmm0[3],xmm11[4],xmm0[4],xmm11[5],xmm0[5],xmm11[6],xmm0[6],xmm11[7],xmm0[7]
1618; SSSE3-NEXT:    pmulhw %xmm5, %xmm11
1619; SSSE3-NEXT:    movdqa %xmm11, %xmm0
1620; SSSE3-NEXT:    psrlw $8, %xmm0
1621; SSSE3-NEXT:    packuswb %xmm7, %xmm0
1622; SSSE3-NEXT:    pand %xmm9, %xmm6
1623; SSSE3-NEXT:    pand %xmm9, %xmm11
1624; SSSE3-NEXT:    packuswb %xmm6, %xmm11
1625; SSSE3-NEXT:    pcmpgtb %xmm11, %xmm4
1626; SSSE3-NEXT:    pcmpeqb %xmm0, %xmm4
1627; SSSE3-NEXT:    pxor %xmm8, %xmm4
1628; SSSE3-NEXT:    movdqa %xmm4, %xmm0
1629; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm8 = xmm8[0],xmm4[0],xmm8[1],xmm4[1],xmm8[2],xmm4[2],xmm8[3],xmm4[3],xmm8[4],xmm4[4],xmm8[5],xmm4[5],xmm8[6],xmm4[6],xmm8[7],xmm4[7]
1630; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1631; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
1632; SSSE3-NEXT:    pslld $31, %xmm4
1633; SSSE3-NEXT:    psrad $31, %xmm4
1634; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1635; SSSE3-NEXT:    movdqa %xmm0, %xmm6
1636; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm6 = xmm6[0,0,1,1,2,2,3,3]
1637; SSSE3-NEXT:    pslld $31, %xmm6
1638; SSSE3-NEXT:    psrad $31, %xmm6
1639; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1640; SSSE3-NEXT:    pslld $31, %xmm0
1641; SSSE3-NEXT:    psrad $31, %xmm0
1642; SSSE3-NEXT:    movdqa %xmm3, %xmm7
1643; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
1644; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm7 = xmm7[4,4,5,5,6,6,7,7]
1645; SSSE3-NEXT:    pslld $31, %xmm7
1646; SSSE3-NEXT:    psrad $31, %xmm7
1647; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm9 = xmm9[0],xmm3[0],xmm9[1],xmm3[1],xmm9[2],xmm3[2],xmm9[3],xmm3[3],xmm9[4],xmm3[4],xmm9[5],xmm3[5],xmm9[6],xmm3[6],xmm9[7],xmm3[7]
1648; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1649; SSSE3-NEXT:    movdqa %xmm3, %xmm1
1650; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3]
1651; SSSE3-NEXT:    pslld $31, %xmm1
1652; SSSE3-NEXT:    psrad $31, %xmm1
1653; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm3 = xmm3[4,4,5,5,6,6,7,7]
1654; SSSE3-NEXT:    pslld $31, %xmm3
1655; SSSE3-NEXT:    psrad $31, %xmm3
1656; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm8[0],xmm5[1],xmm8[1],xmm5[2],xmm8[2],xmm5[3],xmm8[3]
1657; SSSE3-NEXT:    psrad $24, %xmm5
1658; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm9[0],xmm2[1],xmm9[1],xmm2[2],xmm9[2],xmm2[3],xmm9[3]
1659; SSSE3-NEXT:    psrad $24, %xmm2
1660; SSSE3-NEXT:    movdqa %xmm10, 16(%rsi)
1661; SSSE3-NEXT:    movdqa %xmm11, (%rsi)
1662; SSSE3-NEXT:    movdqa %xmm2, 64(%rdi)
1663; SSSE3-NEXT:    movdqa %xmm5, (%rdi)
1664; SSSE3-NEXT:    movdqa %xmm3, 112(%rdi)
1665; SSSE3-NEXT:    movdqa %xmm1, 96(%rdi)
1666; SSSE3-NEXT:    movdqa %xmm7, 80(%rdi)
1667; SSSE3-NEXT:    movdqa %xmm0, 48(%rdi)
1668; SSSE3-NEXT:    movdqa %xmm6, 32(%rdi)
1669; SSSE3-NEXT:    movdqa %xmm4, 16(%rdi)
1670; SSSE3-NEXT:    retq
1671;
1672; SSE41-LABEL: smulo_v32i8:
1673; SSE41:       # %bb.0:
1674; SSE41-NEXT:    movq %rdi, %rax
1675; SSE41-NEXT:    pxor %xmm10, %xmm10
1676; SSE41-NEXT:    pxor %xmm5, %xmm5
1677; SSE41-NEXT:    punpckhbw {{.*#+}} xmm5 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15]
1678; SSE41-NEXT:    pxor %xmm6, %xmm6
1679; SSE41-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
1680; SSE41-NEXT:    pmulhw %xmm5, %xmm6
1681; SSE41-NEXT:    movdqa %xmm6, %xmm5
1682; SSE41-NEXT:    psrlw $8, %xmm5
1683; SSE41-NEXT:    pxor %xmm7, %xmm7
1684; SSE41-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1],xmm7[2],xmm3[2],xmm7[3],xmm3[3],xmm7[4],xmm3[4],xmm7[5],xmm3[5],xmm7[6],xmm3[6],xmm7[7],xmm3[7]
1685; SSE41-NEXT:    pxor %xmm3, %xmm3
1686; SSE41-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
1687; SSE41-NEXT:    pmulhw %xmm7, %xmm3
1688; SSE41-NEXT:    movdqa %xmm3, %xmm7
1689; SSE41-NEXT:    psrlw $8, %xmm7
1690; SSE41-NEXT:    packuswb %xmm5, %xmm7
1691; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [255,255,255,255,255,255,255,255]
1692; SSE41-NEXT:    pand %xmm9, %xmm6
1693; SSE41-NEXT:    pand %xmm9, %xmm3
1694; SSE41-NEXT:    packuswb %xmm6, %xmm3
1695; SSE41-NEXT:    pxor %xmm1, %xmm1
1696; SSE41-NEXT:    pcmpgtb %xmm3, %xmm1
1697; SSE41-NEXT:    pcmpeqb %xmm7, %xmm1
1698; SSE41-NEXT:    pcmpeqd %xmm8, %xmm8
1699; SSE41-NEXT:    pxor %xmm8, %xmm1
1700; SSE41-NEXT:    pxor %xmm7, %xmm7
1701; SSE41-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm2[8],xmm7[9],xmm2[9],xmm7[10],xmm2[10],xmm7[11],xmm2[11],xmm7[12],xmm2[12],xmm7[13],xmm2[13],xmm7[14],xmm2[14],xmm7[15],xmm2[15]
1702; SSE41-NEXT:    pxor %xmm6, %xmm6
1703; SSE41-NEXT:    punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm0[8],xmm6[9],xmm0[9],xmm6[10],xmm0[10],xmm6[11],xmm0[11],xmm6[12],xmm0[12],xmm6[13],xmm0[13],xmm6[14],xmm0[14],xmm6[15],xmm0[15]
1704; SSE41-NEXT:    pmulhw %xmm7, %xmm6
1705; SSE41-NEXT:    movdqa %xmm6, %xmm7
1706; SSE41-NEXT:    psrlw $8, %xmm7
1707; SSE41-NEXT:    pxor %xmm5, %xmm5
1708; SSE41-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7]
1709; SSE41-NEXT:    pxor %xmm2, %xmm2
1710; SSE41-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1711; SSE41-NEXT:    pmulhw %xmm5, %xmm2
1712; SSE41-NEXT:    movdqa %xmm2, %xmm0
1713; SSE41-NEXT:    psrlw $8, %xmm0
1714; SSE41-NEXT:    packuswb %xmm7, %xmm0
1715; SSE41-NEXT:    pand %xmm9, %xmm6
1716; SSE41-NEXT:    pand %xmm9, %xmm2
1717; SSE41-NEXT:    packuswb %xmm6, %xmm2
1718; SSE41-NEXT:    pcmpgtb %xmm2, %xmm10
1719; SSE41-NEXT:    pcmpeqb %xmm0, %xmm10
1720; SSE41-NEXT:    pxor %xmm8, %xmm10
1721; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,1,1]
1722; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm8 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1723; SSE41-NEXT:    pslld $31, %xmm8
1724; SSE41-NEXT:    psrad $31, %xmm8
1725; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm10[2,3,2,3]
1726; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm5 = xmm5[0],zero,zero,zero,xmm5[1],zero,zero,zero,xmm5[2],zero,zero,zero,xmm5[3],zero,zero,zero
1727; SSE41-NEXT:    pslld $31, %xmm5
1728; SSE41-NEXT:    psrad $31, %xmm5
1729; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm10[3,3,3,3]
1730; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm6 = xmm6[0],zero,zero,zero,xmm6[1],zero,zero,zero,xmm6[2],zero,zero,zero,xmm6[3],zero,zero,zero
1731; SSE41-NEXT:    pslld $31, %xmm6
1732; SSE41-NEXT:    psrad $31, %xmm6
1733; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,1,1]
1734; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm7 = xmm7[0],zero,zero,zero,xmm7[1],zero,zero,zero,xmm7[2],zero,zero,zero,xmm7[3],zero,zero,zero
1735; SSE41-NEXT:    pslld $31, %xmm7
1736; SSE41-NEXT:    psrad $31, %xmm7
1737; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
1738; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1739; SSE41-NEXT:    pslld $31, %xmm0
1740; SSE41-NEXT:    psrad $31, %xmm0
1741; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[3,3,3,3]
1742; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm4 = xmm4[0],zero,zero,zero,xmm4[1],zero,zero,zero,xmm4[2],zero,zero,zero,xmm4[3],zero,zero,zero
1743; SSE41-NEXT:    pslld $31, %xmm4
1744; SSE41-NEXT:    psrad $31, %xmm4
1745; SSE41-NEXT:    pmovsxbd %xmm10, %xmm9
1746; SSE41-NEXT:    pmovsxbd %xmm1, %xmm1
1747; SSE41-NEXT:    movdqa %xmm3, 16(%rsi)
1748; SSE41-NEXT:    movdqa %xmm2, (%rsi)
1749; SSE41-NEXT:    movdqa %xmm1, 64(%rdi)
1750; SSE41-NEXT:    movdqa %xmm9, (%rdi)
1751; SSE41-NEXT:    movdqa %xmm4, 112(%rdi)
1752; SSE41-NEXT:    movdqa %xmm0, 96(%rdi)
1753; SSE41-NEXT:    movdqa %xmm7, 80(%rdi)
1754; SSE41-NEXT:    movdqa %xmm6, 48(%rdi)
1755; SSE41-NEXT:    movdqa %xmm5, 32(%rdi)
1756; SSE41-NEXT:    movdqa %xmm8, 16(%rdi)
1757; SSE41-NEXT:    retq
1758;
1759; AVX1-LABEL: smulo_v32i8:
1760; AVX1:       # %bb.0:
1761; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1762; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1763; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
1764; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
1765; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm2[8],xmm5[8],xmm2[9],xmm5[9],xmm2[10],xmm5[10],xmm2[11],xmm5[11],xmm2[12],xmm5[12],xmm2[13],xmm5[13],xmm2[14],xmm5[14],xmm2[15],xmm5[15]
1766; AVX1-NEXT:    vpmulhw %xmm4, %xmm6, %xmm4
1767; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm6
1768; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
1769; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm5 = xmm2[0],xmm5[0],xmm2[1],xmm5[1],xmm2[2],xmm5[2],xmm2[3],xmm5[3],xmm2[4],xmm5[4],xmm2[5],xmm5[5],xmm2[6],xmm5[6],xmm2[7],xmm5[7]
1770; AVX1-NEXT:    vpmulhw %xmm3, %xmm5, %xmm3
1771; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm5
1772; AVX1-NEXT:    vpackuswb %xmm6, %xmm5, %xmm5
1773; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255]
1774; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
1775; AVX1-NEXT:    vpand %xmm6, %xmm3, %xmm3
1776; AVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm4
1777; AVX1-NEXT:    vpcmpgtb %xmm4, %xmm2, %xmm3
1778; AVX1-NEXT:    vpcmpeqb %xmm5, %xmm3, %xmm3
1779; AVX1-NEXT:    vpcmpeqd %xmm8, %xmm8, %xmm8
1780; AVX1-NEXT:    vpxor %xmm3, %xmm8, %xmm3
1781; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm7 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
1782; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
1783; AVX1-NEXT:    vpmulhw %xmm7, %xmm5, %xmm5
1784; AVX1-NEXT:    vpsrlw $8, %xmm5, %xmm7
1785; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
1786; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1787; AVX1-NEXT:    vpmulhw %xmm1, %xmm0, %xmm0
1788; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1789; AVX1-NEXT:    vpackuswb %xmm7, %xmm1, %xmm1
1790; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
1791; AVX1-NEXT:    vpand %xmm6, %xmm0, %xmm0
1792; AVX1-NEXT:    vpackuswb %xmm5, %xmm0, %xmm5
1793; AVX1-NEXT:    vpcmpgtb %xmm5, %xmm2, %xmm0
1794; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
1795; AVX1-NEXT:    vpxor %xmm0, %xmm8, %xmm1
1796; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm0
1797; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,1,1]
1798; AVX1-NEXT:    vpmovsxbd %xmm2, %xmm2
1799; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1800; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm2
1801; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm3[1,1,1,1]
1802; AVX1-NEXT:    vpmovsxbd %xmm6, %xmm6
1803; AVX1-NEXT:    vinsertf128 $1, %xmm6, %ymm2, %ymm2
1804; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm1[2,3,2,3]
1805; AVX1-NEXT:    vpmovsxbd %xmm6, %xmm6
1806; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[3,3,3,3]
1807; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
1808; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm6, %ymm1
1809; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm3[2,3,2,3]
1810; AVX1-NEXT:    vpmovsxbd %xmm6, %xmm6
1811; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[3,3,3,3]
1812; AVX1-NEXT:    vpmovsxbd %xmm3, %xmm3
1813; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm6, %ymm3
1814; AVX1-NEXT:    vmovdqa %xmm4, 16(%rdi)
1815; AVX1-NEXT:    vmovdqa %xmm5, (%rdi)
1816; AVX1-NEXT:    retq
1817;
1818; AVX2-LABEL: smulo_v32i8:
1819; AVX2:       # %bb.0:
1820; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1821; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15],ymm2[24],ymm1[24],ymm2[25],ymm1[25],ymm2[26],ymm1[26],ymm2[27],ymm1[27],ymm2[28],ymm1[28],ymm2[29],ymm1[29],ymm2[30],ymm1[30],ymm2[31],ymm1[31]
1822; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm4 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
1823; AVX2-NEXT:    vpmulhw %ymm3, %ymm4, %ymm3
1824; AVX2-NEXT:    vpsrlw $8, %ymm3, %ymm4
1825; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[16],ymm1[16],ymm2[17],ymm1[17],ymm2[18],ymm1[18],ymm2[19],ymm1[19],ymm2[20],ymm1[20],ymm2[21],ymm1[21],ymm2[22],ymm1[22],ymm2[23],ymm1[23]
1826; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
1827; AVX2-NEXT:    vpmulhw %ymm1, %ymm0, %ymm0
1828; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm1
1829; AVX2-NEXT:    vpackuswb %ymm4, %ymm1, %ymm1
1830; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
1831; AVX2-NEXT:    vpand %ymm4, %ymm3, %ymm3
1832; AVX2-NEXT:    vpand %ymm4, %ymm0, %ymm0
1833; AVX2-NEXT:    vpackuswb %ymm3, %ymm0, %ymm4
1834; AVX2-NEXT:    vpcmpgtb %ymm4, %ymm2, %ymm0
1835; AVX2-NEXT:    vpcmpeqb %ymm1, %ymm0, %ymm0
1836; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1
1837; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm1
1838; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm0
1839; AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm3
1840; AVX2-NEXT:    vpmovsxbd %xmm3, %ymm2
1841; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
1842; AVX2-NEXT:    vpmovsxbd %xmm1, %ymm1
1843; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[2,3,2,3]
1844; AVX2-NEXT:    vpmovsxbd %xmm3, %ymm3
1845; AVX2-NEXT:    vmovdqa %ymm4, (%rdi)
1846; AVX2-NEXT:    retq
1847;
1848; AVX512F-LABEL: smulo_v32i8:
1849; AVX512F:       # %bb.0:
1850; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm2
1851; AVX512F-NEXT:    vpmovsxbw %xmm2, %ymm2
1852; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm3
1853; AVX512F-NEXT:    vpmovsxbw %xmm3, %ymm3
1854; AVX512F-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
1855; AVX512F-NEXT:    vpsraw $8, %ymm2, %ymm3
1856; AVX512F-NEXT:    vpmovsxwd %ymm3, %zmm3
1857; AVX512F-NEXT:    vpsllw $8, %ymm2, %ymm4
1858; AVX512F-NEXT:    vpsraw $15, %ymm4, %ymm4
1859; AVX512F-NEXT:    vpmovsxwd %ymm4, %zmm4
1860; AVX512F-NEXT:    vpcmpneqd %zmm3, %zmm4, %k1
1861; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm1
1862; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
1863; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm3
1864; AVX512F-NEXT:    vpsraw $8, %ymm3, %ymm0
1865; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
1866; AVX512F-NEXT:    vpsllw $8, %ymm3, %ymm1
1867; AVX512F-NEXT:    vpsraw $15, %ymm1, %ymm1
1868; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1
1869; AVX512F-NEXT:    vpcmpneqd %zmm0, %zmm1, %k2
1870; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k2} {z}
1871; AVX512F-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
1872; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
1873; AVX512F-NEXT:    vpmovdb %zmm2, 16(%rdi)
1874; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm2 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero
1875; AVX512F-NEXT:    vpmovdb %zmm2, (%rdi)
1876; AVX512F-NEXT:    retq
1877;
1878; AVX512BW-LABEL: smulo_v32i8:
1879; AVX512BW:       # %bb.0:
1880; AVX512BW-NEXT:    vpmovsxbw %ymm1, %zmm1
1881; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
1882; AVX512BW-NEXT:    vpmullw %zmm1, %zmm0, %zmm2
1883; AVX512BW-NEXT:    vpsraw $8, %zmm2, %zmm0
1884; AVX512BW-NEXT:    vpsllw $8, %zmm2, %zmm1
1885; AVX512BW-NEXT:    vpsraw $15, %zmm1, %zmm1
1886; AVX512BW-NEXT:    vpcmpneqw %zmm0, %zmm1, %k1
1887; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1888; AVX512BW-NEXT:    kshiftrd $16, %k1, %k1
1889; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
1890; AVX512BW-NEXT:    vpmovwb %zmm2, (%rdi)
1891; AVX512BW-NEXT:    retq
1892  %t = call {<32 x i8>, <32 x i1>} @llvm.smul.with.overflow.v32i8(<32 x i8> %a0, <32 x i8> %a1)
1893  %val = extractvalue {<32 x i8>, <32 x i1>} %t, 0
1894  %obit = extractvalue {<32 x i8>, <32 x i1>} %t, 1
1895  %res = sext <32 x i1> %obit to <32 x i32>
1896  store <32 x i8> %val, <32 x i8>* %p2
1897  ret <32 x i32> %res
1898}
1899
1900define <64 x i32> @smulo_v64i8(<64 x i8> %a0, <64 x i8> %a1, <64 x i8>* %p2) nounwind {
1901; SSE2-LABEL: smulo_v64i8:
1902; SSE2:       # %bb.0:
1903; SSE2-NEXT:    movq %rdi, %rax
1904; SSE2-NEXT:    pxor %xmm8, %xmm8
1905; SSE2-NEXT:    punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm7[8],xmm8[9],xmm7[9],xmm8[10],xmm7[10],xmm8[11],xmm7[11],xmm8[12],xmm7[12],xmm8[13],xmm7[13],xmm8[14],xmm7[14],xmm8[15],xmm7[15]
1906; SSE2-NEXT:    pxor %xmm9, %xmm9
1907; SSE2-NEXT:    punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm3[8],xmm9[9],xmm3[9],xmm9[10],xmm3[10],xmm9[11],xmm3[11],xmm9[12],xmm3[12],xmm9[13],xmm3[13],xmm9[14],xmm3[14],xmm9[15],xmm3[15]
1908; SSE2-NEXT:    pmulhw %xmm8, %xmm9
1909; SSE2-NEXT:    movdqa %xmm9, %xmm8
1910; SSE2-NEXT:    psrlw $8, %xmm8
1911; SSE2-NEXT:    pxor %xmm10, %xmm10
1912; SSE2-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3],xmm10[4],xmm7[4],xmm10[5],xmm7[5],xmm10[6],xmm7[6],xmm10[7],xmm7[7]
1913; SSE2-NEXT:    pxor %xmm11, %xmm11
1914; SSE2-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm3[0],xmm11[1],xmm3[1],xmm11[2],xmm3[2],xmm11[3],xmm3[3],xmm11[4],xmm3[4],xmm11[5],xmm3[5],xmm11[6],xmm3[6],xmm11[7],xmm3[7]
1915; SSE2-NEXT:    pmulhw %xmm10, %xmm11
1916; SSE2-NEXT:    movdqa %xmm11, %xmm7
1917; SSE2-NEXT:    psrlw $8, %xmm7
1918; SSE2-NEXT:    packuswb %xmm8, %xmm7
1919; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
1920; SSE2-NEXT:    pand %xmm8, %xmm9
1921; SSE2-NEXT:    pand %xmm8, %xmm11
1922; SSE2-NEXT:    packuswb %xmm9, %xmm11
1923; SSE2-NEXT:    pxor %xmm9, %xmm9
1924; SSE2-NEXT:    pcmpgtb %xmm11, %xmm9
1925; SSE2-NEXT:    pcmpeqb %xmm7, %xmm9
1926; SSE2-NEXT:    pxor %xmm7, %xmm7
1927; SSE2-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm6[8],xmm7[9],xmm6[9],xmm7[10],xmm6[10],xmm7[11],xmm6[11],xmm7[12],xmm6[12],xmm7[13],xmm6[13],xmm7[14],xmm6[14],xmm7[15],xmm6[15]
1928; SSE2-NEXT:    pxor %xmm3, %xmm3
1929; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
1930; SSE2-NEXT:    pmulhw %xmm7, %xmm3
1931; SSE2-NEXT:    pxor %xmm7, %xmm7
1932; SSE2-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]
1933; SSE2-NEXT:    pxor %xmm6, %xmm6
1934; SSE2-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7]
1935; SSE2-NEXT:    movdqa %xmm3, %xmm2
1936; SSE2-NEXT:    psrlw $8, %xmm2
1937; SSE2-NEXT:    pmulhw %xmm7, %xmm6
1938; SSE2-NEXT:    movdqa %xmm6, %xmm7
1939; SSE2-NEXT:    psrlw $8, %xmm7
1940; SSE2-NEXT:    packuswb %xmm2, %xmm7
1941; SSE2-NEXT:    pand %xmm8, %xmm3
1942; SSE2-NEXT:    pand %xmm8, %xmm6
1943; SSE2-NEXT:    packuswb %xmm3, %xmm6
1944; SSE2-NEXT:    pxor %xmm2, %xmm2
1945; SSE2-NEXT:    pcmpgtb %xmm6, %xmm2
1946; SSE2-NEXT:    pcmpeqb %xmm7, %xmm2
1947; SSE2-NEXT:    pxor %xmm3, %xmm3
1948; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm5[8],xmm3[9],xmm5[9],xmm3[10],xmm5[10],xmm3[11],xmm5[11],xmm3[12],xmm5[12],xmm3[13],xmm5[13],xmm3[14],xmm5[14],xmm3[15],xmm5[15]
1949; SSE2-NEXT:    pxor %xmm7, %xmm7
1950; SSE2-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm1[8],xmm7[9],xmm1[9],xmm7[10],xmm1[10],xmm7[11],xmm1[11],xmm7[12],xmm1[12],xmm7[13],xmm1[13],xmm7[14],xmm1[14],xmm7[15],xmm1[15]
1951; SSE2-NEXT:    pmulhw %xmm3, %xmm7
1952; SSE2-NEXT:    pxor %xmm3, %xmm3
1953; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7]
1954; SSE2-NEXT:    pxor %xmm5, %xmm5
1955; SSE2-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7]
1956; SSE2-NEXT:    movdqa %xmm7, %xmm1
1957; SSE2-NEXT:    psrlw $8, %xmm1
1958; SSE2-NEXT:    pmulhw %xmm3, %xmm5
1959; SSE2-NEXT:    movdqa %xmm5, %xmm3
1960; SSE2-NEXT:    psrlw $8, %xmm3
1961; SSE2-NEXT:    packuswb %xmm1, %xmm3
1962; SSE2-NEXT:    pand %xmm8, %xmm7
1963; SSE2-NEXT:    pand %xmm8, %xmm5
1964; SSE2-NEXT:    packuswb %xmm7, %xmm5
1965; SSE2-NEXT:    pxor %xmm1, %xmm1
1966; SSE2-NEXT:    pcmpgtb %xmm5, %xmm1
1967; SSE2-NEXT:    pcmpeqb %xmm3, %xmm1
1968; SSE2-NEXT:    pxor %xmm3, %xmm3
1969; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15]
1970; SSE2-NEXT:    pxor %xmm7, %xmm7
1971; SSE2-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15]
1972; SSE2-NEXT:    pmulhw %xmm3, %xmm7
1973; SSE2-NEXT:    pxor %xmm3, %xmm3
1974; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
1975; SSE2-NEXT:    pxor %xmm4, %xmm4
1976; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
1977; SSE2-NEXT:    movdqa %xmm7, %xmm0
1978; SSE2-NEXT:    psrlw $8, %xmm0
1979; SSE2-NEXT:    pmulhw %xmm3, %xmm4
1980; SSE2-NEXT:    movdqa %xmm4, %xmm3
1981; SSE2-NEXT:    psrlw $8, %xmm3
1982; SSE2-NEXT:    packuswb %xmm0, %xmm3
1983; SSE2-NEXT:    pand %xmm8, %xmm7
1984; SSE2-NEXT:    pand %xmm8, %xmm4
1985; SSE2-NEXT:    packuswb %xmm7, %xmm4
1986; SSE2-NEXT:    pxor %xmm0, %xmm0
1987; SSE2-NEXT:    pcmpgtb %xmm4, %xmm0
1988; SSE2-NEXT:    pcmpeqb %xmm3, %xmm0
1989; SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
1990; SSE2-NEXT:    pxor %xmm3, %xmm9
1991; SSE2-NEXT:    pxor %xmm3, %xmm2
1992; SSE2-NEXT:    pxor %xmm3, %xmm1
1993; SSE2-NEXT:    pxor %xmm3, %xmm0
1994; SSE2-NEXT:    movdqa %xmm11, 48(%rsi)
1995; SSE2-NEXT:    movdqa %xmm6, 32(%rsi)
1996; SSE2-NEXT:    movdqa %xmm5, 16(%rsi)
1997; SSE2-NEXT:    movdqa %xmm9, %xmm3
1998; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1999; SSE2-NEXT:    movdqa %xmm4, (%rsi)
2000; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm9[0],xmm4[1],xmm9[1],xmm4[2],xmm9[2],xmm4[3],xmm9[3],xmm4[4],xmm9[4],xmm4[5],xmm9[5],xmm4[6],xmm9[6],xmm4[7],xmm9[7]
2001; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2002; SSE2-NEXT:    psrad $24, %xmm4
2003; SSE2-NEXT:    movdqa %xmm4, 192(%rdi)
2004; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
2005; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2006; SSE2-NEXT:    psrad $24, %xmm4
2007; SSE2-NEXT:    movdqa %xmm4, 128(%rdi)
2008; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
2009; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2010; SSE2-NEXT:    psrad $24, %xmm4
2011; SSE2-NEXT:    movdqa %xmm4, 64(%rdi)
2012; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
2013; SSE2-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2014; SSE2-NEXT:    psrad $24, %xmm4
2015; SSE2-NEXT:    movdqa %xmm4, (%rdi)
2016; SSE2-NEXT:    movdqa %xmm3, %xmm4
2017; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2018; SSE2-NEXT:    pslld $31, %xmm3
2019; SSE2-NEXT:    psrad $31, %xmm3
2020; SSE2-NEXT:    movdqa %xmm3, 224(%rdi)
2021; SSE2-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
2022; SSE2-NEXT:    pslld $31, %xmm4
2023; SSE2-NEXT:    psrad $31, %xmm4
2024; SSE2-NEXT:    movdqa %xmm4, 240(%rdi)
2025; SSE2-NEXT:    movdqa %xmm2, %xmm3
2026; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2027; SSE2-NEXT:    punpcklbw {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2028; SSE2-NEXT:    punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
2029; SSE2-NEXT:    pslld $31, %xmm9
2030; SSE2-NEXT:    psrad $31, %xmm9
2031; SSE2-NEXT:    movdqa %xmm9, 208(%rdi)
2032; SSE2-NEXT:    movdqa %xmm3, %xmm4
2033; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2034; SSE2-NEXT:    pslld $31, %xmm3
2035; SSE2-NEXT:    psrad $31, %xmm3
2036; SSE2-NEXT:    movdqa %xmm3, 160(%rdi)
2037; SSE2-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
2038; SSE2-NEXT:    pslld $31, %xmm4
2039; SSE2-NEXT:    psrad $31, %xmm4
2040; SSE2-NEXT:    movdqa %xmm4, 176(%rdi)
2041; SSE2-NEXT:    movdqa %xmm1, %xmm3
2042; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2043; SSE2-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2044; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
2045; SSE2-NEXT:    pslld $31, %xmm2
2046; SSE2-NEXT:    psrad $31, %xmm2
2047; SSE2-NEXT:    movdqa %xmm2, 144(%rdi)
2048; SSE2-NEXT:    movdqa %xmm3, %xmm2
2049; SSE2-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2050; SSE2-NEXT:    pslld $31, %xmm3
2051; SSE2-NEXT:    psrad $31, %xmm3
2052; SSE2-NEXT:    movdqa %xmm3, 96(%rdi)
2053; SSE2-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
2054; SSE2-NEXT:    pslld $31, %xmm2
2055; SSE2-NEXT:    psrad $31, %xmm2
2056; SSE2-NEXT:    movdqa %xmm2, 112(%rdi)
2057; SSE2-NEXT:    movdqa %xmm0, %xmm2
2058; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2059; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2060; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2061; SSE2-NEXT:    pslld $31, %xmm1
2062; SSE2-NEXT:    psrad $31, %xmm1
2063; SSE2-NEXT:    movdqa %xmm1, 80(%rdi)
2064; SSE2-NEXT:    movdqa %xmm2, %xmm1
2065; SSE2-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
2066; SSE2-NEXT:    pslld $31, %xmm2
2067; SSE2-NEXT:    psrad $31, %xmm2
2068; SSE2-NEXT:    movdqa %xmm2, 32(%rdi)
2069; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2070; SSE2-NEXT:    pslld $31, %xmm1
2071; SSE2-NEXT:    psrad $31, %xmm1
2072; SSE2-NEXT:    movdqa %xmm1, 48(%rdi)
2073; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2074; SSE2-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
2075; SSE2-NEXT:    pslld $31, %xmm0
2076; SSE2-NEXT:    psrad $31, %xmm0
2077; SSE2-NEXT:    movdqa %xmm0, 16(%rdi)
2078; SSE2-NEXT:    retq
2079;
2080; SSSE3-LABEL: smulo_v64i8:
2081; SSSE3:       # %bb.0:
2082; SSSE3-NEXT:    movq %rdi, %rax
2083; SSSE3-NEXT:    pxor %xmm8, %xmm8
2084; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm7[8],xmm8[9],xmm7[9],xmm8[10],xmm7[10],xmm8[11],xmm7[11],xmm8[12],xmm7[12],xmm8[13],xmm7[13],xmm8[14],xmm7[14],xmm8[15],xmm7[15]
2085; SSSE3-NEXT:    pxor %xmm9, %xmm9
2086; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm3[8],xmm9[9],xmm3[9],xmm9[10],xmm3[10],xmm9[11],xmm3[11],xmm9[12],xmm3[12],xmm9[13],xmm3[13],xmm9[14],xmm3[14],xmm9[15],xmm3[15]
2087; SSSE3-NEXT:    pmulhw %xmm8, %xmm9
2088; SSSE3-NEXT:    movdqa %xmm9, %xmm8
2089; SSSE3-NEXT:    psrlw $8, %xmm8
2090; SSSE3-NEXT:    pxor %xmm10, %xmm10
2091; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3],xmm10[4],xmm7[4],xmm10[5],xmm7[5],xmm10[6],xmm7[6],xmm10[7],xmm7[7]
2092; SSSE3-NEXT:    pxor %xmm11, %xmm11
2093; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm3[0],xmm11[1],xmm3[1],xmm11[2],xmm3[2],xmm11[3],xmm3[3],xmm11[4],xmm3[4],xmm11[5],xmm3[5],xmm11[6],xmm3[6],xmm11[7],xmm3[7]
2094; SSSE3-NEXT:    pmulhw %xmm10, %xmm11
2095; SSSE3-NEXT:    movdqa %xmm11, %xmm7
2096; SSSE3-NEXT:    psrlw $8, %xmm7
2097; SSSE3-NEXT:    packuswb %xmm8, %xmm7
2098; SSSE3-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
2099; SSSE3-NEXT:    pand %xmm8, %xmm9
2100; SSSE3-NEXT:    pand %xmm8, %xmm11
2101; SSSE3-NEXT:    packuswb %xmm9, %xmm11
2102; SSSE3-NEXT:    pxor %xmm9, %xmm9
2103; SSSE3-NEXT:    pcmpgtb %xmm11, %xmm9
2104; SSSE3-NEXT:    pcmpeqb %xmm7, %xmm9
2105; SSSE3-NEXT:    pxor %xmm7, %xmm7
2106; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm6[8],xmm7[9],xmm6[9],xmm7[10],xmm6[10],xmm7[11],xmm6[11],xmm7[12],xmm6[12],xmm7[13],xmm6[13],xmm7[14],xmm6[14],xmm7[15],xmm6[15]
2107; SSSE3-NEXT:    pxor %xmm3, %xmm3
2108; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
2109; SSSE3-NEXT:    pmulhw %xmm7, %xmm3
2110; SSSE3-NEXT:    pxor %xmm7, %xmm7
2111; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]
2112; SSSE3-NEXT:    pxor %xmm6, %xmm6
2113; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7]
2114; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2115; SSSE3-NEXT:    psrlw $8, %xmm2
2116; SSSE3-NEXT:    pmulhw %xmm7, %xmm6
2117; SSSE3-NEXT:    movdqa %xmm6, %xmm7
2118; SSSE3-NEXT:    psrlw $8, %xmm7
2119; SSSE3-NEXT:    packuswb %xmm2, %xmm7
2120; SSSE3-NEXT:    pand %xmm8, %xmm3
2121; SSSE3-NEXT:    pand %xmm8, %xmm6
2122; SSSE3-NEXT:    packuswb %xmm3, %xmm6
2123; SSSE3-NEXT:    pxor %xmm2, %xmm2
2124; SSSE3-NEXT:    pcmpgtb %xmm6, %xmm2
2125; SSSE3-NEXT:    pcmpeqb %xmm7, %xmm2
2126; SSSE3-NEXT:    pxor %xmm3, %xmm3
2127; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm5[8],xmm3[9],xmm5[9],xmm3[10],xmm5[10],xmm3[11],xmm5[11],xmm3[12],xmm5[12],xmm3[13],xmm5[13],xmm3[14],xmm5[14],xmm3[15],xmm5[15]
2128; SSSE3-NEXT:    pxor %xmm7, %xmm7
2129; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm1[8],xmm7[9],xmm1[9],xmm7[10],xmm1[10],xmm7[11],xmm1[11],xmm7[12],xmm1[12],xmm7[13],xmm1[13],xmm7[14],xmm1[14],xmm7[15],xmm1[15]
2130; SSSE3-NEXT:    pmulhw %xmm3, %xmm7
2131; SSSE3-NEXT:    pxor %xmm3, %xmm3
2132; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7]
2133; SSSE3-NEXT:    pxor %xmm5, %xmm5
2134; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7]
2135; SSSE3-NEXT:    movdqa %xmm7, %xmm1
2136; SSSE3-NEXT:    psrlw $8, %xmm1
2137; SSSE3-NEXT:    pmulhw %xmm3, %xmm5
2138; SSSE3-NEXT:    movdqa %xmm5, %xmm3
2139; SSSE3-NEXT:    psrlw $8, %xmm3
2140; SSSE3-NEXT:    packuswb %xmm1, %xmm3
2141; SSSE3-NEXT:    pand %xmm8, %xmm7
2142; SSSE3-NEXT:    pand %xmm8, %xmm5
2143; SSSE3-NEXT:    packuswb %xmm7, %xmm5
2144; SSSE3-NEXT:    pxor %xmm1, %xmm1
2145; SSSE3-NEXT:    pcmpgtb %xmm5, %xmm1
2146; SSSE3-NEXT:    pcmpeqb %xmm3, %xmm1
2147; SSSE3-NEXT:    pxor %xmm3, %xmm3
2148; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15]
2149; SSSE3-NEXT:    pxor %xmm7, %xmm7
2150; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15]
2151; SSSE3-NEXT:    pmulhw %xmm3, %xmm7
2152; SSSE3-NEXT:    pxor %xmm3, %xmm3
2153; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
2154; SSSE3-NEXT:    pxor %xmm4, %xmm4
2155; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
2156; SSSE3-NEXT:    movdqa %xmm7, %xmm0
2157; SSSE3-NEXT:    psrlw $8, %xmm0
2158; SSSE3-NEXT:    pmulhw %xmm3, %xmm4
2159; SSSE3-NEXT:    movdqa %xmm4, %xmm3
2160; SSSE3-NEXT:    psrlw $8, %xmm3
2161; SSSE3-NEXT:    packuswb %xmm0, %xmm3
2162; SSSE3-NEXT:    pand %xmm8, %xmm7
2163; SSSE3-NEXT:    pand %xmm8, %xmm4
2164; SSSE3-NEXT:    packuswb %xmm7, %xmm4
2165; SSSE3-NEXT:    pxor %xmm0, %xmm0
2166; SSSE3-NEXT:    pcmpgtb %xmm4, %xmm0
2167; SSSE3-NEXT:    pcmpeqb %xmm3, %xmm0
2168; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm3
2169; SSSE3-NEXT:    pxor %xmm3, %xmm9
2170; SSSE3-NEXT:    pxor %xmm3, %xmm2
2171; SSSE3-NEXT:    pxor %xmm3, %xmm1
2172; SSSE3-NEXT:    pxor %xmm3, %xmm0
2173; SSSE3-NEXT:    movdqa %xmm11, 48(%rsi)
2174; SSSE3-NEXT:    movdqa %xmm6, 32(%rsi)
2175; SSSE3-NEXT:    movdqa %xmm5, 16(%rsi)
2176; SSSE3-NEXT:    movdqa %xmm9, %xmm3
2177; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2178; SSSE3-NEXT:    movdqa %xmm4, (%rsi)
2179; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm9[0],xmm4[1],xmm9[1],xmm4[2],xmm9[2],xmm4[3],xmm9[3],xmm4[4],xmm9[4],xmm4[5],xmm9[5],xmm4[6],xmm9[6],xmm4[7],xmm9[7]
2180; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2181; SSSE3-NEXT:    psrad $24, %xmm4
2182; SSSE3-NEXT:    movdqa %xmm4, 192(%rdi)
2183; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
2184; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2185; SSSE3-NEXT:    psrad $24, %xmm4
2186; SSSE3-NEXT:    movdqa %xmm4, 128(%rdi)
2187; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
2188; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2189; SSSE3-NEXT:    psrad $24, %xmm4
2190; SSSE3-NEXT:    movdqa %xmm4, 64(%rdi)
2191; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
2192; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0,0,1,1,2,2,3,3]
2193; SSSE3-NEXT:    psrad $24, %xmm4
2194; SSSE3-NEXT:    movdqa %xmm4, (%rdi)
2195; SSSE3-NEXT:    movdqa %xmm3, %xmm4
2196; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2197; SSSE3-NEXT:    pslld $31, %xmm3
2198; SSSE3-NEXT:    psrad $31, %xmm3
2199; SSSE3-NEXT:    movdqa %xmm3, 224(%rdi)
2200; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
2201; SSSE3-NEXT:    pslld $31, %xmm4
2202; SSSE3-NEXT:    psrad $31, %xmm4
2203; SSSE3-NEXT:    movdqa %xmm4, 240(%rdi)
2204; SSSE3-NEXT:    movdqa %xmm2, %xmm3
2205; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2206; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm9 = xmm9[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2207; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm9 = xmm9[4,4,5,5,6,6,7,7]
2208; SSSE3-NEXT:    pslld $31, %xmm9
2209; SSSE3-NEXT:    psrad $31, %xmm9
2210; SSSE3-NEXT:    movdqa %xmm9, 208(%rdi)
2211; SSSE3-NEXT:    movdqa %xmm3, %xmm4
2212; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2213; SSSE3-NEXT:    pslld $31, %xmm3
2214; SSSE3-NEXT:    psrad $31, %xmm3
2215; SSSE3-NEXT:    movdqa %xmm3, 160(%rdi)
2216; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm4 = xmm4[4,4,5,5,6,6,7,7]
2217; SSSE3-NEXT:    pslld $31, %xmm4
2218; SSSE3-NEXT:    psrad $31, %xmm4
2219; SSSE3-NEXT:    movdqa %xmm4, 176(%rdi)
2220; SSSE3-NEXT:    movdqa %xmm1, %xmm3
2221; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2222; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2223; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
2224; SSSE3-NEXT:    pslld $31, %xmm2
2225; SSSE3-NEXT:    psrad $31, %xmm2
2226; SSSE3-NEXT:    movdqa %xmm2, 144(%rdi)
2227; SSSE3-NEXT:    movdqa %xmm3, %xmm2
2228; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0,0,1,1,2,2,3,3]
2229; SSSE3-NEXT:    pslld $31, %xmm3
2230; SSSE3-NEXT:    psrad $31, %xmm3
2231; SSSE3-NEXT:    movdqa %xmm3, 96(%rdi)
2232; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm2 = xmm2[4,4,5,5,6,6,7,7]
2233; SSSE3-NEXT:    pslld $31, %xmm2
2234; SSSE3-NEXT:    psrad $31, %xmm2
2235; SSSE3-NEXT:    movdqa %xmm2, 112(%rdi)
2236; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2237; SSSE3-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
2238; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2239; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2240; SSSE3-NEXT:    pslld $31, %xmm1
2241; SSSE3-NEXT:    psrad $31, %xmm1
2242; SSSE3-NEXT:    movdqa %xmm1, 80(%rdi)
2243; SSSE3-NEXT:    movdqa %xmm2, %xmm1
2244; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0,0,1,1,2,2,3,3]
2245; SSSE3-NEXT:    pslld $31, %xmm2
2246; SSSE3-NEXT:    psrad $31, %xmm2
2247; SSSE3-NEXT:    movdqa %xmm2, 32(%rdi)
2248; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2249; SSSE3-NEXT:    pslld $31, %xmm1
2250; SSSE3-NEXT:    psrad $31, %xmm1
2251; SSSE3-NEXT:    movdqa %xmm1, 48(%rdi)
2252; SSSE3-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
2253; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
2254; SSSE3-NEXT:    pslld $31, %xmm0
2255; SSSE3-NEXT:    psrad $31, %xmm0
2256; SSSE3-NEXT:    movdqa %xmm0, 16(%rdi)
2257; SSSE3-NEXT:    retq
2258;
2259; SSE41-LABEL: smulo_v64i8:
2260; SSE41:       # %bb.0:
2261; SSE41-NEXT:    movq %rdi, %rax
2262; SSE41-NEXT:    pxor %xmm8, %xmm8
2263; SSE41-NEXT:    punpckhbw {{.*#+}} xmm8 = xmm8[8],xmm7[8],xmm8[9],xmm7[9],xmm8[10],xmm7[10],xmm8[11],xmm7[11],xmm8[12],xmm7[12],xmm8[13],xmm7[13],xmm8[14],xmm7[14],xmm8[15],xmm7[15]
2264; SSE41-NEXT:    pxor %xmm9, %xmm9
2265; SSE41-NEXT:    punpckhbw {{.*#+}} xmm9 = xmm9[8],xmm3[8],xmm9[9],xmm3[9],xmm9[10],xmm3[10],xmm9[11],xmm3[11],xmm9[12],xmm3[12],xmm9[13],xmm3[13],xmm9[14],xmm3[14],xmm9[15],xmm3[15]
2266; SSE41-NEXT:    pmulhw %xmm8, %xmm9
2267; SSE41-NEXT:    movdqa %xmm9, %xmm8
2268; SSE41-NEXT:    psrlw $8, %xmm8
2269; SSE41-NEXT:    pxor %xmm10, %xmm10
2270; SSE41-NEXT:    punpcklbw {{.*#+}} xmm10 = xmm10[0],xmm7[0],xmm10[1],xmm7[1],xmm10[2],xmm7[2],xmm10[3],xmm7[3],xmm10[4],xmm7[4],xmm10[5],xmm7[5],xmm10[6],xmm7[6],xmm10[7],xmm7[7]
2271; SSE41-NEXT:    pxor %xmm11, %xmm11
2272; SSE41-NEXT:    punpcklbw {{.*#+}} xmm11 = xmm11[0],xmm3[0],xmm11[1],xmm3[1],xmm11[2],xmm3[2],xmm11[3],xmm3[3],xmm11[4],xmm3[4],xmm11[5],xmm3[5],xmm11[6],xmm3[6],xmm11[7],xmm3[7]
2273; SSE41-NEXT:    pmulhw %xmm10, %xmm11
2274; SSE41-NEXT:    movdqa %xmm11, %xmm7
2275; SSE41-NEXT:    psrlw $8, %xmm7
2276; SSE41-NEXT:    packuswb %xmm8, %xmm7
2277; SSE41-NEXT:    movdqa {{.*#+}} xmm8 = [255,255,255,255,255,255,255,255]
2278; SSE41-NEXT:    pand %xmm8, %xmm9
2279; SSE41-NEXT:    pand %xmm8, %xmm11
2280; SSE41-NEXT:    packuswb %xmm9, %xmm11
2281; SSE41-NEXT:    pxor %xmm9, %xmm9
2282; SSE41-NEXT:    pcmpgtb %xmm11, %xmm9
2283; SSE41-NEXT:    pcmpeqb %xmm7, %xmm9
2284; SSE41-NEXT:    pxor %xmm7, %xmm7
2285; SSE41-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm6[8],xmm7[9],xmm6[9],xmm7[10],xmm6[10],xmm7[11],xmm6[11],xmm7[12],xmm6[12],xmm7[13],xmm6[13],xmm7[14],xmm6[14],xmm7[15],xmm6[15]
2286; SSE41-NEXT:    pxor %xmm3, %xmm3
2287; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm2[8],xmm3[9],xmm2[9],xmm3[10],xmm2[10],xmm3[11],xmm2[11],xmm3[12],xmm2[12],xmm3[13],xmm2[13],xmm3[14],xmm2[14],xmm3[15],xmm2[15]
2288; SSE41-NEXT:    pmulhw %xmm7, %xmm3
2289; SSE41-NEXT:    pxor %xmm7, %xmm7
2290; SSE41-NEXT:    punpcklbw {{.*#+}} xmm7 = xmm7[0],xmm6[0],xmm7[1],xmm6[1],xmm7[2],xmm6[2],xmm7[3],xmm6[3],xmm7[4],xmm6[4],xmm7[5],xmm6[5],xmm7[6],xmm6[6],xmm7[7],xmm6[7]
2291; SSE41-NEXT:    pxor %xmm6, %xmm6
2292; SSE41-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1],xmm6[2],xmm2[2],xmm6[3],xmm2[3],xmm6[4],xmm2[4],xmm6[5],xmm2[5],xmm6[6],xmm2[6],xmm6[7],xmm2[7]
2293; SSE41-NEXT:    movdqa %xmm3, %xmm2
2294; SSE41-NEXT:    psrlw $8, %xmm2
2295; SSE41-NEXT:    pmulhw %xmm7, %xmm6
2296; SSE41-NEXT:    movdqa %xmm6, %xmm7
2297; SSE41-NEXT:    psrlw $8, %xmm7
2298; SSE41-NEXT:    packuswb %xmm2, %xmm7
2299; SSE41-NEXT:    pand %xmm8, %xmm3
2300; SSE41-NEXT:    pand %xmm8, %xmm6
2301; SSE41-NEXT:    packuswb %xmm3, %xmm6
2302; SSE41-NEXT:    pxor %xmm2, %xmm2
2303; SSE41-NEXT:    pcmpgtb %xmm6, %xmm2
2304; SSE41-NEXT:    pcmpeqb %xmm7, %xmm2
2305; SSE41-NEXT:    pxor %xmm3, %xmm3
2306; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm5[8],xmm3[9],xmm5[9],xmm3[10],xmm5[10],xmm3[11],xmm5[11],xmm3[12],xmm5[12],xmm3[13],xmm5[13],xmm3[14],xmm5[14],xmm3[15],xmm5[15]
2307; SSE41-NEXT:    pxor %xmm7, %xmm7
2308; SSE41-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm1[8],xmm7[9],xmm1[9],xmm7[10],xmm1[10],xmm7[11],xmm1[11],xmm7[12],xmm1[12],xmm7[13],xmm1[13],xmm7[14],xmm1[14],xmm7[15],xmm1[15]
2309; SSE41-NEXT:    pmulhw %xmm3, %xmm7
2310; SSE41-NEXT:    pxor %xmm3, %xmm3
2311; SSE41-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7]
2312; SSE41-NEXT:    pxor %xmm5, %xmm5
2313; SSE41-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7]
2314; SSE41-NEXT:    movdqa %xmm7, %xmm1
2315; SSE41-NEXT:    psrlw $8, %xmm1
2316; SSE41-NEXT:    pmulhw %xmm3, %xmm5
2317; SSE41-NEXT:    movdqa %xmm5, %xmm3
2318; SSE41-NEXT:    psrlw $8, %xmm3
2319; SSE41-NEXT:    packuswb %xmm1, %xmm3
2320; SSE41-NEXT:    pand %xmm8, %xmm7
2321; SSE41-NEXT:    pand %xmm8, %xmm5
2322; SSE41-NEXT:    packuswb %xmm7, %xmm5
2323; SSE41-NEXT:    pxor %xmm1, %xmm1
2324; SSE41-NEXT:    pcmpgtb %xmm5, %xmm1
2325; SSE41-NEXT:    pcmpeqb %xmm3, %xmm1
2326; SSE41-NEXT:    pxor %xmm3, %xmm3
2327; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm4[8],xmm3[9],xmm4[9],xmm3[10],xmm4[10],xmm3[11],xmm4[11],xmm3[12],xmm4[12],xmm3[13],xmm4[13],xmm3[14],xmm4[14],xmm3[15],xmm4[15]
2328; SSE41-NEXT:    pxor %xmm7, %xmm7
2329; SSE41-NEXT:    punpckhbw {{.*#+}} xmm7 = xmm7[8],xmm0[8],xmm7[9],xmm0[9],xmm7[10],xmm0[10],xmm7[11],xmm0[11],xmm7[12],xmm0[12],xmm7[13],xmm0[13],xmm7[14],xmm0[14],xmm7[15],xmm0[15]
2330; SSE41-NEXT:    pmulhw %xmm3, %xmm7
2331; SSE41-NEXT:    pxor %xmm3, %xmm3
2332; SSE41-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
2333; SSE41-NEXT:    pxor %xmm4, %xmm4
2334; SSE41-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
2335; SSE41-NEXT:    movdqa %xmm7, %xmm0
2336; SSE41-NEXT:    psrlw $8, %xmm0
2337; SSE41-NEXT:    pmulhw %xmm3, %xmm4
2338; SSE41-NEXT:    movdqa %xmm4, %xmm3
2339; SSE41-NEXT:    psrlw $8, %xmm3
2340; SSE41-NEXT:    packuswb %xmm0, %xmm3
2341; SSE41-NEXT:    pand %xmm8, %xmm7
2342; SSE41-NEXT:    pand %xmm8, %xmm4
2343; SSE41-NEXT:    packuswb %xmm7, %xmm4
2344; SSE41-NEXT:    pxor %xmm0, %xmm0
2345; SSE41-NEXT:    pcmpgtb %xmm4, %xmm0
2346; SSE41-NEXT:    pcmpeqb %xmm3, %xmm0
2347; SSE41-NEXT:    pcmpeqd %xmm3, %xmm3
2348; SSE41-NEXT:    pxor %xmm3, %xmm9
2349; SSE41-NEXT:    pxor %xmm3, %xmm2
2350; SSE41-NEXT:    pxor %xmm3, %xmm1
2351; SSE41-NEXT:    pxor %xmm3, %xmm0
2352; SSE41-NEXT:    movdqa %xmm11, 48(%rsi)
2353; SSE41-NEXT:    movdqa %xmm6, 32(%rsi)
2354; SSE41-NEXT:    movdqa %xmm5, 16(%rsi)
2355; SSE41-NEXT:    movdqa %xmm4, (%rsi)
2356; SSE41-NEXT:    pmovsxbd %xmm9, %xmm3
2357; SSE41-NEXT:    movdqa %xmm3, 192(%rdi)
2358; SSE41-NEXT:    pmovsxbd %xmm2, %xmm3
2359; SSE41-NEXT:    movdqa %xmm3, 128(%rdi)
2360; SSE41-NEXT:    pmovsxbd %xmm1, %xmm3
2361; SSE41-NEXT:    movdqa %xmm3, 64(%rdi)
2362; SSE41-NEXT:    pmovsxbd %xmm0, %xmm3
2363; SSE41-NEXT:    movdqa %xmm3, (%rdi)
2364; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[2,3,2,3]
2365; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2366; SSE41-NEXT:    pslld $31, %xmm3
2367; SSE41-NEXT:    psrad $31, %xmm3
2368; SSE41-NEXT:    movdqa %xmm3, 224(%rdi)
2369; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[3,3,3,3]
2370; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2371; SSE41-NEXT:    pslld $31, %xmm3
2372; SSE41-NEXT:    psrad $31, %xmm3
2373; SSE41-NEXT:    movdqa %xmm3, 240(%rdi)
2374; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm9[1,1,1,1]
2375; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2376; SSE41-NEXT:    pslld $31, %xmm3
2377; SSE41-NEXT:    psrad $31, %xmm3
2378; SSE41-NEXT:    movdqa %xmm3, 208(%rdi)
2379; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
2380; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2381; SSE41-NEXT:    pslld $31, %xmm3
2382; SSE41-NEXT:    psrad $31, %xmm3
2383; SSE41-NEXT:    movdqa %xmm3, 160(%rdi)
2384; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
2385; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm3 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero
2386; SSE41-NEXT:    pslld $31, %xmm3
2387; SSE41-NEXT:    psrad $31, %xmm3
2388; SSE41-NEXT:    movdqa %xmm3, 176(%rdi)
2389; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,1,1]
2390; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2391; SSE41-NEXT:    pslld $31, %xmm2
2392; SSE41-NEXT:    psrad $31, %xmm2
2393; SSE41-NEXT:    movdqa %xmm2, 144(%rdi)
2394; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
2395; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2396; SSE41-NEXT:    pslld $31, %xmm2
2397; SSE41-NEXT:    psrad $31, %xmm2
2398; SSE41-NEXT:    movdqa %xmm2, 96(%rdi)
2399; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]
2400; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm2 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero
2401; SSE41-NEXT:    pslld $31, %xmm2
2402; SSE41-NEXT:    psrad $31, %xmm2
2403; SSE41-NEXT:    movdqa %xmm2, 112(%rdi)
2404; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
2405; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2406; SSE41-NEXT:    pslld $31, %xmm1
2407; SSE41-NEXT:    psrad $31, %xmm1
2408; SSE41-NEXT:    movdqa %xmm1, 80(%rdi)
2409; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2410; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2411; SSE41-NEXT:    pslld $31, %xmm1
2412; SSE41-NEXT:    psrad $31, %xmm1
2413; SSE41-NEXT:    movdqa %xmm1, 32(%rdi)
2414; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
2415; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm1 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero
2416; SSE41-NEXT:    pslld $31, %xmm1
2417; SSE41-NEXT:    psrad $31, %xmm1
2418; SSE41-NEXT:    movdqa %xmm1, 48(%rdi)
2419; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2420; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
2421; SSE41-NEXT:    pslld $31, %xmm0
2422; SSE41-NEXT:    psrad $31, %xmm0
2423; SSE41-NEXT:    movdqa %xmm0, 16(%rdi)
2424; SSE41-NEXT:    retq
2425;
2426; AVX1-LABEL: smulo_v64i8:
2427; AVX1:       # %bb.0:
2428; AVX1-NEXT:    movq %rdi, %rax
2429; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
2430; AVX1-NEXT:    vpxor %xmm5, %xmm5, %xmm5
2431; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm8 = xmm5[8],xmm4[8],xmm5[9],xmm4[9],xmm5[10],xmm4[10],xmm5[11],xmm4[11],xmm5[12],xmm4[12],xmm5[13],xmm4[13],xmm5[14],xmm4[14],xmm5[15],xmm4[15]
2432; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
2433; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm5[8],xmm7[8],xmm5[9],xmm7[9],xmm5[10],xmm7[10],xmm5[11],xmm7[11],xmm5[12],xmm7[12],xmm5[13],xmm7[13],xmm5[14],xmm7[14],xmm5[15],xmm7[15]
2434; AVX1-NEXT:    vpmulhw %xmm6, %xmm8, %xmm6
2435; AVX1-NEXT:    vpsrlw $8, %xmm6, %xmm8
2436; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm4 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]
2437; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm7 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3],xmm5[4],xmm7[4],xmm5[5],xmm7[5],xmm5[6],xmm7[6],xmm5[7],xmm7[7]
2438; AVX1-NEXT:    vpmulhw %xmm4, %xmm7, %xmm7
2439; AVX1-NEXT:    vpsrlw $8, %xmm7, %xmm4
2440; AVX1-NEXT:    vpackuswb %xmm8, %xmm4, %xmm4
2441; AVX1-NEXT:    vmovdqa {{.*#+}} xmm10 = [255,255,255,255,255,255,255,255]
2442; AVX1-NEXT:    vpand %xmm6, %xmm10, %xmm6
2443; AVX1-NEXT:    vpand %xmm7, %xmm10, %xmm7
2444; AVX1-NEXT:    vpackuswb %xmm6, %xmm7, %xmm9
2445; AVX1-NEXT:    vpcmpgtb %xmm9, %xmm5, %xmm6
2446; AVX1-NEXT:    vpcmpeqb %xmm4, %xmm6, %xmm8
2447; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15]
2448; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm5[8],xmm1[8],xmm5[9],xmm1[9],xmm5[10],xmm1[10],xmm5[11],xmm1[11],xmm5[12],xmm1[12],xmm5[13],xmm1[13],xmm5[14],xmm1[14],xmm5[15],xmm1[15]
2449; AVX1-NEXT:    vpmulhw %xmm4, %xmm6, %xmm4
2450; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm6
2451; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3],xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]
2452; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm1 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7]
2453; AVX1-NEXT:    vpmulhw %xmm3, %xmm1, %xmm1
2454; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm3
2455; AVX1-NEXT:    vpackuswb %xmm6, %xmm3, %xmm3
2456; AVX1-NEXT:    vpand %xmm4, %xmm10, %xmm4
2457; AVX1-NEXT:    vpand %xmm1, %xmm10, %xmm1
2458; AVX1-NEXT:    vpackuswb %xmm4, %xmm1, %xmm11
2459; AVX1-NEXT:    vpcmpgtb %xmm11, %xmm5, %xmm4
2460; AVX1-NEXT:    vpcmpeqb %xmm3, %xmm4, %xmm12
2461; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
2462; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm3[8],xmm5[9],xmm3[9],xmm5[10],xmm3[10],xmm5[11],xmm3[11],xmm5[12],xmm3[12],xmm5[13],xmm3[13],xmm5[14],xmm3[14],xmm5[15],xmm3[15]
2463; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
2464; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm5[8],xmm6[8],xmm5[9],xmm6[9],xmm5[10],xmm6[10],xmm5[11],xmm6[11],xmm5[12],xmm6[12],xmm5[13],xmm6[13],xmm5[14],xmm6[14],xmm5[15],xmm6[15]
2465; AVX1-NEXT:    vpmulhw %xmm4, %xmm1, %xmm1
2466; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm4
2467; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3],xmm5[4],xmm3[4],xmm5[5],xmm3[5],xmm5[6],xmm3[6],xmm5[7],xmm3[7]
2468; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm6 = xmm5[0],xmm6[0],xmm5[1],xmm6[1],xmm5[2],xmm6[2],xmm5[3],xmm6[3],xmm5[4],xmm6[4],xmm5[5],xmm6[5],xmm5[6],xmm6[6],xmm5[7],xmm6[7]
2469; AVX1-NEXT:    vpmulhw %xmm3, %xmm6, %xmm3
2470; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm6
2471; AVX1-NEXT:    vpackuswb %xmm4, %xmm6, %xmm4
2472; AVX1-NEXT:    vpand %xmm1, %xmm10, %xmm1
2473; AVX1-NEXT:    vpand %xmm3, %xmm10, %xmm3
2474; AVX1-NEXT:    vpackuswb %xmm1, %xmm3, %xmm3
2475; AVX1-NEXT:    vpcmpgtb %xmm3, %xmm5, %xmm1
2476; AVX1-NEXT:    vpcmpeqb %xmm4, %xmm1, %xmm1
2477; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm5[8],xmm2[8],xmm5[9],xmm2[9],xmm5[10],xmm2[10],xmm5[11],xmm2[11],xmm5[12],xmm2[12],xmm5[13],xmm2[13],xmm5[14],xmm2[14],xmm5[15],xmm2[15]
2478; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm6 = xmm5[8],xmm0[8],xmm5[9],xmm0[9],xmm5[10],xmm0[10],xmm5[11],xmm0[11],xmm5[12],xmm0[12],xmm5[13],xmm0[13],xmm5[14],xmm0[14],xmm5[15],xmm0[15]
2479; AVX1-NEXT:    vpmulhw %xmm4, %xmm6, %xmm4
2480; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm6
2481; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm2 = xmm5[0],xmm2[0],xmm5[1],xmm2[1],xmm5[2],xmm2[2],xmm5[3],xmm2[3],xmm5[4],xmm2[4],xmm5[5],xmm2[5],xmm5[6],xmm2[6],xmm5[7],xmm2[7]
2482; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm0 = xmm5[0],xmm0[0],xmm5[1],xmm0[1],xmm5[2],xmm0[2],xmm5[3],xmm0[3],xmm5[4],xmm0[4],xmm5[5],xmm0[5],xmm5[6],xmm0[6],xmm5[7],xmm0[7]
2483; AVX1-NEXT:    vpmulhw %xmm2, %xmm0, %xmm0
2484; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
2485; AVX1-NEXT:    vpackuswb %xmm6, %xmm2, %xmm2
2486; AVX1-NEXT:    vpand %xmm4, %xmm10, %xmm4
2487; AVX1-NEXT:    vpand %xmm0, %xmm10, %xmm0
2488; AVX1-NEXT:    vpackuswb %xmm4, %xmm0, %xmm4
2489; AVX1-NEXT:    vpcmpgtb %xmm4, %xmm5, %xmm0
2490; AVX1-NEXT:    vpcmpeqb %xmm2, %xmm0, %xmm0
2491; AVX1-NEXT:    vpcmpeqd %xmm7, %xmm7, %xmm7
2492; AVX1-NEXT:    vpxor %xmm7, %xmm8, %xmm6
2493; AVX1-NEXT:    vpxor %xmm7, %xmm12, %xmm5
2494; AVX1-NEXT:    vpxor %xmm7, %xmm1, %xmm2
2495; AVX1-NEXT:    vpxor %xmm7, %xmm0, %xmm0
2496; AVX1-NEXT:    vmovdqa %xmm9, 48(%rsi)
2497; AVX1-NEXT:    vmovdqa %xmm11, 32(%rsi)
2498; AVX1-NEXT:    vmovdqa %xmm3, 16(%rsi)
2499; AVX1-NEXT:    vmovdqa %xmm4, (%rsi)
2500; AVX1-NEXT:    vpmovsxbd %xmm6, %xmm1
2501; AVX1-NEXT:    vmovdqa %xmm1, 192(%rdi)
2502; AVX1-NEXT:    vpmovsxbd %xmm5, %xmm1
2503; AVX1-NEXT:    vmovdqa %xmm1, 128(%rdi)
2504; AVX1-NEXT:    vpmovsxbd %xmm2, %xmm1
2505; AVX1-NEXT:    vmovdqa %xmm1, 64(%rdi)
2506; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm1
2507; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
2508; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm6[2,3,2,3]
2509; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2510; AVX1-NEXT:    vmovdqa %xmm1, 224(%rdi)
2511; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm6[3,3,3,3]
2512; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2513; AVX1-NEXT:    vmovdqa %xmm1, 240(%rdi)
2514; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm6[1,1,1,1]
2515; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2516; AVX1-NEXT:    vmovdqa %xmm1, 208(%rdi)
2517; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
2518; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2519; AVX1-NEXT:    vmovdqa %xmm1, 160(%rdi)
2520; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm5[3,3,3,3]
2521; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2522; AVX1-NEXT:    vmovdqa %xmm1, 176(%rdi)
2523; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm5[1,1,1,1]
2524; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2525; AVX1-NEXT:    vmovdqa %xmm1, 144(%rdi)
2526; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
2527; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2528; AVX1-NEXT:    vmovdqa %xmm1, 96(%rdi)
2529; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]
2530; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2531; AVX1-NEXT:    vmovdqa %xmm1, 112(%rdi)
2532; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
2533; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2534; AVX1-NEXT:    vmovdqa %xmm1, 80(%rdi)
2535; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
2536; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2537; AVX1-NEXT:    vmovdqa %xmm1, 32(%rdi)
2538; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
2539; AVX1-NEXT:    vpmovsxbd %xmm1, %xmm1
2540; AVX1-NEXT:    vmovdqa %xmm1, 48(%rdi)
2541; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
2542; AVX1-NEXT:    vpmovsxbd %xmm0, %xmm0
2543; AVX1-NEXT:    vmovdqa %xmm0, 16(%rdi)
2544; AVX1-NEXT:    vzeroupper
2545; AVX1-NEXT:    retq
2546;
2547; AVX2-LABEL: smulo_v64i8:
2548; AVX2:       # %bb.0:
2549; AVX2-NEXT:    movq %rdi, %rax
2550; AVX2-NEXT:    vpxor %xmm4, %xmm4, %xmm4
2551; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm5 = ymm4[8],ymm3[8],ymm4[9],ymm3[9],ymm4[10],ymm3[10],ymm4[11],ymm3[11],ymm4[12],ymm3[12],ymm4[13],ymm3[13],ymm4[14],ymm3[14],ymm4[15],ymm3[15],ymm4[24],ymm3[24],ymm4[25],ymm3[25],ymm4[26],ymm3[26],ymm4[27],ymm3[27],ymm4[28],ymm3[28],ymm4[29],ymm3[29],ymm4[30],ymm3[30],ymm4[31],ymm3[31]
2552; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm6 = ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15],ymm4[24],ymm1[24],ymm4[25],ymm1[25],ymm4[26],ymm1[26],ymm4[27],ymm1[27],ymm4[28],ymm1[28],ymm4[29],ymm1[29],ymm4[30],ymm1[30],ymm4[31],ymm1[31]
2553; AVX2-NEXT:    vpmulhw %ymm5, %ymm6, %ymm5
2554; AVX2-NEXT:    vpsrlw $8, %ymm5, %ymm6
2555; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm4[0],ymm3[0],ymm4[1],ymm3[1],ymm4[2],ymm3[2],ymm4[3],ymm3[3],ymm4[4],ymm3[4],ymm4[5],ymm3[5],ymm4[6],ymm3[6],ymm4[7],ymm3[7],ymm4[16],ymm3[16],ymm4[17],ymm3[17],ymm4[18],ymm3[18],ymm4[19],ymm3[19],ymm4[20],ymm3[20],ymm4[21],ymm3[21],ymm4[22],ymm3[22],ymm4[23],ymm3[23]
2556; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm1 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[16],ymm1[16],ymm4[17],ymm1[17],ymm4[18],ymm1[18],ymm4[19],ymm1[19],ymm4[20],ymm1[20],ymm4[21],ymm1[21],ymm4[22],ymm1[22],ymm4[23],ymm1[23]
2557; AVX2-NEXT:    vpmulhw %ymm3, %ymm1, %ymm1
2558; AVX2-NEXT:    vpsrlw $8, %ymm1, %ymm3
2559; AVX2-NEXT:    vpackuswb %ymm6, %ymm3, %ymm3
2560; AVX2-NEXT:    vmovdqa {{.*#+}} ymm6 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2561; AVX2-NEXT:    vpand %ymm6, %ymm5, %ymm5
2562; AVX2-NEXT:    vpand %ymm6, %ymm1, %ymm1
2563; AVX2-NEXT:    vpackuswb %ymm5, %ymm1, %ymm1
2564; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm4, %ymm5
2565; AVX2-NEXT:    vpcmpeqb %ymm3, %ymm5, %ymm3
2566; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm5, %ymm5
2567; AVX2-NEXT:    vpxor %ymm5, %ymm3, %ymm3
2568; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm7 = ymm4[8],ymm2[8],ymm4[9],ymm2[9],ymm4[10],ymm2[10],ymm4[11],ymm2[11],ymm4[12],ymm2[12],ymm4[13],ymm2[13],ymm4[14],ymm2[14],ymm4[15],ymm2[15],ymm4[24],ymm2[24],ymm4[25],ymm2[25],ymm4[26],ymm2[26],ymm4[27],ymm2[27],ymm4[28],ymm2[28],ymm4[29],ymm2[29],ymm4[30],ymm2[30],ymm4[31],ymm2[31]
2569; AVX2-NEXT:    vpunpckhbw {{.*#+}} ymm8 = ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15],ymm4[24],ymm0[24],ymm4[25],ymm0[25],ymm4[26],ymm0[26],ymm4[27],ymm0[27],ymm4[28],ymm0[28],ymm4[29],ymm0[29],ymm4[30],ymm0[30],ymm4[31],ymm0[31]
2570; AVX2-NEXT:    vpmulhw %ymm7, %ymm8, %ymm7
2571; AVX2-NEXT:    vpsrlw $8, %ymm7, %ymm8
2572; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm4[0],ymm2[0],ymm4[1],ymm2[1],ymm4[2],ymm2[2],ymm4[3],ymm2[3],ymm4[4],ymm2[4],ymm4[5],ymm2[5],ymm4[6],ymm2[6],ymm4[7],ymm2[7],ymm4[16],ymm2[16],ymm4[17],ymm2[17],ymm4[18],ymm2[18],ymm4[19],ymm2[19],ymm4[20],ymm2[20],ymm4[21],ymm2[21],ymm4[22],ymm2[22],ymm4[23],ymm2[23]
2573; AVX2-NEXT:    vpunpcklbw {{.*#+}} ymm0 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[16],ymm0[16],ymm4[17],ymm0[17],ymm4[18],ymm0[18],ymm4[19],ymm0[19],ymm4[20],ymm0[20],ymm4[21],ymm0[21],ymm4[22],ymm0[22],ymm4[23],ymm0[23]
2574; AVX2-NEXT:    vpmulhw %ymm2, %ymm0, %ymm0
2575; AVX2-NEXT:    vpsrlw $8, %ymm0, %ymm2
2576; AVX2-NEXT:    vpackuswb %ymm8, %ymm2, %ymm2
2577; AVX2-NEXT:    vpand %ymm6, %ymm7, %ymm7
2578; AVX2-NEXT:    vpand %ymm6, %ymm0, %ymm0
2579; AVX2-NEXT:    vpackuswb %ymm7, %ymm0, %ymm0
2580; AVX2-NEXT:    vpcmpgtb %ymm0, %ymm4, %ymm4
2581; AVX2-NEXT:    vpcmpeqb %ymm2, %ymm4, %ymm2
2582; AVX2-NEXT:    vpxor %ymm5, %ymm2, %ymm2
2583; AVX2-NEXT:    vpshufd {{.*#+}} xmm4 = xmm2[2,3,2,3]
2584; AVX2-NEXT:    vpmovsxbd %xmm4, %ymm8
2585; AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm5
2586; AVX2-NEXT:    vpshufd {{.*#+}} xmm6 = xmm5[2,3,2,3]
2587; AVX2-NEXT:    vpmovsxbd %xmm6, %ymm9
2588; AVX2-NEXT:    vpshufd {{.*#+}} xmm7 = xmm3[2,3,2,3]
2589; AVX2-NEXT:    vpmovsxbd %xmm7, %ymm7
2590; AVX2-NEXT:    vextracti128 $1, %ymm3, %xmm4
2591; AVX2-NEXT:    vpshufd {{.*#+}} xmm6 = xmm4[2,3,2,3]
2592; AVX2-NEXT:    vpmovsxbd %xmm6, %ymm6
2593; AVX2-NEXT:    vpmovsxbd %xmm2, %ymm2
2594; AVX2-NEXT:    vpmovsxbd %xmm5, %ymm5
2595; AVX2-NEXT:    vpmovsxbd %xmm3, %ymm3
2596; AVX2-NEXT:    vpmovsxbd %xmm4, %ymm4
2597; AVX2-NEXT:    vmovdqa %ymm1, 32(%rsi)
2598; AVX2-NEXT:    vmovdqa %ymm0, (%rsi)
2599; AVX2-NEXT:    vmovdqa %ymm4, 192(%rdi)
2600; AVX2-NEXT:    vmovdqa %ymm3, 128(%rdi)
2601; AVX2-NEXT:    vmovdqa %ymm5, 64(%rdi)
2602; AVX2-NEXT:    vmovdqa %ymm2, (%rdi)
2603; AVX2-NEXT:    vmovdqa %ymm6, 224(%rdi)
2604; AVX2-NEXT:    vmovdqa %ymm7, 160(%rdi)
2605; AVX2-NEXT:    vmovdqa %ymm9, 96(%rdi)
2606; AVX2-NEXT:    vmovdqa %ymm8, 32(%rdi)
2607; AVX2-NEXT:    vzeroupper
2608; AVX2-NEXT:    retq
2609;
2610; AVX512F-LABEL: smulo_v64i8:
2611; AVX512F:       # %bb.0:
2612; AVX512F-NEXT:    vextracti64x4 $1, %zmm1, %ymm2
2613; AVX512F-NEXT:    vextracti128 $1, %ymm2, %xmm3
2614; AVX512F-NEXT:    vpmovsxbw %xmm3, %ymm3
2615; AVX512F-NEXT:    vextracti64x4 $1, %zmm0, %ymm5
2616; AVX512F-NEXT:    vextracti128 $1, %ymm5, %xmm4
2617; AVX512F-NEXT:    vpmovsxbw %xmm4, %ymm4
2618; AVX512F-NEXT:    vpmullw %ymm3, %ymm4, %ymm4
2619; AVX512F-NEXT:    vpsraw $8, %ymm4, %ymm3
2620; AVX512F-NEXT:    vpmovsxwd %ymm3, %zmm3
2621; AVX512F-NEXT:    vpsllw $8, %ymm4, %ymm6
2622; AVX512F-NEXT:    vpsraw $15, %ymm6, %ymm6
2623; AVX512F-NEXT:    vpmovsxwd %ymm6, %zmm6
2624; AVX512F-NEXT:    vpcmpneqd %zmm3, %zmm6, %k1
2625; AVX512F-NEXT:    vpmovsxbw %xmm2, %ymm2
2626; AVX512F-NEXT:    vpmovsxbw %xmm5, %ymm3
2627; AVX512F-NEXT:    vpmullw %ymm2, %ymm3, %ymm5
2628; AVX512F-NEXT:    vpsraw $8, %ymm5, %ymm2
2629; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm2
2630; AVX512F-NEXT:    vpsllw $8, %ymm5, %ymm3
2631; AVX512F-NEXT:    vpsraw $15, %ymm3, %ymm3
2632; AVX512F-NEXT:    vpmovsxwd %ymm3, %zmm3
2633; AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm3, %k2
2634; AVX512F-NEXT:    vextracti128 $1, %ymm1, %xmm2
2635; AVX512F-NEXT:    vpmovsxbw %xmm2, %ymm2
2636; AVX512F-NEXT:    vextracti128 $1, %ymm0, %xmm3
2637; AVX512F-NEXT:    vpmovsxbw %xmm3, %ymm3
2638; AVX512F-NEXT:    vpmullw %ymm2, %ymm3, %ymm6
2639; AVX512F-NEXT:    vpsraw $8, %ymm6, %ymm2
2640; AVX512F-NEXT:    vpmovsxwd %ymm2, %zmm2
2641; AVX512F-NEXT:    vpsllw $8, %ymm6, %ymm3
2642; AVX512F-NEXT:    vpsraw $15, %ymm3, %ymm3
2643; AVX512F-NEXT:    vpmovsxwd %ymm3, %zmm3
2644; AVX512F-NEXT:    vpcmpneqd %zmm2, %zmm3, %k3
2645; AVX512F-NEXT:    vpmovsxbw %xmm1, %ymm1
2646; AVX512F-NEXT:    vpmovsxbw %xmm0, %ymm0
2647; AVX512F-NEXT:    vpmullw %ymm1, %ymm0, %ymm7
2648; AVX512F-NEXT:    vpsraw $8, %ymm7, %ymm0
2649; AVX512F-NEXT:    vpmovsxwd %ymm0, %zmm0
2650; AVX512F-NEXT:    vpsllw $8, %ymm7, %ymm1
2651; AVX512F-NEXT:    vpsraw $15, %ymm1, %ymm1
2652; AVX512F-NEXT:    vpmovsxwd %ymm1, %zmm1
2653; AVX512F-NEXT:    vpcmpneqd %zmm0, %zmm1, %k4
2654; AVX512F-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k4} {z}
2655; AVX512F-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k3} {z}
2656; AVX512F-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k2} {z}
2657; AVX512F-NEXT:    vpternlogd $255, %zmm3, %zmm3, %zmm3 {%k1} {z}
2658; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm4[0],zero,ymm4[1],zero,ymm4[2],zero,ymm4[3],zero,ymm4[4],zero,ymm4[5],zero,ymm4[6],zero,ymm4[7],zero,ymm4[8],zero,ymm4[9],zero,ymm4[10],zero,ymm4[11],zero,ymm4[12],zero,ymm4[13],zero,ymm4[14],zero,ymm4[15],zero
2659; AVX512F-NEXT:    vpmovdb %zmm4, 48(%rdi)
2660; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm5[0],zero,ymm5[1],zero,ymm5[2],zero,ymm5[3],zero,ymm5[4],zero,ymm5[5],zero,ymm5[6],zero,ymm5[7],zero,ymm5[8],zero,ymm5[9],zero,ymm5[10],zero,ymm5[11],zero,ymm5[12],zero,ymm5[13],zero,ymm5[14],zero,ymm5[15],zero
2661; AVX512F-NEXT:    vpmovdb %zmm4, 32(%rdi)
2662; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm6[0],zero,ymm6[1],zero,ymm6[2],zero,ymm6[3],zero,ymm6[4],zero,ymm6[5],zero,ymm6[6],zero,ymm6[7],zero,ymm6[8],zero,ymm6[9],zero,ymm6[10],zero,ymm6[11],zero,ymm6[12],zero,ymm6[13],zero,ymm6[14],zero,ymm6[15],zero
2663; AVX512F-NEXT:    vpmovdb %zmm4, 16(%rdi)
2664; AVX512F-NEXT:    vpmovzxwd {{.*#+}} zmm4 = ymm7[0],zero,ymm7[1],zero,ymm7[2],zero,ymm7[3],zero,ymm7[4],zero,ymm7[5],zero,ymm7[6],zero,ymm7[7],zero,ymm7[8],zero,ymm7[9],zero,ymm7[10],zero,ymm7[11],zero,ymm7[12],zero,ymm7[13],zero,ymm7[14],zero,ymm7[15],zero
2665; AVX512F-NEXT:    vpmovdb %zmm4, (%rdi)
2666; AVX512F-NEXT:    retq
2667;
2668; AVX512BW-LABEL: smulo_v64i8:
2669; AVX512BW:       # %bb.0:
2670; AVX512BW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
2671; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm3 = zmm2[8],zmm1[8],zmm2[9],zmm1[9],zmm2[10],zmm1[10],zmm2[11],zmm1[11],zmm2[12],zmm1[12],zmm2[13],zmm1[13],zmm2[14],zmm1[14],zmm2[15],zmm1[15],zmm2[24],zmm1[24],zmm2[25],zmm1[25],zmm2[26],zmm1[26],zmm2[27],zmm1[27],zmm2[28],zmm1[28],zmm2[29],zmm1[29],zmm2[30],zmm1[30],zmm2[31],zmm1[31],zmm2[40],zmm1[40],zmm2[41],zmm1[41],zmm2[42],zmm1[42],zmm2[43],zmm1[43],zmm2[44],zmm1[44],zmm2[45],zmm1[45],zmm2[46],zmm1[46],zmm2[47],zmm1[47],zmm2[56],zmm1[56],zmm2[57],zmm1[57],zmm2[58],zmm1[58],zmm2[59],zmm1[59],zmm2[60],zmm1[60],zmm2[61],zmm1[61],zmm2[62],zmm1[62],zmm2[63],zmm1[63]
2672; AVX512BW-NEXT:    vpunpckhbw {{.*#+}} zmm4 = zmm2[8],zmm0[8],zmm2[9],zmm0[9],zmm2[10],zmm0[10],zmm2[11],zmm0[11],zmm2[12],zmm0[12],zmm2[13],zmm0[13],zmm2[14],zmm0[14],zmm2[15],zmm0[15],zmm2[24],zmm0[24],zmm2[25],zmm0[25],zmm2[26],zmm0[26],zmm2[27],zmm0[27],zmm2[28],zmm0[28],zmm2[29],zmm0[29],zmm2[30],zmm0[30],zmm2[31],zmm0[31],zmm2[40],zmm0[40],zmm2[41],zmm0[41],zmm2[42],zmm0[42],zmm2[43],zmm0[43],zmm2[44],zmm0[44],zmm2[45],zmm0[45],zmm2[46],zmm0[46],zmm2[47],zmm0[47],zmm2[56],zmm0[56],zmm2[57],zmm0[57],zmm2[58],zmm0[58],zmm2[59],zmm0[59],zmm2[60],zmm0[60],zmm2[61],zmm0[61],zmm2[62],zmm0[62],zmm2[63],zmm0[63]
2673; AVX512BW-NEXT:    vpmulhw %zmm3, %zmm4, %zmm3
2674; AVX512BW-NEXT:    vpsrlw $8, %zmm3, %zmm4
2675; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm1 = zmm2[0],zmm1[0],zmm2[1],zmm1[1],zmm2[2],zmm1[2],zmm2[3],zmm1[3],zmm2[4],zmm1[4],zmm2[5],zmm1[5],zmm2[6],zmm1[6],zmm2[7],zmm1[7],zmm2[16],zmm1[16],zmm2[17],zmm1[17],zmm2[18],zmm1[18],zmm2[19],zmm1[19],zmm2[20],zmm1[20],zmm2[21],zmm1[21],zmm2[22],zmm1[22],zmm2[23],zmm1[23],zmm2[32],zmm1[32],zmm2[33],zmm1[33],zmm2[34],zmm1[34],zmm2[35],zmm1[35],zmm2[36],zmm1[36],zmm2[37],zmm1[37],zmm2[38],zmm1[38],zmm2[39],zmm1[39],zmm2[48],zmm1[48],zmm2[49],zmm1[49],zmm2[50],zmm1[50],zmm2[51],zmm1[51],zmm2[52],zmm1[52],zmm2[53],zmm1[53],zmm2[54],zmm1[54],zmm2[55],zmm1[55]
2676; AVX512BW-NEXT:    vpunpcklbw {{.*#+}} zmm0 = zmm2[0],zmm0[0],zmm2[1],zmm0[1],zmm2[2],zmm0[2],zmm2[3],zmm0[3],zmm2[4],zmm0[4],zmm2[5],zmm0[5],zmm2[6],zmm0[6],zmm2[7],zmm0[7],zmm2[16],zmm0[16],zmm2[17],zmm0[17],zmm2[18],zmm0[18],zmm2[19],zmm0[19],zmm2[20],zmm0[20],zmm2[21],zmm0[21],zmm2[22],zmm0[22],zmm2[23],zmm0[23],zmm2[32],zmm0[32],zmm2[33],zmm0[33],zmm2[34],zmm0[34],zmm2[35],zmm0[35],zmm2[36],zmm0[36],zmm2[37],zmm0[37],zmm2[38],zmm0[38],zmm2[39],zmm0[39],zmm2[48],zmm0[48],zmm2[49],zmm0[49],zmm2[50],zmm0[50],zmm2[51],zmm0[51],zmm2[52],zmm0[52],zmm2[53],zmm0[53],zmm2[54],zmm0[54],zmm2[55],zmm0[55]
2677; AVX512BW-NEXT:    vpmulhw %zmm1, %zmm0, %zmm0
2678; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm1
2679; AVX512BW-NEXT:    vpackuswb %zmm4, %zmm1, %zmm1
2680; AVX512BW-NEXT:    vmovdqa64 {{.*#+}} zmm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
2681; AVX512BW-NEXT:    vpandq %zmm2, %zmm3, %zmm3
2682; AVX512BW-NEXT:    vpandq %zmm2, %zmm0, %zmm0
2683; AVX512BW-NEXT:    vpackuswb %zmm3, %zmm0, %zmm4
2684; AVX512BW-NEXT:    vpmovb2m %zmm4, %k0
2685; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
2686; AVX512BW-NEXT:    vpcmpneqb %zmm1, %zmm0, %k1
2687; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2688; AVX512BW-NEXT:    kshiftrd $16, %k1, %k2
2689; AVX512BW-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
2690; AVX512BW-NEXT:    kshiftrq $32, %k1, %k1
2691; AVX512BW-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k1} {z}
2692; AVX512BW-NEXT:    kshiftrd $16, %k1, %k1
2693; AVX512BW-NEXT:    vpternlogd $255, %zmm3, %zmm3, %zmm3 {%k1} {z}
2694; AVX512BW-NEXT:    vmovdqa64 %zmm4, (%rdi)
2695; AVX512BW-NEXT:    retq
2696  %t = call {<64 x i8>, <64 x i1>} @llvm.smul.with.overflow.v64i8(<64 x i8> %a0, <64 x i8> %a1)
2697  %val = extractvalue {<64 x i8>, <64 x i1>} %t, 0
2698  %obit = extractvalue {<64 x i8>, <64 x i1>} %t, 1
2699  %res = sext <64 x i1> %obit to <64 x i32>
2700  store <64 x i8> %val, <64 x i8>* %p2
2701  ret <64 x i32> %res
2702}
2703
2704define <8 x i32> @smulo_v8i16(<8 x i16> %a0, <8 x i16> %a1, <8 x i16>* %p2) nounwind {
2705; SSE2-LABEL: smulo_v8i16:
2706; SSE2:       # %bb.0:
2707; SSE2-NEXT:    movdqa %xmm0, %xmm2
2708; SSE2-NEXT:    pmulhw %xmm1, %xmm2
2709; SSE2-NEXT:    pmullw %xmm1, %xmm0
2710; SSE2-NEXT:    movdqa %xmm0, (%rdi)
2711; SSE2-NEXT:    psraw $15, %xmm0
2712; SSE2-NEXT:    pcmpeqw %xmm2, %xmm0
2713; SSE2-NEXT:    pcmpeqd %xmm1, %xmm1
2714; SSE2-NEXT:    pxor %xmm0, %xmm1
2715; SSE2-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2716; SSE2-NEXT:    psrad $16, %xmm0
2717; SSE2-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2718; SSE2-NEXT:    pslld $31, %xmm1
2719; SSE2-NEXT:    psrad $31, %xmm1
2720; SSE2-NEXT:    retq
2721;
2722; SSSE3-LABEL: smulo_v8i16:
2723; SSSE3:       # %bb.0:
2724; SSSE3-NEXT:    movdqa %xmm0, %xmm2
2725; SSSE3-NEXT:    pmulhw %xmm1, %xmm2
2726; SSSE3-NEXT:    pmullw %xmm1, %xmm0
2727; SSSE3-NEXT:    movdqa %xmm0, (%rdi)
2728; SSSE3-NEXT:    psraw $15, %xmm0
2729; SSSE3-NEXT:    pcmpeqw %xmm2, %xmm0
2730; SSSE3-NEXT:    pcmpeqd %xmm1, %xmm1
2731; SSSE3-NEXT:    pxor %xmm0, %xmm1
2732; SSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
2733; SSSE3-NEXT:    psrad $16, %xmm0
2734; SSSE3-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2735; SSSE3-NEXT:    pslld $31, %xmm1
2736; SSSE3-NEXT:    psrad $31, %xmm1
2737; SSSE3-NEXT:    retq
2738;
2739; SSE41-LABEL: smulo_v8i16:
2740; SSE41:       # %bb.0:
2741; SSE41-NEXT:    movdqa %xmm0, %xmm2
2742; SSE41-NEXT:    pmulhw %xmm1, %xmm2
2743; SSE41-NEXT:    pmullw %xmm1, %xmm0
2744; SSE41-NEXT:    movdqa %xmm0, (%rdi)
2745; SSE41-NEXT:    psraw $15, %xmm0
2746; SSE41-NEXT:    pcmpeqw %xmm2, %xmm0
2747; SSE41-NEXT:    pcmpeqd %xmm1, %xmm1
2748; SSE41-NEXT:    pxor %xmm0, %xmm1
2749; SSE41-NEXT:    pmovsxwd %xmm1, %xmm0
2750; SSE41-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]
2751; SSE41-NEXT:    pslld $31, %xmm1
2752; SSE41-NEXT:    psrad $31, %xmm1
2753; SSE41-NEXT:    retq
2754;
2755; AVX1-LABEL: smulo_v8i16:
2756; AVX1:       # %bb.0:
2757; AVX1-NEXT:    vpmulhw %xmm1, %xmm0, %xmm2
2758; AVX1-NEXT:    vpmullw %xmm1, %xmm0, %xmm1
2759; AVX1-NEXT:    vpsraw $15, %xmm1, %xmm0
2760; AVX1-NEXT:    vpcmpeqw %xmm0, %xmm2, %xmm0
2761; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2762; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
2763; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm2
2764; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
2765; AVX1-NEXT:    vpmovsxwd %xmm0, %xmm0
2766; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
2767; AVX1-NEXT:    vmovdqa %xmm1, (%rdi)
2768; AVX1-NEXT:    retq
2769;
2770; AVX2-LABEL: smulo_v8i16:
2771; AVX2:       # %bb.0:
2772; AVX2-NEXT:    vpmulhw %xmm1, %xmm0, %xmm2
2773; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm1
2774; AVX2-NEXT:    vpsraw $15, %xmm1, %xmm0
2775; AVX2-NEXT:    vpcmpeqw %xmm0, %xmm2, %xmm0
2776; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
2777; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
2778; AVX2-NEXT:    vpmovsxwd %xmm0, %ymm0
2779; AVX2-NEXT:    vmovdqa %xmm1, (%rdi)
2780; AVX2-NEXT:    retq
2781;
2782; AVX512F-LABEL: smulo_v8i16:
2783; AVX512F:       # %bb.0:
2784; AVX512F-NEXT:    vpmulhw %xmm1, %xmm0, %xmm2
2785; AVX512F-NEXT:    vpmullw %xmm1, %xmm0, %xmm1
2786; AVX512F-NEXT:    vpsraw $15, %xmm1, %xmm0
2787; AVX512F-NEXT:    vpcmpeqw %xmm0, %xmm2, %xmm0
2788; AVX512F-NEXT:    vpternlogq $15, %xmm0, %xmm0, %xmm0
2789; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
2790; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k1
2791; AVX512F-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
2792; AVX512F-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
2793; AVX512F-NEXT:    vmovdqa %xmm1, (%rdi)
2794; AVX512F-NEXT:    retq
2795;
2796; AVX512BW-LABEL: smulo_v8i16:
2797; AVX512BW:       # %bb.0:
2798; AVX512BW-NEXT:    vpmulhw %xmm1, %xmm0, %xmm2
2799; AVX512BW-NEXT:    vpmullw %xmm1, %xmm0, %xmm1
2800; AVX512BW-NEXT:    vpsraw $15, %xmm1, %xmm0
2801; AVX512BW-NEXT:    vpcmpneqw %xmm0, %xmm2, %k1
2802; AVX512BW-NEXT:    vpcmpeqd %ymm0, %ymm0, %ymm0
2803; AVX512BW-NEXT:    vmovdqa32 %ymm0, %ymm0 {%k1} {z}
2804; AVX512BW-NEXT:    vmovdqa %xmm1, (%rdi)
2805; AVX512BW-NEXT:    retq
2806  %t = call {<8 x i16>, <8 x i1>} @llvm.smul.with.overflow.v8i16(<8 x i16> %a0, <8 x i16> %a1)
2807  %val = extractvalue {<8 x i16>, <8 x i1>} %t, 0
2808  %obit = extractvalue {<8 x i16>, <8 x i1>} %t, 1
2809  %res = sext <8 x i1> %obit to <8 x i32>
2810  store <8 x i16> %val, <8 x i16>* %p2
2811  ret <8 x i32> %res
2812}
2813
2814define <2 x i32> @smulo_v2i64(<2 x i64> %a0, <2 x i64> %a1, <2 x i64>* %p2) nounwind {
2815; SSE2-LABEL: smulo_v2i64:
2816; SSE2:       # %bb.0:
2817; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
2818; SSE2-NEXT:    movq %xmm2, %r8
2819; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
2820; SSE2-NEXT:    movq %xmm2, %rcx
2821; SSE2-NEXT:    movq %xmm1, %rdx
2822; SSE2-NEXT:    movq %xmm0, %rsi
2823; SSE2-NEXT:    xorl %eax, %eax
2824; SSE2-NEXT:    imulq %rdx, %rsi
2825; SSE2-NEXT:    movq $-1, %r9
2826; SSE2-NEXT:    movl $0, %edx
2827; SSE2-NEXT:    cmovoq %r9, %rdx
2828; SSE2-NEXT:    movq %rsi, %xmm1
2829; SSE2-NEXT:    imulq %r8, %rcx
2830; SSE2-NEXT:    movq %rcx, %xmm0
2831; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2832; SSE2-NEXT:    movq %rdx, %xmm0
2833; SSE2-NEXT:    cmovoq %r9, %rax
2834; SSE2-NEXT:    movq %rax, %xmm2
2835; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2836; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2837; SSE2-NEXT:    movdqa %xmm1, (%rdi)
2838; SSE2-NEXT:    retq
2839;
2840; SSSE3-LABEL: smulo_v2i64:
2841; SSSE3:       # %bb.0:
2842; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
2843; SSSE3-NEXT:    movq %xmm2, %r8
2844; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
2845; SSSE3-NEXT:    movq %xmm2, %rcx
2846; SSSE3-NEXT:    movq %xmm1, %rdx
2847; SSSE3-NEXT:    movq %xmm0, %rsi
2848; SSSE3-NEXT:    xorl %eax, %eax
2849; SSSE3-NEXT:    imulq %rdx, %rsi
2850; SSSE3-NEXT:    movq $-1, %r9
2851; SSSE3-NEXT:    movl $0, %edx
2852; SSSE3-NEXT:    cmovoq %r9, %rdx
2853; SSSE3-NEXT:    movq %rsi, %xmm1
2854; SSSE3-NEXT:    imulq %r8, %rcx
2855; SSSE3-NEXT:    movq %rcx, %xmm0
2856; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2857; SSSE3-NEXT:    movq %rdx, %xmm0
2858; SSSE3-NEXT:    cmovoq %r9, %rax
2859; SSSE3-NEXT:    movq %rax, %xmm2
2860; SSSE3-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
2861; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2862; SSSE3-NEXT:    movdqa %xmm1, (%rdi)
2863; SSSE3-NEXT:    retq
2864;
2865; SSE41-LABEL: smulo_v2i64:
2866; SSE41:       # %bb.0:
2867; SSE41-NEXT:    movq %xmm1, %r8
2868; SSE41-NEXT:    movq %xmm0, %rcx
2869; SSE41-NEXT:    pextrq $1, %xmm1, %rdx
2870; SSE41-NEXT:    pextrq $1, %xmm0, %rsi
2871; SSE41-NEXT:    xorl %eax, %eax
2872; SSE41-NEXT:    imulq %rdx, %rsi
2873; SSE41-NEXT:    movq $-1, %r9
2874; SSE41-NEXT:    movl $0, %edx
2875; SSE41-NEXT:    cmovoq %r9, %rdx
2876; SSE41-NEXT:    movq %rsi, %xmm0
2877; SSE41-NEXT:    imulq %r8, %rcx
2878; SSE41-NEXT:    movq %rcx, %xmm1
2879; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2880; SSE41-NEXT:    movq %rdx, %xmm0
2881; SSE41-NEXT:    cmovoq %r9, %rax
2882; SSE41-NEXT:    movq %rax, %xmm2
2883; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
2884; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3]
2885; SSE41-NEXT:    movdqa %xmm1, (%rdi)
2886; SSE41-NEXT:    retq
2887;
2888; AVX-LABEL: smulo_v2i64:
2889; AVX:       # %bb.0:
2890; AVX-NEXT:    vmovq %xmm1, %r8
2891; AVX-NEXT:    vmovq %xmm0, %rcx
2892; AVX-NEXT:    vpextrq $1, %xmm1, %rdx
2893; AVX-NEXT:    vpextrq $1, %xmm0, %rsi
2894; AVX-NEXT:    xorl %eax, %eax
2895; AVX-NEXT:    imulq %rdx, %rsi
2896; AVX-NEXT:    movq $-1, %r9
2897; AVX-NEXT:    movl $0, %edx
2898; AVX-NEXT:    cmovoq %r9, %rdx
2899; AVX-NEXT:    vmovq %rsi, %xmm0
2900; AVX-NEXT:    imulq %r8, %rcx
2901; AVX-NEXT:    vmovq %rcx, %xmm1
2902; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2903; AVX-NEXT:    vmovq %rdx, %xmm0
2904; AVX-NEXT:    cmovoq %r9, %rax
2905; AVX-NEXT:    vmovq %rax, %xmm2
2906; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]
2907; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
2908; AVX-NEXT:    vmovdqa %xmm1, (%rdi)
2909; AVX-NEXT:    retq
2910;
2911; AVX512F-LABEL: smulo_v2i64:
2912; AVX512F:       # %bb.0:
2913; AVX512F-NEXT:    vmovq %xmm1, %rax
2914; AVX512F-NEXT:    vmovq %xmm0, %rcx
2915; AVX512F-NEXT:    vpextrq $1, %xmm1, %rdx
2916; AVX512F-NEXT:    vpextrq $1, %xmm0, %rsi
2917; AVX512F-NEXT:    imulq %rdx, %rsi
2918; AVX512F-NEXT:    seto %dl
2919; AVX512F-NEXT:    vmovq %rsi, %xmm0
2920; AVX512F-NEXT:    imulq %rax, %rcx
2921; AVX512F-NEXT:    vmovq %rcx, %xmm1
2922; AVX512F-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2923; AVX512F-NEXT:    seto %al
2924; AVX512F-NEXT:    movw $-3, %cx
2925; AVX512F-NEXT:    kmovw %ecx, %k0
2926; AVX512F-NEXT:    kmovw %eax, %k1
2927; AVX512F-NEXT:    kandw %k0, %k1, %k0
2928; AVX512F-NEXT:    kmovw %edx, %k1
2929; AVX512F-NEXT:    kshiftlw $15, %k1, %k1
2930; AVX512F-NEXT:    kshiftrw $14, %k1, %k1
2931; AVX512F-NEXT:    korw %k1, %k0, %k1
2932; AVX512F-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
2933; AVX512F-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
2934; AVX512F-NEXT:    vmovdqa %xmm1, (%rdi)
2935; AVX512F-NEXT:    retq
2936;
2937; AVX512BW-LABEL: smulo_v2i64:
2938; AVX512BW:       # %bb.0:
2939; AVX512BW-NEXT:    vmovq %xmm1, %rax
2940; AVX512BW-NEXT:    vmovq %xmm0, %rcx
2941; AVX512BW-NEXT:    vpextrq $1, %xmm1, %rdx
2942; AVX512BW-NEXT:    vpextrq $1, %xmm0, %rsi
2943; AVX512BW-NEXT:    imulq %rdx, %rsi
2944; AVX512BW-NEXT:    seto %dl
2945; AVX512BW-NEXT:    vmovq %rsi, %xmm0
2946; AVX512BW-NEXT:    imulq %rax, %rcx
2947; AVX512BW-NEXT:    vmovq %rcx, %xmm1
2948; AVX512BW-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
2949; AVX512BW-NEXT:    seto %al
2950; AVX512BW-NEXT:    movw $-3, %cx
2951; AVX512BW-NEXT:    kmovd %ecx, %k0
2952; AVX512BW-NEXT:    kmovd %eax, %k1
2953; AVX512BW-NEXT:    kandw %k0, %k1, %k0
2954; AVX512BW-NEXT:    kmovd %edx, %k1
2955; AVX512BW-NEXT:    kshiftlw $15, %k1, %k1
2956; AVX512BW-NEXT:    kshiftrw $14, %k1, %k1
2957; AVX512BW-NEXT:    korw %k1, %k0, %k1
2958; AVX512BW-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
2959; AVX512BW-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
2960; AVX512BW-NEXT:    vmovdqa %xmm1, (%rdi)
2961; AVX512BW-NEXT:    retq
2962  %t = call {<2 x i64>, <2 x i1>} @llvm.smul.with.overflow.v2i64(<2 x i64> %a0, <2 x i64> %a1)
2963  %val = extractvalue {<2 x i64>, <2 x i1>} %t, 0
2964  %obit = extractvalue {<2 x i64>, <2 x i1>} %t, 1
2965  %res = sext <2 x i1> %obit to <2 x i32>
2966  store <2 x i64> %val, <2 x i64>* %p2
2967  ret <2 x i32> %res
2968}
2969
2970define <4 x i32> @smulo_v4i24(<4 x i24> %a0, <4 x i24> %a1, <4 x i24>* %p2) nounwind {
2971; SSE2-LABEL: smulo_v4i24:
2972; SSE2:       # %bb.0:
2973; SSE2-NEXT:    pslld $8, %xmm0
2974; SSE2-NEXT:    psrad $8, %xmm0
2975; SSE2-NEXT:    pslld $8, %xmm1
2976; SSE2-NEXT:    psrad $8, %xmm1
2977; SSE2-NEXT:    pxor %xmm3, %xmm3
2978; SSE2-NEXT:    pxor %xmm2, %xmm2
2979; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
2980; SSE2-NEXT:    pand %xmm0, %xmm2
2981; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
2982; SSE2-NEXT:    pand %xmm1, %xmm3
2983; SSE2-NEXT:    paddd %xmm2, %xmm3
2984; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
2985; SSE2-NEXT:    pmuludq %xmm1, %xmm0
2986; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3]
2987; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
2988; SSE2-NEXT:    pmuludq %xmm4, %xmm2
2989; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
2990; SSE2-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1]
2991; SSE2-NEXT:    psubd %xmm3, %xmm5
2992; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]
2993; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
2994; SSE2-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
2995; SSE2-NEXT:    movdqa %xmm3, %xmm1
2996; SSE2-NEXT:    pslld $8, %xmm1
2997; SSE2-NEXT:    psrad $8, %xmm1
2998; SSE2-NEXT:    pcmpeqd %xmm3, %xmm1
2999; SSE2-NEXT:    psrad $31, %xmm3
3000; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
3001; SSE2-NEXT:    pcmpeqd %xmm4, %xmm4
3002; SSE2-NEXT:    pxor %xmm4, %xmm3
3003; SSE2-NEXT:    pxor %xmm4, %xmm1
3004; SSE2-NEXT:    por %xmm3, %xmm1
3005; SSE2-NEXT:    movd %xmm0, %eax
3006; SSE2-NEXT:    movw %ax, (%rdi)
3007; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
3008; SSE2-NEXT:    movd %xmm0, %ecx
3009; SSE2-NEXT:    movw %cx, 6(%rdi)
3010; SSE2-NEXT:    movd %xmm2, %edx
3011; SSE2-NEXT:    movw %dx, 3(%rdi)
3012; SSE2-NEXT:    shrl $16, %eax
3013; SSE2-NEXT:    movb %al, 2(%rdi)
3014; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,2,2,2]
3015; SSE2-NEXT:    movd %xmm0, %eax
3016; SSE2-NEXT:    movw %ax, 9(%rdi)
3017; SSE2-NEXT:    shrl $16, %ecx
3018; SSE2-NEXT:    movb %cl, 8(%rdi)
3019; SSE2-NEXT:    shrl $16, %edx
3020; SSE2-NEXT:    movb %dl, 5(%rdi)
3021; SSE2-NEXT:    shrl $16, %eax
3022; SSE2-NEXT:    movb %al, 11(%rdi)
3023; SSE2-NEXT:    movdqa %xmm1, %xmm0
3024; SSE2-NEXT:    retq
3025;
3026; SSSE3-LABEL: smulo_v4i24:
3027; SSSE3:       # %bb.0:
3028; SSSE3-NEXT:    pslld $8, %xmm0
3029; SSSE3-NEXT:    psrad $8, %xmm0
3030; SSSE3-NEXT:    pslld $8, %xmm1
3031; SSSE3-NEXT:    psrad $8, %xmm1
3032; SSSE3-NEXT:    pxor %xmm3, %xmm3
3033; SSSE3-NEXT:    pxor %xmm2, %xmm2
3034; SSSE3-NEXT:    pcmpgtd %xmm1, %xmm2
3035; SSSE3-NEXT:    pand %xmm0, %xmm2
3036; SSSE3-NEXT:    pcmpgtd %xmm0, %xmm3
3037; SSSE3-NEXT:    pand %xmm1, %xmm3
3038; SSSE3-NEXT:    paddd %xmm2, %xmm3
3039; SSSE3-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
3040; SSSE3-NEXT:    pmuludq %xmm1, %xmm0
3041; SSSE3-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,3,2,3]
3042; SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3043; SSSE3-NEXT:    pmuludq %xmm4, %xmm2
3044; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3]
3045; SSSE3-NEXT:    punpckldq {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1]
3046; SSSE3-NEXT:    psubd %xmm3, %xmm5
3047; SSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[0,2,2,3]
3048; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
3049; SSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
3050; SSSE3-NEXT:    movdqa %xmm3, %xmm1
3051; SSSE3-NEXT:    pslld $8, %xmm1
3052; SSSE3-NEXT:    psrad $8, %xmm1
3053; SSSE3-NEXT:    pcmpeqd %xmm3, %xmm1
3054; SSSE3-NEXT:    psrad $31, %xmm3
3055; SSSE3-NEXT:    pcmpeqd %xmm5, %xmm3
3056; SSSE3-NEXT:    pcmpeqd %xmm4, %xmm4
3057; SSSE3-NEXT:    pxor %xmm4, %xmm3
3058; SSSE3-NEXT:    pxor %xmm4, %xmm1
3059; SSSE3-NEXT:    por %xmm3, %xmm1
3060; SSSE3-NEXT:    movd %xmm0, %eax
3061; SSSE3-NEXT:    movw %ax, (%rdi)
3062; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
3063; SSSE3-NEXT:    movd %xmm0, %ecx
3064; SSSE3-NEXT:    movw %cx, 6(%rdi)
3065; SSSE3-NEXT:    movd %xmm2, %edx
3066; SSSE3-NEXT:    movw %dx, 3(%rdi)
3067; SSSE3-NEXT:    shrl $16, %eax
3068; SSSE3-NEXT:    movb %al, 2(%rdi)
3069; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,2,2,2]
3070; SSSE3-NEXT:    movd %xmm0, %eax
3071; SSSE3-NEXT:    movw %ax, 9(%rdi)
3072; SSSE3-NEXT:    shrl $16, %ecx
3073; SSSE3-NEXT:    movb %cl, 8(%rdi)
3074; SSSE3-NEXT:    shrl $16, %edx
3075; SSSE3-NEXT:    movb %dl, 5(%rdi)
3076; SSSE3-NEXT:    shrl $16, %eax
3077; SSSE3-NEXT:    movb %al, 11(%rdi)
3078; SSSE3-NEXT:    movdqa %xmm1, %xmm0
3079; SSSE3-NEXT:    retq
3080;
3081; SSE41-LABEL: smulo_v4i24:
3082; SSE41:       # %bb.0:
3083; SSE41-NEXT:    pslld $8, %xmm0
3084; SSE41-NEXT:    psrad $8, %xmm0
3085; SSE41-NEXT:    pslld $8, %xmm1
3086; SSE41-NEXT:    psrad $8, %xmm1
3087; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3088; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
3089; SSE41-NEXT:    pmuldq %xmm2, %xmm3
3090; SSE41-NEXT:    movdqa %xmm0, %xmm2
3091; SSE41-NEXT:    pmuldq %xmm1, %xmm2
3092; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
3093; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
3094; SSE41-NEXT:    pmulld %xmm0, %xmm1
3095; SSE41-NEXT:    movdqa %xmm1, %xmm3
3096; SSE41-NEXT:    pslld $8, %xmm3
3097; SSE41-NEXT:    psrad $8, %xmm3
3098; SSE41-NEXT:    pcmpeqd %xmm1, %xmm3
3099; SSE41-NEXT:    pextrd $3, %xmm1, %eax
3100; SSE41-NEXT:    pextrd $2, %xmm1, %ecx
3101; SSE41-NEXT:    pextrd $1, %xmm1, %edx
3102; SSE41-NEXT:    movd %xmm1, %esi
3103; SSE41-NEXT:    psrad $31, %xmm1
3104; SSE41-NEXT:    pcmpeqd %xmm2, %xmm1
3105; SSE41-NEXT:    pcmpeqd %xmm0, %xmm0
3106; SSE41-NEXT:    pxor %xmm0, %xmm1
3107; SSE41-NEXT:    pxor %xmm3, %xmm0
3108; SSE41-NEXT:    por %xmm1, %xmm0
3109; SSE41-NEXT:    movw %ax, 9(%rdi)
3110; SSE41-NEXT:    movw %cx, 6(%rdi)
3111; SSE41-NEXT:    movw %dx, 3(%rdi)
3112; SSE41-NEXT:    movw %si, (%rdi)
3113; SSE41-NEXT:    shrl $16, %eax
3114; SSE41-NEXT:    movb %al, 11(%rdi)
3115; SSE41-NEXT:    shrl $16, %ecx
3116; SSE41-NEXT:    movb %cl, 8(%rdi)
3117; SSE41-NEXT:    shrl $16, %edx
3118; SSE41-NEXT:    movb %dl, 5(%rdi)
3119; SSE41-NEXT:    shrl $16, %esi
3120; SSE41-NEXT:    movb %sil, 2(%rdi)
3121; SSE41-NEXT:    retq
3122;
3123; AVX1-LABEL: smulo_v4i24:
3124; AVX1:       # %bb.0:
3125; AVX1-NEXT:    vpslld $8, %xmm0, %xmm0
3126; AVX1-NEXT:    vpsrad $8, %xmm0, %xmm0
3127; AVX1-NEXT:    vpslld $8, %xmm1, %xmm1
3128; AVX1-NEXT:    vpsrad $8, %xmm1, %xmm1
3129; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3130; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
3131; AVX1-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
3132; AVX1-NEXT:    vpmuldq %xmm1, %xmm0, %xmm3
3133; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3134; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
3135; AVX1-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
3136; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm0
3137; AVX1-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
3138; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3139; AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm0
3140; AVX1-NEXT:    vpslld $8, %xmm1, %xmm3
3141; AVX1-NEXT:    vpsrad $8, %xmm3, %xmm3
3142; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm3, %xmm3
3143; AVX1-NEXT:    vpxor %xmm2, %xmm3, %xmm2
3144; AVX1-NEXT:    vpor %xmm0, %xmm2, %xmm0
3145; AVX1-NEXT:    vpextrd $3, %xmm1, %eax
3146; AVX1-NEXT:    movw %ax, 9(%rdi)
3147; AVX1-NEXT:    vpextrd $2, %xmm1, %ecx
3148; AVX1-NEXT:    movw %cx, 6(%rdi)
3149; AVX1-NEXT:    vpextrd $1, %xmm1, %edx
3150; AVX1-NEXT:    movw %dx, 3(%rdi)
3151; AVX1-NEXT:    vmovd %xmm1, %esi
3152; AVX1-NEXT:    movw %si, (%rdi)
3153; AVX1-NEXT:    shrl $16, %eax
3154; AVX1-NEXT:    movb %al, 11(%rdi)
3155; AVX1-NEXT:    shrl $16, %ecx
3156; AVX1-NEXT:    movb %cl, 8(%rdi)
3157; AVX1-NEXT:    shrl $16, %edx
3158; AVX1-NEXT:    movb %dl, 5(%rdi)
3159; AVX1-NEXT:    shrl $16, %esi
3160; AVX1-NEXT:    movb %sil, 2(%rdi)
3161; AVX1-NEXT:    retq
3162;
3163; AVX2-LABEL: smulo_v4i24:
3164; AVX2:       # %bb.0:
3165; AVX2-NEXT:    vpslld $8, %xmm0, %xmm0
3166; AVX2-NEXT:    vpsrad $8, %xmm0, %xmm0
3167; AVX2-NEXT:    vpslld $8, %xmm1, %xmm1
3168; AVX2-NEXT:    vpsrad $8, %xmm1, %xmm1
3169; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
3170; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
3171; AVX2-NEXT:    vpmuldq %xmm2, %xmm3, %xmm2
3172; AVX2-NEXT:    vpmuldq %xmm1, %xmm0, %xmm3
3173; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
3174; AVX2-NEXT:    vpblendd {{.*#+}} xmm2 = xmm3[0],xmm2[1],xmm3[2],xmm2[3]
3175; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
3176; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm0
3177; AVX2-NEXT:    vpcmpeqd %xmm0, %xmm2, %xmm0
3178; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm2, %xmm2
3179; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
3180; AVX2-NEXT:    vpslld $8, %xmm1, %xmm3
3181; AVX2-NEXT:    vpsrad $8, %xmm3, %xmm3
3182; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm3, %xmm3
3183; AVX2-NEXT:    vpxor %xmm2, %xmm3, %xmm2
3184; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
3185; AVX2-NEXT:    vpextrd $3, %xmm1, %eax
3186; AVX2-NEXT:    movw %ax, 9(%rdi)
3187; AVX2-NEXT:    vpextrd $2, %xmm1, %ecx
3188; AVX2-NEXT:    movw %cx, 6(%rdi)
3189; AVX2-NEXT:    vpextrd $1, %xmm1, %edx
3190; AVX2-NEXT:    movw %dx, 3(%rdi)
3191; AVX2-NEXT:    vmovd %xmm1, %esi
3192; AVX2-NEXT:    movw %si, (%rdi)
3193; AVX2-NEXT:    shrl $16, %eax
3194; AVX2-NEXT:    movb %al, 11(%rdi)
3195; AVX2-NEXT:    shrl $16, %ecx
3196; AVX2-NEXT:    movb %cl, 8(%rdi)
3197; AVX2-NEXT:    shrl $16, %edx
3198; AVX2-NEXT:    movb %dl, 5(%rdi)
3199; AVX2-NEXT:    shrl $16, %esi
3200; AVX2-NEXT:    movb %sil, 2(%rdi)
3201; AVX2-NEXT:    retq
3202;
3203; AVX512-LABEL: smulo_v4i24:
3204; AVX512:       # %bb.0:
3205; AVX512-NEXT:    vpslld $8, %xmm1, %xmm1
3206; AVX512-NEXT:    vpsrad $8, %xmm1, %xmm1
3207; AVX512-NEXT:    vpslld $8, %xmm0, %xmm0
3208; AVX512-NEXT:    vpsrad $8, %xmm0, %xmm0
3209; AVX512-NEXT:    vpmuldq %xmm1, %xmm0, %xmm2
3210; AVX512-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
3211; AVX512-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
3212; AVX512-NEXT:    vpmuldq %xmm3, %xmm4, %xmm3
3213; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,5,3,7]
3214; AVX512-NEXT:    vpermi2d %xmm3, %xmm2, %xmm4
3215; AVX512-NEXT:    vpmulld %xmm1, %xmm0, %xmm1
3216; AVX512-NEXT:    vpsrad $31, %xmm1, %xmm0
3217; AVX512-NEXT:    vpcmpneqd %xmm0, %xmm4, %k0
3218; AVX512-NEXT:    vpslld $8, %xmm1, %xmm0
3219; AVX512-NEXT:    vpsrad $8, %xmm0, %xmm0
3220; AVX512-NEXT:    vpcmpneqd %xmm1, %xmm0, %k1
3221; AVX512-NEXT:    korw %k0, %k1, %k1
3222; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
3223; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
3224; AVX512-NEXT:    vpextrd $3, %xmm1, %eax
3225; AVX512-NEXT:    movw %ax, 9(%rdi)
3226; AVX512-NEXT:    vpextrd $2, %xmm1, %ecx
3227; AVX512-NEXT:    movw %cx, 6(%rdi)
3228; AVX512-NEXT:    vpextrd $1, %xmm1, %edx
3229; AVX512-NEXT:    movw %dx, 3(%rdi)
3230; AVX512-NEXT:    vmovd %xmm1, %esi
3231; AVX512-NEXT:    movw %si, (%rdi)
3232; AVX512-NEXT:    shrl $16, %eax
3233; AVX512-NEXT:    movb %al, 11(%rdi)
3234; AVX512-NEXT:    shrl $16, %ecx
3235; AVX512-NEXT:    movb %cl, 8(%rdi)
3236; AVX512-NEXT:    shrl $16, %edx
3237; AVX512-NEXT:    movb %dl, 5(%rdi)
3238; AVX512-NEXT:    shrl $16, %esi
3239; AVX512-NEXT:    movb %sil, 2(%rdi)
3240; AVX512-NEXT:    retq
3241  %t = call {<4 x i24>, <4 x i1>} @llvm.smul.with.overflow.v4i24(<4 x i24> %a0, <4 x i24> %a1)
3242  %val = extractvalue {<4 x i24>, <4 x i1>} %t, 0
3243  %obit = extractvalue {<4 x i24>, <4 x i1>} %t, 1
3244  %res = sext <4 x i1> %obit to <4 x i32>
3245  store <4 x i24> %val, <4 x i24>* %p2
3246  ret <4 x i32> %res
3247}
3248
3249define <4 x i32> @smulo_v4i1(<4 x i1> %a0, <4 x i1> %a1, <4 x i1>* %p2) nounwind {
3250; SSE2-LABEL: smulo_v4i1:
3251; SSE2:       # %bb.0:
3252; SSE2-NEXT:    pand %xmm1, %xmm0
3253; SSE2-NEXT:    pslld $31, %xmm0
3254; SSE2-NEXT:    movmskps %xmm0, %eax
3255; SSE2-NEXT:    psrad $31, %xmm0
3256; SSE2-NEXT:    movb %al, (%rdi)
3257; SSE2-NEXT:    retq
3258;
3259; SSSE3-LABEL: smulo_v4i1:
3260; SSSE3:       # %bb.0:
3261; SSSE3-NEXT:    pand %xmm1, %xmm0
3262; SSSE3-NEXT:    pslld $31, %xmm0
3263; SSSE3-NEXT:    movmskps %xmm0, %eax
3264; SSSE3-NEXT:    psrad $31, %xmm0
3265; SSSE3-NEXT:    movb %al, (%rdi)
3266; SSSE3-NEXT:    retq
3267;
3268; SSE41-LABEL: smulo_v4i1:
3269; SSE41:       # %bb.0:
3270; SSE41-NEXT:    pand %xmm1, %xmm0
3271; SSE41-NEXT:    pslld $31, %xmm0
3272; SSE41-NEXT:    movmskps %xmm0, %eax
3273; SSE41-NEXT:    psrad $31, %xmm0
3274; SSE41-NEXT:    movb %al, (%rdi)
3275; SSE41-NEXT:    retq
3276;
3277; AVX-LABEL: smulo_v4i1:
3278; AVX:       # %bb.0:
3279; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
3280; AVX-NEXT:    vpslld $31, %xmm0, %xmm0
3281; AVX-NEXT:    vmovmskps %xmm0, %eax
3282; AVX-NEXT:    vpsrad $31, %xmm0, %xmm0
3283; AVX-NEXT:    movb %al, (%rdi)
3284; AVX-NEXT:    retq
3285;
3286; AVX512F-LABEL: smulo_v4i1:
3287; AVX512F:       # %bb.0:
3288; AVX512F-NEXT:    vpand %xmm1, %xmm0, %xmm0
3289; AVX512F-NEXT:    vpslld $31, %xmm0, %xmm0
3290; AVX512F-NEXT:    vptestmd %xmm0, %xmm0, %k0
3291; AVX512F-NEXT:    vpsrad $31, %xmm0, %xmm0
3292; AVX512F-NEXT:    kmovw %k0, %eax
3293; AVX512F-NEXT:    movb %al, (%rdi)
3294; AVX512F-NEXT:    retq
3295;
3296; AVX512BW-LABEL: smulo_v4i1:
3297; AVX512BW:       # %bb.0:
3298; AVX512BW-NEXT:    vpand %xmm1, %xmm0, %xmm0
3299; AVX512BW-NEXT:    vpslld $31, %xmm0, %xmm0
3300; AVX512BW-NEXT:    vptestmd %xmm0, %xmm0, %k0
3301; AVX512BW-NEXT:    vpsrad $31, %xmm0, %xmm0
3302; AVX512BW-NEXT:    kmovd %k0, %eax
3303; AVX512BW-NEXT:    movb %al, (%rdi)
3304; AVX512BW-NEXT:    retq
3305  %t = call {<4 x i1>, <4 x i1>} @llvm.smul.with.overflow.v4i1(<4 x i1> %a0, <4 x i1> %a1)
3306  %val = extractvalue {<4 x i1>, <4 x i1>} %t, 0
3307  %obit = extractvalue {<4 x i1>, <4 x i1>} %t, 1
3308  %res = sext <4 x i1> %obit to <4 x i32>
3309  store <4 x i1> %val, <4 x i1>* %p2
3310  ret <4 x i32> %res
3311}
3312
3313define <2 x i32> @smulo_v2i128(<2 x i128> %a0, <2 x i128> %a1, <2 x i128>* %p2) nounwind {
3314; SSE2-LABEL: smulo_v2i128:
3315; SSE2:       # %bb.0:
3316; SSE2-NEXT:    pushq %rbp
3317; SSE2-NEXT:    pushq %r15
3318; SSE2-NEXT:    pushq %r14
3319; SSE2-NEXT:    pushq %r13
3320; SSE2-NEXT:    pushq %r12
3321; SSE2-NEXT:    pushq %rbx
3322; SSE2-NEXT:    subq $24, %rsp
3323; SSE2-NEXT:    movq %r8, %rax
3324; SSE2-NEXT:    movq %rcx, %r14
3325; SSE2-NEXT:    movq %rdx, %rbx
3326; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r15
3327; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %r12
3328; SSE2-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3329; SSE2-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3330; SSE2-NEXT:    movq %rax, %rdx
3331; SSE2-NEXT:    movq %r9, %rcx
3332; SSE2-NEXT:    callq __muloti4@PLT
3333; SSE2-NEXT:    movq %rax, %r13
3334; SSE2-NEXT:    movq %rdx, %rbp
3335; SSE2-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3336; SSE2-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3337; SSE2-NEXT:    movq %rbx, %rdi
3338; SSE2-NEXT:    movq %r14, %rsi
3339; SSE2-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
3340; SSE2-NEXT:    movq %r12, %rcx
3341; SSE2-NEXT:    callq __muloti4@PLT
3342; SSE2-NEXT:    xorl %ecx, %ecx
3343; SSE2-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
3344; SSE2-NEXT:    sbbl %esi, %esi
3345; SSE2-NEXT:    movd %esi, %xmm1
3346; SSE2-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
3347; SSE2-NEXT:    sbbl %ecx, %ecx
3348; SSE2-NEXT:    movd %ecx, %xmm0
3349; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3350; SSE2-NEXT:    movq %rdx, 24(%r15)
3351; SSE2-NEXT:    movq %rax, 16(%r15)
3352; SSE2-NEXT:    movq %rbp, 8(%r15)
3353; SSE2-NEXT:    movq %r13, (%r15)
3354; SSE2-NEXT:    addq $24, %rsp
3355; SSE2-NEXT:    popq %rbx
3356; SSE2-NEXT:    popq %r12
3357; SSE2-NEXT:    popq %r13
3358; SSE2-NEXT:    popq %r14
3359; SSE2-NEXT:    popq %r15
3360; SSE2-NEXT:    popq %rbp
3361; SSE2-NEXT:    retq
3362;
3363; SSSE3-LABEL: smulo_v2i128:
3364; SSSE3:       # %bb.0:
3365; SSSE3-NEXT:    pushq %rbp
3366; SSSE3-NEXT:    pushq %r15
3367; SSSE3-NEXT:    pushq %r14
3368; SSSE3-NEXT:    pushq %r13
3369; SSSE3-NEXT:    pushq %r12
3370; SSSE3-NEXT:    pushq %rbx
3371; SSSE3-NEXT:    subq $24, %rsp
3372; SSSE3-NEXT:    movq %r8, %rax
3373; SSSE3-NEXT:    movq %rcx, %r14
3374; SSSE3-NEXT:    movq %rdx, %rbx
3375; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %r15
3376; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %r12
3377; SSSE3-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3378; SSSE3-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3379; SSSE3-NEXT:    movq %rax, %rdx
3380; SSSE3-NEXT:    movq %r9, %rcx
3381; SSSE3-NEXT:    callq __muloti4@PLT
3382; SSSE3-NEXT:    movq %rax, %r13
3383; SSSE3-NEXT:    movq %rdx, %rbp
3384; SSSE3-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3385; SSSE3-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3386; SSSE3-NEXT:    movq %rbx, %rdi
3387; SSSE3-NEXT:    movq %r14, %rsi
3388; SSSE3-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
3389; SSSE3-NEXT:    movq %r12, %rcx
3390; SSSE3-NEXT:    callq __muloti4@PLT
3391; SSSE3-NEXT:    xorl %ecx, %ecx
3392; SSSE3-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
3393; SSSE3-NEXT:    sbbl %esi, %esi
3394; SSSE3-NEXT:    movd %esi, %xmm1
3395; SSSE3-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
3396; SSSE3-NEXT:    sbbl %ecx, %ecx
3397; SSSE3-NEXT:    movd %ecx, %xmm0
3398; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
3399; SSSE3-NEXT:    movq %rdx, 24(%r15)
3400; SSSE3-NEXT:    movq %rax, 16(%r15)
3401; SSSE3-NEXT:    movq %rbp, 8(%r15)
3402; SSSE3-NEXT:    movq %r13, (%r15)
3403; SSSE3-NEXT:    addq $24, %rsp
3404; SSSE3-NEXT:    popq %rbx
3405; SSSE3-NEXT:    popq %r12
3406; SSSE3-NEXT:    popq %r13
3407; SSSE3-NEXT:    popq %r14
3408; SSSE3-NEXT:    popq %r15
3409; SSSE3-NEXT:    popq %rbp
3410; SSSE3-NEXT:    retq
3411;
3412; SSE41-LABEL: smulo_v2i128:
3413; SSE41:       # %bb.0:
3414; SSE41-NEXT:    pushq %rbp
3415; SSE41-NEXT:    pushq %r15
3416; SSE41-NEXT:    pushq %r14
3417; SSE41-NEXT:    pushq %r13
3418; SSE41-NEXT:    pushq %r12
3419; SSE41-NEXT:    pushq %rbx
3420; SSE41-NEXT:    subq $24, %rsp
3421; SSE41-NEXT:    movq %r8, %rax
3422; SSE41-NEXT:    movq %rcx, %r14
3423; SSE41-NEXT:    movq %rdx, %rbx
3424; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r15
3425; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %r12
3426; SSE41-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3427; SSE41-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3428; SSE41-NEXT:    movq %rax, %rdx
3429; SSE41-NEXT:    movq %r9, %rcx
3430; SSE41-NEXT:    callq __muloti4@PLT
3431; SSE41-NEXT:    movq %rax, %r13
3432; SSE41-NEXT:    movq %rdx, %rbp
3433; SSE41-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3434; SSE41-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3435; SSE41-NEXT:    movq %rbx, %rdi
3436; SSE41-NEXT:    movq %r14, %rsi
3437; SSE41-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
3438; SSE41-NEXT:    movq %r12, %rcx
3439; SSE41-NEXT:    callq __muloti4@PLT
3440; SSE41-NEXT:    xorl %ecx, %ecx
3441; SSE41-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
3442; SSE41-NEXT:    sbbl %esi, %esi
3443; SSE41-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
3444; SSE41-NEXT:    sbbl %ecx, %ecx
3445; SSE41-NEXT:    movd %ecx, %xmm0
3446; SSE41-NEXT:    pinsrd $1, %esi, %xmm0
3447; SSE41-NEXT:    movq %rdx, 24(%r15)
3448; SSE41-NEXT:    movq %rax, 16(%r15)
3449; SSE41-NEXT:    movq %rbp, 8(%r15)
3450; SSE41-NEXT:    movq %r13, (%r15)
3451; SSE41-NEXT:    addq $24, %rsp
3452; SSE41-NEXT:    popq %rbx
3453; SSE41-NEXT:    popq %r12
3454; SSE41-NEXT:    popq %r13
3455; SSE41-NEXT:    popq %r14
3456; SSE41-NEXT:    popq %r15
3457; SSE41-NEXT:    popq %rbp
3458; SSE41-NEXT:    retq
3459;
3460; AVX-LABEL: smulo_v2i128:
3461; AVX:       # %bb.0:
3462; AVX-NEXT:    pushq %rbp
3463; AVX-NEXT:    pushq %r15
3464; AVX-NEXT:    pushq %r14
3465; AVX-NEXT:    pushq %r13
3466; AVX-NEXT:    pushq %r12
3467; AVX-NEXT:    pushq %rbx
3468; AVX-NEXT:    subq $24, %rsp
3469; AVX-NEXT:    movq %r8, %rax
3470; AVX-NEXT:    movq %rcx, %r14
3471; AVX-NEXT:    movq %rdx, %rbx
3472; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r15
3473; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %r12
3474; AVX-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3475; AVX-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3476; AVX-NEXT:    movq %rax, %rdx
3477; AVX-NEXT:    movq %r9, %rcx
3478; AVX-NEXT:    callq __muloti4@PLT
3479; AVX-NEXT:    movq %rax, %r13
3480; AVX-NEXT:    movq %rdx, %rbp
3481; AVX-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3482; AVX-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3483; AVX-NEXT:    movq %rbx, %rdi
3484; AVX-NEXT:    movq %r14, %rsi
3485; AVX-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
3486; AVX-NEXT:    movq %r12, %rcx
3487; AVX-NEXT:    callq __muloti4@PLT
3488; AVX-NEXT:    xorl %ecx, %ecx
3489; AVX-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
3490; AVX-NEXT:    sbbl %esi, %esi
3491; AVX-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
3492; AVX-NEXT:    sbbl %ecx, %ecx
3493; AVX-NEXT:    vmovd %ecx, %xmm0
3494; AVX-NEXT:    vpinsrd $1, %esi, %xmm0, %xmm0
3495; AVX-NEXT:    movq %rdx, 24(%r15)
3496; AVX-NEXT:    movq %rax, 16(%r15)
3497; AVX-NEXT:    movq %rbp, 8(%r15)
3498; AVX-NEXT:    movq %r13, (%r15)
3499; AVX-NEXT:    addq $24, %rsp
3500; AVX-NEXT:    popq %rbx
3501; AVX-NEXT:    popq %r12
3502; AVX-NEXT:    popq %r13
3503; AVX-NEXT:    popq %r14
3504; AVX-NEXT:    popq %r15
3505; AVX-NEXT:    popq %rbp
3506; AVX-NEXT:    retq
3507;
3508; AVX512F-LABEL: smulo_v2i128:
3509; AVX512F:       # %bb.0:
3510; AVX512F-NEXT:    pushq %rbp
3511; AVX512F-NEXT:    pushq %r15
3512; AVX512F-NEXT:    pushq %r14
3513; AVX512F-NEXT:    pushq %r13
3514; AVX512F-NEXT:    pushq %r12
3515; AVX512F-NEXT:    pushq %rbx
3516; AVX512F-NEXT:    subq $24, %rsp
3517; AVX512F-NEXT:    movq %r8, %rax
3518; AVX512F-NEXT:    movq %rcx, %r14
3519; AVX512F-NEXT:    movq %rdx, %rbx
3520; AVX512F-NEXT:    movq {{[0-9]+}}(%rsp), %r15
3521; AVX512F-NEXT:    movq {{[0-9]+}}(%rsp), %r12
3522; AVX512F-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3523; AVX512F-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3524; AVX512F-NEXT:    movq %rax, %rdx
3525; AVX512F-NEXT:    movq %r9, %rcx
3526; AVX512F-NEXT:    callq __muloti4@PLT
3527; AVX512F-NEXT:    movq %rax, %r13
3528; AVX512F-NEXT:    movq %rdx, %rbp
3529; AVX512F-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3530; AVX512F-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3531; AVX512F-NEXT:    movq %rbx, %rdi
3532; AVX512F-NEXT:    movq %r14, %rsi
3533; AVX512F-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
3534; AVX512F-NEXT:    movq %r12, %rcx
3535; AVX512F-NEXT:    callq __muloti4@PLT
3536; AVX512F-NEXT:    cmpq $0, {{[0-9]+}}(%rsp)
3537; AVX512F-NEXT:    setne %cl
3538; AVX512F-NEXT:    kmovw %ecx, %k0
3539; AVX512F-NEXT:    cmpq $0, {{[0-9]+}}(%rsp)
3540; AVX512F-NEXT:    setne %cl
3541; AVX512F-NEXT:    andl $1, %ecx
3542; AVX512F-NEXT:    kmovw %ecx, %k1
3543; AVX512F-NEXT:    kshiftlw $1, %k0, %k0
3544; AVX512F-NEXT:    korw %k0, %k1, %k1
3545; AVX512F-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
3546; AVX512F-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
3547; AVX512F-NEXT:    movq %rdx, 24(%r15)
3548; AVX512F-NEXT:    movq %rax, 16(%r15)
3549; AVX512F-NEXT:    movq %rbp, 8(%r15)
3550; AVX512F-NEXT:    movq %r13, (%r15)
3551; AVX512F-NEXT:    addq $24, %rsp
3552; AVX512F-NEXT:    popq %rbx
3553; AVX512F-NEXT:    popq %r12
3554; AVX512F-NEXT:    popq %r13
3555; AVX512F-NEXT:    popq %r14
3556; AVX512F-NEXT:    popq %r15
3557; AVX512F-NEXT:    popq %rbp
3558; AVX512F-NEXT:    retq
3559;
3560; AVX512BW-LABEL: smulo_v2i128:
3561; AVX512BW:       # %bb.0:
3562; AVX512BW-NEXT:    pushq %rbp
3563; AVX512BW-NEXT:    pushq %r15
3564; AVX512BW-NEXT:    pushq %r14
3565; AVX512BW-NEXT:    pushq %r13
3566; AVX512BW-NEXT:    pushq %r12
3567; AVX512BW-NEXT:    pushq %rbx
3568; AVX512BW-NEXT:    subq $24, %rsp
3569; AVX512BW-NEXT:    movq %r8, %rax
3570; AVX512BW-NEXT:    movq %rcx, %r14
3571; AVX512BW-NEXT:    movq %rdx, %rbx
3572; AVX512BW-NEXT:    movq {{[0-9]+}}(%rsp), %r15
3573; AVX512BW-NEXT:    movq {{[0-9]+}}(%rsp), %r12
3574; AVX512BW-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3575; AVX512BW-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3576; AVX512BW-NEXT:    movq %rax, %rdx
3577; AVX512BW-NEXT:    movq %r9, %rcx
3578; AVX512BW-NEXT:    callq __muloti4@PLT
3579; AVX512BW-NEXT:    movq %rax, %r13
3580; AVX512BW-NEXT:    movq %rdx, %rbp
3581; AVX512BW-NEXT:    movq $0, {{[0-9]+}}(%rsp)
3582; AVX512BW-NEXT:    leaq {{[0-9]+}}(%rsp), %r8
3583; AVX512BW-NEXT:    movq %rbx, %rdi
3584; AVX512BW-NEXT:    movq %r14, %rsi
3585; AVX512BW-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
3586; AVX512BW-NEXT:    movq %r12, %rcx
3587; AVX512BW-NEXT:    callq __muloti4@PLT
3588; AVX512BW-NEXT:    cmpq $0, {{[0-9]+}}(%rsp)
3589; AVX512BW-NEXT:    setne %cl
3590; AVX512BW-NEXT:    kmovd %ecx, %k0
3591; AVX512BW-NEXT:    cmpq $0, {{[0-9]+}}(%rsp)
3592; AVX512BW-NEXT:    setne %cl
3593; AVX512BW-NEXT:    andl $1, %ecx
3594; AVX512BW-NEXT:    kmovw %ecx, %k1
3595; AVX512BW-NEXT:    kshiftlw $1, %k0, %k0
3596; AVX512BW-NEXT:    korw %k0, %k1, %k1
3597; AVX512BW-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
3598; AVX512BW-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
3599; AVX512BW-NEXT:    movq %rdx, 24(%r15)
3600; AVX512BW-NEXT:    movq %rax, 16(%r15)
3601; AVX512BW-NEXT:    movq %rbp, 8(%r15)
3602; AVX512BW-NEXT:    movq %r13, (%r15)
3603; AVX512BW-NEXT:    addq $24, %rsp
3604; AVX512BW-NEXT:    popq %rbx
3605; AVX512BW-NEXT:    popq %r12
3606; AVX512BW-NEXT:    popq %r13
3607; AVX512BW-NEXT:    popq %r14
3608; AVX512BW-NEXT:    popq %r15
3609; AVX512BW-NEXT:    popq %rbp
3610; AVX512BW-NEXT:    retq
3611  %t = call {<2 x i128>, <2 x i1>} @llvm.smul.with.overflow.v2i128(<2 x i128> %a0, <2 x i128> %a1)
3612  %val = extractvalue {<2 x i128>, <2 x i1>} %t, 0
3613  %obit = extractvalue {<2 x i128>, <2 x i1>} %t, 1
3614  %res = sext <2 x i1> %obit to <2 x i32>
3615  store <2 x i128> %val, <2 x i128>* %p2
3616  ret <2 x i32> %res
3617}
3618