blob: 3312c033af0e2f93acc23cb2c4f7565b504de394 [file] [log] [blame]
Simon Pilgrim4af44f32016-03-20 21:46:58 +00001; 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-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6
7;
8; sdiv by 7
9;
10
11define <2 x i64> @test_div7_2i64(<2 x i64> %a) nounwind {
12; SSE2-LABEL: test_div7_2i64:
13; SSE2: # BB#0:
14; SSE2-NEXT: movd %xmm0, %rax
15; SSE2-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x4924924924924925
16; SSE2-NEXT: imulq %rcx
17; SSE2-NEXT: movq %rdx, %rax
18; SSE2-NEXT: shrq $63, %rax
19; SSE2-NEXT: sarq %rdx
20; SSE2-NEXT: addq %rax, %rdx
21; SSE2-NEXT: movd %rdx, %xmm1
22; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
23; SSE2-NEXT: movd %xmm0, %rax
24; SSE2-NEXT: imulq %rcx
25; SSE2-NEXT: movq %rdx, %rax
26; SSE2-NEXT: shrq $63, %rax
27; SSE2-NEXT: sarq %rdx
28; SSE2-NEXT: addq %rax, %rdx
29; SSE2-NEXT: movd %rdx, %xmm0
30; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
31; SSE2-NEXT: movdqa %xmm1, %xmm0
32; SSE2-NEXT: retq
33;
34; SSE41-LABEL: test_div7_2i64:
35; SSE41: # BB#0:
36; SSE41-NEXT: pextrq $1, %xmm0, %rax
37; SSE41-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x4924924924924925
38; SSE41-NEXT: imulq %rcx
39; SSE41-NEXT: movq %rdx, %rax
40; SSE41-NEXT: shrq $63, %rax
41; SSE41-NEXT: sarq %rdx
42; SSE41-NEXT: addq %rax, %rdx
43; SSE41-NEXT: movd %rdx, %xmm1
44; SSE41-NEXT: movd %xmm0, %rax
45; SSE41-NEXT: imulq %rcx
46; SSE41-NEXT: movq %rdx, %rax
47; SSE41-NEXT: shrq $63, %rax
48; SSE41-NEXT: sarq %rdx
49; SSE41-NEXT: addq %rax, %rdx
50; SSE41-NEXT: movd %rdx, %xmm0
51; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
52; SSE41-NEXT: retq
53;
54; AVX-LABEL: test_div7_2i64:
55; AVX: # BB#0:
56; AVX-NEXT: vpextrq $1, %xmm0, %rax
57; AVX-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x4924924924924925
58; AVX-NEXT: imulq %rcx
59; AVX-NEXT: movq %rdx, %rax
60; AVX-NEXT: shrq $63, %rax
61; AVX-NEXT: sarq %rdx
62; AVX-NEXT: addq %rax, %rdx
63; AVX-NEXT: vmovq %rdx, %xmm1
64; AVX-NEXT: vmovq %xmm0, %rax
65; AVX-NEXT: imulq %rcx
66; AVX-NEXT: movq %rdx, %rax
67; AVX-NEXT: shrq $63, %rax
68; AVX-NEXT: sarq %rdx
69; AVX-NEXT: addq %rax, %rdx
70; AVX-NEXT: vmovq %rdx, %xmm0
71; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
72; AVX-NEXT: retq
73 %res = sdiv <2 x i64> %a, <i64 7, i64 7>
74 ret <2 x i64> %res
75}
76
77define <4 x i32> @test_div7_4i32(<4 x i32> %a) nounwind {
78; SSE2-LABEL: test_div7_4i32:
79; SSE2: # BB#0:
80; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
81; SSE2-NEXT: movdqa %xmm0, %xmm2
82; SSE2-NEXT: psrad $31, %xmm2
83; SSE2-NEXT: pand %xmm1, %xmm2
84; SSE2-NEXT: movdqa %xmm0, %xmm3
85; SSE2-NEXT: pmuludq %xmm1, %xmm3
86; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
87; SSE2-NEXT: psrad $31, %xmm1
88; SSE2-NEXT: pand %xmm0, %xmm1
89; SSE2-NEXT: paddd %xmm1, %xmm2
90; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
91; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
92; SSE2-NEXT: pmuludq %xmm4, %xmm3
93; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
94; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
95; SSE2-NEXT: psubd %xmm2, %xmm1
96; SSE2-NEXT: paddd %xmm0, %xmm1
97; SSE2-NEXT: movdqa %xmm1, %xmm0
98; SSE2-NEXT: psrld $31, %xmm0
99; SSE2-NEXT: psrad $2, %xmm1
100; SSE2-NEXT: paddd %xmm0, %xmm1
101; SSE2-NEXT: movdqa %xmm1, %xmm0
102; SSE2-NEXT: retq
103;
104; SSE41-LABEL: test_div7_4i32:
105; SSE41: # BB#0:
106; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
107; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
108; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
109; SSE41-NEXT: pmuldq %xmm2, %xmm3
110; SSE41-NEXT: pmuldq %xmm0, %xmm1
111; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
112; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
113; SSE41-NEXT: paddd %xmm0, %xmm1
114; SSE41-NEXT: movdqa %xmm1, %xmm0
115; SSE41-NEXT: psrld $31, %xmm0
116; SSE41-NEXT: psrad $2, %xmm1
117; SSE41-NEXT: paddd %xmm0, %xmm1
118; SSE41-NEXT: movdqa %xmm1, %xmm0
119; SSE41-NEXT: retq
120;
121; AVX1-LABEL: test_div7_4i32:
122; AVX1: # BB#0:
123; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
124; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
125; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
126; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
127; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm1
128; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
129; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
130; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm0
131; AVX1-NEXT: vpsrld $31, %xmm0, %xmm1
132; AVX1-NEXT: vpsrad $2, %xmm0, %xmm0
133; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0
134; AVX1-NEXT: retq
135;
136; AVX2-LABEL: test_div7_4i32:
137; AVX2: # BB#0:
138; AVX2-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
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, %xmm1
143; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
144; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
145; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm0
146; AVX2-NEXT: vpsrld $31, %xmm0, %xmm1
147; AVX2-NEXT: vpsrad $2, %xmm0, %xmm0
148; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0
149; AVX2-NEXT: retq
150 %res = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
151 ret <4 x i32> %res
152}
153
154define <8 x i16> @test_div7_8i16(<8 x i16> %a) nounwind {
155; SSE-LABEL: test_div7_8i16:
156; SSE: # BB#0:
157; SSE-NEXT: pmulhw {{.*}}(%rip), %xmm0
158; SSE-NEXT: movdqa %xmm0, %xmm1
159; SSE-NEXT: psrlw $15, %xmm1
160; SSE-NEXT: psraw $1, %xmm0
161; SSE-NEXT: paddw %xmm1, %xmm0
162; SSE-NEXT: retq
163;
164; AVX-LABEL: test_div7_8i16:
165; AVX: # BB#0:
166; AVX-NEXT: vpmulhw {{.*}}(%rip), %xmm0, %xmm0
167; AVX-NEXT: vpsrlw $15, %xmm0, %xmm1
168; AVX-NEXT: vpsraw $1, %xmm0, %xmm0
169; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0
170; AVX-NEXT: retq
171 %res = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
172 ret <8 x i16> %res
173}
174
175define <16 x i8> @test_div7_16i8(<16 x i8> %a) nounwind {
176; SSE2-LABEL: test_div7_16i8:
177; SSE2: # BB#0:
178; SSE2-NEXT: pushq %rbp
179; SSE2-NEXT: pushq %r14
180; SSE2-NEXT: pushq %rbx
181; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
182; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax
183; SSE2-NEXT: imull $-109, %eax, %ecx
184; SSE2-NEXT: shrl $8, %ecx
185; SSE2-NEXT: addb %al, %cl
186; SSE2-NEXT: movb %cl, %al
187; SSE2-NEXT: shrb $7, %al
188; SSE2-NEXT: sarb $2, %cl
189; SSE2-NEXT: addb %al, %cl
190; SSE2-NEXT: movzbl %cl, %eax
191; SSE2-NEXT: movd %eax, %xmm0
192; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r14d
193; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %edx
194; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r9d
195; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax
196; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r11d
197; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ecx
198; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r8d
199; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %esi
200; SSE2-NEXT: imull $-109, %esi, %edi
201; SSE2-NEXT: shrl $8, %edi
202; SSE2-NEXT: addb %sil, %dil
203; SSE2-NEXT: movb %dil, %bl
204; SSE2-NEXT: shrb $7, %bl
205; SSE2-NEXT: sarb $2, %dil
206; SSE2-NEXT: addb %bl, %dil
207; SSE2-NEXT: movzbl %dil, %esi
208; SSE2-NEXT: movd %esi, %xmm1
209; SSE2-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]
210; SSE2-NEXT: imull $-109, %eax, %esi
211; SSE2-NEXT: shrl $8, %esi
212; SSE2-NEXT: addb %al, %sil
213; SSE2-NEXT: movb %sil, %al
214; SSE2-NEXT: shrb $7, %al
215; SSE2-NEXT: sarb $2, %sil
216; SSE2-NEXT: addb %al, %sil
217; SSE2-NEXT: movzbl %sil, %eax
218; SSE2-NEXT: movd %eax, %xmm2
219; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ebp
220; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %esi
221; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r10d
222; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %edi
223; SSE2-NEXT: imull $-109, %edi, %ebx
224; SSE2-NEXT: shrl $8, %ebx
225; SSE2-NEXT: addb %dil, %bl
226; SSE2-NEXT: movb %bl, %al
227; SSE2-NEXT: shrb $7, %al
228; SSE2-NEXT: sarb $2, %bl
229; SSE2-NEXT: addb %al, %bl
230; SSE2-NEXT: movzbl %bl, %eax
231; SSE2-NEXT: movd %eax, %xmm0
232; SSE2-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]
233; SSE2-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]
234; SSE2-NEXT: imull $-109, %edx, %eax
235; SSE2-NEXT: shrl $8, %eax
236; SSE2-NEXT: addb %dl, %al
237; SSE2-NEXT: movb %al, %dl
238; SSE2-NEXT: shrb $7, %dl
239; SSE2-NEXT: sarb $2, %al
240; SSE2-NEXT: addb %dl, %al
241; SSE2-NEXT: movzbl %al, %eax
242; SSE2-NEXT: movd %eax, %xmm1
243; SSE2-NEXT: imull $-109, %esi, %eax
244; SSE2-NEXT: shrl $8, %eax
245; SSE2-NEXT: addb %sil, %al
246; SSE2-NEXT: movb %al, %dl
247; SSE2-NEXT: shrb $7, %dl
248; SSE2-NEXT: sarb $2, %al
249; SSE2-NEXT: addb %dl, %al
250; SSE2-NEXT: movzbl %al, %eax
251; SSE2-NEXT: movd %eax, %xmm2
252; SSE2-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]
253; SSE2-NEXT: imull $-109, %ecx, %eax
254; SSE2-NEXT: shrl $8, %eax
255; SSE2-NEXT: addb %cl, %al
256; SSE2-NEXT: movb %al, %cl
257; SSE2-NEXT: shrb $7, %cl
258; SSE2-NEXT: sarb $2, %al
259; SSE2-NEXT: addb %cl, %al
260; SSE2-NEXT: movzbl %al, %eax
261; SSE2-NEXT: movd %eax, %xmm3
262; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ecx
263; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax
264; SSE2-NEXT: imull $-109, %eax, %edx
265; SSE2-NEXT: shrl $8, %edx
266; SSE2-NEXT: addb %al, %dl
267; SSE2-NEXT: movb %dl, %al
268; SSE2-NEXT: shrb $7, %al
269; SSE2-NEXT: sarb $2, %dl
270; SSE2-NEXT: addb %al, %dl
271; SSE2-NEXT: movzbl %dl, %eax
272; SSE2-NEXT: movd %eax, %xmm1
273; SSE2-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]
274; SSE2-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]
275; SSE2-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]
276; SSE2-NEXT: imull $-109, %r14d, %eax
277; SSE2-NEXT: shrl $8, %eax
278; SSE2-NEXT: addb %r14b, %al
279; SSE2-NEXT: movb %al, %dl
280; SSE2-NEXT: shrb $7, %dl
281; SSE2-NEXT: sarb $2, %al
282; SSE2-NEXT: addb %dl, %al
283; SSE2-NEXT: movzbl %al, %eax
284; SSE2-NEXT: movd %eax, %xmm2
285; SSE2-NEXT: imull $-109, %ebp, %eax
286; SSE2-NEXT: shrl $8, %eax
287; SSE2-NEXT: addb %bpl, %al
288; SSE2-NEXT: movb %al, %dl
289; SSE2-NEXT: shrb $7, %dl
290; SSE2-NEXT: sarb $2, %al
291; SSE2-NEXT: addb %dl, %al
292; SSE2-NEXT: movzbl %al, %eax
293; SSE2-NEXT: movd %eax, %xmm0
294; SSE2-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]
295; SSE2-NEXT: imull $-109, %r11d, %eax
296; SSE2-NEXT: shrl $8, %eax
297; SSE2-NEXT: addb %r11b, %al
298; SSE2-NEXT: movb %al, %dl
299; SSE2-NEXT: shrb $7, %dl
300; SSE2-NEXT: sarb $2, %al
301; SSE2-NEXT: addb %dl, %al
302; SSE2-NEXT: movzbl %al, %eax
303; SSE2-NEXT: movd %eax, %xmm3
304; SSE2-NEXT: imull $-109, %ecx, %eax
305; SSE2-NEXT: shrl $8, %eax
306; SSE2-NEXT: addb %cl, %al
307; SSE2-NEXT: movb %al, %cl
308; SSE2-NEXT: shrb $7, %cl
309; SSE2-NEXT: sarb $2, %al
310; SSE2-NEXT: addb %cl, %al
311; SSE2-NEXT: movzbl %al, %eax
312; SSE2-NEXT: movd %eax, %xmm2
313; SSE2-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]
314; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
315; SSE2-NEXT: imull $-109, %r9d, %eax
316; SSE2-NEXT: shrl $8, %eax
317; SSE2-NEXT: addb %r9b, %al
318; SSE2-NEXT: movb %al, %cl
319; SSE2-NEXT: shrb $7, %cl
320; SSE2-NEXT: sarb $2, %al
321; SSE2-NEXT: addb %cl, %al
322; SSE2-NEXT: movzbl %al, %eax
323; SSE2-NEXT: movd %eax, %xmm0
324; SSE2-NEXT: imull $-109, %r10d, %eax
325; SSE2-NEXT: shrl $8, %eax
326; SSE2-NEXT: addb %r10b, %al
327; SSE2-NEXT: movb %al, %cl
328; SSE2-NEXT: shrb $7, %cl
329; SSE2-NEXT: sarb $2, %al
330; SSE2-NEXT: addb %cl, %al
331; SSE2-NEXT: movzbl %al, %eax
332; SSE2-NEXT: movd %eax, %xmm3
333; SSE2-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]
334; SSE2-NEXT: imull $-109, %r8d, %eax
335; SSE2-NEXT: shrl $8, %eax
336; SSE2-NEXT: addb %r8b, %al
337; SSE2-NEXT: movb %al, %cl
338; SSE2-NEXT: shrb $7, %cl
339; SSE2-NEXT: sarb $2, %al
340; SSE2-NEXT: addb %cl, %al
341; SSE2-NEXT: movzbl %al, %eax
342; SSE2-NEXT: movd %eax, %xmm4
343; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %eax
344; SSE2-NEXT: imull $-109, %eax, %ecx
345; SSE2-NEXT: shrl $8, %ecx
346; SSE2-NEXT: addb %al, %cl
347; SSE2-NEXT: movb %cl, %al
348; SSE2-NEXT: shrb $7, %al
349; SSE2-NEXT: sarb $2, %cl
350; SSE2-NEXT: addb %al, %cl
351; SSE2-NEXT: movzbl %cl, %eax
352; SSE2-NEXT: movd %eax, %xmm0
353; SSE2-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]
354; 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]
355; SSE2-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]
356; SSE2-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]
357; SSE2-NEXT: popq %rbx
358; SSE2-NEXT: popq %r14
359; SSE2-NEXT: popq %rbp
360; SSE2-NEXT: retq
361;
362; SSE41-LABEL: test_div7_16i8:
363; SSE41: # BB#0:
364; SSE41-NEXT: pextrb $1, %xmm0, %eax
365; SSE41-NEXT: movsbl %al, %eax
366; SSE41-NEXT: imull $-109, %eax, %ecx
367; SSE41-NEXT: shrl $8, %ecx
368; SSE41-NEXT: addb %cl, %al
369; SSE41-NEXT: movb %al, %cl
370; SSE41-NEXT: shrb $7, %cl
371; SSE41-NEXT: sarb $2, %al
372; SSE41-NEXT: addb %cl, %al
373; SSE41-NEXT: movzbl %al, %eax
374; SSE41-NEXT: pextrb $0, %xmm0, %ecx
375; SSE41-NEXT: movsbl %cl, %ecx
376; SSE41-NEXT: imull $-109, %ecx, %edx
377; SSE41-NEXT: shrl $8, %edx
378; SSE41-NEXT: addb %dl, %cl
379; SSE41-NEXT: movb %cl, %dl
380; SSE41-NEXT: shrb $7, %dl
381; SSE41-NEXT: sarb $2, %cl
382; SSE41-NEXT: addb %dl, %cl
383; SSE41-NEXT: movzbl %cl, %ecx
384; SSE41-NEXT: movd %ecx, %xmm1
385; SSE41-NEXT: pinsrb $1, %eax, %xmm1
386; SSE41-NEXT: pextrb $2, %xmm0, %eax
387; SSE41-NEXT: movsbl %al, %eax
388; SSE41-NEXT: imull $-109, %eax, %ecx
389; SSE41-NEXT: shrl $8, %ecx
390; SSE41-NEXT: addb %cl, %al
391; SSE41-NEXT: movb %al, %cl
392; SSE41-NEXT: shrb $7, %cl
393; SSE41-NEXT: sarb $2, %al
394; SSE41-NEXT: addb %cl, %al
395; SSE41-NEXT: movzbl %al, %eax
396; SSE41-NEXT: pinsrb $2, %eax, %xmm1
397; SSE41-NEXT: pextrb $3, %xmm0, %eax
398; SSE41-NEXT: movsbl %al, %eax
399; SSE41-NEXT: imull $-109, %eax, %ecx
400; SSE41-NEXT: shrl $8, %ecx
401; SSE41-NEXT: addb %cl, %al
402; SSE41-NEXT: movb %al, %cl
403; SSE41-NEXT: shrb $7, %cl
404; SSE41-NEXT: sarb $2, %al
405; SSE41-NEXT: addb %cl, %al
406; SSE41-NEXT: movzbl %al, %eax
407; SSE41-NEXT: pinsrb $3, %eax, %xmm1
408; SSE41-NEXT: pextrb $4, %xmm0, %eax
409; SSE41-NEXT: movsbl %al, %eax
410; SSE41-NEXT: imull $-109, %eax, %ecx
411; SSE41-NEXT: shrl $8, %ecx
412; SSE41-NEXT: addb %cl, %al
413; SSE41-NEXT: movb %al, %cl
414; SSE41-NEXT: shrb $7, %cl
415; SSE41-NEXT: sarb $2, %al
416; SSE41-NEXT: addb %cl, %al
417; SSE41-NEXT: movzbl %al, %eax
418; SSE41-NEXT: pinsrb $4, %eax, %xmm1
419; SSE41-NEXT: pextrb $5, %xmm0, %eax
420; SSE41-NEXT: movsbl %al, %eax
421; SSE41-NEXT: imull $-109, %eax, %ecx
422; SSE41-NEXT: shrl $8, %ecx
423; SSE41-NEXT: addb %cl, %al
424; SSE41-NEXT: movb %al, %cl
425; SSE41-NEXT: shrb $7, %cl
426; SSE41-NEXT: sarb $2, %al
427; SSE41-NEXT: addb %cl, %al
428; SSE41-NEXT: movzbl %al, %eax
429; SSE41-NEXT: pinsrb $5, %eax, %xmm1
430; SSE41-NEXT: pextrb $6, %xmm0, %eax
431; SSE41-NEXT: movsbl %al, %eax
432; SSE41-NEXT: imull $-109, %eax, %ecx
433; SSE41-NEXT: shrl $8, %ecx
434; SSE41-NEXT: addb %cl, %al
435; SSE41-NEXT: movb %al, %cl
436; SSE41-NEXT: shrb $7, %cl
437; SSE41-NEXT: sarb $2, %al
438; SSE41-NEXT: addb %cl, %al
439; SSE41-NEXT: movzbl %al, %eax
440; SSE41-NEXT: pinsrb $6, %eax, %xmm1
441; SSE41-NEXT: pextrb $7, %xmm0, %eax
442; SSE41-NEXT: movsbl %al, %eax
443; SSE41-NEXT: imull $-109, %eax, %ecx
444; SSE41-NEXT: shrl $8, %ecx
445; SSE41-NEXT: addb %cl, %al
446; SSE41-NEXT: movb %al, %cl
447; SSE41-NEXT: shrb $7, %cl
448; SSE41-NEXT: sarb $2, %al
449; SSE41-NEXT: addb %cl, %al
450; SSE41-NEXT: movzbl %al, %eax
451; SSE41-NEXT: pinsrb $7, %eax, %xmm1
452; SSE41-NEXT: pextrb $8, %xmm0, %eax
453; SSE41-NEXT: movsbl %al, %eax
454; SSE41-NEXT: imull $-109, %eax, %ecx
455; SSE41-NEXT: shrl $8, %ecx
456; SSE41-NEXT: addb %cl, %al
457; SSE41-NEXT: movb %al, %cl
458; SSE41-NEXT: shrb $7, %cl
459; SSE41-NEXT: sarb $2, %al
460; SSE41-NEXT: addb %cl, %al
461; SSE41-NEXT: movzbl %al, %eax
462; SSE41-NEXT: pinsrb $8, %eax, %xmm1
463; SSE41-NEXT: pextrb $9, %xmm0, %eax
464; SSE41-NEXT: movsbl %al, %eax
465; SSE41-NEXT: imull $-109, %eax, %ecx
466; SSE41-NEXT: shrl $8, %ecx
467; SSE41-NEXT: addb %cl, %al
468; SSE41-NEXT: movb %al, %cl
469; SSE41-NEXT: shrb $7, %cl
470; SSE41-NEXT: sarb $2, %al
471; SSE41-NEXT: addb %cl, %al
472; SSE41-NEXT: movzbl %al, %eax
473; SSE41-NEXT: pinsrb $9, %eax, %xmm1
474; SSE41-NEXT: pextrb $10, %xmm0, %eax
475; SSE41-NEXT: movsbl %al, %eax
476; SSE41-NEXT: imull $-109, %eax, %ecx
477; SSE41-NEXT: shrl $8, %ecx
478; SSE41-NEXT: addb %cl, %al
479; SSE41-NEXT: movb %al, %cl
480; SSE41-NEXT: shrb $7, %cl
481; SSE41-NEXT: sarb $2, %al
482; SSE41-NEXT: addb %cl, %al
483; SSE41-NEXT: movzbl %al, %eax
484; SSE41-NEXT: pinsrb $10, %eax, %xmm1
485; SSE41-NEXT: pextrb $11, %xmm0, %eax
486; SSE41-NEXT: movsbl %al, %eax
487; SSE41-NEXT: imull $-109, %eax, %ecx
488; SSE41-NEXT: shrl $8, %ecx
489; SSE41-NEXT: addb %cl, %al
490; SSE41-NEXT: movb %al, %cl
491; SSE41-NEXT: shrb $7, %cl
492; SSE41-NEXT: sarb $2, %al
493; SSE41-NEXT: addb %cl, %al
494; SSE41-NEXT: movzbl %al, %eax
495; SSE41-NEXT: pinsrb $11, %eax, %xmm1
496; SSE41-NEXT: pextrb $12, %xmm0, %eax
497; SSE41-NEXT: movsbl %al, %eax
498; SSE41-NEXT: imull $-109, %eax, %ecx
499; SSE41-NEXT: shrl $8, %ecx
500; SSE41-NEXT: addb %cl, %al
501; SSE41-NEXT: movb %al, %cl
502; SSE41-NEXT: shrb $7, %cl
503; SSE41-NEXT: sarb $2, %al
504; SSE41-NEXT: addb %cl, %al
505; SSE41-NEXT: movzbl %al, %eax
506; SSE41-NEXT: pinsrb $12, %eax, %xmm1
507; SSE41-NEXT: pextrb $13, %xmm0, %eax
508; SSE41-NEXT: movsbl %al, %eax
509; SSE41-NEXT: imull $-109, %eax, %ecx
510; SSE41-NEXT: shrl $8, %ecx
511; SSE41-NEXT: addb %cl, %al
512; SSE41-NEXT: movb %al, %cl
513; SSE41-NEXT: shrb $7, %cl
514; SSE41-NEXT: sarb $2, %al
515; SSE41-NEXT: addb %cl, %al
516; SSE41-NEXT: movzbl %al, %eax
517; SSE41-NEXT: pinsrb $13, %eax, %xmm1
518; SSE41-NEXT: pextrb $14, %xmm0, %eax
519; SSE41-NEXT: movsbl %al, %eax
520; SSE41-NEXT: imull $-109, %eax, %ecx
521; SSE41-NEXT: shrl $8, %ecx
522; SSE41-NEXT: addb %cl, %al
523; SSE41-NEXT: movb %al, %cl
524; SSE41-NEXT: shrb $7, %cl
525; SSE41-NEXT: sarb $2, %al
526; SSE41-NEXT: addb %cl, %al
527; SSE41-NEXT: movzbl %al, %eax
528; SSE41-NEXT: pinsrb $14, %eax, %xmm1
529; SSE41-NEXT: pextrb $15, %xmm0, %eax
530; SSE41-NEXT: movsbl %al, %eax
531; SSE41-NEXT: imull $-109, %eax, %ecx
532; SSE41-NEXT: shrl $8, %ecx
533; SSE41-NEXT: addb %cl, %al
534; SSE41-NEXT: movb %al, %cl
535; SSE41-NEXT: shrb $7, %cl
536; SSE41-NEXT: sarb $2, %al
537; SSE41-NEXT: addb %cl, %al
538; SSE41-NEXT: movzbl %al, %eax
539; SSE41-NEXT: pinsrb $15, %eax, %xmm1
540; SSE41-NEXT: movdqa %xmm1, %xmm0
541; SSE41-NEXT: retq
542;
543; AVX-LABEL: test_div7_16i8:
544; AVX: # BB#0:
545; AVX-NEXT: vpextrb $1, %xmm0, %eax
546; AVX-NEXT: movsbl %al, %eax
547; AVX-NEXT: imull $-109, %eax, %ecx
548; AVX-NEXT: shrl $8, %ecx
549; AVX-NEXT: addb %cl, %al
550; AVX-NEXT: movb %al, %cl
551; AVX-NEXT: shrb $7, %cl
552; AVX-NEXT: sarb $2, %al
553; AVX-NEXT: addb %cl, %al
554; AVX-NEXT: movzbl %al, %eax
555; AVX-NEXT: vpextrb $0, %xmm0, %ecx
556; AVX-NEXT: movsbl %cl, %ecx
557; AVX-NEXT: imull $-109, %ecx, %edx
558; AVX-NEXT: shrl $8, %edx
559; AVX-NEXT: addb %dl, %cl
560; AVX-NEXT: movb %cl, %dl
561; AVX-NEXT: shrb $7, %dl
562; AVX-NEXT: sarb $2, %cl
563; AVX-NEXT: addb %dl, %cl
564; AVX-NEXT: movzbl %cl, %ecx
565; AVX-NEXT: vmovd %ecx, %xmm1
566; AVX-NEXT: vpinsrb $1, %eax, %xmm1, %xmm1
567; AVX-NEXT: vpextrb $2, %xmm0, %eax
568; AVX-NEXT: movsbl %al, %eax
569; AVX-NEXT: imull $-109, %eax, %ecx
570; AVX-NEXT: shrl $8, %ecx
571; AVX-NEXT: addb %cl, %al
572; AVX-NEXT: movb %al, %cl
573; AVX-NEXT: shrb $7, %cl
574; AVX-NEXT: sarb $2, %al
575; AVX-NEXT: addb %cl, %al
576; AVX-NEXT: movzbl %al, %eax
577; AVX-NEXT: vpinsrb $2, %eax, %xmm1, %xmm1
578; AVX-NEXT: vpextrb $3, %xmm0, %eax
579; AVX-NEXT: movsbl %al, %eax
580; AVX-NEXT: imull $-109, %eax, %ecx
581; AVX-NEXT: shrl $8, %ecx
582; AVX-NEXT: addb %cl, %al
583; AVX-NEXT: movb %al, %cl
584; AVX-NEXT: shrb $7, %cl
585; AVX-NEXT: sarb $2, %al
586; AVX-NEXT: addb %cl, %al
587; AVX-NEXT: movzbl %al, %eax
588; AVX-NEXT: vpinsrb $3, %eax, %xmm1, %xmm1
589; AVX-NEXT: vpextrb $4, %xmm0, %eax
590; AVX-NEXT: movsbl %al, %eax
591; AVX-NEXT: imull $-109, %eax, %ecx
592; AVX-NEXT: shrl $8, %ecx
593; AVX-NEXT: addb %cl, %al
594; AVX-NEXT: movb %al, %cl
595; AVX-NEXT: shrb $7, %cl
596; AVX-NEXT: sarb $2, %al
597; AVX-NEXT: addb %cl, %al
598; AVX-NEXT: movzbl %al, %eax
599; AVX-NEXT: vpinsrb $4, %eax, %xmm1, %xmm1
600; AVX-NEXT: vpextrb $5, %xmm0, %eax
601; AVX-NEXT: movsbl %al, %eax
602; AVX-NEXT: imull $-109, %eax, %ecx
603; AVX-NEXT: shrl $8, %ecx
604; AVX-NEXT: addb %cl, %al
605; AVX-NEXT: movb %al, %cl
606; AVX-NEXT: shrb $7, %cl
607; AVX-NEXT: sarb $2, %al
608; AVX-NEXT: addb %cl, %al
609; AVX-NEXT: movzbl %al, %eax
610; AVX-NEXT: vpinsrb $5, %eax, %xmm1, %xmm1
611; AVX-NEXT: vpextrb $6, %xmm0, %eax
612; AVX-NEXT: movsbl %al, %eax
613; AVX-NEXT: imull $-109, %eax, %ecx
614; AVX-NEXT: shrl $8, %ecx
615; AVX-NEXT: addb %cl, %al
616; AVX-NEXT: movb %al, %cl
617; AVX-NEXT: shrb $7, %cl
618; AVX-NEXT: sarb $2, %al
619; AVX-NEXT: addb %cl, %al
620; AVX-NEXT: movzbl %al, %eax
621; AVX-NEXT: vpinsrb $6, %eax, %xmm1, %xmm1
622; AVX-NEXT: vpextrb $7, %xmm0, %eax
623; AVX-NEXT: movsbl %al, %eax
624; AVX-NEXT: imull $-109, %eax, %ecx
625; AVX-NEXT: shrl $8, %ecx
626; AVX-NEXT: addb %cl, %al
627; AVX-NEXT: movb %al, %cl
628; AVX-NEXT: shrb $7, %cl
629; AVX-NEXT: sarb $2, %al
630; AVX-NEXT: addb %cl, %al
631; AVX-NEXT: movzbl %al, %eax
632; AVX-NEXT: vpinsrb $7, %eax, %xmm1, %xmm1
633; AVX-NEXT: vpextrb $8, %xmm0, %eax
634; AVX-NEXT: movsbl %al, %eax
635; AVX-NEXT: imull $-109, %eax, %ecx
636; AVX-NEXT: shrl $8, %ecx
637; AVX-NEXT: addb %cl, %al
638; AVX-NEXT: movb %al, %cl
639; AVX-NEXT: shrb $7, %cl
640; AVX-NEXT: sarb $2, %al
641; AVX-NEXT: addb %cl, %al
642; AVX-NEXT: movzbl %al, %eax
643; AVX-NEXT: vpinsrb $8, %eax, %xmm1, %xmm1
644; AVX-NEXT: vpextrb $9, %xmm0, %eax
645; AVX-NEXT: movsbl %al, %eax
646; AVX-NEXT: imull $-109, %eax, %ecx
647; AVX-NEXT: shrl $8, %ecx
648; AVX-NEXT: addb %cl, %al
649; AVX-NEXT: movb %al, %cl
650; AVX-NEXT: shrb $7, %cl
651; AVX-NEXT: sarb $2, %al
652; AVX-NEXT: addb %cl, %al
653; AVX-NEXT: movzbl %al, %eax
654; AVX-NEXT: vpinsrb $9, %eax, %xmm1, %xmm1
655; AVX-NEXT: vpextrb $10, %xmm0, %eax
656; AVX-NEXT: movsbl %al, %eax
657; AVX-NEXT: imull $-109, %eax, %ecx
658; AVX-NEXT: shrl $8, %ecx
659; AVX-NEXT: addb %cl, %al
660; AVX-NEXT: movb %al, %cl
661; AVX-NEXT: shrb $7, %cl
662; AVX-NEXT: sarb $2, %al
663; AVX-NEXT: addb %cl, %al
664; AVX-NEXT: movzbl %al, %eax
665; AVX-NEXT: vpinsrb $10, %eax, %xmm1, %xmm1
666; AVX-NEXT: vpextrb $11, %xmm0, %eax
667; AVX-NEXT: movsbl %al, %eax
668; AVX-NEXT: imull $-109, %eax, %ecx
669; AVX-NEXT: shrl $8, %ecx
670; AVX-NEXT: addb %cl, %al
671; AVX-NEXT: movb %al, %cl
672; AVX-NEXT: shrb $7, %cl
673; AVX-NEXT: sarb $2, %al
674; AVX-NEXT: addb %cl, %al
675; AVX-NEXT: movzbl %al, %eax
676; AVX-NEXT: vpinsrb $11, %eax, %xmm1, %xmm1
677; AVX-NEXT: vpextrb $12, %xmm0, %eax
678; AVX-NEXT: movsbl %al, %eax
679; AVX-NEXT: imull $-109, %eax, %ecx
680; AVX-NEXT: shrl $8, %ecx
681; AVX-NEXT: addb %cl, %al
682; AVX-NEXT: movb %al, %cl
683; AVX-NEXT: shrb $7, %cl
684; AVX-NEXT: sarb $2, %al
685; AVX-NEXT: addb %cl, %al
686; AVX-NEXT: movzbl %al, %eax
687; AVX-NEXT: vpinsrb $12, %eax, %xmm1, %xmm1
688; AVX-NEXT: vpextrb $13, %xmm0, %eax
689; AVX-NEXT: movsbl %al, %eax
690; AVX-NEXT: imull $-109, %eax, %ecx
691; AVX-NEXT: shrl $8, %ecx
692; AVX-NEXT: addb %cl, %al
693; AVX-NEXT: movb %al, %cl
694; AVX-NEXT: shrb $7, %cl
695; AVX-NEXT: sarb $2, %al
696; AVX-NEXT: addb %cl, %al
697; AVX-NEXT: movzbl %al, %eax
698; AVX-NEXT: vpinsrb $13, %eax, %xmm1, %xmm1
699; AVX-NEXT: vpextrb $14, %xmm0, %eax
700; AVX-NEXT: movsbl %al, %eax
701; AVX-NEXT: imull $-109, %eax, %ecx
702; AVX-NEXT: shrl $8, %ecx
703; AVX-NEXT: addb %cl, %al
704; AVX-NEXT: movb %al, %cl
705; AVX-NEXT: shrb $7, %cl
706; AVX-NEXT: sarb $2, %al
707; AVX-NEXT: addb %cl, %al
708; AVX-NEXT: movzbl %al, %eax
709; AVX-NEXT: vpinsrb $14, %eax, %xmm1, %xmm1
710; AVX-NEXT: vpextrb $15, %xmm0, %eax
711; AVX-NEXT: movsbl %al, %eax
712; AVX-NEXT: imull $-109, %eax, %ecx
713; AVX-NEXT: shrl $8, %ecx
714; AVX-NEXT: addb %cl, %al
715; AVX-NEXT: movb %al, %cl
716; AVX-NEXT: shrb $7, %cl
717; AVX-NEXT: sarb $2, %al
718; AVX-NEXT: addb %cl, %al
719; AVX-NEXT: movzbl %al, %eax
720; AVX-NEXT: vpinsrb $15, %eax, %xmm1, %xmm0
721; AVX-NEXT: retq
722 %res = 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>
723 ret <16 x i8> %res
724}
725
726;
727; srem by 7
728;
729
730define <2 x i64> @test_rem7_2i64(<2 x i64> %a) nounwind {
731; SSE2-LABEL: test_rem7_2i64:
732; SSE2: # BB#0:
733; SSE2-NEXT: movd %xmm0, %rcx
734; SSE2-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925
735; SSE2-NEXT: movq %rcx, %rax
736; SSE2-NEXT: imulq %rsi
737; SSE2-NEXT: movq %rdx, %rax
738; SSE2-NEXT: shrq $63, %rax
739; SSE2-NEXT: sarq %rdx
740; SSE2-NEXT: addq %rax, %rdx
741; SSE2-NEXT: leaq (,%rdx,8), %rax
742; SSE2-NEXT: subq %rdx, %rax
743; SSE2-NEXT: subq %rax, %rcx
744; SSE2-NEXT: movd %rcx, %xmm1
745; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
746; SSE2-NEXT: movd %xmm0, %rcx
747; SSE2-NEXT: movq %rcx, %rax
748; SSE2-NEXT: imulq %rsi
749; SSE2-NEXT: movq %rdx, %rax
750; SSE2-NEXT: shrq $63, %rax
751; SSE2-NEXT: sarq %rdx
752; SSE2-NEXT: addq %rax, %rdx
753; SSE2-NEXT: leaq (,%rdx,8), %rax
754; SSE2-NEXT: subq %rdx, %rax
755; SSE2-NEXT: subq %rax, %rcx
756; SSE2-NEXT: movd %rcx, %xmm0
757; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
758; SSE2-NEXT: movdqa %xmm1, %xmm0
759; SSE2-NEXT: retq
760;
761; SSE41-LABEL: test_rem7_2i64:
762; SSE41: # BB#0:
763; SSE41-NEXT: pextrq $1, %xmm0, %rcx
764; SSE41-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925
765; SSE41-NEXT: movq %rcx, %rax
766; SSE41-NEXT: imulq %rsi
767; SSE41-NEXT: movq %rdx, %rax
768; SSE41-NEXT: shrq $63, %rax
769; SSE41-NEXT: sarq %rdx
770; SSE41-NEXT: addq %rax, %rdx
771; SSE41-NEXT: leaq (,%rdx,8), %rax
772; SSE41-NEXT: subq %rdx, %rax
773; SSE41-NEXT: subq %rax, %rcx
774; SSE41-NEXT: movd %rcx, %xmm1
775; SSE41-NEXT: movd %xmm0, %rcx
776; SSE41-NEXT: movq %rcx, %rax
777; SSE41-NEXT: imulq %rsi
778; SSE41-NEXT: movq %rdx, %rax
779; SSE41-NEXT: shrq $63, %rax
780; SSE41-NEXT: sarq %rdx
781; SSE41-NEXT: addq %rax, %rdx
782; SSE41-NEXT: leaq (,%rdx,8), %rax
783; SSE41-NEXT: subq %rdx, %rax
784; SSE41-NEXT: subq %rax, %rcx
785; SSE41-NEXT: movd %rcx, %xmm0
786; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
787; SSE41-NEXT: retq
788;
789; AVX-LABEL: test_rem7_2i64:
790; AVX: # BB#0:
791; AVX-NEXT: vpextrq $1, %xmm0, %rcx
792; AVX-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925
793; AVX-NEXT: movq %rcx, %rax
794; AVX-NEXT: imulq %rsi
795; AVX-NEXT: movq %rdx, %rax
796; AVX-NEXT: shrq $63, %rax
797; AVX-NEXT: sarq %rdx
798; AVX-NEXT: addq %rax, %rdx
799; AVX-NEXT: leaq (,%rdx,8), %rax
800; AVX-NEXT: subq %rdx, %rax
801; AVX-NEXT: subq %rax, %rcx
802; AVX-NEXT: vmovq %rcx, %xmm1
803; AVX-NEXT: vmovq %xmm0, %rcx
804; AVX-NEXT: movq %rcx, %rax
805; AVX-NEXT: imulq %rsi
806; AVX-NEXT: movq %rdx, %rax
807; AVX-NEXT: shrq $63, %rax
808; AVX-NEXT: sarq %rdx
809; AVX-NEXT: addq %rax, %rdx
810; AVX-NEXT: leaq (,%rdx,8), %rax
811; AVX-NEXT: subq %rdx, %rax
812; AVX-NEXT: subq %rax, %rcx
813; AVX-NEXT: vmovq %rcx, %xmm0
814; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
815; AVX-NEXT: retq
816 %res = srem <2 x i64> %a, <i64 7, i64 7>
817 ret <2 x i64> %res
818}
819
820define <4 x i32> @test_rem7_4i32(<4 x i32> %a) nounwind {
821; SSE2-LABEL: test_rem7_4i32:
822; SSE2: # BB#0:
823; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
824; SSE2-NEXT: movdqa %xmm0, %xmm2
825; SSE2-NEXT: psrad $31, %xmm2
826; SSE2-NEXT: pand %xmm1, %xmm2
827; SSE2-NEXT: movdqa %xmm0, %xmm3
828; SSE2-NEXT: pmuludq %xmm1, %xmm3
829; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3]
830; SSE2-NEXT: psrad $31, %xmm1
831; SSE2-NEXT: pand %xmm0, %xmm1
832; SSE2-NEXT: paddd %xmm1, %xmm2
833; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
834; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
835; SSE2-NEXT: pmuludq %xmm4, %xmm3
836; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3]
837; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
838; SSE2-NEXT: psubd %xmm2, %xmm1
839; SSE2-NEXT: paddd %xmm0, %xmm1
840; SSE2-NEXT: movdqa %xmm1, %xmm2
841; SSE2-NEXT: psrld $31, %xmm2
842; SSE2-NEXT: psrad $2, %xmm1
843; SSE2-NEXT: paddd %xmm2, %xmm1
844; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [7,7,7,7]
845; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3]
846; SSE2-NEXT: pmuludq %xmm2, %xmm1
847; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
848; SSE2-NEXT: pmuludq %xmm2, %xmm3
849; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3]
850; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
851; SSE2-NEXT: psubd %xmm1, %xmm0
852; SSE2-NEXT: retq
853;
854; SSE41-LABEL: test_rem7_4i32:
855; SSE41: # BB#0:
856; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
857; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
858; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
859; SSE41-NEXT: pmuldq %xmm2, %xmm3
860; SSE41-NEXT: pmuldq %xmm0, %xmm1
861; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
862; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3],xmm1[4,5],xmm3[6,7]
863; SSE41-NEXT: paddd %xmm0, %xmm1
864; SSE41-NEXT: movdqa %xmm1, %xmm2
865; SSE41-NEXT: psrld $31, %xmm2
866; SSE41-NEXT: psrad $2, %xmm1
867; SSE41-NEXT: paddd %xmm2, %xmm1
868; SSE41-NEXT: pmulld {{.*}}(%rip), %xmm1
869; SSE41-NEXT: psubd %xmm1, %xmm0
870; SSE41-NEXT: retq
871;
872; AVX1-LABEL: test_rem7_4i32:
873; AVX1: # BB#0:
874; AVX1-NEXT: vmovdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
875; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
876; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
877; AVX1-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
878; AVX1-NEXT: vpmuldq %xmm1, %xmm0, %xmm1
879; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
880; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
881; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm1
882; AVX1-NEXT: vpsrld $31, %xmm1, %xmm2
883; AVX1-NEXT: vpsrad $2, %xmm1, %xmm1
884; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1
885; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm1, %xmm1
886; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0
887; AVX1-NEXT: retq
888;
889; AVX2-LABEL: test_rem7_4i32:
890; AVX2: # BB#0:
891; AVX2-NEXT: vpbroadcastd {{.*}}(%rip), %xmm1
892; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
893; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
894; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2
895; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm1
896; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
897; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
898; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm1
899; AVX2-NEXT: vpsrld $31, %xmm1, %xmm2
900; AVX2-NEXT: vpsrad $2, %xmm1, %xmm1
901; AVX2-NEXT: vpaddd %xmm2, %xmm1, %xmm1
902; AVX2-NEXT: vpbroadcastd {{.*}}(%rip), %xmm2
903; AVX2-NEXT: vpmulld %xmm2, %xmm1, %xmm1
904; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0
905; AVX2-NEXT: retq
906 %res = srem <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
907 ret <4 x i32> %res
908}
909
910define <8 x i16> @test_rem7_8i16(<8 x i16> %a) nounwind {
911; SSE-LABEL: test_rem7_8i16:
912; SSE: # BB#0:
913; SSE-NEXT: movdqa {{.*#+}} xmm1 = [18725,18725,18725,18725,18725,18725,18725,18725]
914; SSE-NEXT: pmulhw %xmm0, %xmm1
915; SSE-NEXT: movdqa %xmm1, %xmm2
916; SSE-NEXT: psrlw $15, %xmm2
917; SSE-NEXT: psraw $1, %xmm1
918; SSE-NEXT: paddw %xmm2, %xmm1
919; SSE-NEXT: pmullw {{.*}}(%rip), %xmm1
920; SSE-NEXT: psubw %xmm1, %xmm0
921; SSE-NEXT: retq
922;
923; AVX-LABEL: test_rem7_8i16:
924; AVX: # BB#0:
925; AVX-NEXT: vpmulhw {{.*}}(%rip), %xmm0, %xmm1
926; AVX-NEXT: vpsrlw $15, %xmm1, %xmm2
927; AVX-NEXT: vpsraw $1, %xmm1, %xmm1
928; AVX-NEXT: vpaddw %xmm2, %xmm1, %xmm1
929; AVX-NEXT: vpmullw {{.*}}(%rip), %xmm1, %xmm1
930; AVX-NEXT: vpsubw %xmm1, %xmm0, %xmm0
931; AVX-NEXT: retq
932 %res = srem <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
933 ret <8 x i16> %res
934}
935
936define <16 x i8> @test_rem7_16i8(<16 x i8> %a) nounwind {
937; SSE2-LABEL: test_rem7_16i8:
938; SSE2: # BB#0:
939; SSE2-NEXT: pushq %rbp
940; SSE2-NEXT: pushq %r15
941; SSE2-NEXT: pushq %r14
942; SSE2-NEXT: pushq %rbx
943; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
944; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ecx
945; SSE2-NEXT: imull $-109, %ecx, %eax
946; SSE2-NEXT: shrl $8, %eax
947; SSE2-NEXT: addb %cl, %al
948; SSE2-NEXT: movb %al, %dl
949; SSE2-NEXT: shrb $7, %dl
950; SSE2-NEXT: sarb $2, %al
951; SSE2-NEXT: addb %dl, %al
952; SSE2-NEXT: movb $7, %r11b
953; SSE2-NEXT: mulb %r11b
954; SSE2-NEXT: subb %al, %cl
955; SSE2-NEXT: movzbl %cl, %eax
956; SSE2-NEXT: movd %eax, %xmm0
957; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r15d
958; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ebx
959; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r9d
960; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %edi
961; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r14d
962; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %esi
963; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r8d
964; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ebp
965; SSE2-NEXT: imull $-109, %ebp, %eax
966; SSE2-NEXT: shrl $8, %eax
967; SSE2-NEXT: addb %bpl, %al
968; SSE2-NEXT: movb %al, %dl
969; SSE2-NEXT: shrb $7, %dl
970; SSE2-NEXT: sarb $2, %al
971; SSE2-NEXT: addb %dl, %al
972; SSE2-NEXT: mulb %r11b
973; SSE2-NEXT: subb %al, %bpl
974; SSE2-NEXT: movzbl %bpl, %eax
975; SSE2-NEXT: movd %eax, %xmm1
976; SSE2-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]
977; SSE2-NEXT: imull $-109, %edi, %eax
978; SSE2-NEXT: shrl $8, %eax
979; SSE2-NEXT: addb %dil, %al
980; SSE2-NEXT: movb %al, %dl
981; SSE2-NEXT: shrb $7, %dl
982; SSE2-NEXT: sarb $2, %al
983; SSE2-NEXT: addb %dl, %al
984; SSE2-NEXT: mulb %r11b
985; SSE2-NEXT: subb %al, %dil
986; SSE2-NEXT: movzbl %dil, %eax
987; SSE2-NEXT: movd %eax, %xmm2
988; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %edi
989; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ebp
990; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %r10d
991; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %edx
992; SSE2-NEXT: imull $-109, %edx, %eax
993; SSE2-NEXT: shrl $8, %eax
994; SSE2-NEXT: addb %dl, %al
995; SSE2-NEXT: movb %al, %cl
996; SSE2-NEXT: shrb $7, %cl
997; SSE2-NEXT: sarb $2, %al
998; SSE2-NEXT: addb %cl, %al
999; SSE2-NEXT: mulb %r11b
1000; SSE2-NEXT: subb %al, %dl
1001; SSE2-NEXT: movzbl %dl, %eax
1002; SSE2-NEXT: movd %eax, %xmm0
1003; SSE2-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]
1004; SSE2-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]
1005; SSE2-NEXT: imull $-109, %ebx, %eax
1006; SSE2-NEXT: shrl $8, %eax
1007; SSE2-NEXT: addb %bl, %al
1008; SSE2-NEXT: movb %al, %cl
1009; SSE2-NEXT: shrb $7, %cl
1010; SSE2-NEXT: sarb $2, %al
1011; SSE2-NEXT: addb %cl, %al
1012; SSE2-NEXT: mulb %r11b
1013; SSE2-NEXT: subb %al, %bl
1014; SSE2-NEXT: movzbl %bl, %eax
1015; SSE2-NEXT: movd %eax, %xmm1
1016; SSE2-NEXT: imull $-109, %ebp, %eax
1017; SSE2-NEXT: shrl $8, %eax
1018; SSE2-NEXT: addb %bpl, %al
1019; SSE2-NEXT: movb %al, %cl
1020; SSE2-NEXT: shrb $7, %cl
1021; SSE2-NEXT: sarb $2, %al
1022; SSE2-NEXT: addb %cl, %al
1023; SSE2-NEXT: mulb %r11b
1024; SSE2-NEXT: subb %al, %bpl
1025; SSE2-NEXT: movzbl %bpl, %eax
1026; SSE2-NEXT: movd %eax, %xmm2
1027; SSE2-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]
1028; SSE2-NEXT: imull $-109, %esi, %eax
1029; SSE2-NEXT: shrl $8, %eax
1030; SSE2-NEXT: addb %sil, %al
1031; SSE2-NEXT: movb %al, %cl
1032; SSE2-NEXT: shrb $7, %cl
1033; SSE2-NEXT: sarb $2, %al
1034; SSE2-NEXT: addb %cl, %al
1035; SSE2-NEXT: mulb %r11b
1036; SSE2-NEXT: subb %al, %sil
1037; SSE2-NEXT: movzbl %sil, %eax
1038; SSE2-NEXT: movd %eax, %xmm3
1039; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ecx
1040; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %edx
1041; SSE2-NEXT: imull $-109, %edx, %eax
1042; SSE2-NEXT: shrl $8, %eax
1043; SSE2-NEXT: addb %dl, %al
1044; SSE2-NEXT: movb %al, %bl
1045; SSE2-NEXT: shrb $7, %bl
1046; SSE2-NEXT: sarb $2, %al
1047; SSE2-NEXT: addb %bl, %al
1048; SSE2-NEXT: mulb %r11b
1049; SSE2-NEXT: subb %al, %dl
1050; SSE2-NEXT: movzbl %dl, %eax
1051; SSE2-NEXT: movd %eax, %xmm1
1052; SSE2-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]
1053; SSE2-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]
1054; SSE2-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]
1055; SSE2-NEXT: imull $-109, %r15d, %eax
1056; SSE2-NEXT: shrl $8, %eax
1057; SSE2-NEXT: addb %r15b, %al
1058; SSE2-NEXT: movb %al, %dl
1059; SSE2-NEXT: shrb $7, %dl
1060; SSE2-NEXT: sarb $2, %al
1061; SSE2-NEXT: addb %dl, %al
1062; SSE2-NEXT: mulb %r11b
1063; SSE2-NEXT: subb %al, %r15b
1064; SSE2-NEXT: movzbl %r15b, %eax
1065; SSE2-NEXT: movd %eax, %xmm2
1066; SSE2-NEXT: imull $-109, %edi, %eax
1067; SSE2-NEXT: shrl $8, %eax
1068; SSE2-NEXT: addb %dil, %al
1069; SSE2-NEXT: movb %al, %dl
1070; SSE2-NEXT: shrb $7, %dl
1071; SSE2-NEXT: sarb $2, %al
1072; SSE2-NEXT: addb %dl, %al
1073; SSE2-NEXT: mulb %r11b
1074; SSE2-NEXT: subb %al, %dil
1075; SSE2-NEXT: movzbl %dil, %eax
1076; SSE2-NEXT: movd %eax, %xmm0
1077; SSE2-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]
1078; SSE2-NEXT: imull $-109, %r14d, %eax
1079; SSE2-NEXT: shrl $8, %eax
1080; SSE2-NEXT: addb %r14b, %al
1081; SSE2-NEXT: movb %al, %dl
1082; SSE2-NEXT: shrb $7, %dl
1083; SSE2-NEXT: sarb $2, %al
1084; SSE2-NEXT: addb %dl, %al
1085; SSE2-NEXT: mulb %r11b
1086; SSE2-NEXT: subb %al, %r14b
1087; SSE2-NEXT: movzbl %r14b, %eax
1088; SSE2-NEXT: movd %eax, %xmm3
1089; SSE2-NEXT: imull $-109, %ecx, %eax
1090; SSE2-NEXT: shrl $8, %eax
1091; SSE2-NEXT: addb %cl, %al
1092; SSE2-NEXT: movb %al, %dl
1093; SSE2-NEXT: shrb $7, %dl
1094; SSE2-NEXT: sarb $2, %al
1095; SSE2-NEXT: addb %dl, %al
1096; SSE2-NEXT: mulb %r11b
1097; SSE2-NEXT: subb %al, %cl
1098; SSE2-NEXT: movzbl %cl, %eax
1099; SSE2-NEXT: movd %eax, %xmm2
1100; SSE2-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]
1101; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
1102; SSE2-NEXT: imull $-109, %r9d, %eax
1103; SSE2-NEXT: shrl $8, %eax
1104; SSE2-NEXT: addb %r9b, %al
1105; SSE2-NEXT: movb %al, %cl
1106; SSE2-NEXT: shrb $7, %cl
1107; SSE2-NEXT: sarb $2, %al
1108; SSE2-NEXT: addb %cl, %al
1109; SSE2-NEXT: mulb %r11b
1110; SSE2-NEXT: subb %al, %r9b
1111; SSE2-NEXT: movzbl %r9b, %eax
1112; SSE2-NEXT: movd %eax, %xmm0
1113; SSE2-NEXT: imull $-109, %r10d, %eax
1114; SSE2-NEXT: shrl $8, %eax
1115; SSE2-NEXT: addb %r10b, %al
1116; SSE2-NEXT: movb %al, %cl
1117; SSE2-NEXT: shrb $7, %cl
1118; SSE2-NEXT: sarb $2, %al
1119; SSE2-NEXT: addb %cl, %al
1120; SSE2-NEXT: mulb %r11b
1121; SSE2-NEXT: subb %al, %r10b
1122; SSE2-NEXT: movzbl %r10b, %eax
1123; SSE2-NEXT: movd %eax, %xmm3
1124; SSE2-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]
1125; SSE2-NEXT: imull $-109, %r8d, %eax
1126; SSE2-NEXT: shrl $8, %eax
1127; SSE2-NEXT: addb %r8b, %al
1128; SSE2-NEXT: movb %al, %cl
1129; SSE2-NEXT: shrb $7, %cl
1130; SSE2-NEXT: sarb $2, %al
1131; SSE2-NEXT: addb %cl, %al
1132; SSE2-NEXT: mulb %r11b
1133; SSE2-NEXT: subb %al, %r8b
1134; SSE2-NEXT: movzbl %r8b, %eax
1135; SSE2-NEXT: movd %eax, %xmm4
1136; SSE2-NEXT: movsbl -{{[0-9]+}}(%rsp), %ecx
1137; SSE2-NEXT: imull $-109, %ecx, %eax
1138; SSE2-NEXT: shrl $8, %eax
1139; SSE2-NEXT: addb %cl, %al
1140; SSE2-NEXT: movb %al, %dl
1141; SSE2-NEXT: shrb $7, %dl
1142; SSE2-NEXT: sarb $2, %al
1143; SSE2-NEXT: addb %dl, %al
1144; SSE2-NEXT: mulb %r11b
1145; SSE2-NEXT: subb %al, %cl
1146; SSE2-NEXT: movzbl %cl, %eax
1147; SSE2-NEXT: movd %eax, %xmm0
1148; SSE2-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]
1149; 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]
1150; SSE2-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]
1151; SSE2-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]
1152; SSE2-NEXT: popq %rbx
1153; SSE2-NEXT: popq %r14
1154; SSE2-NEXT: popq %r15
1155; SSE2-NEXT: popq %rbp
1156; SSE2-NEXT: retq
1157;
1158; SSE41-LABEL: test_rem7_16i8:
1159; SSE41: # BB#0:
1160; SSE41-NEXT: pextrb $1, %xmm0, %eax
1161; SSE41-NEXT: movsbl %al, %edx
1162; SSE41-NEXT: imull $-109, %edx, %eax
1163; SSE41-NEXT: shrl $8, %eax
1164; SSE41-NEXT: addb %dl, %al
1165; SSE41-NEXT: movb %al, %cl
1166; SSE41-NEXT: shrb $7, %cl
1167; SSE41-NEXT: sarb $2, %al
1168; SSE41-NEXT: addb %cl, %al
1169; SSE41-NEXT: movb $7, %dil
1170; SSE41-NEXT: mulb %dil
1171; SSE41-NEXT: subb %al, %dl
1172; SSE41-NEXT: movzbl %dl, %edx
1173; SSE41-NEXT: pextrb $0, %xmm0, %eax
1174; SSE41-NEXT: movsbl %al, %esi
1175; SSE41-NEXT: imull $-109, %esi, %eax
1176; SSE41-NEXT: shrl $8, %eax
1177; SSE41-NEXT: addb %sil, %al
1178; SSE41-NEXT: movb %al, %cl
1179; SSE41-NEXT: shrb $7, %cl
1180; SSE41-NEXT: sarb $2, %al
1181; SSE41-NEXT: addb %cl, %al
1182; SSE41-NEXT: mulb %dil
1183; SSE41-NEXT: subb %al, %sil
1184; SSE41-NEXT: movzbl %sil, %eax
1185; SSE41-NEXT: movd %eax, %xmm1
1186; SSE41-NEXT: pinsrb $1, %edx, %xmm1
1187; SSE41-NEXT: pextrb $2, %xmm0, %eax
1188; SSE41-NEXT: movsbl %al, %ecx
1189; SSE41-NEXT: imull $-109, %ecx, %eax
1190; SSE41-NEXT: shrl $8, %eax
1191; SSE41-NEXT: addb %cl, %al
1192; SSE41-NEXT: movb %al, %dl
1193; SSE41-NEXT: shrb $7, %dl
1194; SSE41-NEXT: sarb $2, %al
1195; SSE41-NEXT: addb %dl, %al
1196; SSE41-NEXT: mulb %dil
1197; SSE41-NEXT: subb %al, %cl
1198; SSE41-NEXT: movzbl %cl, %eax
1199; SSE41-NEXT: pinsrb $2, %eax, %xmm1
1200; SSE41-NEXT: pextrb $3, %xmm0, %eax
1201; SSE41-NEXT: movsbl %al, %ecx
1202; SSE41-NEXT: imull $-109, %ecx, %eax
1203; SSE41-NEXT: shrl $8, %eax
1204; SSE41-NEXT: addb %cl, %al
1205; SSE41-NEXT: movb %al, %dl
1206; SSE41-NEXT: shrb $7, %dl
1207; SSE41-NEXT: sarb $2, %al
1208; SSE41-NEXT: addb %dl, %al
1209; SSE41-NEXT: mulb %dil
1210; SSE41-NEXT: subb %al, %cl
1211; SSE41-NEXT: movzbl %cl, %eax
1212; SSE41-NEXT: pinsrb $3, %eax, %xmm1
1213; SSE41-NEXT: pextrb $4, %xmm0, %eax
1214; SSE41-NEXT: movsbl %al, %ecx
1215; SSE41-NEXT: imull $-109, %ecx, %eax
1216; SSE41-NEXT: shrl $8, %eax
1217; SSE41-NEXT: addb %cl, %al
1218; SSE41-NEXT: movb %al, %dl
1219; SSE41-NEXT: shrb $7, %dl
1220; SSE41-NEXT: sarb $2, %al
1221; SSE41-NEXT: addb %dl, %al
1222; SSE41-NEXT: mulb %dil
1223; SSE41-NEXT: subb %al, %cl
1224; SSE41-NEXT: movzbl %cl, %eax
1225; SSE41-NEXT: pinsrb $4, %eax, %xmm1
1226; SSE41-NEXT: pextrb $5, %xmm0, %eax
1227; SSE41-NEXT: movsbl %al, %ecx
1228; SSE41-NEXT: imull $-109, %ecx, %eax
1229; SSE41-NEXT: shrl $8, %eax
1230; SSE41-NEXT: addb %cl, %al
1231; SSE41-NEXT: movb %al, %dl
1232; SSE41-NEXT: shrb $7, %dl
1233; SSE41-NEXT: sarb $2, %al
1234; SSE41-NEXT: addb %dl, %al
1235; SSE41-NEXT: mulb %dil
1236; SSE41-NEXT: subb %al, %cl
1237; SSE41-NEXT: movzbl %cl, %eax
1238; SSE41-NEXT: pinsrb $5, %eax, %xmm1
1239; SSE41-NEXT: pextrb $6, %xmm0, %eax
1240; SSE41-NEXT: movsbl %al, %ecx
1241; SSE41-NEXT: imull $-109, %ecx, %eax
1242; SSE41-NEXT: shrl $8, %eax
1243; SSE41-NEXT: addb %cl, %al
1244; SSE41-NEXT: movb %al, %dl
1245; SSE41-NEXT: shrb $7, %dl
1246; SSE41-NEXT: sarb $2, %al
1247; SSE41-NEXT: addb %dl, %al
1248; SSE41-NEXT: mulb %dil
1249; SSE41-NEXT: subb %al, %cl
1250; SSE41-NEXT: movzbl %cl, %eax
1251; SSE41-NEXT: pinsrb $6, %eax, %xmm1
1252; SSE41-NEXT: pextrb $7, %xmm0, %eax
1253; SSE41-NEXT: movsbl %al, %ecx
1254; SSE41-NEXT: imull $-109, %ecx, %eax
1255; SSE41-NEXT: shrl $8, %eax
1256; SSE41-NEXT: addb %cl, %al
1257; SSE41-NEXT: movb %al, %dl
1258; SSE41-NEXT: shrb $7, %dl
1259; SSE41-NEXT: sarb $2, %al
1260; SSE41-NEXT: addb %dl, %al
1261; SSE41-NEXT: mulb %dil
1262; SSE41-NEXT: subb %al, %cl
1263; SSE41-NEXT: movzbl %cl, %eax
1264; SSE41-NEXT: pinsrb $7, %eax, %xmm1
1265; SSE41-NEXT: pextrb $8, %xmm0, %eax
1266; SSE41-NEXT: movsbl %al, %ecx
1267; SSE41-NEXT: imull $-109, %ecx, %eax
1268; SSE41-NEXT: shrl $8, %eax
1269; SSE41-NEXT: addb %cl, %al
1270; SSE41-NEXT: movb %al, %dl
1271; SSE41-NEXT: shrb $7, %dl
1272; SSE41-NEXT: sarb $2, %al
1273; SSE41-NEXT: addb %dl, %al
1274; SSE41-NEXT: mulb %dil
1275; SSE41-NEXT: subb %al, %cl
1276; SSE41-NEXT: movzbl %cl, %eax
1277; SSE41-NEXT: pinsrb $8, %eax, %xmm1
1278; SSE41-NEXT: pextrb $9, %xmm0, %eax
1279; SSE41-NEXT: movsbl %al, %ecx
1280; SSE41-NEXT: imull $-109, %ecx, %eax
1281; SSE41-NEXT: shrl $8, %eax
1282; SSE41-NEXT: addb %cl, %al
1283; SSE41-NEXT: movb %al, %dl
1284; SSE41-NEXT: shrb $7, %dl
1285; SSE41-NEXT: sarb $2, %al
1286; SSE41-NEXT: addb %dl, %al
1287; SSE41-NEXT: mulb %dil
1288; SSE41-NEXT: subb %al, %cl
1289; SSE41-NEXT: movzbl %cl, %eax
1290; SSE41-NEXT: pinsrb $9, %eax, %xmm1
1291; SSE41-NEXT: pextrb $10, %xmm0, %eax
1292; SSE41-NEXT: movsbl %al, %ecx
1293; SSE41-NEXT: imull $-109, %ecx, %eax
1294; SSE41-NEXT: shrl $8, %eax
1295; SSE41-NEXT: addb %cl, %al
1296; SSE41-NEXT: movb %al, %dl
1297; SSE41-NEXT: shrb $7, %dl
1298; SSE41-NEXT: sarb $2, %al
1299; SSE41-NEXT: addb %dl, %al
1300; SSE41-NEXT: mulb %dil
1301; SSE41-NEXT: subb %al, %cl
1302; SSE41-NEXT: movzbl %cl, %eax
1303; SSE41-NEXT: pinsrb $10, %eax, %xmm1
1304; SSE41-NEXT: pextrb $11, %xmm0, %eax
1305; SSE41-NEXT: movsbl %al, %ecx
1306; SSE41-NEXT: imull $-109, %ecx, %eax
1307; SSE41-NEXT: shrl $8, %eax
1308; SSE41-NEXT: addb %cl, %al
1309; SSE41-NEXT: movb %al, %dl
1310; SSE41-NEXT: shrb $7, %dl
1311; SSE41-NEXT: sarb $2, %al
1312; SSE41-NEXT: addb %dl, %al
1313; SSE41-NEXT: mulb %dil
1314; SSE41-NEXT: subb %al, %cl
1315; SSE41-NEXT: movzbl %cl, %eax
1316; SSE41-NEXT: pinsrb $11, %eax, %xmm1
1317; SSE41-NEXT: pextrb $12, %xmm0, %eax
1318; SSE41-NEXT: movsbl %al, %ecx
1319; SSE41-NEXT: imull $-109, %ecx, %eax
1320; SSE41-NEXT: shrl $8, %eax
1321; SSE41-NEXT: addb %cl, %al
1322; SSE41-NEXT: movb %al, %dl
1323; SSE41-NEXT: shrb $7, %dl
1324; SSE41-NEXT: sarb $2, %al
1325; SSE41-NEXT: addb %dl, %al
1326; SSE41-NEXT: mulb %dil
1327; SSE41-NEXT: subb %al, %cl
1328; SSE41-NEXT: movzbl %cl, %eax
1329; SSE41-NEXT: pinsrb $12, %eax, %xmm1
1330; SSE41-NEXT: pextrb $13, %xmm0, %eax
1331; SSE41-NEXT: movsbl %al, %ecx
1332; SSE41-NEXT: imull $-109, %ecx, %eax
1333; SSE41-NEXT: shrl $8, %eax
1334; SSE41-NEXT: addb %cl, %al
1335; SSE41-NEXT: movb %al, %dl
1336; SSE41-NEXT: shrb $7, %dl
1337; SSE41-NEXT: sarb $2, %al
1338; SSE41-NEXT: addb %dl, %al
1339; SSE41-NEXT: mulb %dil
1340; SSE41-NEXT: subb %al, %cl
1341; SSE41-NEXT: movzbl %cl, %eax
1342; SSE41-NEXT: pinsrb $13, %eax, %xmm1
1343; SSE41-NEXT: pextrb $14, %xmm0, %eax
1344; SSE41-NEXT: movsbl %al, %ecx
1345; SSE41-NEXT: imull $-109, %ecx, %eax
1346; SSE41-NEXT: shrl $8, %eax
1347; SSE41-NEXT: addb %cl, %al
1348; SSE41-NEXT: movb %al, %dl
1349; SSE41-NEXT: shrb $7, %dl
1350; SSE41-NEXT: sarb $2, %al
1351; SSE41-NEXT: addb %dl, %al
1352; SSE41-NEXT: mulb %dil
1353; SSE41-NEXT: subb %al, %cl
1354; SSE41-NEXT: movzbl %cl, %eax
1355; SSE41-NEXT: pinsrb $14, %eax, %xmm1
1356; SSE41-NEXT: pextrb $15, %xmm0, %eax
1357; SSE41-NEXT: movsbl %al, %ecx
1358; SSE41-NEXT: imull $-109, %ecx, %eax
1359; SSE41-NEXT: shrl $8, %eax
1360; SSE41-NEXT: addb %cl, %al
1361; SSE41-NEXT: movb %al, %dl
1362; SSE41-NEXT: shrb $7, %dl
1363; SSE41-NEXT: sarb $2, %al
1364; SSE41-NEXT: addb %dl, %al
1365; SSE41-NEXT: mulb %dil
1366; SSE41-NEXT: subb %al, %cl
1367; SSE41-NEXT: movzbl %cl, %eax
1368; SSE41-NEXT: pinsrb $15, %eax, %xmm1
1369; SSE41-NEXT: movdqa %xmm1, %xmm0
1370; SSE41-NEXT: retq
1371;
1372; AVX-LABEL: test_rem7_16i8:
1373; AVX: # BB#0:
1374; AVX-NEXT: vpextrb $1, %xmm0, %eax
1375; AVX-NEXT: movsbl %al, %edx
1376; AVX-NEXT: imull $-109, %edx, %eax
1377; AVX-NEXT: shrl $8, %eax
1378; AVX-NEXT: addb %dl, %al
1379; AVX-NEXT: movb %al, %cl
1380; AVX-NEXT: shrb $7, %cl
1381; AVX-NEXT: sarb $2, %al
1382; AVX-NEXT: addb %cl, %al
1383; AVX-NEXT: movb $7, %dil
1384; AVX-NEXT: mulb %dil
1385; AVX-NEXT: subb %al, %dl
1386; AVX-NEXT: movzbl %dl, %edx
1387; AVX-NEXT: vpextrb $0, %xmm0, %eax
1388; AVX-NEXT: movsbl %al, %esi
1389; AVX-NEXT: imull $-109, %esi, %eax
1390; AVX-NEXT: shrl $8, %eax
1391; AVX-NEXT: addb %sil, %al
1392; AVX-NEXT: movb %al, %cl
1393; AVX-NEXT: shrb $7, %cl
1394; AVX-NEXT: sarb $2, %al
1395; AVX-NEXT: addb %cl, %al
1396; AVX-NEXT: mulb %dil
1397; AVX-NEXT: subb %al, %sil
1398; AVX-NEXT: movzbl %sil, %eax
1399; AVX-NEXT: vmovd %eax, %xmm1
1400; AVX-NEXT: vpinsrb $1, %edx, %xmm1, %xmm1
1401; AVX-NEXT: vpextrb $2, %xmm0, %eax
1402; AVX-NEXT: movsbl %al, %ecx
1403; AVX-NEXT: imull $-109, %ecx, %eax
1404; AVX-NEXT: shrl $8, %eax
1405; AVX-NEXT: addb %cl, %al
1406; AVX-NEXT: movb %al, %dl
1407; AVX-NEXT: shrb $7, %dl
1408; AVX-NEXT: sarb $2, %al
1409; AVX-NEXT: addb %dl, %al
1410; AVX-NEXT: mulb %dil
1411; AVX-NEXT: subb %al, %cl
1412; AVX-NEXT: movzbl %cl, %eax
1413; AVX-NEXT: vpinsrb $2, %eax, %xmm1, %xmm1
1414; AVX-NEXT: vpextrb $3, %xmm0, %eax
1415; AVX-NEXT: movsbl %al, %ecx
1416; AVX-NEXT: imull $-109, %ecx, %eax
1417; AVX-NEXT: shrl $8, %eax
1418; AVX-NEXT: addb %cl, %al
1419; AVX-NEXT: movb %al, %dl
1420; AVX-NEXT: shrb $7, %dl
1421; AVX-NEXT: sarb $2, %al
1422; AVX-NEXT: addb %dl, %al
1423; AVX-NEXT: mulb %dil
1424; AVX-NEXT: subb %al, %cl
1425; AVX-NEXT: movzbl %cl, %eax
1426; AVX-NEXT: vpinsrb $3, %eax, %xmm1, %xmm1
1427; AVX-NEXT: vpextrb $4, %xmm0, %eax
1428; AVX-NEXT: movsbl %al, %ecx
1429; AVX-NEXT: imull $-109, %ecx, %eax
1430; AVX-NEXT: shrl $8, %eax
1431; AVX-NEXT: addb %cl, %al
1432; AVX-NEXT: movb %al, %dl
1433; AVX-NEXT: shrb $7, %dl
1434; AVX-NEXT: sarb $2, %al
1435; AVX-NEXT: addb %dl, %al
1436; AVX-NEXT: mulb %dil
1437; AVX-NEXT: subb %al, %cl
1438; AVX-NEXT: movzbl %cl, %eax
1439; AVX-NEXT: vpinsrb $4, %eax, %xmm1, %xmm1
1440; AVX-NEXT: vpextrb $5, %xmm0, %eax
1441; AVX-NEXT: movsbl %al, %ecx
1442; AVX-NEXT: imull $-109, %ecx, %eax
1443; AVX-NEXT: shrl $8, %eax
1444; AVX-NEXT: addb %cl, %al
1445; AVX-NEXT: movb %al, %dl
1446; AVX-NEXT: shrb $7, %dl
1447; AVX-NEXT: sarb $2, %al
1448; AVX-NEXT: addb %dl, %al
1449; AVX-NEXT: mulb %dil
1450; AVX-NEXT: subb %al, %cl
1451; AVX-NEXT: movzbl %cl, %eax
1452; AVX-NEXT: vpinsrb $5, %eax, %xmm1, %xmm1
1453; AVX-NEXT: vpextrb $6, %xmm0, %eax
1454; AVX-NEXT: movsbl %al, %ecx
1455; AVX-NEXT: imull $-109, %ecx, %eax
1456; AVX-NEXT: shrl $8, %eax
1457; AVX-NEXT: addb %cl, %al
1458; AVX-NEXT: movb %al, %dl
1459; AVX-NEXT: shrb $7, %dl
1460; AVX-NEXT: sarb $2, %al
1461; AVX-NEXT: addb %dl, %al
1462; AVX-NEXT: mulb %dil
1463; AVX-NEXT: subb %al, %cl
1464; AVX-NEXT: movzbl %cl, %eax
1465; AVX-NEXT: vpinsrb $6, %eax, %xmm1, %xmm1
1466; AVX-NEXT: vpextrb $7, %xmm0, %eax
1467; AVX-NEXT: movsbl %al, %ecx
1468; AVX-NEXT: imull $-109, %ecx, %eax
1469; AVX-NEXT: shrl $8, %eax
1470; AVX-NEXT: addb %cl, %al
1471; AVX-NEXT: movb %al, %dl
1472; AVX-NEXT: shrb $7, %dl
1473; AVX-NEXT: sarb $2, %al
1474; AVX-NEXT: addb %dl, %al
1475; AVX-NEXT: mulb %dil
1476; AVX-NEXT: subb %al, %cl
1477; AVX-NEXT: movzbl %cl, %eax
1478; AVX-NEXT: vpinsrb $7, %eax, %xmm1, %xmm1
1479; AVX-NEXT: vpextrb $8, %xmm0, %eax
1480; AVX-NEXT: movsbl %al, %ecx
1481; AVX-NEXT: imull $-109, %ecx, %eax
1482; AVX-NEXT: shrl $8, %eax
1483; AVX-NEXT: addb %cl, %al
1484; AVX-NEXT: movb %al, %dl
1485; AVX-NEXT: shrb $7, %dl
1486; AVX-NEXT: sarb $2, %al
1487; AVX-NEXT: addb %dl, %al
1488; AVX-NEXT: mulb %dil
1489; AVX-NEXT: subb %al, %cl
1490; AVX-NEXT: movzbl %cl, %eax
1491; AVX-NEXT: vpinsrb $8, %eax, %xmm1, %xmm1
1492; AVX-NEXT: vpextrb $9, %xmm0, %eax
1493; AVX-NEXT: movsbl %al, %ecx
1494; AVX-NEXT: imull $-109, %ecx, %eax
1495; AVX-NEXT: shrl $8, %eax
1496; AVX-NEXT: addb %cl, %al
1497; AVX-NEXT: movb %al, %dl
1498; AVX-NEXT: shrb $7, %dl
1499; AVX-NEXT: sarb $2, %al
1500; AVX-NEXT: addb %dl, %al
1501; AVX-NEXT: mulb %dil
1502; AVX-NEXT: subb %al, %cl
1503; AVX-NEXT: movzbl %cl, %eax
1504; AVX-NEXT: vpinsrb $9, %eax, %xmm1, %xmm1
1505; AVX-NEXT: vpextrb $10, %xmm0, %eax
1506; AVX-NEXT: movsbl %al, %ecx
1507; AVX-NEXT: imull $-109, %ecx, %eax
1508; AVX-NEXT: shrl $8, %eax
1509; AVX-NEXT: addb %cl, %al
1510; AVX-NEXT: movb %al, %dl
1511; AVX-NEXT: shrb $7, %dl
1512; AVX-NEXT: sarb $2, %al
1513; AVX-NEXT: addb %dl, %al
1514; AVX-NEXT: mulb %dil
1515; AVX-NEXT: subb %al, %cl
1516; AVX-NEXT: movzbl %cl, %eax
1517; AVX-NEXT: vpinsrb $10, %eax, %xmm1, %xmm1
1518; AVX-NEXT: vpextrb $11, %xmm0, %eax
1519; AVX-NEXT: movsbl %al, %ecx
1520; AVX-NEXT: imull $-109, %ecx, %eax
1521; AVX-NEXT: shrl $8, %eax
1522; AVX-NEXT: addb %cl, %al
1523; AVX-NEXT: movb %al, %dl
1524; AVX-NEXT: shrb $7, %dl
1525; AVX-NEXT: sarb $2, %al
1526; AVX-NEXT: addb %dl, %al
1527; AVX-NEXT: mulb %dil
1528; AVX-NEXT: subb %al, %cl
1529; AVX-NEXT: movzbl %cl, %eax
1530; AVX-NEXT: vpinsrb $11, %eax, %xmm1, %xmm1
1531; AVX-NEXT: vpextrb $12, %xmm0, %eax
1532; AVX-NEXT: movsbl %al, %ecx
1533; AVX-NEXT: imull $-109, %ecx, %eax
1534; AVX-NEXT: shrl $8, %eax
1535; AVX-NEXT: addb %cl, %al
1536; AVX-NEXT: movb %al, %dl
1537; AVX-NEXT: shrb $7, %dl
1538; AVX-NEXT: sarb $2, %al
1539; AVX-NEXT: addb %dl, %al
1540; AVX-NEXT: mulb %dil
1541; AVX-NEXT: subb %al, %cl
1542; AVX-NEXT: movzbl %cl, %eax
1543; AVX-NEXT: vpinsrb $12, %eax, %xmm1, %xmm1
1544; AVX-NEXT: vpextrb $13, %xmm0, %eax
1545; AVX-NEXT: movsbl %al, %ecx
1546; AVX-NEXT: imull $-109, %ecx, %eax
1547; AVX-NEXT: shrl $8, %eax
1548; AVX-NEXT: addb %cl, %al
1549; AVX-NEXT: movb %al, %dl
1550; AVX-NEXT: shrb $7, %dl
1551; AVX-NEXT: sarb $2, %al
1552; AVX-NEXT: addb %dl, %al
1553; AVX-NEXT: mulb %dil
1554; AVX-NEXT: subb %al, %cl
1555; AVX-NEXT: movzbl %cl, %eax
1556; AVX-NEXT: vpinsrb $13, %eax, %xmm1, %xmm1
1557; AVX-NEXT: vpextrb $14, %xmm0, %eax
1558; AVX-NEXT: movsbl %al, %ecx
1559; AVX-NEXT: imull $-109, %ecx, %eax
1560; AVX-NEXT: shrl $8, %eax
1561; AVX-NEXT: addb %cl, %al
1562; AVX-NEXT: movb %al, %dl
1563; AVX-NEXT: shrb $7, %dl
1564; AVX-NEXT: sarb $2, %al
1565; AVX-NEXT: addb %dl, %al
1566; AVX-NEXT: mulb %dil
1567; AVX-NEXT: subb %al, %cl
1568; AVX-NEXT: movzbl %cl, %eax
1569; AVX-NEXT: vpinsrb $14, %eax, %xmm1, %xmm1
1570; AVX-NEXT: vpextrb $15, %xmm0, %eax
1571; AVX-NEXT: movsbl %al, %ecx
1572; AVX-NEXT: imull $-109, %ecx, %eax
1573; AVX-NEXT: shrl $8, %eax
1574; AVX-NEXT: addb %cl, %al
1575; AVX-NEXT: movb %al, %dl
1576; AVX-NEXT: shrb $7, %dl
1577; AVX-NEXT: sarb $2, %al
1578; AVX-NEXT: addb %dl, %al
1579; AVX-NEXT: mulb %dil
1580; AVX-NEXT: subb %al, %cl
1581; AVX-NEXT: movzbl %cl, %eax
1582; AVX-NEXT: vpinsrb $15, %eax, %xmm1, %xmm0
1583; AVX-NEXT: retq
1584 %res = srem <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>
1585 ret <16 x i8> %res
1586}