1; RUN: llc -march=x86-64 -mcpu=core2 -mattr=+sse4.1 < %s | FileCheck %s --check-prefix=SSE41
2; RUN: llc -march=x86-64 -mcpu=core2 < %s | FileCheck %s --check-prefix=SSE
3; RUN: llc -march=x86-64 -mcpu=core-avx2 < %s | FileCheck %s --check-prefix=AVX
4
5target triple = "x86_64-unknown-unknown"
6
7define <4 x i32> @test1(<4 x i32> %a) {
8; SSE41-LABEL: test1:
9; SSE41:       # BB#0:
10; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
11; SSE41-NEXT:    movdqa %xmm0, %xmm2
12; SSE41-NEXT:    pmuludq %xmm1, %xmm2
13; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
14; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
15; SSE41-NEXT:    pmuludq %xmm1, %xmm3
16; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
17; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
18; SSE41-NEXT:    psubd %xmm2, %xmm0
19; SSE41-NEXT:    psrld $1, %xmm0
20; SSE41-NEXT:    paddd %xmm2, %xmm0
21; SSE41-NEXT:    psrld $2, %xmm0
22; SSE41-NEXT:    retq
23;
24; SSE-LABEL: test1:
25; SSE:       # BB#0:
26; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
27; SSE-NEXT:    movdqa %xmm0, %xmm2
28; SSE-NEXT:    pmuludq %xmm1, %xmm2
29; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
30; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
31; SSE-NEXT:    pmuludq %xmm1, %xmm3
32; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
33; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
34; SSE-NEXT:    psubd %xmm2, %xmm0
35; SSE-NEXT:    psrld $1, %xmm0
36; SSE-NEXT:    paddd %xmm2, %xmm0
37; SSE-NEXT:    psrld $2, %xmm0
38; SSE-NEXT:    retq
39;
40; AVX-LABEL: test1:
41; AVX:       # BB#0:
42; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
43; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
44; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
45; AVX-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
46; AVX-NEXT:    vpmuludq %xmm1, %xmm3, %xmm1
47; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm2[1,3],xmm1[1,3]
48; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2,1,3]
49; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
50; AVX-NEXT:    vpsrld $1, %xmm0, %xmm0
51; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
52; AVX-NEXT:    vpsrld $2, %xmm0, %xmm0
53; AVX-NEXT:    retq
54  %div = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
55  ret <4 x i32> %div
56}
57
58define <8 x i32> @test2(<8 x i32> %a) {
59; SSE41-LABEL: test2:
60; SSE41:       # BB#0:
61; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
62; SSE41-NEXT:    movdqa %xmm0, %xmm3
63; SSE41-NEXT:    pmuludq %xmm2, %xmm3
64; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
65; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
66; SSE41-NEXT:    pmuludq %xmm4, %xmm5
67; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
68; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2,1,3]
69; SSE41-NEXT:    psubd %xmm3, %xmm0
70; SSE41-NEXT:    psrld $1, %xmm0
71; SSE41-NEXT:    paddd %xmm3, %xmm0
72; SSE41-NEXT:    psrld $2, %xmm0
73; SSE41-NEXT:    pmuludq %xmm1, %xmm2
74; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
75; SSE41-NEXT:    pmuludq %xmm4, %xmm3
76; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
77; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
78; SSE41-NEXT:    psubd %xmm2, %xmm1
79; SSE41-NEXT:    psrld $1, %xmm1
80; SSE41-NEXT:    paddd %xmm2, %xmm1
81; SSE41-NEXT:    psrld $2, %xmm1
82; SSE41-NEXT:    retq
83;
84; SSE-LABEL: test2:
85; SSE:       # BB#0:
86; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
87; SSE-NEXT:    movdqa %xmm0, %xmm3
88; SSE-NEXT:    pmuludq %xmm2, %xmm3
89; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
90; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
91; SSE-NEXT:    pmuludq %xmm4, %xmm5
92; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
93; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2,1,3]
94; SSE-NEXT:    psubd %xmm3, %xmm0
95; SSE-NEXT:    psrld $1, %xmm0
96; SSE-NEXT:    paddd %xmm3, %xmm0
97; SSE-NEXT:    psrld $2, %xmm0
98; SSE-NEXT:    pmuludq %xmm1, %xmm2
99; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
100; SSE-NEXT:    pmuludq %xmm4, %xmm3
101; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
102; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
103; SSE-NEXT:    psubd %xmm2, %xmm1
104; SSE-NEXT:    psrld $1, %xmm1
105; SSE-NEXT:    paddd %xmm2, %xmm1
106; SSE-NEXT:    psrld $2, %xmm1
107; SSE-NEXT:    retq
108;
109; AVX-LABEL: test2:
110; AVX:       # BB#0:
111; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
112; AVX-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
113; AVX-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
114; AVX-NEXT:    vpmuludq %ymm2, %ymm3, %ymm2
115; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm1
116; AVX-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
117; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
118; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
119; AVX-NEXT:    vpsrld $1, %ymm0, %ymm0
120; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
121; AVX-NEXT:    vpsrld $2, %ymm0, %ymm0
122; AVX-NEXT:    retq
123  %div = udiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
124  ret <8 x i32> %div
125}
126
127define <8 x i16> @test3(<8 x i16> %a) {
128; SSE41-LABEL: test3:
129; SSE41:       # BB#0:
130; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
131; SSE41-NEXT:    pmulhuw %xmm0, %xmm1
132; SSE41-NEXT:    psubw %xmm1, %xmm0
133; SSE41-NEXT:    psrlw $1, %xmm0
134; SSE41-NEXT:    paddw %xmm1, %xmm0
135; SSE41-NEXT:    psrlw $2, %xmm0
136; SSE41-NEXT:    retq
137;
138; SSE-LABEL: test3:
139; SSE:       # BB#0:
140; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
141; SSE-NEXT:    pmulhuw %xmm0, %xmm1
142; SSE-NEXT:    psubw %xmm1, %xmm0
143; SSE-NEXT:    psrlw $1, %xmm0
144; SSE-NEXT:    paddw %xmm1, %xmm0
145; SSE-NEXT:    psrlw $2, %xmm0
146; SSE-NEXT:    retq
147;
148; AVX-LABEL: test3:
149; AVX:       # BB#0:
150; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %xmm0, %xmm1
151; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
152; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm0
153; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
154; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm0
155; AVX-NEXT:    retq
156  %div = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
157  ret <8 x i16> %div
158}
159
160define <16 x i16> @test4(<16 x i16> %a) {
161; SSE41-LABEL: test4:
162; SSE41:       # BB#0:
163; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363]
164; SSE41-NEXT:    movdqa %xmm0, %xmm3
165; SSE41-NEXT:    pmulhuw %xmm2, %xmm3
166; SSE41-NEXT:    psubw %xmm3, %xmm0
167; SSE41-NEXT:    psrlw $1, %xmm0
168; SSE41-NEXT:    paddw %xmm3, %xmm0
169; SSE41-NEXT:    psrlw $2, %xmm0
170; SSE41-NEXT:    pmulhuw %xmm1, %xmm2
171; SSE41-NEXT:    psubw %xmm2, %xmm1
172; SSE41-NEXT:    psrlw $1, %xmm1
173; SSE41-NEXT:    paddw %xmm2, %xmm1
174; SSE41-NEXT:    psrlw $2, %xmm1
175; SSE41-NEXT:    retq
176;
177; SSE-LABEL: test4:
178; SSE:       # BB#0:
179; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363]
180; SSE-NEXT:    movdqa %xmm0, %xmm3
181; SSE-NEXT:    pmulhuw %xmm2, %xmm3
182; SSE-NEXT:    psubw %xmm3, %xmm0
183; SSE-NEXT:    psrlw $1, %xmm0
184; SSE-NEXT:    paddw %xmm3, %xmm0
185; SSE-NEXT:    psrlw $2, %xmm0
186; SSE-NEXT:    pmulhuw %xmm1, %xmm2
187; SSE-NEXT:    psubw %xmm2, %xmm1
188; SSE-NEXT:    psrlw $1, %xmm1
189; SSE-NEXT:    paddw %xmm2, %xmm1
190; SSE-NEXT:    psrlw $2, %xmm1
191; SSE-NEXT:    retq
192;
193; AVX-LABEL: test4:
194; AVX:       # BB#0:
195; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %ymm0, %ymm1
196; AVX-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
197; AVX-NEXT:    vpsrlw $1, %ymm0, %ymm0
198; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
199; AVX-NEXT:    vpsrlw $2, %ymm0, %ymm0
200; AVX-NEXT:    retq
201  %div = udiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7>
202  ret <16 x i16> %div
203}
204
205define <8 x i16> @test5(<8 x i16> %a) {
206; SSE41-LABEL: test5:
207; SSE41:       # BB#0:
208; SSE41-NEXT:    pmulhw {{.*}}(%rip), %xmm0
209; SSE41-NEXT:    movdqa %xmm0, %xmm1
210; SSE41-NEXT:    psrlw $15, %xmm1
211; SSE41-NEXT:    psraw $1, %xmm0
212; SSE41-NEXT:    paddw %xmm1, %xmm0
213; SSE41-NEXT:    retq
214;
215; SSE-LABEL: test5:
216; SSE:       # BB#0:
217; SSE-NEXT:    pmulhw {{.*}}(%rip), %xmm0
218; SSE-NEXT:    movdqa %xmm0, %xmm1
219; SSE-NEXT:    psrlw $15, %xmm1
220; SSE-NEXT:    psraw $1, %xmm0
221; SSE-NEXT:    paddw %xmm1, %xmm0
222; SSE-NEXT:    retq
223;
224; AVX-LABEL: test5:
225; AVX:       # BB#0:
226; AVX-NEXT:    vpmulhw {{.*}}(%rip), %xmm0, %xmm0
227; AVX-NEXT:    vpsrlw $15, %xmm0, %xmm1
228; AVX-NEXT:    vpsraw $1, %xmm0, %xmm0
229; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
230; AVX-NEXT:    retq
231  %div = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
232  ret <8 x i16> %div
233}
234
235define <16 x i16> @test6(<16 x i16> %a) {
236; SSE41-LABEL: test6:
237; SSE41:       # BB#0:
238; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]
239; SSE41-NEXT:    pmulhw %xmm2, %xmm0
240; SSE41-NEXT:    movdqa %xmm0, %xmm3
241; SSE41-NEXT:    psrlw $15, %xmm3
242; SSE41-NEXT:    psraw $1, %xmm0
243; SSE41-NEXT:    paddw %xmm3, %xmm0
244; SSE41-NEXT:    pmulhw %xmm2, %xmm1
245; SSE41-NEXT:    movdqa %xmm1, %xmm2
246; SSE41-NEXT:    psrlw $15, %xmm2
247; SSE41-NEXT:    psraw $1, %xmm1
248; SSE41-NEXT:    paddw %xmm2, %xmm1
249; SSE41-NEXT:    retq
250;
251; SSE-LABEL: test6:
252; SSE:       # BB#0:
253; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]
254; SSE-NEXT:    pmulhw %xmm2, %xmm0
255; SSE-NEXT:    movdqa %xmm0, %xmm3
256; SSE-NEXT:    psrlw $15, %xmm3
257; SSE-NEXT:    psraw $1, %xmm0
258; SSE-NEXT:    paddw %xmm3, %xmm0
259; SSE-NEXT:    pmulhw %xmm2, %xmm1
260; SSE-NEXT:    movdqa %xmm1, %xmm2
261; SSE-NEXT:    psrlw $15, %xmm2
262; SSE-NEXT:    psraw $1, %xmm1
263; SSE-NEXT:    paddw %xmm2, %xmm1
264; SSE-NEXT:    retq
265;
266; AVX-LABEL: test6:
267; AVX:       # BB#0:
268; AVX-NEXT:    vpmulhw {{.*}}(%rip), %ymm0, %ymm0
269; AVX-NEXT:    vpsrlw $15, %ymm0, %ymm1
270; AVX-NEXT:    vpsraw $1, %ymm0, %ymm0
271; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
272; AVX-NEXT:    retq
273  %div = sdiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7>
274  ret <16 x i16> %div
275}
276
277define <16 x i8> @test7(<16 x i8> %a) {
278; SSE41-LABEL: test7:
279; SSE41:       # BB#0:
280; SSE41-NEXT:    pextrb $1, %xmm0, %eax
281; SSE41-NEXT:    movsbl %al, %eax
282; SSE41-NEXT:    imull $-109, %eax, %ecx
283; SSE41-NEXT:    shrl $8, %ecx
284; SSE41-NEXT:    addb %cl, %al
285; SSE41-NEXT:    movb %al, %cl
286; SSE41-NEXT:    shrb $7, %cl
287; SSE41-NEXT:    sarb $2, %al
288; SSE41-NEXT:    addb %cl, %al
289; SSE41-NEXT:    movzbl %al, %eax
290; SSE41-NEXT:    pextrb $0, %xmm0, %ecx
291; SSE41-NEXT:    movsbl %cl, %ecx
292; SSE41-NEXT:    imull $-109, %ecx, %edx
293; SSE41-NEXT:    shrl $8, %edx
294; SSE41-NEXT:    addb %dl, %cl
295; SSE41-NEXT:    movb %cl, %dl
296; SSE41-NEXT:    shrb $7, %dl
297; SSE41-NEXT:    sarb $2, %cl
298; SSE41-NEXT:    addb %dl, %cl
299; SSE41-NEXT:    movzbl %cl, %ecx
300; SSE41-NEXT:    movd %ecx, %xmm1
301; SSE41-NEXT:    pinsrb $1, %eax, %xmm1
302; SSE41-NEXT:    pextrb $2, %xmm0, %eax
303; SSE41-NEXT:    movsbl %al, %eax
304; SSE41-NEXT:    imull $-109, %eax, %ecx
305; SSE41-NEXT:    shrl $8, %ecx
306; SSE41-NEXT:    addb %cl, %al
307; SSE41-NEXT:    movb %al, %cl
308; SSE41-NEXT:    shrb $7, %cl
309; SSE41-NEXT:    sarb $2, %al
310; SSE41-NEXT:    addb %cl, %al
311; SSE41-NEXT:    movzbl %al, %eax
312; SSE41-NEXT:    pinsrb $2, %eax, %xmm1
313; SSE41-NEXT:    pextrb $3, %xmm0, %eax
314; SSE41-NEXT:    movsbl %al, %eax
315; SSE41-NEXT:    imull $-109, %eax, %ecx
316; SSE41-NEXT:    shrl $8, %ecx
317; SSE41-NEXT:    addb %cl, %al
318; SSE41-NEXT:    movb %al, %cl
319; SSE41-NEXT:    shrb $7, %cl
320; SSE41-NEXT:    sarb $2, %al
321; SSE41-NEXT:    addb %cl, %al
322; SSE41-NEXT:    movzbl %al, %eax
323; SSE41-NEXT:    pinsrb $3, %eax, %xmm1
324; SSE41-NEXT:    pextrb $4, %xmm0, %eax
325; SSE41-NEXT:    movsbl %al, %eax
326; SSE41-NEXT:    imull $-109, %eax, %ecx
327; SSE41-NEXT:    shrl $8, %ecx
328; SSE41-NEXT:    addb %cl, %al
329; SSE41-NEXT:    movb %al, %cl
330; SSE41-NEXT:    shrb $7, %cl
331; SSE41-NEXT:    sarb $2, %al
332; SSE41-NEXT:    addb %cl, %al
333; SSE41-NEXT:    movzbl %al, %eax
334; SSE41-NEXT:    pinsrb $4, %eax, %xmm1
335; SSE41-NEXT:    pextrb $5, %xmm0, %eax
336; SSE41-NEXT:    movsbl %al, %eax
337; SSE41-NEXT:    imull $-109, %eax, %ecx
338; SSE41-NEXT:    shrl $8, %ecx
339; SSE41-NEXT:    addb %cl, %al
340; SSE41-NEXT:    movb %al, %cl
341; SSE41-NEXT:    shrb $7, %cl
342; SSE41-NEXT:    sarb $2, %al
343; SSE41-NEXT:    addb %cl, %al
344; SSE41-NEXT:    movzbl %al, %eax
345; SSE41-NEXT:    pinsrb $5, %eax, %xmm1
346; SSE41-NEXT:    pextrb $6, %xmm0, %eax
347; SSE41-NEXT:    movsbl %al, %eax
348; SSE41-NEXT:    imull $-109, %eax, %ecx
349; SSE41-NEXT:    shrl $8, %ecx
350; SSE41-NEXT:    addb %cl, %al
351; SSE41-NEXT:    movb %al, %cl
352; SSE41-NEXT:    shrb $7, %cl
353; SSE41-NEXT:    sarb $2, %al
354; SSE41-NEXT:    addb %cl, %al
355; SSE41-NEXT:    movzbl %al, %eax
356; SSE41-NEXT:    pinsrb $6, %eax, %xmm1
357; SSE41-NEXT:    pextrb $7, %xmm0, %eax
358; SSE41-NEXT:    movsbl %al, %eax
359; SSE41-NEXT:    imull $-109, %eax, %ecx
360; SSE41-NEXT:    shrl $8, %ecx
361; SSE41-NEXT:    addb %cl, %al
362; SSE41-NEXT:    movb %al, %cl
363; SSE41-NEXT:    shrb $7, %cl
364; SSE41-NEXT:    sarb $2, %al
365; SSE41-NEXT:    addb %cl, %al
366; SSE41-NEXT:    movzbl %al, %eax
367; SSE41-NEXT:    pinsrb $7, %eax, %xmm1
368; SSE41-NEXT:    pextrb $8, %xmm0, %eax
369; SSE41-NEXT:    movsbl %al, %eax
370; SSE41-NEXT:    imull $-109, %eax, %ecx
371; SSE41-NEXT:    shrl $8, %ecx
372; SSE41-NEXT:    addb %cl, %al
373; SSE41-NEXT:    movb %al, %cl
374; SSE41-NEXT:    shrb $7, %cl
375; SSE41-NEXT:    sarb $2, %al
376; SSE41-NEXT:    addb %cl, %al
377; SSE41-NEXT:    movzbl %al, %eax
378; SSE41-NEXT:    pinsrb $8, %eax, %xmm1
379; SSE41-NEXT:    pextrb $9, %xmm0, %eax
380; SSE41-NEXT:    movsbl %al, %eax
381; SSE41-NEXT:    imull $-109, %eax, %ecx
382; SSE41-NEXT:    shrl $8, %ecx
383; SSE41-NEXT:    addb %cl, %al
384; SSE41-NEXT:    movb %al, %cl
385; SSE41-NEXT:    shrb $7, %cl
386; SSE41-NEXT:    sarb $2, %al
387; SSE41-NEXT:    addb %cl, %al
388; SSE41-NEXT:    movzbl %al, %eax
389; SSE41-NEXT:    pinsrb $9, %eax, %xmm1
390; SSE41-NEXT:    pextrb $10, %xmm0, %eax
391; SSE41-NEXT:    movsbl %al, %eax
392; SSE41-NEXT:    imull $-109, %eax, %ecx
393; SSE41-NEXT:    shrl $8, %ecx
394; SSE41-NEXT:    addb %cl, %al
395; SSE41-NEXT:    movb %al, %cl
396; SSE41-NEXT:    shrb $7, %cl
397; SSE41-NEXT:    sarb $2, %al
398; SSE41-NEXT:    addb %cl, %al
399; SSE41-NEXT:    movzbl %al, %eax
400; SSE41-NEXT:    pinsrb $10, %eax, %xmm1
401; SSE41-NEXT:    pextrb $11, %xmm0, %eax
402; SSE41-NEXT:    movsbl %al, %eax
403; SSE41-NEXT:    imull $-109, %eax, %ecx
404; SSE41-NEXT:    shrl $8, %ecx
405; SSE41-NEXT:    addb %cl, %al
406; SSE41-NEXT:    movb %al, %cl
407; SSE41-NEXT:    shrb $7, %cl
408; SSE41-NEXT:    sarb $2, %al
409; SSE41-NEXT:    addb %cl, %al
410; SSE41-NEXT:    movzbl %al, %eax
411; SSE41-NEXT:    pinsrb $11, %eax, %xmm1
412; SSE41-NEXT:    pextrb $12, %xmm0, %eax
413; SSE41-NEXT:    movsbl %al, %eax
414; SSE41-NEXT:    imull $-109, %eax, %ecx
415; SSE41-NEXT:    shrl $8, %ecx
416; SSE41-NEXT:    addb %cl, %al
417; SSE41-NEXT:    movb %al, %cl
418; SSE41-NEXT:    shrb $7, %cl
419; SSE41-NEXT:    sarb $2, %al
420; SSE41-NEXT:    addb %cl, %al
421; SSE41-NEXT:    movzbl %al, %eax
422; SSE41-NEXT:    pinsrb $12, %eax, %xmm1
423; SSE41-NEXT:    pextrb $13, %xmm0, %eax
424; SSE41-NEXT:    movsbl %al, %eax
425; SSE41-NEXT:    imull $-109, %eax, %ecx
426; SSE41-NEXT:    shrl $8, %ecx
427; SSE41-NEXT:    addb %cl, %al
428; SSE41-NEXT:    movb %al, %cl
429; SSE41-NEXT:    shrb $7, %cl
430; SSE41-NEXT:    sarb $2, %al
431; SSE41-NEXT:    addb %cl, %al
432; SSE41-NEXT:    movzbl %al, %eax
433; SSE41-NEXT:    pinsrb $13, %eax, %xmm1
434; SSE41-NEXT:    pextrb $14, %xmm0, %eax
435; SSE41-NEXT:    movsbl %al, %eax
436; SSE41-NEXT:    imull $-109, %eax, %ecx
437; SSE41-NEXT:    shrl $8, %ecx
438; SSE41-NEXT:    addb %cl, %al
439; SSE41-NEXT:    movb %al, %cl
440; SSE41-NEXT:    shrb $7, %cl
441; SSE41-NEXT:    sarb $2, %al
442; SSE41-NEXT:    addb %cl, %al
443; SSE41-NEXT:    movzbl %al, %eax
444; SSE41-NEXT:    pinsrb $14, %eax, %xmm1
445; SSE41-NEXT:    pextrb $15, %xmm0, %eax
446; SSE41-NEXT:    movsbl %al, %eax
447; SSE41-NEXT:    imull $-109, %eax, %ecx
448; SSE41-NEXT:    shrl $8, %ecx
449; SSE41-NEXT:    addb %cl, %al
450; SSE41-NEXT:    movb %al, %cl
451; SSE41-NEXT:    shrb $7, %cl
452; SSE41-NEXT:    sarb $2, %al
453; SSE41-NEXT:    addb %cl, %al
454; SSE41-NEXT:    movzbl %al, %eax
455; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
456; SSE41-NEXT:    movdqa %xmm1, %xmm0
457; SSE41-NEXT:    retq
458;
459; SSE-LABEL: test7:
460; SSE:       # BB#0:
461; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
462; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
463; SSE-NEXT:    imull $-109, %eax, %ecx
464; SSE-NEXT:    shrl $8, %ecx
465; SSE-NEXT:    addb %al, %cl
466; SSE-NEXT:    movb %cl, %al
467; SSE-NEXT:    shrb $7, %al
468; SSE-NEXT:    sarb $2, %cl
469; SSE-NEXT:    addb %al, %cl
470; SSE-NEXT:    movzbl %cl, %eax
471; SSE-NEXT:    movd %eax, %xmm0
472; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
473; SSE-NEXT:    imull $-109, %eax, %ecx
474; SSE-NEXT:    shrl $8, %ecx
475; SSE-NEXT:    addb %al, %cl
476; SSE-NEXT:    movb %cl, %al
477; SSE-NEXT:    shrb $7, %al
478; SSE-NEXT:    sarb $2, %cl
479; SSE-NEXT:    addb %al, %cl
480; SSE-NEXT:    movzbl %cl, %eax
481; SSE-NEXT:    movd %eax, %xmm1
482; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
483; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
484; SSE-NEXT:    imull $-109, %eax, %ecx
485; SSE-NEXT:    shrl $8, %ecx
486; SSE-NEXT:    addb %al, %cl
487; SSE-NEXT:    movb %cl, %al
488; SSE-NEXT:    shrb $7, %al
489; SSE-NEXT:    sarb $2, %cl
490; SSE-NEXT:    addb %al, %cl
491; SSE-NEXT:    movzbl %cl, %eax
492; SSE-NEXT:    movd %eax, %xmm2
493; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
494; SSE-NEXT:    imull $-109, %eax, %ecx
495; SSE-NEXT:    shrl $8, %ecx
496; SSE-NEXT:    addb %al, %cl
497; SSE-NEXT:    movb %cl, %al
498; SSE-NEXT:    shrb $7, %al
499; SSE-NEXT:    sarb $2, %cl
500; SSE-NEXT:    addb %al, %cl
501; SSE-NEXT:    movzbl %cl, %eax
502; SSE-NEXT:    movd %eax, %xmm0
503; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
504; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
505; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
506; SSE-NEXT:    imull $-109, %eax, %ecx
507; SSE-NEXT:    shrl $8, %ecx
508; SSE-NEXT:    addb %al, %cl
509; SSE-NEXT:    movb %cl, %al
510; SSE-NEXT:    shrb $7, %al
511; SSE-NEXT:    sarb $2, %cl
512; SSE-NEXT:    addb %al, %cl
513; SSE-NEXT:    movzbl %cl, %eax
514; SSE-NEXT:    movd %eax, %xmm1
515; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
516; SSE-NEXT:    imull $-109, %eax, %ecx
517; SSE-NEXT:    shrl $8, %ecx
518; SSE-NEXT:    addb %al, %cl
519; SSE-NEXT:    movb %cl, %al
520; SSE-NEXT:    shrb $7, %al
521; SSE-NEXT:    sarb $2, %cl
522; SSE-NEXT:    addb %al, %cl
523; SSE-NEXT:    movzbl %cl, %eax
524; SSE-NEXT:    movd %eax, %xmm2
525; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = 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]
526; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
527; SSE-NEXT:    imull $-109, %eax, %ecx
528; SSE-NEXT:    shrl $8, %ecx
529; SSE-NEXT:    addb %al, %cl
530; SSE-NEXT:    movb %cl, %al
531; SSE-NEXT:    shrb $7, %al
532; SSE-NEXT:    sarb $2, %cl
533; SSE-NEXT:    addb %al, %cl
534; SSE-NEXT:    movzbl %cl, %eax
535; SSE-NEXT:    movd %eax, %xmm3
536; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
537; SSE-NEXT:    imull $-109, %eax, %ecx
538; SSE-NEXT:    shrl $8, %ecx
539; SSE-NEXT:    addb %al, %cl
540; SSE-NEXT:    movb %cl, %al
541; SSE-NEXT:    shrb $7, %al
542; SSE-NEXT:    sarb $2, %cl
543; SSE-NEXT:    addb %al, %cl
544; SSE-NEXT:    movzbl %cl, %eax
545; SSE-NEXT:    movd %eax, %xmm1
546; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
547; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
548; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
549; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
550; SSE-NEXT:    imull $-109, %eax, %ecx
551; SSE-NEXT:    shrl $8, %ecx
552; SSE-NEXT:    addb %al, %cl
553; SSE-NEXT:    movb %cl, %al
554; SSE-NEXT:    shrb $7, %al
555; SSE-NEXT:    sarb $2, %cl
556; SSE-NEXT:    addb %al, %cl
557; SSE-NEXT:    movzbl %cl, %eax
558; SSE-NEXT:    movd %eax, %xmm2
559; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
560; SSE-NEXT:    imull $-109, %eax, %ecx
561; SSE-NEXT:    shrl $8, %ecx
562; SSE-NEXT:    addb %al, %cl
563; SSE-NEXT:    movb %cl, %al
564; SSE-NEXT:    shrb $7, %al
565; SSE-NEXT:    sarb $2, %cl
566; SSE-NEXT:    addb %al, %cl
567; SSE-NEXT:    movzbl %cl, %eax
568; SSE-NEXT:    movd %eax, %xmm0
569; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
570; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
571; SSE-NEXT:    imull $-109, %eax, %ecx
572; SSE-NEXT:    shrl $8, %ecx
573; SSE-NEXT:    addb %al, %cl
574; SSE-NEXT:    movb %cl, %al
575; SSE-NEXT:    shrb $7, %al
576; SSE-NEXT:    sarb $2, %cl
577; SSE-NEXT:    addb %al, %cl
578; SSE-NEXT:    movzbl %cl, %eax
579; SSE-NEXT:    movd %eax, %xmm3
580; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
581; SSE-NEXT:    imull $-109, %eax, %ecx
582; SSE-NEXT:    shrl $8, %ecx
583; SSE-NEXT:    addb %al, %cl
584; SSE-NEXT:    movb %cl, %al
585; SSE-NEXT:    shrb $7, %al
586; SSE-NEXT:    sarb $2, %cl
587; SSE-NEXT:    addb %al, %cl
588; SSE-NEXT:    movzbl %cl, %eax
589; SSE-NEXT:    movd %eax, %xmm2
590; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = 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]
591; SSE-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]
592; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
593; SSE-NEXT:    imull $-109, %eax, %ecx
594; SSE-NEXT:    shrl $8, %ecx
595; SSE-NEXT:    addb %al, %cl
596; SSE-NEXT:    movb %cl, %al
597; SSE-NEXT:    shrb $7, %al
598; SSE-NEXT:    sarb $2, %cl
599; SSE-NEXT:    addb %al, %cl
600; SSE-NEXT:    movzbl %cl, %eax
601; SSE-NEXT:    movd %eax, %xmm0
602; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
603; SSE-NEXT:    imull $-109, %eax, %ecx
604; SSE-NEXT:    shrl $8, %ecx
605; SSE-NEXT:    addb %al, %cl
606; SSE-NEXT:    movb %cl, %al
607; SSE-NEXT:    shrb $7, %al
608; SSE-NEXT:    sarb $2, %cl
609; SSE-NEXT:    addb %al, %cl
610; SSE-NEXT:    movzbl %cl, %eax
611; SSE-NEXT:    movd %eax, %xmm3
612; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
613; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
614; SSE-NEXT:    imull $-109, %eax, %ecx
615; SSE-NEXT:    shrl $8, %ecx
616; SSE-NEXT:    addb %al, %cl
617; SSE-NEXT:    movb %cl, %al
618; SSE-NEXT:    shrb $7, %al
619; SSE-NEXT:    sarb $2, %cl
620; SSE-NEXT:    addb %al, %cl
621; SSE-NEXT:    movzbl %cl, %eax
622; SSE-NEXT:    movd %eax, %xmm4
623; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
624; SSE-NEXT:    imull $-109, %eax, %ecx
625; SSE-NEXT:    shrl $8, %ecx
626; SSE-NEXT:    addb %al, %cl
627; SSE-NEXT:    movb %cl, %al
628; SSE-NEXT:    shrb $7, %al
629; SSE-NEXT:    sarb $2, %cl
630; SSE-NEXT:    addb %al, %cl
631; SSE-NEXT:    movzbl %cl, %eax
632; SSE-NEXT:    movd %eax, %xmm0
633; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
634; SSE-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]
635; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
636; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
637; SSE-NEXT:    retq
638;
639; AVX-LABEL: test7:
640; AVX:       # BB#0:
641; AVX-NEXT:    vpextrb $1, %xmm0, %eax
642; AVX-NEXT:    movsbl %al, %eax
643; AVX-NEXT:    imull $-109, %eax, %ecx
644; AVX-NEXT:    shrl $8, %ecx
645; AVX-NEXT:    addb %cl, %al
646; AVX-NEXT:    movb %al, %cl
647; AVX-NEXT:    shrb $7, %cl
648; AVX-NEXT:    sarb $2, %al
649; AVX-NEXT:    addb %cl, %al
650; AVX-NEXT:    movzbl %al, %eax
651; AVX-NEXT:    vpextrb $0, %xmm0, %ecx
652; AVX-NEXT:    movsbl %cl, %ecx
653; AVX-NEXT:    imull $-109, %ecx, %edx
654; AVX-NEXT:    shrl $8, %edx
655; AVX-NEXT:    addb %dl, %cl
656; AVX-NEXT:    movb %cl, %dl
657; AVX-NEXT:    shrb $7, %dl
658; AVX-NEXT:    sarb $2, %cl
659; AVX-NEXT:    addb %dl, %cl
660; AVX-NEXT:    movzbl %cl, %ecx
661; AVX-NEXT:    vmovd %ecx, %xmm1
662; AVX-NEXT:    vpextrb $2, %xmm0, %ecx
663; AVX-NEXT:    movsbl %cl, %ecx
664; AVX-NEXT:    imull $-109, %ecx, %edx
665; AVX-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
666; AVX-NEXT:    shrl $8, %edx
667; AVX-NEXT:    addb %dl, %cl
668; AVX-NEXT:    movb %cl, %al
669; AVX-NEXT:    shrb $7, %al
670; AVX-NEXT:    sarb $2, %cl
671; AVX-NEXT:    addb %al, %cl
672; AVX-NEXT:    movzbl %cl, %eax
673; AVX-NEXT:    vpextrb $3, %xmm0, %ecx
674; AVX-NEXT:    movsbl %cl, %ecx
675; AVX-NEXT:    imull $-109, %ecx, %edx
676; AVX-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
677; AVX-NEXT:    shrl $8, %edx
678; AVX-NEXT:    addb %dl, %cl
679; AVX-NEXT:    movb %cl, %al
680; AVX-NEXT:    shrb $7, %al
681; AVX-NEXT:    sarb $2, %cl
682; AVX-NEXT:    addb %al, %cl
683; AVX-NEXT:    movzbl %cl, %eax
684; AVX-NEXT:    vpextrb $4, %xmm0, %ecx
685; AVX-NEXT:    movsbl %cl, %ecx
686; AVX-NEXT:    imull $-109, %ecx, %edx
687; AVX-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
688; AVX-NEXT:    shrl $8, %edx
689; AVX-NEXT:    addb %dl, %cl
690; AVX-NEXT:    movb %cl, %al
691; AVX-NEXT:    shrb $7, %al
692; AVX-NEXT:    sarb $2, %cl
693; AVX-NEXT:    addb %al, %cl
694; AVX-NEXT:    movzbl %cl, %eax
695; AVX-NEXT:    vpextrb $5, %xmm0, %ecx
696; AVX-NEXT:    movsbl %cl, %ecx
697; AVX-NEXT:    imull $-109, %ecx, %edx
698; AVX-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
699; AVX-NEXT:    shrl $8, %edx
700; AVX-NEXT:    addb %dl, %cl
701; AVX-NEXT:    movb %cl, %al
702; AVX-NEXT:    shrb $7, %al
703; AVX-NEXT:    sarb $2, %cl
704; AVX-NEXT:    addb %al, %cl
705; AVX-NEXT:    movzbl %cl, %eax
706; AVX-NEXT:    vpextrb $6, %xmm0, %ecx
707; AVX-NEXT:    movsbl %cl, %ecx
708; AVX-NEXT:    imull $-109, %ecx, %edx
709; AVX-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
710; AVX-NEXT:    shrl $8, %edx
711; AVX-NEXT:    addb %dl, %cl
712; AVX-NEXT:    movb %cl, %al
713; AVX-NEXT:    shrb $7, %al
714; AVX-NEXT:    sarb $2, %cl
715; AVX-NEXT:    addb %al, %cl
716; AVX-NEXT:    movzbl %cl, %eax
717; AVX-NEXT:    vpextrb $7, %xmm0, %ecx
718; AVX-NEXT:    movsbl %cl, %ecx
719; AVX-NEXT:    imull $-109, %ecx, %edx
720; AVX-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
721; AVX-NEXT:    shrl $8, %edx
722; AVX-NEXT:    addb %dl, %cl
723; AVX-NEXT:    movb %cl, %al
724; AVX-NEXT:    shrb $7, %al
725; AVX-NEXT:    sarb $2, %cl
726; AVX-NEXT:    addb %al, %cl
727; AVX-NEXT:    movzbl %cl, %eax
728; AVX-NEXT:    vpextrb $8, %xmm0, %ecx
729; AVX-NEXT:    movsbl %cl, %ecx
730; AVX-NEXT:    imull $-109, %ecx, %edx
731; AVX-NEXT:    vpinsrb $7, %eax, %xmm1, %xmm1
732; AVX-NEXT:    shrl $8, %edx
733; AVX-NEXT:    addb %dl, %cl
734; AVX-NEXT:    movb %cl, %al
735; AVX-NEXT:    shrb $7, %al
736; AVX-NEXT:    sarb $2, %cl
737; AVX-NEXT:    addb %al, %cl
738; AVX-NEXT:    movzbl %cl, %eax
739; AVX-NEXT:    vpextrb $9, %xmm0, %ecx
740; AVX-NEXT:    movsbl %cl, %ecx
741; AVX-NEXT:    imull $-109, %ecx, %edx
742; AVX-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
743; AVX-NEXT:    shrl $8, %edx
744; AVX-NEXT:    addb %dl, %cl
745; AVX-NEXT:    movb %cl, %al
746; AVX-NEXT:    shrb $7, %al
747; AVX-NEXT:    sarb $2, %cl
748; AVX-NEXT:    addb %al, %cl
749; AVX-NEXT:    movzbl %cl, %eax
750; AVX-NEXT:    vpextrb $10, %xmm0, %ecx
751; AVX-NEXT:    movsbl %cl, %ecx
752; AVX-NEXT:    imull $-109, %ecx, %edx
753; AVX-NEXT:    vpinsrb $9, %eax, %xmm1, %xmm1
754; AVX-NEXT:    shrl $8, %edx
755; AVX-NEXT:    addb %dl, %cl
756; AVX-NEXT:    movb %cl, %al
757; AVX-NEXT:    shrb $7, %al
758; AVX-NEXT:    sarb $2, %cl
759; AVX-NEXT:    addb %al, %cl
760; AVX-NEXT:    movzbl %cl, %eax
761; AVX-NEXT:    vpextrb $11, %xmm0, %ecx
762; AVX-NEXT:    movsbl %cl, %ecx
763; AVX-NEXT:    imull $-109, %ecx, %edx
764; AVX-NEXT:    vpinsrb $10, %eax, %xmm1, %xmm1
765; AVX-NEXT:    shrl $8, %edx
766; AVX-NEXT:    addb %dl, %cl
767; AVX-NEXT:    movb %cl, %al
768; AVX-NEXT:    shrb $7, %al
769; AVX-NEXT:    sarb $2, %cl
770; AVX-NEXT:    addb %al, %cl
771; AVX-NEXT:    movzbl %cl, %eax
772; AVX-NEXT:    vpextrb $12, %xmm0, %ecx
773; AVX-NEXT:    movsbl %cl, %ecx
774; AVX-NEXT:    imull $-109, %ecx, %edx
775; AVX-NEXT:    vpinsrb $11, %eax, %xmm1, %xmm1
776; AVX-NEXT:    shrl $8, %edx
777; AVX-NEXT:    addb %dl, %cl
778; AVX-NEXT:    movb %cl, %al
779; AVX-NEXT:    shrb $7, %al
780; AVX-NEXT:    sarb $2, %cl
781; AVX-NEXT:    addb %al, %cl
782; AVX-NEXT:    movzbl %cl, %eax
783; AVX-NEXT:    vpextrb $13, %xmm0, %ecx
784; AVX-NEXT:    movsbl %cl, %ecx
785; AVX-NEXT:    imull $-109, %ecx, %edx
786; AVX-NEXT:    vpinsrb $12, %eax, %xmm1, %xmm1
787; AVX-NEXT:    shrl $8, %edx
788; AVX-NEXT:    addb %dl, %cl
789; AVX-NEXT:    movb %cl, %al
790; AVX-NEXT:    shrb $7, %al
791; AVX-NEXT:    sarb $2, %cl
792; AVX-NEXT:    addb %al, %cl
793; AVX-NEXT:    movzbl %cl, %eax
794; AVX-NEXT:    vpextrb $14, %xmm0, %ecx
795; AVX-NEXT:    movsbl %cl, %ecx
796; AVX-NEXT:    imull $-109, %ecx, %edx
797; AVX-NEXT:    vpinsrb $13, %eax, %xmm1, %xmm1
798; AVX-NEXT:    shrl $8, %edx
799; AVX-NEXT:    addb %dl, %cl
800; AVX-NEXT:    movb %cl, %al
801; AVX-NEXT:    shrb $7, %al
802; AVX-NEXT:    sarb $2, %cl
803; AVX-NEXT:    addb %al, %cl
804; AVX-NEXT:    movzbl %cl, %eax
805; AVX-NEXT:    vpextrb $15, %xmm0, %ecx
806; AVX-NEXT:    movsbl %cl, %ecx
807; AVX-NEXT:    imull $-109, %ecx, %edx
808; AVX-NEXT:    vpinsrb $14, %eax, %xmm1, %xmm0
809; AVX-NEXT:    shrl $8, %edx
810; AVX-NEXT:    addb %dl, %cl
811; AVX-NEXT:    movb %cl, %al
812; AVX-NEXT:    shrb $7, %al
813; AVX-NEXT:    sarb $2, %cl
814; AVX-NEXT:    addb %al, %cl
815; AVX-NEXT:    movzbl %cl, %eax
816; AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
817; AVX-NEXT:    retq
818  %div = sdiv <16 x i8> %a, <i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,i8 7, i8 7, i8 7, i8 7>
819  ret <16 x i8> %div
820}
821
822define <4 x i32> @test8(<4 x i32> %a) {
823; SSE41-LABEL: test8:
824; SSE41:       # BB#0:
825; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]
826; SSE41-NEXT:    movdqa %xmm0, %xmm1
827; SSE41-NEXT:    pmuldq %xmm2, %xmm1
828; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
829; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
830; SSE41-NEXT:    pmuldq %xmm2, %xmm3
831; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,3],xmm3[1,3]
832; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2,1,3]
833; SSE41-NEXT:    paddd %xmm0, %xmm1
834; SSE41-NEXT:    movdqa %xmm1, %xmm0
835; SSE41-NEXT:    psrld $31, %xmm0
836; SSE41-NEXT:    psrad $2, %xmm1
837; SSE41-NEXT:    paddd %xmm0, %xmm1
838; SSE41-NEXT:    movdqa %xmm1, %xmm0
839; SSE41-NEXT:    retq
840;
841; SSE-LABEL: test8:
842; SSE:       # BB#0:
843; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]
844; SSE-NEXT:    movdqa %xmm2, %xmm1
845; SSE-NEXT:    psrad $31, %xmm1
846; SSE-NEXT:    pand %xmm0, %xmm1
847; SSE-NEXT:    movdqa %xmm0, %xmm3
848; SSE-NEXT:    psrad $31, %xmm3
849; SSE-NEXT:    pand %xmm2, %xmm3
850; SSE-NEXT:    paddd %xmm1, %xmm3
851; SSE-NEXT:    movdqa %xmm0, %xmm1
852; SSE-NEXT:    pmuludq %xmm2, %xmm1
853; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
854; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
855; SSE-NEXT:    pmuludq %xmm2, %xmm4
856; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,3],xmm4[1,3]
857; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2,1,3]
858; SSE-NEXT:    psubd %xmm3, %xmm1
859; SSE-NEXT:    paddd %xmm0, %xmm1
860; SSE-NEXT:    movdqa %xmm1, %xmm0
861; SSE-NEXT:    psrld $31, %xmm0
862; SSE-NEXT:    psrad $2, %xmm1
863; SSE-NEXT:    paddd %xmm0, %xmm1
864; SSE-NEXT:    movdqa %xmm1, %xmm0
865; SSE-NEXT:    retq
866;
867; AVX-LABEL: test8:
868; AVX:       # BB#0:
869; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
870; AVX-NEXT:    vpmuldq %xmm1, %xmm0, %xmm2
871; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
872; AVX-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
873; AVX-NEXT:    vpmuldq %xmm1, %xmm3, %xmm1
874; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm2[1,3],xmm1[1,3]
875; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm1[0,2,1,3]
876; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
877; AVX-NEXT:    vpsrld $31, %xmm0, %xmm1
878; AVX-NEXT:    vpsrad $2, %xmm0, %xmm0
879; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
880; AVX-NEXT:    retq
881  %div = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
882  ret <4 x i32> %div
883}
884
885define <8 x i32> @test9(<8 x i32> %a) {
886; SSE41-LABEL: test9:
887; SSE41:       # BB#0:
888; SSE41-NEXT:    movdqa %xmm1, %xmm2
889; SSE41-NEXT:    movdqa %xmm0, %xmm3
890; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
891; SSE41-NEXT:   # kill: XMM0<def> XMM3<kill>
892; SSE41-NEXT:    pmuldq %xmm1, %xmm0
893; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
894; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[1,1,3,3]
895; SSE41-NEXT:    pmuldq %xmm4, %xmm5
896; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm5[1,3]
897; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
898; SSE41-NEXT:    paddd %xmm3, %xmm0
899; SSE41-NEXT:    movdqa %xmm0, %xmm3
900; SSE41-NEXT:    psrld $31, %xmm3
901; SSE41-NEXT:    psrad $2, %xmm0
902; SSE41-NEXT:    paddd %xmm3, %xmm0
903; SSE41-NEXT:    pmuldq %xmm2, %xmm1
904; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
905; SSE41-NEXT:    pmuldq %xmm4, %xmm3
906; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,3],xmm3[1,3]
907; SSE41-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2,1,3]
908; SSE41-NEXT:    paddd %xmm2, %xmm1
909; SSE41-NEXT:    movdqa %xmm1, %xmm2
910; SSE41-NEXT:    psrld $31, %xmm2
911; SSE41-NEXT:    psrad $2, %xmm1
912; SSE41-NEXT:    paddd %xmm2, %xmm1
913; SSE41-NEXT:    retq
914;
915; SSE-LABEL: test9:
916; SSE:       # BB#0:
917; SSE-NEXT:    movdqa %xmm1, %xmm2
918; SSE-NEXT:    movdqa %xmm0, %xmm3
919; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
920; SSE-NEXT:    movdqa %xmm1, %xmm4
921; SSE-NEXT:    psrad $31, %xmm4
922; SSE-NEXT:    movdqa %xmm4, %xmm0
923; SSE-NEXT:    pand %xmm3, %xmm0
924; SSE-NEXT:    movdqa %xmm3, %xmm5
925; SSE-NEXT:    psrad $31, %xmm5
926; SSE-NEXT:    pand %xmm1, %xmm5
927; SSE-NEXT:    paddd %xmm0, %xmm5
928; SSE-NEXT:    movdqa %xmm3, %xmm0
929; SSE-NEXT:    pmuludq %xmm1, %xmm0
930; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm1[1,1,3,3]
931; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
932; SSE-NEXT:    pmuludq %xmm6, %xmm7
933; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm7[1,3]
934; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
935; SSE-NEXT:    psubd %xmm5, %xmm0
936; SSE-NEXT:    paddd %xmm3, %xmm0
937; SSE-NEXT:    movdqa %xmm0, %xmm3
938; SSE-NEXT:    psrld $31, %xmm3
939; SSE-NEXT:    psrad $2, %xmm0
940; SSE-NEXT:    paddd %xmm3, %xmm0
941; SSE-NEXT:    pand %xmm2, %xmm4
942; SSE-NEXT:    movdqa %xmm2, %xmm3
943; SSE-NEXT:    psrad $31, %xmm3
944; SSE-NEXT:    pand %xmm1, %xmm3
945; SSE-NEXT:    paddd %xmm4, %xmm3
946; SSE-NEXT:    pmuludq %xmm2, %xmm1
947; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
948; SSE-NEXT:    pmuludq %xmm6, %xmm4
949; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,3],xmm4[1,3]
950; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,2,1,3]
951; SSE-NEXT:    psubd %xmm3, %xmm1
952; SSE-NEXT:    paddd %xmm2, %xmm1
953; SSE-NEXT:    movdqa %xmm1, %xmm2
954; SSE-NEXT:    psrld $31, %xmm2
955; SSE-NEXT:    psrad $2, %xmm1
956; SSE-NEXT:    paddd %xmm2, %xmm1
957; SSE-NEXT:    retq
958;
959; AVX-LABEL: test9:
960; AVX:       # BB#0:
961; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
962; AVX-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
963; AVX-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
964; AVX-NEXT:    vpmuldq %ymm2, %ymm3, %ymm2
965; AVX-NEXT:    vpmuldq %ymm1, %ymm0, %ymm1
966; AVX-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
967; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
968; AVX-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
969; AVX-NEXT:    vpsrld $31, %ymm0, %ymm1
970; AVX-NEXT:    vpsrad $2, %ymm0, %ymm0
971; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
972; AVX-NEXT:    retq
973  %div = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
974  ret <8 x i32> %div
975}
976
977define <8 x i32> @test10(<8 x i32> %a) {
978; SSE41-LABEL: test10:
979; SSE41:       # BB#0:
980; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
981; SSE41-NEXT:    movdqa %xmm0, %xmm3
982; SSE41-NEXT:    pmuludq %xmm2, %xmm3
983; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
984; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
985; SSE41-NEXT:    pmuludq %xmm4, %xmm5
986; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
987; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2,1,3]
988; SSE41-NEXT:    movdqa %xmm0, %xmm5
989; SSE41-NEXT:    psubd %xmm3, %xmm5
990; SSE41-NEXT:    psrld $1, %xmm5
991; SSE41-NEXT:    paddd %xmm3, %xmm5
992; SSE41-NEXT:    psrld $2, %xmm5
993; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7]
994; SSE41-NEXT:    pmulld %xmm3, %xmm5
995; SSE41-NEXT:    psubd %xmm5, %xmm0
996; SSE41-NEXT:    pmuludq %xmm1, %xmm2
997; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
998; SSE41-NEXT:    pmuludq %xmm4, %xmm5
999; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm5[1,3]
1000; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
1001; SSE41-NEXT:    movdqa %xmm1, %xmm4
1002; SSE41-NEXT:    psubd %xmm2, %xmm4
1003; SSE41-NEXT:    psrld $1, %xmm4
1004; SSE41-NEXT:    paddd %xmm2, %xmm4
1005; SSE41-NEXT:    psrld $2, %xmm4
1006; SSE41-NEXT:    pmulld %xmm3, %xmm4
1007; SSE41-NEXT:    psubd %xmm4, %xmm1
1008; SSE41-NEXT:    retq
1009;
1010; SSE-LABEL: test10:
1011; SSE:       # BB#0:
1012; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
1013; SSE-NEXT:    movdqa %xmm0, %xmm3
1014; SSE-NEXT:    pmuludq %xmm2, %xmm3
1015; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1016; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
1017; SSE-NEXT:    pmuludq %xmm4, %xmm5
1018; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
1019; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2,1,3]
1020; SSE-NEXT:    movdqa %xmm0, %xmm5
1021; SSE-NEXT:    psubd %xmm3, %xmm5
1022; SSE-NEXT:    psrld $1, %xmm5
1023; SSE-NEXT:    paddd %xmm3, %xmm5
1024; SSE-NEXT:    psrld $2, %xmm5
1025; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7]
1026; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
1027; SSE-NEXT:    pmuludq %xmm3, %xmm5
1028; SSE-NEXT:    pmuludq %xmm3, %xmm6
1029; SSE-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,2],xmm6[0,2]
1030; SSE-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,2,1,3]
1031; SSE-NEXT:    psubd %xmm5, %xmm0
1032; SSE-NEXT:    pmuludq %xmm1, %xmm2
1033; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,1,3,3]
1034; SSE-NEXT:    pmuludq %xmm4, %xmm5
1035; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm5[1,3]
1036; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
1037; SSE-NEXT:    movdqa %xmm1, %xmm4
1038; SSE-NEXT:    psubd %xmm2, %xmm4
1039; SSE-NEXT:    psrld $1, %xmm4
1040; SSE-NEXT:    paddd %xmm2, %xmm4
1041; SSE-NEXT:    psrld $2, %xmm4
1042; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
1043; SSE-NEXT:    pmuludq %xmm3, %xmm4
1044; SSE-NEXT:    pmuludq %xmm3, %xmm2
1045; SSE-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm2[0,2]
1046; SSE-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2,1,3]
1047; SSE-NEXT:    psubd %xmm4, %xmm1
1048; SSE-NEXT:    retq
1049;
1050; AVX-LABEL: test10:
1051; AVX:       # BB#0:
1052; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
1053; AVX-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
1054; AVX-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
1055; AVX-NEXT:    vpmuludq %ymm2, %ymm3, %ymm2
1056; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm1
1057; AVX-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
1058; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
1059; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm2
1060; AVX-NEXT:    vpsrld $1, %ymm2, %ymm2
1061; AVX-NEXT:    vpaddd %ymm1, %ymm2, %ymm1
1062; AVX-NEXT:    vpsrld $2, %ymm1, %ymm1
1063; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
1064; AVX-NEXT:    vpmulld %ymm2, %ymm1, %ymm1
1065; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1066; AVX-NEXT:    retq
1067  %rem = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
1068  ret <8 x i32> %rem
1069}
1070
1071define <8 x i32> @test11(<8 x i32> %a) {
1072; SSE41-LABEL: test11:
1073; SSE41:       # BB#0:
1074; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]
1075; SSE41-NEXT:    movdqa %xmm0, %xmm3
1076; SSE41-NEXT:    pmuldq %xmm2, %xmm3
1077; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,1,3,3]
1078; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,1,3,3]
1079; SSE41-NEXT:    pmuldq %xmm4, %xmm5
1080; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
1081; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,2,1,3]
1082; SSE41-NEXT:    paddd %xmm0, %xmm3
1083; SSE41-NEXT:    movdqa %xmm3, %xmm5
1084; SSE41-NEXT:    psrld $31, %xmm5
1085; SSE41-NEXT:    psrad $2, %xmm3
1086; SSE41-NEXT:    paddd %xmm5, %xmm3
1087; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [7,7,7,7]
1088; SSE41-NEXT:    pmulld %xmm5, %xmm3
1089; SSE41-NEXT:    psubd %xmm3, %xmm0
1090; SSE41-NEXT:    pmuldq %xmm1, %xmm2
1091; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
1092; SSE41-NEXT:    pmuldq %xmm4, %xmm3
1093; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
1094; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
1095; SSE41-NEXT:    paddd %xmm1, %xmm2
1096; SSE41-NEXT:    movdqa %xmm2, %xmm3
1097; SSE41-NEXT:    psrld $31, %xmm3
1098; SSE41-NEXT:    psrad $2, %xmm2
1099; SSE41-NEXT:    paddd %xmm3, %xmm2
1100; SSE41-NEXT:    pmulld %xmm5, %xmm2
1101; SSE41-NEXT:    psubd %xmm2, %xmm1
1102; SSE41-NEXT:    retq
1103;
1104; SSE-LABEL: test11:
1105; SSE:       # BB#0:
1106; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]
1107; SSE-NEXT:    movdqa %xmm2, %xmm3
1108; SSE-NEXT:    psrad $31, %xmm3
1109; SSE-NEXT:    movdqa %xmm3, %xmm4
1110; SSE-NEXT:    pand %xmm0, %xmm4
1111; SSE-NEXT:    movdqa %xmm0, %xmm6
1112; SSE-NEXT:    psrad $31, %xmm6
1113; SSE-NEXT:    pand %xmm2, %xmm6
1114; SSE-NEXT:    paddd %xmm4, %xmm6
1115; SSE-NEXT:    movdqa %xmm0, %xmm7
1116; SSE-NEXT:    pmuludq %xmm2, %xmm7
1117; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
1118; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,1,3,3]
1119; SSE-NEXT:    pmuludq %xmm5, %xmm4
1120; SSE-NEXT:    shufps {{.*#+}} xmm7 = xmm7[1,3],xmm4[1,3]
1121; SSE-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,2,1,3]
1122; SSE-NEXT:    psubd %xmm6, %xmm7
1123; SSE-NEXT:    paddd %xmm0, %xmm7
1124; SSE-NEXT:    movdqa %xmm7, %xmm4
1125; SSE-NEXT:    psrld $31, %xmm4
1126; SSE-NEXT:    psrad $2, %xmm7
1127; SSE-NEXT:    paddd %xmm4, %xmm7
1128; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [7,7,7,7]
1129; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
1130; SSE-NEXT:    pmuludq %xmm4, %xmm7
1131; SSE-NEXT:    pmuludq %xmm4, %xmm6
1132; SSE-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,2],xmm6[0,2]
1133; SSE-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,2,1,3]
1134; SSE-NEXT:    psubd %xmm7, %xmm0
1135; SSE-NEXT:    pand %xmm1, %xmm3
1136; SSE-NEXT:    movdqa %xmm1, %xmm6
1137; SSE-NEXT:    psrad $31, %xmm6
1138; SSE-NEXT:    pand %xmm2, %xmm6
1139; SSE-NEXT:    paddd %xmm3, %xmm6
1140; SSE-NEXT:    pmuludq %xmm1, %xmm2
1141; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
1142; SSE-NEXT:    pmuludq %xmm5, %xmm3
1143; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
1144; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
1145; SSE-NEXT:    psubd %xmm6, %xmm2
1146; SSE-NEXT:    paddd %xmm1, %xmm2
1147; SSE-NEXT:    movdqa %xmm2, %xmm3
1148; SSE-NEXT:    psrld $31, %xmm3
1149; SSE-NEXT:    psrad $2, %xmm2
1150; SSE-NEXT:    paddd %xmm3, %xmm2
1151; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3]
1152; SSE-NEXT:    pmuludq %xmm4, %xmm2
1153; SSE-NEXT:    pmuludq %xmm4, %xmm3
1154; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
1155; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2,1,3]
1156; SSE-NEXT:    psubd %xmm2, %xmm1
1157; SSE-NEXT:    retq
1158;
1159; AVX-LABEL: test11:
1160; AVX:       # BB#0:
1161; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
1162; AVX-NEXT:    vpshufd {{.*#+}} ymm2 = ymm1[1,1,3,3,5,5,7,7]
1163; AVX-NEXT:    vpshufd {{.*#+}} ymm3 = ymm0[1,1,3,3,5,5,7,7]
1164; AVX-NEXT:    vpmuldq %ymm2, %ymm3, %ymm2
1165; AVX-NEXT:    vpmuldq %ymm1, %ymm0, %ymm1
1166; AVX-NEXT:    vpshufd {{.*#+}} ymm1 = ymm1[1,1,3,3,5,5,7,7]
1167; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
1168; AVX-NEXT:    vpaddd %ymm0, %ymm1, %ymm1
1169; AVX-NEXT:    vpsrld $31, %ymm1, %ymm2
1170; AVX-NEXT:    vpsrad $2, %ymm1, %ymm1
1171; AVX-NEXT:    vpaddd %ymm2, %ymm1, %ymm1
1172; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
1173; AVX-NEXT:    vpmulld %ymm2, %ymm1, %ymm1
1174; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1175; AVX-NEXT:    retq
1176  %rem = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
1177  ret <8 x i32> %rem
1178}
1179
1180define <2 x i16> @test12() {
1181; SSE41-LABEL: test12:
1182; SSE41:       # BB#0:
1183; SSE41-NEXT:    xorps %xmm0, %xmm0
1184; SSE41-NEXT:    retq
1185;
1186; SSE-LABEL: test12:
1187; SSE:       # BB#0:
1188; SSE-NEXT:    xorps %xmm0, %xmm0
1189; SSE-NEXT:    retq
1190;
1191; AVX-LABEL: test12:
1192; AVX:       # BB#0:
1193; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1194; AVX-NEXT:    retq
1195  %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0
1196  %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1
1197  %B9 = urem <2 x i16> %I9, %I9
1198  ret <2 x i16> %B9
1199}
1200
1201define <4 x i32> @PR20355(<4 x i32> %a) {
1202; SSE41-LABEL: PR20355:
1203; SSE41:       # BB#0: # %entry
1204; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1431655766,1431655766,1431655766,1431655766]
1205; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1206; SSE41-NEXT:    pmuldq %xmm1, %xmm0
1207; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1208; SSE41-NEXT:    pmuldq %xmm2, %xmm1
1209; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
1210; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
1211; SSE41-NEXT:    movaps %xmm0, %xmm1
1212; SSE41-NEXT:    psrld $31, %xmm1
1213; SSE41-NEXT:    paddd %xmm0, %xmm1
1214; SSE41-NEXT:    movdqa %xmm1, %xmm0
1215; SSE41-NEXT:    retq
1216;
1217; SSE-LABEL: PR20355:
1218; SSE:       # BB#0: # %entry
1219; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1431655766,1431655766,1431655766,1431655766]
1220; SSE-NEXT:    movdqa %xmm1, %xmm2
1221; SSE-NEXT:    psrad $31, %xmm2
1222; SSE-NEXT:    pand %xmm0, %xmm2
1223; SSE-NEXT:    movdqa %xmm0, %xmm3
1224; SSE-NEXT:    psrad $31, %xmm3
1225; SSE-NEXT:    pand %xmm1, %xmm3
1226; SSE-NEXT:    paddd %xmm2, %xmm3
1227; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
1228; SSE-NEXT:    pmuludq %xmm1, %xmm0
1229; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1230; SSE-NEXT:    pmuludq %xmm2, %xmm1
1231; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
1232; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
1233; SSE-NEXT:    psubd %xmm3, %xmm0
1234; SSE-NEXT:    movdqa %xmm0, %xmm1
1235; SSE-NEXT:    psrld $31, %xmm1
1236; SSE-NEXT:    paddd %xmm0, %xmm1
1237; SSE-NEXT:    movdqa %xmm1, %xmm0
1238; SSE-NEXT:    retq
1239;
1240; AVX-LABEL: PR20355:
1241; AVX:       # BB#0: # %entry
1242; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
1243; AVX-NEXT:    vpmuldq %xmm1, %xmm0, %xmm2
1244; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
1245; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
1246; AVX-NEXT:    vpmuldq %xmm1, %xmm0, %xmm0
1247; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm2[1,3],xmm0[1,3]
1248; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
1249; AVX-NEXT:    vpsrld $31, %xmm0, %xmm1
1250; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
1251; AVX-NEXT:    retq
1252entry:
1253  %sdiv = sdiv <4 x i32> %a, <i32 3, i32 3, i32 3, i32 3>
1254  ret <4 x i32> %sdiv
1255}
1256