[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / vector-idiv-sdiv-256.ll
blobeda349005cda742f2e85ce6264ed553331849ac4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX1
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX2 --check-prefix=AVX2NOBW
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX2 --check-prefix=AVX512BW
7 ; sdiv by 7
10 define <4 x i64> @test_div7_4i64(<4 x i64> %a) nounwind {
11 ; AVX1-LABEL: test_div7_4i64:
12 ; AVX1:       # %bb.0:
13 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
14 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rax
15 ; AVX1-NEXT:    movabsq $5270498306774157605, %rcx # imm = 0x4924924924924925
16 ; AVX1-NEXT:    imulq %rcx
17 ; AVX1-NEXT:    movq %rdx, %rax
18 ; AVX1-NEXT:    shrq $63, %rax
19 ; AVX1-NEXT:    sarq %rdx
20 ; AVX1-NEXT:    addq %rax, %rdx
21 ; AVX1-NEXT:    vmovq %rdx, %xmm2
22 ; AVX1-NEXT:    vmovq %xmm1, %rax
23 ; AVX1-NEXT:    imulq %rcx
24 ; AVX1-NEXT:    movq %rdx, %rax
25 ; AVX1-NEXT:    shrq $63, %rax
26 ; AVX1-NEXT:    sarq %rdx
27 ; AVX1-NEXT:    addq %rax, %rdx
28 ; AVX1-NEXT:    vmovq %rdx, %xmm1
29 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
30 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
31 ; AVX1-NEXT:    imulq %rcx
32 ; AVX1-NEXT:    movq %rdx, %rax
33 ; AVX1-NEXT:    shrq $63, %rax
34 ; AVX1-NEXT:    sarq %rdx
35 ; AVX1-NEXT:    addq %rax, %rdx
36 ; AVX1-NEXT:    vmovq %rdx, %xmm2
37 ; AVX1-NEXT:    vmovq %xmm0, %rax
38 ; AVX1-NEXT:    imulq %rcx
39 ; AVX1-NEXT:    movq %rdx, %rax
40 ; AVX1-NEXT:    shrq $63, %rax
41 ; AVX1-NEXT:    sarq %rdx
42 ; AVX1-NEXT:    addq %rax, %rdx
43 ; AVX1-NEXT:    vmovq %rdx, %xmm0
44 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
45 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
46 ; AVX1-NEXT:    retq
48 ; AVX2-LABEL: test_div7_4i64:
49 ; AVX2:       # %bb.0:
50 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
51 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rax
52 ; AVX2-NEXT:    movabsq $5270498306774157605, %rcx # imm = 0x4924924924924925
53 ; AVX2-NEXT:    imulq %rcx
54 ; AVX2-NEXT:    movq %rdx, %rax
55 ; AVX2-NEXT:    shrq $63, %rax
56 ; AVX2-NEXT:    sarq %rdx
57 ; AVX2-NEXT:    addq %rax, %rdx
58 ; AVX2-NEXT:    vmovq %rdx, %xmm2
59 ; AVX2-NEXT:    vmovq %xmm1, %rax
60 ; AVX2-NEXT:    imulq %rcx
61 ; AVX2-NEXT:    movq %rdx, %rax
62 ; AVX2-NEXT:    shrq $63, %rax
63 ; AVX2-NEXT:    sarq %rdx
64 ; AVX2-NEXT:    addq %rax, %rdx
65 ; AVX2-NEXT:    vmovq %rdx, %xmm1
66 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
67 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
68 ; AVX2-NEXT:    imulq %rcx
69 ; AVX2-NEXT:    movq %rdx, %rax
70 ; AVX2-NEXT:    shrq $63, %rax
71 ; AVX2-NEXT:    sarq %rdx
72 ; AVX2-NEXT:    addq %rax, %rdx
73 ; AVX2-NEXT:    vmovq %rdx, %xmm2
74 ; AVX2-NEXT:    vmovq %xmm0, %rax
75 ; AVX2-NEXT:    imulq %rcx
76 ; AVX2-NEXT:    movq %rdx, %rax
77 ; AVX2-NEXT:    shrq $63, %rax
78 ; AVX2-NEXT:    sarq %rdx
79 ; AVX2-NEXT:    addq %rax, %rdx
80 ; AVX2-NEXT:    vmovq %rdx, %xmm0
81 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
82 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
83 ; AVX2-NEXT:    retq
84   %res = sdiv <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
85   ret <4 x i64> %res
88 define <8 x i32> @test_div7_8i32(<8 x i32> %a) nounwind {
89 ; AVX1-LABEL: test_div7_8i32:
90 ; AVX1:       # %bb.0:
91 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
92 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
93 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2454267027,2454267027,2454267027,2454267027]
94 ; AVX1-NEXT:    vpmuldq %xmm3, %xmm2, %xmm2
95 ; AVX1-NEXT:    vpmuldq %xmm3, %xmm1, %xmm4
96 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
97 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3],xmm4[4,5],xmm2[6,7]
98 ; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
99 ; AVX1-NEXT:    vpsrld $31, %xmm1, %xmm2
100 ; AVX1-NEXT:    vpsrad $2, %xmm1, %xmm1
101 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
102 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
103 ; AVX1-NEXT:    vpmuldq %xmm3, %xmm2, %xmm2
104 ; AVX1-NEXT:    vpmuldq %xmm3, %xmm0, %xmm3
105 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
106 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
107 ; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
108 ; AVX1-NEXT:    vpsrld $31, %xmm0, %xmm2
109 ; AVX1-NEXT:    vpsrad $2, %xmm0, %xmm0
110 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
111 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
112 ; AVX1-NEXT:    retq
114 ; AVX2-LABEL: test_div7_8i32:
115 ; AVX2:       # %bb.0:
116 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]
117 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [2454267027,2454267027,2454267027,2454267027,2454267027,2454267027,2454267027,2454267027]
118 ; AVX2-NEXT:    vpmuldq %ymm2, %ymm1, %ymm1
119 ; AVX2-NEXT:    vpmuldq %ymm2, %ymm0, %ymm2
120 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
121 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]
122 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
123 ; AVX2-NEXT:    vpsrld $31, %ymm0, %ymm1
124 ; AVX2-NEXT:    vpsrad $2, %ymm0, %ymm0
125 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
126 ; AVX2-NEXT:    retq
127   %res = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
128   ret <8 x i32> %res
131 define <16 x i16> @test_div7_16i16(<16 x i16> %a) nounwind {
132 ; AVX1-LABEL: test_div7_16i16:
133 ; AVX1:       # %bb.0:
134 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
135 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]
136 ; AVX1-NEXT:    vpmulhw %xmm2, %xmm1, %xmm1
137 ; AVX1-NEXT:    vpsrlw $15, %xmm1, %xmm3
138 ; AVX1-NEXT:    vpsraw $1, %xmm1, %xmm1
139 ; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
140 ; AVX1-NEXT:    vpmulhw %xmm2, %xmm0, %xmm0
141 ; AVX1-NEXT:    vpsrlw $15, %xmm0, %xmm2
142 ; AVX1-NEXT:    vpsraw $1, %xmm0, %xmm0
143 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
144 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
145 ; AVX1-NEXT:    retq
147 ; AVX2-LABEL: test_div7_16i16:
148 ; AVX2:       # %bb.0:
149 ; AVX2-NEXT:    vpmulhw {{.*}}(%rip), %ymm0, %ymm0
150 ; AVX2-NEXT:    vpsrlw $15, %ymm0, %ymm1
151 ; AVX2-NEXT:    vpsraw $1, %ymm0, %ymm0
152 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
153 ; AVX2-NEXT:    retq
154   %res = sdiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
155   ret <16 x i16> %res
158 define <32 x i8> @test_div7_32i8(<32 x i8> %a) nounwind {
159 ; AVX1-LABEL: test_div7_32i8:
160 ; AVX1:       # %bb.0:
161 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
162 ; AVX1-NEXT:    vpmovsxbw %xmm1, %xmm2
163 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [65427,65427,65427,65427,65427,65427,65427,65427]
164 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
165 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
166 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
167 ; AVX1-NEXT:    vpmovsxbw %xmm4, %xmm4
168 ; AVX1-NEXT:    vpmullw %xmm3, %xmm4, %xmm4
169 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
170 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm2, %xmm2
171 ; AVX1-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
172 ; AVX1-NEXT:    vpsrlw $7, %xmm1, %xmm2
173 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
174 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
175 ; AVX1-NEXT:    vpsrlw $2, %xmm1, %xmm1
176 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
177 ; AVX1-NEXT:    vpand %xmm5, %xmm1, %xmm1
178 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
179 ; AVX1-NEXT:    vpxor %xmm6, %xmm1, %xmm1
180 ; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm1
181 ; AVX1-NEXT:    vpsubb %xmm6, %xmm1, %xmm1
182 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm2
183 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
184 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
185 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm7 = xmm0[2,3,0,1]
186 ; AVX1-NEXT:    vpmovsxbw %xmm7, %xmm7
187 ; AVX1-NEXT:    vpmullw %xmm3, %xmm7, %xmm3
188 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
189 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
190 ; AVX1-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
191 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm2
192 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
193 ; AVX1-NEXT:    vpsrlw $2, %xmm0, %xmm0
194 ; AVX1-NEXT:    vpand %xmm5, %xmm0, %xmm0
195 ; AVX1-NEXT:    vpxor %xmm6, %xmm0, %xmm0
196 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
197 ; AVX1-NEXT:    vpsubb %xmm6, %xmm0, %xmm0
198 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
199 ; AVX1-NEXT:    retq
201 ; AVX2NOBW-LABEL: test_div7_32i8:
202 ; AVX2NOBW:       # %bb.0:
203 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm0, %xmm1
204 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm1, %ymm1
205 ; AVX2NOBW-NEXT:    vmovdqa {{.*#+}} ymm2 = [65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427]
206 ; AVX2NOBW-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
207 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
208 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm0, %ymm3
209 ; AVX2NOBW-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
210 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm2, %ymm2
211 ; AVX2NOBW-NEXT:    vpackuswb %ymm1, %ymm2, %ymm1
212 ; AVX2NOBW-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
213 ; AVX2NOBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
214 ; AVX2NOBW-NEXT:    vpsrlw $2, %ymm0, %ymm1
215 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
216 ; AVX2NOBW-NEXT:    vmovdqa {{.*#+}} ymm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
217 ; AVX2NOBW-NEXT:    vpxor %ymm2, %ymm1, %ymm1
218 ; AVX2NOBW-NEXT:    vpsrlw $7, %ymm0, %ymm0
219 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
220 ; AVX2NOBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
221 ; AVX2NOBW-NEXT:    vpsubb %ymm2, %ymm0, %ymm0
222 ; AVX2NOBW-NEXT:    retq
224 ; AVX512BW-LABEL: test_div7_32i8:
225 ; AVX512BW:       # %bb.0:
226 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm1
227 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm1, %zmm1
228 ; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1
229 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
230 ; AVX512BW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
231 ; AVX512BW-NEXT:    vpsrlw $2, %ymm0, %ymm1
232 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
233 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
234 ; AVX512BW-NEXT:    vpxor %ymm2, %ymm1, %ymm1
235 ; AVX512BW-NEXT:    vpsrlw $7, %ymm0, %ymm0
236 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
237 ; AVX512BW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
238 ; AVX512BW-NEXT:    vpsubb %ymm2, %ymm0, %ymm0
239 ; AVX512BW-NEXT:    retq
240   %res = sdiv <32 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, 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>
241   ret <32 x i8> %res
245 ; sdiv by non-splat constant
248 define <32 x i8> @test_divconstant_32i8(<32 x i8> %a) nounwind {
249 ; AVX1-LABEL: test_divconstant_32i8:
250 ; AVX1:       # %bb.0:
251 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
252 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = 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]
253 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm3
254 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
255 ; AVX1-NEXT:    vpand %xmm1, %xmm3, %xmm3
256 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
257 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
258 ; AVX1-NEXT:    vpand %xmm1, %xmm4, %xmm4
259 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm4, %xmm3
260 ; AVX1-NEXT:    vpmovsxbw %xmm2, %xmm4
261 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
262 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
263 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
264 ; AVX1-NEXT:    vpmovsxbw %xmm2, %xmm2
265 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm2
266 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
267 ; AVX1-NEXT:    vpackuswb %xmm2, %xmm4, %xmm2
268 ; AVX1-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
269 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
270 ; AVX1-NEXT:    vpsraw $8, %xmm3, %xmm3
271 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm3
272 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
273 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm4 = xmm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
274 ; AVX1-NEXT:    vpsraw $8, %xmm4, %xmm4
275 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
276 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
277 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm4, %xmm3
278 ; AVX1-NEXT:    vpsrlw $7, %xmm2, %xmm2
279 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm4 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
280 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
281 ; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
282 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm3 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
283 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm3
284 ; AVX1-NEXT:    vpand %xmm1, %xmm3, %xmm3
285 ; 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
286 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm5, %xmm5
287 ; AVX1-NEXT:    vpand %xmm1, %xmm5, %xmm1
288 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm1, %xmm1
289 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm3
290 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm3
291 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
292 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
293 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm0
294 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
295 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm0
296 ; AVX1-NEXT:    vpackuswb %xmm0, %xmm3, %xmm0
297 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
298 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
299 ; AVX1-NEXT:    vpsraw $8, %xmm1, %xmm1
300 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm1
301 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
302 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm3 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
303 ; AVX1-NEXT:    vpsraw $8, %xmm3, %xmm3
304 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm3
305 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
306 ; AVX1-NEXT:    vpackuswb %xmm1, %xmm3, %xmm1
307 ; AVX1-NEXT:    vpsrlw $7, %xmm0, %xmm0
308 ; AVX1-NEXT:    vpand %xmm4, %xmm0, %xmm0
309 ; AVX1-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
310 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
311 ; AVX1-NEXT:    retq
313 ; AVX2NOBW-LABEL: test_divconstant_32i8:
314 ; AVX2NOBW:       # %bb.0:
315 ; AVX2NOBW-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
316 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
317 ; AVX2NOBW-NEXT:    vmovdqa {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
318 ; AVX2NOBW-NEXT:    vpand %ymm2, %ymm1, %ymm1
319 ; AVX2NOBW-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
320 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
321 ; AVX2NOBW-NEXT:    vpand %ymm2, %ymm3, %ymm2
322 ; AVX2NOBW-NEXT:    vpackuswb %ymm1, %ymm2, %ymm1
323 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm0, %xmm2
324 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm2, %ymm2
325 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm2, %ymm2
326 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm2, %ymm2
327 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm0, %ymm0
328 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm0, %ymm0
329 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm0, %ymm0
330 ; AVX2NOBW-NEXT:    vpackuswb %ymm2, %ymm0, %ymm0
331 ; AVX2NOBW-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
332 ; AVX2NOBW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
333 ; AVX2NOBW-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
334 ; AVX2NOBW-NEXT:    vpsraw $8, %ymm1, %ymm1
335 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
336 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
337 ; AVX2NOBW-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
338 ; AVX2NOBW-NEXT:    vpsraw $8, %ymm2, %ymm2
339 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm2, %ymm2
340 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm2, %ymm2
341 ; AVX2NOBW-NEXT:    vpackuswb %ymm1, %ymm2, %ymm1
342 ; AVX2NOBW-NEXT:    vpsrlw $7, %ymm0, %ymm0
343 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
344 ; AVX2NOBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm0
345 ; AVX2NOBW-NEXT:    retq
347 ; AVX512BW-LABEL: test_divconstant_32i8:
348 ; AVX512BW:       # %bb.0:
349 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
350 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm1, %zmm1
351 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
352 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
353 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm0, %zmm0
354 ; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
355 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
356 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
357 ; AVX512BW-NEXT:    vpsrlw $7, %ymm0, %ymm1
358 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
359 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm0
360 ; AVX512BW-NEXT:    vpsravw {{.*}}(%rip), %zmm0, %zmm0
361 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
362 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
363 ; AVX512BW-NEXT:    retq
364   %res = sdiv <32 x i8> %a, <i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 22, i8 21, i8 20, i8 19, i8 18, i8 17, i8 16, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7>
365   ret <32 x i8> %res
369 ; srem by 7
372 define <4 x i64> @test_rem7_4i64(<4 x i64> %a) nounwind {
373 ; AVX1-LABEL: test_rem7_4i64:
374 ; AVX1:       # %bb.0:
375 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
376 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rcx
377 ; AVX1-NEXT:    movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925
378 ; AVX1-NEXT:    movq %rcx, %rax
379 ; AVX1-NEXT:    imulq %rsi
380 ; AVX1-NEXT:    movq %rdx, %rax
381 ; AVX1-NEXT:    shrq $63, %rax
382 ; AVX1-NEXT:    sarq %rdx
383 ; AVX1-NEXT:    addq %rax, %rdx
384 ; AVX1-NEXT:    leaq (,%rdx,8), %rax
385 ; AVX1-NEXT:    subq %rax, %rdx
386 ; AVX1-NEXT:    addq %rcx, %rdx
387 ; AVX1-NEXT:    vmovq %rdx, %xmm2
388 ; AVX1-NEXT:    vmovq %xmm1, %rcx
389 ; AVX1-NEXT:    movq %rcx, %rax
390 ; AVX1-NEXT:    imulq %rsi
391 ; AVX1-NEXT:    movq %rdx, %rax
392 ; AVX1-NEXT:    shrq $63, %rax
393 ; AVX1-NEXT:    sarq %rdx
394 ; AVX1-NEXT:    addq %rax, %rdx
395 ; AVX1-NEXT:    leaq (,%rdx,8), %rax
396 ; AVX1-NEXT:    subq %rax, %rdx
397 ; AVX1-NEXT:    addq %rcx, %rdx
398 ; AVX1-NEXT:    vmovq %rdx, %xmm1
399 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
400 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
401 ; AVX1-NEXT:    movq %rcx, %rax
402 ; AVX1-NEXT:    imulq %rsi
403 ; AVX1-NEXT:    movq %rdx, %rax
404 ; AVX1-NEXT:    shrq $63, %rax
405 ; AVX1-NEXT:    sarq %rdx
406 ; AVX1-NEXT:    addq %rax, %rdx
407 ; AVX1-NEXT:    leaq (,%rdx,8), %rax
408 ; AVX1-NEXT:    subq %rax, %rdx
409 ; AVX1-NEXT:    addq %rcx, %rdx
410 ; AVX1-NEXT:    vmovq %rdx, %xmm2
411 ; AVX1-NEXT:    vmovq %xmm0, %rcx
412 ; AVX1-NEXT:    movq %rcx, %rax
413 ; AVX1-NEXT:    imulq %rsi
414 ; AVX1-NEXT:    movq %rdx, %rax
415 ; AVX1-NEXT:    shrq $63, %rax
416 ; AVX1-NEXT:    sarq %rdx
417 ; AVX1-NEXT:    addq %rax, %rdx
418 ; AVX1-NEXT:    leaq (,%rdx,8), %rax
419 ; AVX1-NEXT:    subq %rax, %rdx
420 ; AVX1-NEXT:    addq %rcx, %rdx
421 ; AVX1-NEXT:    vmovq %rdx, %xmm0
422 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
423 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
424 ; AVX1-NEXT:    retq
426 ; AVX2-LABEL: test_rem7_4i64:
427 ; AVX2:       # %bb.0:
428 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
429 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rcx
430 ; AVX2-NEXT:    movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925
431 ; AVX2-NEXT:    movq %rcx, %rax
432 ; AVX2-NEXT:    imulq %rsi
433 ; AVX2-NEXT:    movq %rdx, %rax
434 ; AVX2-NEXT:    shrq $63, %rax
435 ; AVX2-NEXT:    sarq %rdx
436 ; AVX2-NEXT:    addq %rax, %rdx
437 ; AVX2-NEXT:    leaq (,%rdx,8), %rax
438 ; AVX2-NEXT:    subq %rax, %rdx
439 ; AVX2-NEXT:    addq %rcx, %rdx
440 ; AVX2-NEXT:    vmovq %rdx, %xmm2
441 ; AVX2-NEXT:    vmovq %xmm1, %rcx
442 ; AVX2-NEXT:    movq %rcx, %rax
443 ; AVX2-NEXT:    imulq %rsi
444 ; AVX2-NEXT:    movq %rdx, %rax
445 ; AVX2-NEXT:    shrq $63, %rax
446 ; AVX2-NEXT:    sarq %rdx
447 ; AVX2-NEXT:    addq %rax, %rdx
448 ; AVX2-NEXT:    leaq (,%rdx,8), %rax
449 ; AVX2-NEXT:    subq %rax, %rdx
450 ; AVX2-NEXT:    addq %rcx, %rdx
451 ; AVX2-NEXT:    vmovq %rdx, %xmm1
452 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
453 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
454 ; AVX2-NEXT:    movq %rcx, %rax
455 ; AVX2-NEXT:    imulq %rsi
456 ; AVX2-NEXT:    movq %rdx, %rax
457 ; AVX2-NEXT:    shrq $63, %rax
458 ; AVX2-NEXT:    sarq %rdx
459 ; AVX2-NEXT:    addq %rax, %rdx
460 ; AVX2-NEXT:    leaq (,%rdx,8), %rax
461 ; AVX2-NEXT:    subq %rax, %rdx
462 ; AVX2-NEXT:    addq %rcx, %rdx
463 ; AVX2-NEXT:    vmovq %rdx, %xmm2
464 ; AVX2-NEXT:    vmovq %xmm0, %rcx
465 ; AVX2-NEXT:    movq %rcx, %rax
466 ; AVX2-NEXT:    imulq %rsi
467 ; AVX2-NEXT:    movq %rdx, %rax
468 ; AVX2-NEXT:    shrq $63, %rax
469 ; AVX2-NEXT:    sarq %rdx
470 ; AVX2-NEXT:    addq %rax, %rdx
471 ; AVX2-NEXT:    leaq (,%rdx,8), %rax
472 ; AVX2-NEXT:    subq %rax, %rdx
473 ; AVX2-NEXT:    addq %rcx, %rdx
474 ; AVX2-NEXT:    vmovq %rdx, %xmm0
475 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
476 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
477 ; AVX2-NEXT:    retq
478   %res = srem <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
479   ret <4 x i64> %res
482 define <8 x i32> @test_rem7_8i32(<8 x i32> %a) nounwind {
483 ; AVX1-LABEL: test_rem7_8i32:
484 ; AVX1:       # %bb.0:
485 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
486 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
487 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [2454267027,2454267027,2454267027,2454267027]
488 ; AVX1-NEXT:    vpmuldq %xmm3, %xmm2, %xmm2
489 ; AVX1-NEXT:    vpmuldq %xmm3, %xmm1, %xmm4
490 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
491 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3],xmm4[4,5],xmm2[6,7]
492 ; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm2
493 ; AVX1-NEXT:    vpsrld $31, %xmm2, %xmm4
494 ; AVX1-NEXT:    vpsrad $2, %xmm2, %xmm2
495 ; AVX1-NEXT:    vpaddd %xmm4, %xmm2, %xmm2
496 ; AVX1-NEXT:    vpslld $3, %xmm2, %xmm4
497 ; AVX1-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
498 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
499 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
500 ; AVX1-NEXT:    vpmuldq %xmm3, %xmm2, %xmm2
501 ; AVX1-NEXT:    vpmuldq %xmm3, %xmm0, %xmm3
502 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
503 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
504 ; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm2
505 ; AVX1-NEXT:    vpsrld $31, %xmm2, %xmm3
506 ; AVX1-NEXT:    vpsrad $2, %xmm2, %xmm2
507 ; AVX1-NEXT:    vpaddd %xmm3, %xmm2, %xmm2
508 ; AVX1-NEXT:    vpslld $3, %xmm2, %xmm3
509 ; AVX1-NEXT:    vpsubd %xmm3, %xmm2, %xmm2
510 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
511 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
512 ; AVX1-NEXT:    retq
514 ; AVX2-LABEL: test_rem7_8i32:
515 ; AVX2:       # %bb.0:
516 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]
517 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [2454267027,2454267027,2454267027,2454267027,2454267027,2454267027,2454267027,2454267027]
518 ; AVX2-NEXT:    vpmuldq %ymm2, %ymm1, %ymm1
519 ; AVX2-NEXT:    vpmuldq %ymm2, %ymm0, %ymm2
520 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
521 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]
522 ; AVX2-NEXT:    vpaddd %ymm0, %ymm1, %ymm1
523 ; AVX2-NEXT:    vpsrld $31, %ymm1, %ymm2
524 ; AVX2-NEXT:    vpsrad $2, %ymm1, %ymm1
525 ; AVX2-NEXT:    vpaddd %ymm2, %ymm1, %ymm1
526 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [7,7,7,7,7,7,7,7]
527 ; AVX2-NEXT:    vpmulld %ymm2, %ymm1, %ymm1
528 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
529 ; AVX2-NEXT:    retq
530   %res = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
531   ret <8 x i32> %res
534 define <16 x i16> @test_rem7_16i16(<16 x i16> %a) nounwind {
535 ; AVX1-LABEL: test_rem7_16i16:
536 ; AVX1:       # %bb.0:
537 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
538 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]
539 ; AVX1-NEXT:    vpmulhw %xmm2, %xmm1, %xmm3
540 ; AVX1-NEXT:    vpsrlw $15, %xmm3, %xmm4
541 ; AVX1-NEXT:    vpsraw $1, %xmm3, %xmm3
542 ; AVX1-NEXT:    vpaddw %xmm4, %xmm3, %xmm3
543 ; AVX1-NEXT:    vpsllw $3, %xmm3, %xmm4
544 ; AVX1-NEXT:    vpsubw %xmm4, %xmm3, %xmm3
545 ; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
546 ; AVX1-NEXT:    vpmulhw %xmm2, %xmm0, %xmm2
547 ; AVX1-NEXT:    vpsrlw $15, %xmm2, %xmm3
548 ; AVX1-NEXT:    vpsraw $1, %xmm2, %xmm2
549 ; AVX1-NEXT:    vpaddw %xmm3, %xmm2, %xmm2
550 ; AVX1-NEXT:    vpsllw $3, %xmm2, %xmm3
551 ; AVX1-NEXT:    vpsubw %xmm3, %xmm2, %xmm2
552 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
553 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
554 ; AVX1-NEXT:    retq
556 ; AVX2-LABEL: test_rem7_16i16:
557 ; AVX2:       # %bb.0:
558 ; AVX2-NEXT:    vpmulhw {{.*}}(%rip), %ymm0, %ymm1
559 ; AVX2-NEXT:    vpsrlw $15, %ymm1, %ymm2
560 ; AVX2-NEXT:    vpsraw $1, %ymm1, %ymm1
561 ; AVX2-NEXT:    vpaddw %ymm2, %ymm1, %ymm1
562 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
563 ; AVX2-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
564 ; AVX2-NEXT:    retq
565   %res = srem <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
566   ret <16 x i16> %res
569 define <32 x i8> @test_rem7_32i8(<32 x i8> %a) nounwind {
570 ; AVX1-LABEL: test_rem7_32i8:
571 ; AVX1:       # %bb.0:
572 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
573 ; AVX1-NEXT:    vpmovsxbw %xmm1, %xmm2
574 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [65427,65427,65427,65427,65427,65427,65427,65427]
575 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
576 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
577 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm1[2,3,0,1]
578 ; AVX1-NEXT:    vpmovsxbw %xmm4, %xmm4
579 ; AVX1-NEXT:    vpmullw %xmm3, %xmm4, %xmm4
580 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
581 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm2, %xmm2
582 ; AVX1-NEXT:    vpaddb %xmm1, %xmm2, %xmm2
583 ; AVX1-NEXT:    vpsrlw $7, %xmm2, %xmm4
584 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm8 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
585 ; AVX1-NEXT:    vpand %xmm8, %xmm4, %xmm4
586 ; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm2
587 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm6 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
588 ; AVX1-NEXT:    vpand %xmm6, %xmm2, %xmm2
589 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm7 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
590 ; AVX1-NEXT:    vpxor %xmm7, %xmm2, %xmm2
591 ; AVX1-NEXT:    vpaddb %xmm4, %xmm2, %xmm2
592 ; AVX1-NEXT:    vpsubb %xmm7, %xmm2, %xmm2
593 ; AVX1-NEXT:    vpsllw $3, %xmm2, %xmm4
594 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm5 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
595 ; AVX1-NEXT:    vpand %xmm5, %xmm4, %xmm4
596 ; AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm2
597 ; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm1
598 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm2
599 ; AVX1-NEXT:    vpmullw %xmm3, %xmm2, %xmm2
600 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
601 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[2,3,0,1]
602 ; AVX1-NEXT:    vpmovsxbw %xmm4, %xmm4
603 ; AVX1-NEXT:    vpmullw %xmm3, %xmm4, %xmm3
604 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
605 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm2, %xmm2
606 ; AVX1-NEXT:    vpaddb %xmm0, %xmm2, %xmm2
607 ; AVX1-NEXT:    vpsrlw $7, %xmm2, %xmm3
608 ; AVX1-NEXT:    vpand %xmm8, %xmm3, %xmm3
609 ; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm2
610 ; AVX1-NEXT:    vpand %xmm6, %xmm2, %xmm2
611 ; AVX1-NEXT:    vpxor %xmm7, %xmm2, %xmm2
612 ; AVX1-NEXT:    vpaddb %xmm3, %xmm2, %xmm2
613 ; AVX1-NEXT:    vpsubb %xmm7, %xmm2, %xmm2
614 ; AVX1-NEXT:    vpsllw $3, %xmm2, %xmm3
615 ; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
616 ; AVX1-NEXT:    vpsubb %xmm3, %xmm2, %xmm2
617 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
618 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
619 ; AVX1-NEXT:    retq
621 ; AVX2NOBW-LABEL: test_rem7_32i8:
622 ; AVX2NOBW:       # %bb.0:
623 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm0, %xmm1
624 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm1, %ymm1
625 ; AVX2NOBW-NEXT:    vmovdqa {{.*#+}} ymm2 = [65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427,65427]
626 ; AVX2NOBW-NEXT:    vpmullw %ymm2, %ymm1, %ymm1
627 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
628 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm0, %ymm3
629 ; AVX2NOBW-NEXT:    vpmullw %ymm2, %ymm3, %ymm2
630 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm2, %ymm2
631 ; AVX2NOBW-NEXT:    vpackuswb %ymm1, %ymm2, %ymm1
632 ; AVX2NOBW-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
633 ; AVX2NOBW-NEXT:    vpaddb %ymm0, %ymm1, %ymm1
634 ; AVX2NOBW-NEXT:    vpsrlw $2, %ymm1, %ymm2
635 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
636 ; AVX2NOBW-NEXT:    vmovdqa {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
637 ; AVX2NOBW-NEXT:    vpxor %ymm3, %ymm2, %ymm2
638 ; AVX2NOBW-NEXT:    vpsrlw $7, %ymm1, %ymm1
639 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
640 ; AVX2NOBW-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
641 ; AVX2NOBW-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
642 ; AVX2NOBW-NEXT:    vpsllw $3, %ymm1, %ymm2
643 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
644 ; AVX2NOBW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
645 ; AVX2NOBW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
646 ; AVX2NOBW-NEXT:    retq
648 ; AVX512BW-LABEL: test_rem7_32i8:
649 ; AVX512BW:       # %bb.0:
650 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm1
651 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm1, %zmm1
652 ; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1
653 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
654 ; AVX512BW-NEXT:    vpaddb %ymm0, %ymm1, %ymm1
655 ; AVX512BW-NEXT:    vpsrlw $2, %ymm1, %ymm2
656 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
657 ; AVX512BW-NEXT:    vmovdqa {{.*#+}} ymm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
658 ; AVX512BW-NEXT:    vpxor %ymm3, %ymm2, %ymm2
659 ; AVX512BW-NEXT:    vpsrlw $7, %ymm1, %ymm1
660 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
661 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
662 ; AVX512BW-NEXT:    vpsubb %ymm3, %ymm1, %ymm1
663 ; AVX512BW-NEXT:    vpsllw $3, %ymm1, %ymm2
664 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
665 ; AVX512BW-NEXT:    vpsubb %ymm2, %ymm1, %ymm1
666 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
667 ; AVX512BW-NEXT:    retq
668   %res = srem <32 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, 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>
669   ret <32 x i8> %res
673 ; srem by non-splat constant
676 define <32 x i8> @test_remconstant_32i8(<32 x i8> %a) nounwind {
677 ; AVX1-LABEL: test_remconstant_32i8:
678 ; AVX1:       # %bb.0:
679 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
680 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm1 = 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]
681 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm1, %xmm3
682 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
683 ; AVX1-NEXT:    vpand %xmm1, %xmm3, %xmm3
684 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero
685 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
686 ; AVX1-NEXT:    vpand %xmm1, %xmm4, %xmm4
687 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm4, %xmm3
688 ; AVX1-NEXT:    vpmovsxbw %xmm2, %xmm4
689 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
690 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
691 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm5 = xmm2[2,3,0,1]
692 ; AVX1-NEXT:    vpmovsxbw %xmm5, %xmm5
693 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm5, %xmm5
694 ; AVX1-NEXT:    vpsrlw $8, %xmm5, %xmm5
695 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm4, %xmm4
696 ; AVX1-NEXT:    vpaddb %xmm3, %xmm4, %xmm3
697 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
698 ; AVX1-NEXT:    vpsraw $8, %xmm4, %xmm4
699 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
700 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
701 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm5 = xmm3[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
702 ; AVX1-NEXT:    vpsraw $8, %xmm5, %xmm5
703 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm5, %xmm5
704 ; AVX1-NEXT:    vpsrlw $8, %xmm5, %xmm5
705 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm5, %xmm4
706 ; AVX1-NEXT:    vpsrlw $7, %xmm3, %xmm5
707 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
708 ; AVX1-NEXT:    vpand %xmm3, %xmm5, %xmm5
709 ; AVX1-NEXT:    vpaddb %xmm5, %xmm4, %xmm4
710 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = 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]
711 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm5, %xmm5
712 ; AVX1-NEXT:    vpand %xmm1, %xmm5, %xmm5
713 ; AVX1-NEXT:    vpmovzxbw {{.*#+}} xmm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero
714 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
715 ; AVX1-NEXT:    vpand %xmm1, %xmm4, %xmm4
716 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm4, %xmm4
717 ; AVX1-NEXT:    vpsubb %xmm4, %xmm2, %xmm2
718 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
719 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
720 ; AVX1-NEXT:    vpand %xmm1, %xmm4, %xmm4
721 ; 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
722 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm5, %xmm5
723 ; AVX1-NEXT:    vpand %xmm1, %xmm5, %xmm5
724 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm5, %xmm4
725 ; AVX1-NEXT:    vpmovsxbw %xmm0, %xmm5
726 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm5, %xmm5
727 ; AVX1-NEXT:    vpsrlw $8, %xmm5, %xmm5
728 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm6 = xmm0[2,3,0,1]
729 ; AVX1-NEXT:    vpmovsxbw %xmm6, %xmm6
730 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm6, %xmm6
731 ; AVX1-NEXT:    vpsrlw $8, %xmm6, %xmm6
732 ; AVX1-NEXT:    vpackuswb %xmm6, %xmm5, %xmm5
733 ; AVX1-NEXT:    vpaddb %xmm4, %xmm5, %xmm4
734 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm5 = xmm4[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
735 ; AVX1-NEXT:    vpsraw $8, %xmm5, %xmm5
736 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm5, %xmm5
737 ; AVX1-NEXT:    vpsrlw $8, %xmm5, %xmm5
738 ; AVX1-NEXT:    vpunpcklbw {{.*#+}} xmm6 = xmm4[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
739 ; AVX1-NEXT:    vpsraw $8, %xmm6, %xmm6
740 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm6, %xmm6
741 ; AVX1-NEXT:    vpsrlw $8, %xmm6, %xmm6
742 ; AVX1-NEXT:    vpackuswb %xmm5, %xmm6, %xmm5
743 ; AVX1-NEXT:    vpsrlw $7, %xmm4, %xmm4
744 ; AVX1-NEXT:    vpand %xmm3, %xmm4, %xmm3
745 ; AVX1-NEXT:    vpaddb %xmm3, %xmm5, %xmm3
746 ; AVX1-NEXT:    vpunpckhbw {{.*#+}} xmm4 = 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]
747 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm4, %xmm4
748 ; AVX1-NEXT:    vpand %xmm1, %xmm4, %xmm4
749 ; 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
750 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm3, %xmm3
751 ; AVX1-NEXT:    vpand %xmm1, %xmm3, %xmm1
752 ; AVX1-NEXT:    vpackuswb %xmm4, %xmm1, %xmm1
753 ; AVX1-NEXT:    vpsubb %xmm1, %xmm0, %xmm0
754 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
755 ; AVX1-NEXT:    retq
757 ; AVX2NOBW-LABEL: test_remconstant_32i8:
758 ; AVX2NOBW:       # %bb.0:
759 ; AVX2NOBW-NEXT:    vpunpckhbw {{.*#+}} ymm1 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
760 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm2
761 ; AVX2NOBW-NEXT:    vmovdqa {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
762 ; AVX2NOBW-NEXT:    vpand %ymm1, %ymm2, %ymm2
763 ; AVX2NOBW-NEXT:    vpunpcklbw {{.*#+}} ymm3 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
764 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
765 ; AVX2NOBW-NEXT:    vpand %ymm1, %ymm3, %ymm3
766 ; AVX2NOBW-NEXT:    vpackuswb %ymm2, %ymm3, %ymm2
767 ; AVX2NOBW-NEXT:    vextracti128 $1, %ymm0, %xmm3
768 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm3, %ymm3
769 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
770 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm3, %ymm3
771 ; AVX2NOBW-NEXT:    vpmovsxbw %xmm0, %ymm4
772 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm4, %ymm4
773 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm4, %ymm4
774 ; AVX2NOBW-NEXT:    vpackuswb %ymm3, %ymm4, %ymm3
775 ; AVX2NOBW-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[0,2,1,3]
776 ; AVX2NOBW-NEXT:    vpaddb %ymm2, %ymm3, %ymm2
777 ; AVX2NOBW-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31]
778 ; AVX2NOBW-NEXT:    vpsraw $8, %ymm3, %ymm3
779 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
780 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm3, %ymm3
781 ; AVX2NOBW-NEXT:    vpunpcklbw {{.*#+}} ymm4 = ymm2[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23]
782 ; AVX2NOBW-NEXT:    vpsraw $8, %ymm4, %ymm4
783 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm4, %ymm4
784 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm4, %ymm4
785 ; AVX2NOBW-NEXT:    vpackuswb %ymm3, %ymm4, %ymm3
786 ; AVX2NOBW-NEXT:    vpsrlw $7, %ymm2, %ymm2
787 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
788 ; AVX2NOBW-NEXT:    vpaddb %ymm2, %ymm3, %ymm2
789 ; AVX2NOBW-NEXT:    vpunpckhbw {{.*#+}} ymm3 = ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15],ymm2[24],ymm0[24],ymm2[25],ymm0[25],ymm2[26],ymm0[26],ymm2[27],ymm0[27],ymm2[28],ymm0[28],ymm2[29],ymm0[29],ymm2[30],ymm0[30],ymm2[31],ymm0[31]
790 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
791 ; AVX2NOBW-NEXT:    vpand %ymm1, %ymm3, %ymm3
792 ; AVX2NOBW-NEXT:    vpunpcklbw {{.*#+}} ymm2 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[16],ymm0[16],ymm2[17],ymm0[17],ymm2[18],ymm0[18],ymm2[19],ymm0[19],ymm2[20],ymm0[20],ymm2[21],ymm0[21],ymm2[22],ymm0[22],ymm2[23],ymm0[23]
793 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm2, %ymm2
794 ; AVX2NOBW-NEXT:    vpand %ymm1, %ymm2, %ymm1
795 ; AVX2NOBW-NEXT:    vpackuswb %ymm3, %ymm1, %ymm1
796 ; AVX2NOBW-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
797 ; AVX2NOBW-NEXT:    retq
799 ; AVX512BW-LABEL: test_remconstant_32i8:
800 ; AVX512BW:       # %bb.0:
801 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero,ymm0[16],zero,ymm0[17],zero,ymm0[18],zero,ymm0[19],zero,ymm0[20],zero,ymm0[21],zero,ymm0[22],zero,ymm0[23],zero,ymm0[24],zero,ymm0[25],zero,ymm0[26],zero,ymm0[27],zero,ymm0[28],zero,ymm0[29],zero,ymm0[30],zero,ymm0[31],zero
802 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm1, %zmm1
803 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
804 ; AVX512BW-NEXT:    vpmovsxbw %ymm0, %zmm2
805 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm2, %zmm2
806 ; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2
807 ; AVX512BW-NEXT:    vpmovwb %zmm2, %ymm2
808 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
809 ; AVX512BW-NEXT:    vpsrlw $7, %ymm1, %ymm2
810 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm2, %ymm2
811 ; AVX512BW-NEXT:    vpmovsxbw %ymm1, %zmm1
812 ; AVX512BW-NEXT:    vpsravw {{.*}}(%rip), %zmm1, %zmm1
813 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
814 ; AVX512BW-NEXT:    vpaddb %ymm2, %ymm1, %ymm1
815 ; AVX512BW-NEXT:    vpmovzxbw {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero,ymm1[16],zero,ymm1[17],zero,ymm1[18],zero,ymm1[19],zero,ymm1[20],zero,ymm1[21],zero,ymm1[22],zero,ymm1[23],zero,ymm1[24],zero,ymm1[25],zero,ymm1[26],zero,ymm1[27],zero,ymm1[28],zero,ymm1[29],zero,ymm1[30],zero,ymm1[31],zero
816 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm1, %zmm1
817 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
818 ; AVX512BW-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
819 ; AVX512BW-NEXT:    retq
820   %res = srem <32 x i8> %a, <i8 7, i8 8, i8 9, i8 10, i8 11, i8 12, i8 13, i8 14, i8 15, i8 16, i8 17, i8 18, i8 19, i8 20, i8 21, i8 22, i8 22, i8 21, i8 20, i8 19, i8 18, i8 17, i8 16, i8 15, i8 14, i8 13, i8 12, i8 11, i8 10, i8 9, i8 8, i8 7>
821   ret <32 x i8> %res