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