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