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