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