Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vector-idiv-udiv-128.ll
blobac6fe217e38e2a48579824617e69f331b2e8773c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-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 --check-prefix=AVX2NOBW
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX512BW
9 ; udiv by 7
12 define <2 x i64> @test_div7_2i64(<2 x i64> %a) nounwind {
13 ; SSE2-LABEL: test_div7_2i64:
14 ; SSE2:       # %bb.0:
15 ; SSE2-NEXT:    movq %xmm0, %rcx
16 ; SSE2-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
17 ; SSE2-NEXT:    movq %rcx, %rax
18 ; SSE2-NEXT:    mulq %rsi
19 ; SSE2-NEXT:    subq %rdx, %rcx
20 ; SSE2-NEXT:    shrq %rcx
21 ; SSE2-NEXT:    addq %rdx, %rcx
22 ; SSE2-NEXT:    shrq $2, %rcx
23 ; SSE2-NEXT:    movq %rcx, %xmm1
24 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
25 ; SSE2-NEXT:    movq %xmm0, %rcx
26 ; SSE2-NEXT:    movq %rcx, %rax
27 ; SSE2-NEXT:    mulq %rsi
28 ; SSE2-NEXT:    subq %rdx, %rcx
29 ; SSE2-NEXT:    shrq %rcx
30 ; SSE2-NEXT:    addq %rdx, %rcx
31 ; SSE2-NEXT:    shrq $2, %rcx
32 ; SSE2-NEXT:    movq %rcx, %xmm0
33 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
34 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
35 ; SSE2-NEXT:    retq
37 ; SSE41-LABEL: test_div7_2i64:
38 ; SSE41:       # %bb.0:
39 ; SSE41-NEXT:    pextrq $1, %xmm0, %rcx
40 ; SSE41-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
41 ; SSE41-NEXT:    movq %rcx, %rax
42 ; SSE41-NEXT:    mulq %rsi
43 ; SSE41-NEXT:    subq %rdx, %rcx
44 ; SSE41-NEXT:    shrq %rcx
45 ; SSE41-NEXT:    addq %rdx, %rcx
46 ; SSE41-NEXT:    shrq $2, %rcx
47 ; SSE41-NEXT:    movq %rcx, %xmm1
48 ; SSE41-NEXT:    movq %xmm0, %rcx
49 ; SSE41-NEXT:    movq %rcx, %rax
50 ; SSE41-NEXT:    mulq %rsi
51 ; SSE41-NEXT:    subq %rdx, %rcx
52 ; SSE41-NEXT:    shrq %rcx
53 ; SSE41-NEXT:    addq %rdx, %rcx
54 ; SSE41-NEXT:    shrq $2, %rcx
55 ; SSE41-NEXT:    movq %rcx, %xmm0
56 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
57 ; SSE41-NEXT:    retq
59 ; AVX-LABEL: test_div7_2i64:
60 ; AVX:       # %bb.0:
61 ; AVX-NEXT:    vpextrq $1, %xmm0, %rcx
62 ; AVX-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
63 ; AVX-NEXT:    movq %rcx, %rax
64 ; AVX-NEXT:    mulq %rsi
65 ; AVX-NEXT:    subq %rdx, %rcx
66 ; AVX-NEXT:    shrq %rcx
67 ; AVX-NEXT:    addq %rdx, %rcx
68 ; AVX-NEXT:    shrq $2, %rcx
69 ; AVX-NEXT:    vmovq %rcx, %xmm1
70 ; AVX-NEXT:    vmovq %xmm0, %rcx
71 ; AVX-NEXT:    movq %rcx, %rax
72 ; AVX-NEXT:    mulq %rsi
73 ; AVX-NEXT:    subq %rdx, %rcx
74 ; AVX-NEXT:    shrq %rcx
75 ; AVX-NEXT:    addq %rdx, %rcx
76 ; AVX-NEXT:    shrq $2, %rcx
77 ; AVX-NEXT:    vmovq %rcx, %xmm0
78 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
79 ; AVX-NEXT:    retq
80   %res = udiv <2 x i64> %a, <i64 7, i64 7>
81   ret <2 x i64> %res
84 define <4 x i32> @test_div7_4i32(<4 x i32> %a) nounwind {
85 ; SSE2-LABEL: test_div7_4i32:
86 ; SSE2:       # %bb.0:
87 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
88 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
89 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
90 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
91 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
92 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
93 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
94 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
95 ; SSE2-NEXT:    psubd %xmm2, %xmm0
96 ; SSE2-NEXT:    psrld $1, %xmm0
97 ; SSE2-NEXT:    paddd %xmm2, %xmm0
98 ; SSE2-NEXT:    psrld $2, %xmm0
99 ; SSE2-NEXT:    retq
101 ; SSE41-LABEL: test_div7_4i32:
102 ; SSE41:       # %bb.0:
103 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
104 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
105 ; SSE41-NEXT:    pmuludq %xmm2, %xmm1
106 ; SSE41-NEXT:    pmuludq %xmm0, %xmm2
107 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
108 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
109 ; SSE41-NEXT:    psubd %xmm2, %xmm0
110 ; SSE41-NEXT:    psrld $1, %xmm0
111 ; SSE41-NEXT:    paddd %xmm2, %xmm0
112 ; SSE41-NEXT:    psrld $2, %xmm0
113 ; SSE41-NEXT:    retq
115 ; AVX1-LABEL: test_div7_4i32:
116 ; AVX1:       # %bb.0:
117 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
118 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
119 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1
120 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
121 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
122 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
123 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
124 ; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
125 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
126 ; AVX1-NEXT:    vpsrld $2, %xmm0, %xmm0
127 ; AVX1-NEXT:    retq
129 ; AVX2-LABEL: test_div7_4i32:
130 ; AVX2:       # %bb.0:
131 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
132 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
133 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1
134 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
135 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
136 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
137 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
138 ; AVX2-NEXT:    vpsrld $1, %xmm0, %xmm0
139 ; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
140 ; AVX2-NEXT:    vpsrld $2, %xmm0, %xmm0
141 ; AVX2-NEXT:    retq
142   %res = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
143   ret <4 x i32> %res
146 define <8 x i16> @test_div7_8i16(<8 x i16> %a) nounwind {
147 ; SSE-LABEL: test_div7_8i16:
148 ; SSE:       # %bb.0:
149 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
150 ; SSE-NEXT:    pmulhuw %xmm0, %xmm1
151 ; SSE-NEXT:    psubw %xmm1, %xmm0
152 ; SSE-NEXT:    psrlw $1, %xmm0
153 ; SSE-NEXT:    paddw %xmm1, %xmm0
154 ; SSE-NEXT:    psrlw $2, %xmm0
155 ; SSE-NEXT:    retq
157 ; AVX-LABEL: test_div7_8i16:
158 ; AVX:       # %bb.0:
159 ; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %xmm0, %xmm1
160 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
161 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm0
162 ; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
163 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm0
164 ; AVX-NEXT:    retq
165   %res = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
166   ret <8 x i16> %res
169 define <16 x i8> @test_div7_16i8(<16 x i8> %a) nounwind {
170 ; SSE2-LABEL: test_div7_16i8:
171 ; SSE2:       # %bb.0:
172 ; SSE2-NEXT:    pxor %xmm1, %xmm1
173 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
174 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
175 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [37,37,37,37,37,37,37,37]
176 ; SSE2-NEXT:    pmullw %xmm3, %xmm2
177 ; SSE2-NEXT:    psrlw $8, %xmm2
178 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
179 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
180 ; SSE2-NEXT:    pmullw %xmm3, %xmm4
181 ; SSE2-NEXT:    psrlw $8, %xmm4
182 ; SSE2-NEXT:    packuswb %xmm2, %xmm4
183 ; SSE2-NEXT:    psubb %xmm4, %xmm0
184 ; SSE2-NEXT:    psrlw $1, %xmm0
185 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
186 ; SSE2-NEXT:    paddb %xmm4, %xmm0
187 ; SSE2-NEXT:    psrlw $2, %xmm0
188 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
189 ; SSE2-NEXT:    retq
191 ; SSE41-LABEL: test_div7_16i8:
192 ; SSE41:       # %bb.0:
193 ; SSE41-NEXT:    pxor %xmm1, %xmm1
194 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
195 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
196 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [37,37,37,37,37,37,37,37]
197 ; SSE41-NEXT:    pmullw %xmm1, %xmm2
198 ; SSE41-NEXT:    psrlw $8, %xmm2
199 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
200 ; SSE41-NEXT:    pmullw %xmm1, %xmm3
201 ; SSE41-NEXT:    psrlw $8, %xmm3
202 ; SSE41-NEXT:    packuswb %xmm2, %xmm3
203 ; SSE41-NEXT:    psubb %xmm3, %xmm0
204 ; SSE41-NEXT:    psrlw $1, %xmm0
205 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
206 ; SSE41-NEXT:    paddb %xmm3, %xmm0
207 ; SSE41-NEXT:    psrlw $2, %xmm0
208 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm0
209 ; SSE41-NEXT:    retq
211 ; AVX1-LABEL: test_div7_16i8:
212 ; AVX1:       # %bb.0:
213 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
214 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
215 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [37,37,37,37,37,37,37,37]
216 ; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
217 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
218 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
219 ; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
220 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
221 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
222 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
223 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
224 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
225 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
226 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm0
227 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
228 ; AVX1-NEXT:    retq
230 ; AVX2NOBW-LABEL: test_div7_16i8:
231 ; AVX2NOBW:       # %bb.0:
232 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
233 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
234 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
235 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
236 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
237 ; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
238 ; AVX2NOBW-NEXT:    vpsrlw $1, %xmm0, %xmm0
239 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
240 ; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
241 ; AVX2NOBW-NEXT:    vpsrlw $2, %xmm0, %xmm0
242 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
243 ; AVX2NOBW-NEXT:    vzeroupper
244 ; AVX2NOBW-NEXT:    retq
246 ; AVX512BW-LABEL: test_div7_16i8:
247 ; AVX512BW:       # %bb.0:
248 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
249 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
250 ; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
251 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
252 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
253 ; AVX512BW-NEXT:    vpsrlw $1, %xmm0, %xmm0
254 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
255 ; AVX512BW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
256 ; AVX512BW-NEXT:    vpsrlw $2, %xmm0, %xmm0
257 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
258 ; AVX512BW-NEXT:    vzeroupper
259 ; AVX512BW-NEXT:    retq
260   %res = udiv <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>
261   ret <16 x i8> %res
265 ; sdiv by non-splat constant
268 define <16 x i8> @test_divconstant_16i8(<16 x i8> %a) nounwind {
269 ; SSE2-LABEL: test_divconstant_16i8:
270 ; SSE2:       # %bb.0:
271 ; SSE2-NEXT:    pxor %xmm1, %xmm1
272 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
273 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
274 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
275 ; SSE2-NEXT:    psrlw $8, %xmm2
276 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
277 ; SSE2-NEXT:    psrlw $8, %xmm2
278 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
279 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
280 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm3
281 ; SSE2-NEXT:    psrlw $8, %xmm3
282 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm3
283 ; SSE2-NEXT:    psrlw $8, %xmm3
284 ; SSE2-NEXT:    packuswb %xmm2, %xmm3
285 ; SSE2-NEXT:    psubb %xmm3, %xmm0
286 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
287 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
288 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
289 ; SSE2-NEXT:    psrlw $8, %xmm2
290 ; 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]
291 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm0
292 ; SSE2-NEXT:    psrlw $8, %xmm0
293 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
294 ; SSE2-NEXT:    paddb %xmm3, %xmm0
295 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
296 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
297 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
298 ; SSE2-NEXT:    psrlw $8, %xmm2
299 ; 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]
300 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm0
301 ; SSE2-NEXT:    psrlw $8, %xmm0
302 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
303 ; SSE2-NEXT:    retq
305 ; SSE41-LABEL: test_divconstant_16i8:
306 ; SSE41:       # %bb.0:
307 ; SSE41-NEXT:    pxor %xmm1, %xmm1
308 ; SSE41-NEXT:    pxor %xmm2, %xmm2
309 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
310 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
311 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
312 ; SSE41-NEXT:    psllw $7, %xmm3
313 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1,2,3,4,5,6,7]
314 ; SSE41-NEXT:    psrlw $8, %xmm3
315 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [147,79,171,117,205,57,57,37]
316 ; SSE41-NEXT:    pmullw %xmm3, %xmm2
317 ; SSE41-NEXT:    psrlw $8, %xmm2
318 ; SSE41-NEXT:    pxor %xmm4, %xmm4
319 ; SSE41-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
320 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
321 ; SSE41-NEXT:    psllw $7, %xmm5
322 ; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm4[0,1,2,3,4,5,6],xmm5[7]
323 ; SSE41-NEXT:    psrlw $8, %xmm5
324 ; SSE41-NEXT:    packuswb %xmm3, %xmm5
325 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
326 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm3
327 ; SSE41-NEXT:    psrlw $8, %xmm3
328 ; SSE41-NEXT:    packuswb %xmm2, %xmm3
329 ; SSE41-NEXT:    psubb %xmm3, %xmm0
330 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
331 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
332 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm0
333 ; SSE41-NEXT:    psrlw $8, %xmm0
334 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm2
335 ; SSE41-NEXT:    psrlw $8, %xmm2
336 ; SSE41-NEXT:    packuswb %xmm0, %xmm2
337 ; SSE41-NEXT:    paddb %xmm3, %xmm2
338 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
339 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
340 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm2
341 ; SSE41-NEXT:    psrlw $8, %xmm2
342 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm0
343 ; SSE41-NEXT:    psrlw $8, %xmm0
344 ; SSE41-NEXT:    packuswb %xmm2, %xmm0
345 ; SSE41-NEXT:    retq
347 ; AVX1-LABEL: test_divconstant_16i8:
348 ; AVX1:       # %bb.0:
349 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
350 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
351 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
352 ; AVX1-NEXT:    vpsllw $7, %xmm3, %xmm3
353 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3,4,5,6,7]
354 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
355 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm3
356 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
357 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm4 = 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]
358 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
359 ; AVX1-NEXT:    vpsllw $7, %xmm5, %xmm5
360 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,6],xmm5[7]
361 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
362 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm4, %xmm2
363 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
364 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm2
365 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
366 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
367 ; AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm0
368 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
369 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm3
370 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
371 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
372 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
373 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
374 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm0, %xmm0
375 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
376 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
377 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
378 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
379 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
380 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
381 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
382 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
383 ; AVX1-NEXT:    retq
385 ; AVX2NOBW-LABEL: test_divconstant_16i8:
386 ; AVX2NOBW:       # %bb.0:
387 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
388 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
389 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
390 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
391 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
392 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
393 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
394 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
395 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
396 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
397 ; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
398 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
399 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
400 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm0, %ymm0
401 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm0, %xmm2
402 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm0, %xmm0
403 ; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
404 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
405 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
406 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm0, %ymm0
407 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm0, %xmm1
408 ; AVX2NOBW-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
409 ; AVX2NOBW-NEXT:    vzeroupper
410 ; AVX2NOBW-NEXT:    retq
412 ; AVX512BW-LABEL: test_divconstant_16i8:
413 ; AVX512BW:       # %bb.0:
414 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0]
415 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
416 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm2, %zmm1
417 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
418 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
419 ; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
420 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
421 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
422 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
423 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
424 ; AVX512BW-NEXT:    vpsrlw $8, %ymm0, %ymm0
425 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
426 ; AVX512BW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
427 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
428 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [2,0,1,3,3,3,2,2,2,2,3,3,3,1,1,2]
429 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm0, %zmm0
430 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
431 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
432 ; AVX512BW-NEXT:    vzeroupper
433 ; AVX512BW-NEXT:    retq
434   %res = udiv <16 x i8> %a, <i8 7, i8 8, i8 9, i8 10,i8 11, i8 12, i8 13, i8 14, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9,i8 9, i8 7>
435   ret <16 x i8> %res
439 ; urem by 7
442 define <2 x i64> @test_rem7_2i64(<2 x i64> %a) nounwind {
443 ; SSE2-LABEL: test_rem7_2i64:
444 ; SSE2:       # %bb.0:
445 ; SSE2-NEXT:    movq %xmm0, %rcx
446 ; SSE2-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
447 ; SSE2-NEXT:    movq %rcx, %rax
448 ; SSE2-NEXT:    mulq %rsi
449 ; SSE2-NEXT:    movq %rcx, %rax
450 ; SSE2-NEXT:    subq %rdx, %rax
451 ; SSE2-NEXT:    shrq %rax
452 ; SSE2-NEXT:    addq %rdx, %rax
453 ; SSE2-NEXT:    shrq $2, %rax
454 ; SSE2-NEXT:    leaq (,%rax,8), %rdx
455 ; SSE2-NEXT:    subq %rdx, %rax
456 ; SSE2-NEXT:    addq %rcx, %rax
457 ; SSE2-NEXT:    movq %rax, %xmm1
458 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
459 ; SSE2-NEXT:    movq %xmm0, %rcx
460 ; SSE2-NEXT:    movq %rcx, %rax
461 ; SSE2-NEXT:    mulq %rsi
462 ; SSE2-NEXT:    movq %rcx, %rax
463 ; SSE2-NEXT:    subq %rdx, %rax
464 ; SSE2-NEXT:    shrq %rax
465 ; SSE2-NEXT:    addq %rdx, %rax
466 ; SSE2-NEXT:    shrq $2, %rax
467 ; SSE2-NEXT:    leaq (,%rax,8), %rdx
468 ; SSE2-NEXT:    subq %rdx, %rax
469 ; SSE2-NEXT:    addq %rcx, %rax
470 ; SSE2-NEXT:    movq %rax, %xmm0
471 ; SSE2-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
472 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
473 ; SSE2-NEXT:    retq
475 ; SSE41-LABEL: test_rem7_2i64:
476 ; SSE41:       # %bb.0:
477 ; SSE41-NEXT:    pextrq $1, %xmm0, %rcx
478 ; SSE41-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
479 ; SSE41-NEXT:    movq %rcx, %rax
480 ; SSE41-NEXT:    mulq %rsi
481 ; SSE41-NEXT:    movq %rcx, %rax
482 ; SSE41-NEXT:    subq %rdx, %rax
483 ; SSE41-NEXT:    shrq %rax
484 ; SSE41-NEXT:    addq %rdx, %rax
485 ; SSE41-NEXT:    shrq $2, %rax
486 ; SSE41-NEXT:    leaq (,%rax,8), %rdx
487 ; SSE41-NEXT:    subq %rdx, %rax
488 ; SSE41-NEXT:    addq %rcx, %rax
489 ; SSE41-NEXT:    movq %rax, %xmm1
490 ; SSE41-NEXT:    movq %xmm0, %rcx
491 ; SSE41-NEXT:    movq %rcx, %rax
492 ; SSE41-NEXT:    mulq %rsi
493 ; SSE41-NEXT:    movq %rcx, %rax
494 ; SSE41-NEXT:    subq %rdx, %rax
495 ; SSE41-NEXT:    shrq %rax
496 ; SSE41-NEXT:    addq %rdx, %rax
497 ; SSE41-NEXT:    shrq $2, %rax
498 ; SSE41-NEXT:    leaq (,%rax,8), %rdx
499 ; SSE41-NEXT:    subq %rdx, %rax
500 ; SSE41-NEXT:    addq %rcx, %rax
501 ; SSE41-NEXT:    movq %rax, %xmm0
502 ; SSE41-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
503 ; SSE41-NEXT:    retq
505 ; AVX-LABEL: test_rem7_2i64:
506 ; AVX:       # %bb.0:
507 ; AVX-NEXT:    vpextrq $1, %xmm0, %rcx
508 ; AVX-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
509 ; AVX-NEXT:    movq %rcx, %rax
510 ; AVX-NEXT:    mulq %rsi
511 ; AVX-NEXT:    movq %rcx, %rax
512 ; AVX-NEXT:    subq %rdx, %rax
513 ; AVX-NEXT:    shrq %rax
514 ; AVX-NEXT:    addq %rdx, %rax
515 ; AVX-NEXT:    shrq $2, %rax
516 ; AVX-NEXT:    leaq (,%rax,8), %rdx
517 ; AVX-NEXT:    subq %rdx, %rax
518 ; AVX-NEXT:    addq %rcx, %rax
519 ; AVX-NEXT:    vmovq %rax, %xmm1
520 ; AVX-NEXT:    vmovq %xmm0, %rcx
521 ; AVX-NEXT:    movq %rcx, %rax
522 ; AVX-NEXT:    mulq %rsi
523 ; AVX-NEXT:    movq %rcx, %rax
524 ; AVX-NEXT:    subq %rdx, %rax
525 ; AVX-NEXT:    shrq %rax
526 ; AVX-NEXT:    addq %rdx, %rax
527 ; AVX-NEXT:    shrq $2, %rax
528 ; AVX-NEXT:    leaq (,%rax,8), %rdx
529 ; AVX-NEXT:    subq %rdx, %rax
530 ; AVX-NEXT:    addq %rcx, %rax
531 ; AVX-NEXT:    vmovq %rax, %xmm0
532 ; AVX-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
533 ; AVX-NEXT:    retq
534   %res = urem <2 x i64> %a, <i64 7, i64 7>
535   ret <2 x i64> %res
538 define <4 x i32> @test_rem7_4i32(<4 x i32> %a) nounwind {
539 ; SSE2-LABEL: test_rem7_4i32:
540 ; SSE2:       # %bb.0:
541 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
542 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
543 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
544 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
545 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
546 ; SSE2-NEXT:    pmuludq %xmm1, %xmm3
547 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3]
548 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
549 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
550 ; SSE2-NEXT:    psubd %xmm2, %xmm1
551 ; SSE2-NEXT:    psrld $1, %xmm1
552 ; SSE2-NEXT:    paddd %xmm2, %xmm1
553 ; SSE2-NEXT:    psrld $2, %xmm1
554 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
555 ; SSE2-NEXT:    pslld $3, %xmm2
556 ; SSE2-NEXT:    psubd %xmm2, %xmm1
557 ; SSE2-NEXT:    paddd %xmm0, %xmm1
558 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
559 ; SSE2-NEXT:    retq
561 ; SSE41-LABEL: test_rem7_4i32:
562 ; SSE41:       # %bb.0:
563 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
564 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
565 ; SSE41-NEXT:    pmuludq %xmm2, %xmm1
566 ; SSE41-NEXT:    pmuludq %xmm0, %xmm2
567 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
568 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
569 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
570 ; SSE41-NEXT:    psubd %xmm2, %xmm1
571 ; SSE41-NEXT:    psrld $1, %xmm1
572 ; SSE41-NEXT:    paddd %xmm2, %xmm1
573 ; SSE41-NEXT:    psrld $2, %xmm1
574 ; SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm1
575 ; SSE41-NEXT:    psubd %xmm1, %xmm0
576 ; SSE41-NEXT:    retq
578 ; AVX1-LABEL: test_rem7_4i32:
579 ; AVX1:       # %bb.0:
580 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
581 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
582 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1
583 ; AVX1-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
584 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
585 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7]
586 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm2
587 ; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
588 ; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
589 ; AVX1-NEXT:    vpsrld $2, %xmm1, %xmm1
590 ; AVX1-NEXT:    vpmulld {{.*}}(%rip), %xmm1, %xmm1
591 ; AVX1-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
592 ; AVX1-NEXT:    retq
594 ; AVX2-LABEL: test_rem7_4i32:
595 ; AVX2:       # %bb.0:
596 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
597 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
598 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1
599 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm0, %xmm2
600 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
601 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm2[0],xmm1[1],xmm2[2],xmm1[3]
602 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm2
603 ; AVX2-NEXT:    vpsrld $1, %xmm2, %xmm2
604 ; AVX2-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
605 ; AVX2-NEXT:    vpsrld $2, %xmm1, %xmm1
606 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [7,7,7,7]
607 ; AVX2-NEXT:    vpmulld %xmm2, %xmm1, %xmm1
608 ; AVX2-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
609 ; AVX2-NEXT:    retq
610   %res = urem <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
611   ret <4 x i32> %res
614 define <8 x i16> @test_rem7_8i16(<8 x i16> %a) nounwind {
615 ; SSE-LABEL: test_rem7_8i16:
616 ; SSE:       # %bb.0:
617 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
618 ; SSE-NEXT:    pmulhuw %xmm0, %xmm1
619 ; SSE-NEXT:    movdqa %xmm0, %xmm2
620 ; SSE-NEXT:    psubw %xmm1, %xmm2
621 ; SSE-NEXT:    psrlw $1, %xmm2
622 ; SSE-NEXT:    paddw %xmm1, %xmm2
623 ; SSE-NEXT:    psrlw $2, %xmm2
624 ; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm2
625 ; SSE-NEXT:    psubw %xmm2, %xmm0
626 ; SSE-NEXT:    retq
628 ; AVX-LABEL: test_rem7_8i16:
629 ; AVX:       # %bb.0:
630 ; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %xmm0, %xmm1
631 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm2
632 ; AVX-NEXT:    vpsrlw $1, %xmm2, %xmm2
633 ; AVX-NEXT:    vpaddw %xmm1, %xmm2, %xmm1
634 ; AVX-NEXT:    vpsrlw $2, %xmm1, %xmm1
635 ; AVX-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
636 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
637 ; AVX-NEXT:    retq
638   %res = urem <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
639   ret <8 x i16> %res
642 define <16 x i8> @test_rem7_16i8(<16 x i8> %a) nounwind {
643 ; SSE2-LABEL: test_rem7_16i8:
644 ; SSE2:       # %bb.0:
645 ; SSE2-NEXT:    pxor %xmm1, %xmm1
646 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
647 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
648 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [37,37,37,37,37,37,37,37]
649 ; SSE2-NEXT:    pmullw %xmm3, %xmm2
650 ; SSE2-NEXT:    psrlw $8, %xmm2
651 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
652 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
653 ; SSE2-NEXT:    pmullw %xmm3, %xmm4
654 ; SSE2-NEXT:    psrlw $8, %xmm4
655 ; SSE2-NEXT:    packuswb %xmm2, %xmm4
656 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
657 ; SSE2-NEXT:    psubb %xmm4, %xmm1
658 ; SSE2-NEXT:    psrlw $1, %xmm1
659 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
660 ; SSE2-NEXT:    paddb %xmm4, %xmm1
661 ; SSE2-NEXT:    psrlw $2, %xmm1
662 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm1
663 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
664 ; SSE2-NEXT:    psllw $3, %xmm2
665 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm2
666 ; SSE2-NEXT:    psubb %xmm2, %xmm1
667 ; SSE2-NEXT:    paddb %xmm0, %xmm1
668 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
669 ; SSE2-NEXT:    retq
671 ; SSE41-LABEL: test_rem7_16i8:
672 ; SSE41:       # %bb.0:
673 ; SSE41-NEXT:    pxor %xmm1, %xmm1
674 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
675 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
676 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [37,37,37,37,37,37,37,37]
677 ; SSE41-NEXT:    pmullw %xmm1, %xmm2
678 ; SSE41-NEXT:    psrlw $8, %xmm2
679 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
680 ; SSE41-NEXT:    pmullw %xmm1, %xmm3
681 ; SSE41-NEXT:    psrlw $8, %xmm3
682 ; SSE41-NEXT:    packuswb %xmm2, %xmm3
683 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
684 ; SSE41-NEXT:    psubb %xmm3, %xmm1
685 ; SSE41-NEXT:    psrlw $1, %xmm1
686 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
687 ; SSE41-NEXT:    paddb %xmm3, %xmm1
688 ; SSE41-NEXT:    psrlw $2, %xmm1
689 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm1
690 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
691 ; SSE41-NEXT:    psllw $3, %xmm2
692 ; SSE41-NEXT:    pand {{.*}}(%rip), %xmm2
693 ; SSE41-NEXT:    psubb %xmm2, %xmm1
694 ; SSE41-NEXT:    paddb %xmm0, %xmm1
695 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
696 ; SSE41-NEXT:    retq
698 ; AVX1-LABEL: test_rem7_16i8:
699 ; AVX1:       # %bb.0:
700 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
701 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
702 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [37,37,37,37,37,37,37,37]
703 ; AVX1-NEXT:    vpmullw %xmm2, %xmm1, %xmm1
704 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
705 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
706 ; AVX1-NEXT:    vpmullw %xmm2, %xmm3, %xmm2
707 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
708 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
709 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
710 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
711 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
712 ; AVX1-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
713 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm1
714 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
715 ; AVX1-NEXT:    vpsllw $3, %xmm1, %xmm2
716 ; AVX1-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
717 ; AVX1-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
718 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
719 ; AVX1-NEXT:    retq
721 ; AVX2NOBW-LABEL: test_rem7_16i8:
722 ; AVX2NOBW:       # %bb.0:
723 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
724 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
725 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
726 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
727 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
728 ; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
729 ; AVX2NOBW-NEXT:    vpsrlw $1, %xmm2, %xmm2
730 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
731 ; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
732 ; AVX2NOBW-NEXT:    vpsrlw $2, %xmm1, %xmm1
733 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
734 ; AVX2NOBW-NEXT:    vpsllw $3, %xmm1, %xmm2
735 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
736 ; AVX2NOBW-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
737 ; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
738 ; AVX2NOBW-NEXT:    vzeroupper
739 ; AVX2NOBW-NEXT:    retq
741 ; AVX512BW-LABEL: test_rem7_16i8:
742 ; AVX512BW:       # %bb.0:
743 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
744 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
745 ; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
746 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
747 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
748 ; AVX512BW-NEXT:    vpsrlw $1, %xmm2, %xmm2
749 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
750 ; AVX512BW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
751 ; AVX512BW-NEXT:    vpsrlw $2, %xmm1, %xmm1
752 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm1, %xmm1
753 ; AVX512BW-NEXT:    vpsllw $3, %xmm1, %xmm2
754 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %xmm2, %xmm2
755 ; AVX512BW-NEXT:    vpsubb %xmm2, %xmm1, %xmm1
756 ; AVX512BW-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
757 ; AVX512BW-NEXT:    vzeroupper
758 ; AVX512BW-NEXT:    retq
759   %res = urem <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>
760   ret <16 x i8> %res
764 ; srem by non-splat constant
767 define <16 x i8> @test_remconstant_16i8(<16 x i8> %a) nounwind {
768 ; SSE2-LABEL: test_remconstant_16i8:
769 ; SSE2:       # %bb.0:
770 ; SSE2-NEXT:    pxor %xmm1, %xmm1
771 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
772 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
773 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
774 ; SSE2-NEXT:    psrlw $8, %xmm2
775 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
776 ; SSE2-NEXT:    psrlw $8, %xmm2
777 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
778 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
779 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm3
780 ; SSE2-NEXT:    psrlw $8, %xmm3
781 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm3
782 ; SSE2-NEXT:    psrlw $8, %xmm3
783 ; SSE2-NEXT:    packuswb %xmm2, %xmm3
784 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
785 ; SSE2-NEXT:    psubb %xmm3, %xmm2
786 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
787 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]
788 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm4
789 ; SSE2-NEXT:    psrlw $8, %xmm4
790 ; 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]
791 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
792 ; SSE2-NEXT:    psrlw $8, %xmm2
793 ; SSE2-NEXT:    packuswb %xmm4, %xmm2
794 ; SSE2-NEXT:    paddb %xmm3, %xmm2
795 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
796 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
797 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm3
798 ; SSE2-NEXT:    psrlw $8, %xmm3
799 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm3
800 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
801 ; SSE2-NEXT:    pand %xmm4, %xmm3
802 ; 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]
803 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
804 ; SSE2-NEXT:    psrlw $8, %xmm2
805 ; SSE2-NEXT:    pmullw {{.*}}(%rip), %xmm2
806 ; SSE2-NEXT:    pand %xmm4, %xmm2
807 ; SSE2-NEXT:    packuswb %xmm3, %xmm2
808 ; SSE2-NEXT:    psubb %xmm2, %xmm0
809 ; SSE2-NEXT:    retq
811 ; SSE41-LABEL: test_remconstant_16i8:
812 ; SSE41:       # %bb.0:
813 ; SSE41-NEXT:    pxor %xmm1, %xmm1
814 ; SSE41-NEXT:    pxor %xmm2, %xmm2
815 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15]
816 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
817 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
818 ; SSE41-NEXT:    psllw $7, %xmm3
819 ; SSE41-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1,2,3,4,5,6,7]
820 ; SSE41-NEXT:    psrlw $8, %xmm3
821 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [147,79,171,117,205,57,57,37]
822 ; SSE41-NEXT:    pmullw %xmm3, %xmm2
823 ; SSE41-NEXT:    psrlw $8, %xmm2
824 ; SSE41-NEXT:    pxor %xmm4, %xmm4
825 ; SSE41-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3],xmm4[4],xmm0[4],xmm4[5],xmm0[5],xmm4[6],xmm0[6],xmm4[7],xmm0[7]
826 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
827 ; SSE41-NEXT:    psllw $7, %xmm5
828 ; SSE41-NEXT:    pblendw {{.*#+}} xmm5 = xmm4[0,1,2,3,4,5,6],xmm5[7]
829 ; SSE41-NEXT:    psrlw $8, %xmm5
830 ; SSE41-NEXT:    packuswb %xmm3, %xmm5
831 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero
832 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm3
833 ; SSE41-NEXT:    psrlw $8, %xmm3
834 ; SSE41-NEXT:    packuswb %xmm2, %xmm3
835 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
836 ; SSE41-NEXT:    psubb %xmm3, %xmm4
837 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm2 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
838 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm4 = xmm4[8],xmm1[8],xmm4[9],xmm1[9],xmm4[10],xmm1[10],xmm4[11],xmm1[11],xmm4[12],xmm1[12],xmm4[13],xmm1[13],xmm4[14],xmm1[14],xmm4[15],xmm1[15]
839 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm4
840 ; SSE41-NEXT:    psrlw $8, %xmm4
841 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm2
842 ; SSE41-NEXT:    psrlw $8, %xmm2
843 ; SSE41-NEXT:    packuswb %xmm4, %xmm2
844 ; SSE41-NEXT:    paddb %xmm3, %xmm2
845 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm3 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
846 ; SSE41-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
847 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm2
848 ; SSE41-NEXT:    psrlw $8, %xmm2
849 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm3
850 ; SSE41-NEXT:    psrlw $8, %xmm3
851 ; SSE41-NEXT:    packuswb %xmm2, %xmm3
852 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm1 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
853 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm1
854 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
855 ; SSE41-NEXT:    pand %xmm3, %xmm1
856 ; SSE41-NEXT:    pmullw {{.*}}(%rip), %xmm2
857 ; SSE41-NEXT:    pand %xmm3, %xmm2
858 ; SSE41-NEXT:    packuswb %xmm2, %xmm1
859 ; SSE41-NEXT:    psubb %xmm1, %xmm0
860 ; SSE41-NEXT:    retq
862 ; AVX1-LABEL: test_remconstant_16i8:
863 ; AVX1:       # %bb.0:
864 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
865 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm2 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]
866 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
867 ; AVX1-NEXT:    vpsllw $7, %xmm3, %xmm3
868 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3,4,5,6,7]
869 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
870 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm3
871 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
872 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm4 = 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]
873 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm5 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
874 ; AVX1-NEXT:    vpsllw $7, %xmm5, %xmm5
875 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,6],xmm5[7]
876 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
877 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm4, %xmm2
878 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
879 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm2
880 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
881 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
882 ; AVX1-NEXT:    vpsubb %xmm2, %xmm0, %xmm3
883 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
884 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
885 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
886 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
887 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm3
888 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
889 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm3, %xmm3
890 ; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
891 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
892 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
893 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
894 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
895 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm2
896 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
897 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm2
898 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
899 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm2
900 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
901 ; AVX1-NEXT:    vpand %xmm3, %xmm2, %xmm2
902 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
903 ; AVX1-NEXT:    vpand %xmm3, %xmm1, %xmm1
904 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm2, %xmm1
905 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
906 ; AVX1-NEXT:    retq
908 ; AVX2NOBW-LABEL: test_remconstant_16i8:
909 ; AVX2NOBW:       # %bb.0:
910 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
911 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
912 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
913 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
914 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
915 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
916 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
917 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
918 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
919 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
920 ; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
921 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
922 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm2, %ymm2
923 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm2, %ymm2
924 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm2, %xmm3
925 ; AVX2NOBW-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
926 ; AVX2NOBW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
927 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
928 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
929 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
930 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
931 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
932 ; AVX2NOBW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
933 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
934 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
935 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm1, %xmm2
936 ; AVX2NOBW-NEXT:    vpackuswb %xmm2, %xmm1, %xmm1
937 ; AVX2NOBW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
938 ; AVX2NOBW-NEXT:    vzeroupper
939 ; AVX2NOBW-NEXT:    retq
941 ; AVX512BW-LABEL: test_remconstant_16i8:
942 ; AVX512BW:       # %bb.0:
943 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm1 = [0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0]
944 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
945 ; AVX512BW-NEXT:    vpsrlvw %zmm1, %zmm2, %zmm1
946 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
947 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
948 ; AVX512BW-NEXT:    vpsrlw $8, %ymm1, %ymm1
949 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
950 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm2
951 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
952 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm2, %ymm2
953 ; AVX512BW-NEXT:    vpsrlw $8, %ymm2, %ymm2
954 ; AVX512BW-NEXT:    vpmovwb %zmm2, %ymm2
955 ; AVX512BW-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
956 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
957 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [2,0,1,3,3,3,2,2,2,2,3,3,3,1,1,2]
958 ; AVX512BW-NEXT:    vpsrlvw %zmm2, %zmm1, %zmm1
959 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
960 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
961 ; AVX512BW-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
962 ; AVX512BW-NEXT:    vzeroupper
963 ; AVX512BW-NEXT:    retq
964   %res = urem <16 x i8> %a, <i8 7, i8 8, i8 9, i8 10,i8 11, i8 12, i8 13, i8 14, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9,i8 9, i8 7>
965   ret <16 x i8> %res