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