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