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