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
10 define <4 x i64> @test_div7_4i64(<4 x i64> %a) nounwind {
11 ; AVX1-LABEL: test_div7_4i64:
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
50 ; AVX2-LABEL: test_div7_4i64:
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
87 %res = udiv <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
91 define <8 x i32> @test_div7_8i32(<8 x i32> %a) nounwind {
92 ; AVX1-LABEL: test_div7_8i32:
94 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
95 ; AVX1-NEXT: vbroadcastss {{.*#+}} 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
117 ; AVX2-LABEL: test_div7_8i32:
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
130 %res = udiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
134 define <16 x i16> @test_div7_16i16(<16 x i16> %a) nounwind {
135 ; AVX1-LABEL: test_div7_16i16:
137 ; AVX1-NEXT: vbroadcastss {{.*#+}} 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
152 ; AVX2-LABEL: test_div7_16i16:
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
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>
164 define <32 x i8> @test_div7_32i8(<32 x i8> %a) nounwind {
165 ; AVX1-LABEL: test_div7_32i8:
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: vbroadcastss {{.*#+}} 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: vbroadcastss {{.*#+}} 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: vbroadcastss {{.*#+}} 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
201 ; AVX2NOBW-LABEL: test_div7_32i8:
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: vpbroadcastw {{.*#+}} 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:
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>
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:
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
311 ; AVX2NOBW-LABEL: test_divconstant_32i8:
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:
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>
369 define <4 x i64> @test_rem7_4i64(<4 x i64> %a) nounwind {
370 ; AVX1-LABEL: test_rem7_4i64:
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
427 ; AVX2-LABEL: test_rem7_4i64:
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
483 %res = urem <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
487 define <8 x i32> @test_rem7_8i32(<8 x i32> %a) nounwind {
488 ; AVX1-LABEL: test_rem7_8i32:
490 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
491 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
492 ; AVX1-NEXT: vbroadcastss {{.*#+}} 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
519 ; AVX2-LABEL: test_rem7_8i32:
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: vpslld $3, %ymm1, %ymm2
532 ; AVX2-NEXT: vpsubd %ymm2, %ymm1, %ymm1
533 ; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0
535 %res = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
539 define <16 x i16> @test_rem7_16i16(<16 x i16> %a) nounwind {
540 ; AVX1-LABEL: test_rem7_16i16:
542 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
543 ; AVX1-NEXT: vbroadcastss {{.*#+}} 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
563 ; AVX2-LABEL: test_rem7_16i16:
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: vpsllw $3, %ymm1, %ymm2
571 ; AVX2-NEXT: vpsubw %ymm2, %ymm1, %ymm1
572 ; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0
574 %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>
578 define <32 x i8> @test_rem7_32i8(<32 x i8> %a) nounwind {
579 ; AVX1-LABEL: test_rem7_32i8:
581 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
582 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
583 ; 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]
584 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm4 = [37,37,37,37,37,37,37,37]
585 ; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm3
586 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
587 ; 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
588 ; AVX1-NEXT: vpmullw %xmm4, %xmm5, %xmm5
589 ; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5
590 ; AVX1-NEXT: vpackuswb %xmm3, %xmm5, %xmm3
591 ; AVX1-NEXT: vpsubb %xmm3, %xmm1, %xmm5
592 ; AVX1-NEXT: vpsrlw $1, %xmm5, %xmm5
593 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
594 ; AVX1-NEXT: vpand %xmm6, %xmm5, %xmm5
595 ; AVX1-NEXT: vpaddb %xmm3, %xmm5, %xmm3
596 ; AVX1-NEXT: vpsrlw $2, %xmm3, %xmm3
597 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm5 = [63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63]
598 ; AVX1-NEXT: vpand %xmm5, %xmm3, %xmm3
599 ; AVX1-NEXT: vpsllw $3, %xmm3, %xmm7
600 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm8 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
601 ; AVX1-NEXT: vpand %xmm7, %xmm8, %xmm7
602 ; AVX1-NEXT: vpsubb %xmm7, %xmm3, %xmm3
603 ; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1
604 ; 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]
605 ; AVX1-NEXT: vpmullw %xmm4, %xmm2, %xmm2
606 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
607 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm3 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
608 ; AVX1-NEXT: vpmullw %xmm4, %xmm3, %xmm3
609 ; AVX1-NEXT: vpsrlw $8, %xmm3, %xmm3
610 ; AVX1-NEXT: vpackuswb %xmm2, %xmm3, %xmm2
611 ; AVX1-NEXT: vpsubb %xmm2, %xmm0, %xmm3
612 ; AVX1-NEXT: vpsrlw $1, %xmm3, %xmm3
613 ; AVX1-NEXT: vpand %xmm6, %xmm3, %xmm3
614 ; AVX1-NEXT: vpaddb %xmm2, %xmm3, %xmm2
615 ; AVX1-NEXT: vpsrlw $2, %xmm2, %xmm2
616 ; AVX1-NEXT: vpand %xmm5, %xmm2, %xmm2
617 ; AVX1-NEXT: vpsllw $3, %xmm2, %xmm3
618 ; AVX1-NEXT: vpand %xmm3, %xmm8, %xmm3
619 ; AVX1-NEXT: vpsubb %xmm3, %xmm2, %xmm2
620 ; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0
621 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
624 ; AVX2NOBW-LABEL: test_rem7_32i8:
626 ; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1
627 ; 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]
628 ; AVX2NOBW-NEXT: vpbroadcastw {{.*#+}} ymm3 = [37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37]
629 ; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm2, %ymm2
630 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2
631 ; 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]
632 ; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm1, %ymm1
633 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1
634 ; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm1, %ymm1
635 ; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm0, %ymm2
636 ; AVX2NOBW-NEXT: vpsrlw $1, %ymm2, %ymm2
637 ; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
638 ; AVX2NOBW-NEXT: vpaddb %ymm1, %ymm2, %ymm1
639 ; AVX2NOBW-NEXT: vpsrlw $2, %ymm1, %ymm1
640 ; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
641 ; AVX2NOBW-NEXT: vpsllw $3, %ymm1, %ymm2
642 ; AVX2NOBW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
643 ; AVX2NOBW-NEXT: vpsubb %ymm2, %ymm1, %ymm1
644 ; AVX2NOBW-NEXT: vpaddb %ymm1, %ymm0, %ymm0
645 ; AVX2NOBW-NEXT: retq
647 ; AVX512BW-LABEL: test_rem7_32i8:
649 ; 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
650 ; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
651 ; AVX512BW-NEXT: vpsrlw $8, %zmm1, %zmm1
652 ; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1
653 ; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm2
654 ; AVX512BW-NEXT: vpsrlw $1, %ymm2, %ymm2
655 ; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
656 ; AVX512BW-NEXT: vpaddb %ymm1, %ymm2, %ymm1
657 ; AVX512BW-NEXT: vpsrlw $2, %ymm1, %ymm1
658 ; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
659 ; AVX512BW-NEXT: vpsllw $3, %ymm1, %ymm2
660 ; AVX512BW-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
661 ; AVX512BW-NEXT: vpsubb %ymm2, %ymm1, %ymm1
662 ; AVX512BW-NEXT: vpaddb %ymm1, %ymm0, %ymm0
663 ; AVX512BW-NEXT: retq
664 %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>
669 ; urem by non-splat constant
672 define <32 x i8> @test_remconstant_32i8(<32 x i8> %a) nounwind {
673 ; AVX1-LABEL: test_remconstant_32i8:
675 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
676 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
677 ; 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]
678 ; 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]
679 ; AVX1-NEXT: vpsllw $7, %xmm4, %xmm4
680 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3,4,5,6,7]
681 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
682 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
683 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
684 ; 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]
685 ; 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
686 ; AVX1-NEXT: vpsllw $7, %xmm5, %xmm5
687 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm5[0],xmm4[1,2,3,4,5,6,7]
688 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4
689 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4
690 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4
691 ; AVX1-NEXT: vpackuswb %xmm2, %xmm4, %xmm2
692 ; AVX1-NEXT: vpsubb %xmm2, %xmm3, %xmm4
693 ; 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]
694 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5
695 ; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5
696 ; 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
697 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4
698 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4
699 ; AVX1-NEXT: vpackuswb %xmm5, %xmm4, %xmm4
700 ; AVX1-NEXT: vpaddb %xmm2, %xmm4, %xmm4
701 ; 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]
702 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm2
703 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2
704 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2, %xmm5
705 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
706 ; AVX1-NEXT: vpand %xmm2, %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 {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4
709 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4
710 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4
711 ; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm4
712 ; AVX1-NEXT: vpackuswb %xmm5, %xmm4, %xmm4
713 ; AVX1-NEXT: vpsubb %xmm4, %xmm3, %xmm3
714 ; 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]
715 ; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm5
716 ; AVX1-NEXT: vpsllw $7, %xmm5, %xmm5
717 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1,2,3,4,5,6],xmm5[7]
718 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4
719 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4
720 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4
721 ; 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]
722 ; 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
723 ; AVX1-NEXT: vpsllw $7, %xmm6, %xmm6
724 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1,2,3,4,5,6],xmm6[7]
725 ; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5
726 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5
727 ; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5
728 ; AVX1-NEXT: vpackuswb %xmm4, %xmm5, %xmm4
729 ; AVX1-NEXT: vpsubb %xmm4, %xmm0, %xmm5
730 ; 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]
731 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6, %xmm6
732 ; AVX1-NEXT: vpsrlw $8, %xmm6, %xmm6
733 ; 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
734 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5, %xmm5
735 ; AVX1-NEXT: vpsrlw $8, %xmm5, %xmm5
736 ; AVX1-NEXT: vpackuswb %xmm6, %xmm5, %xmm5
737 ; AVX1-NEXT: vpaddb %xmm4, %xmm5, %xmm4
738 ; 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]
739 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
740 ; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1
741 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
742 ; AVX1-NEXT: vpand %xmm2, %xmm1, %xmm1
743 ; 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
744 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4
745 ; AVX1-NEXT: vpsrlw $8, %xmm4, %xmm4
746 ; AVX1-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4, %xmm4
747 ; AVX1-NEXT: vpand %xmm2, %xmm4, %xmm2
748 ; AVX1-NEXT: vpackuswb %xmm1, %xmm2, %xmm1
749 ; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0
750 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
753 ; AVX2NOBW-LABEL: test_remconstant_32i8:
755 ; AVX2NOBW-NEXT: vpxor %xmm1, %xmm1, %xmm1
756 ; 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]
757 ; AVX2NOBW-NEXT: vmovdqa {{.*#+}} ymm3 = [256,256,256,256,256,256,256,128,128,256,256,256,256,256,256,256]
758 ; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm2, %ymm2
759 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2
760 ; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2
761 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm2, %ymm2
762 ; 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]
763 ; AVX2NOBW-NEXT: vpmullw %ymm3, %ymm4, %ymm3
764 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3
765 ; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
766 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3
767 ; AVX2NOBW-NEXT: vpackuswb %ymm2, %ymm3, %ymm2
768 ; AVX2NOBW-NEXT: vpsubb %ymm2, %ymm0, %ymm3
769 ; 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]
770 ; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4
771 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm4, %ymm4
772 ; 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]
773 ; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
774 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3
775 ; AVX2NOBW-NEXT: vpackuswb %ymm4, %ymm3, %ymm3
776 ; AVX2NOBW-NEXT: vpaddb %ymm2, %ymm3, %ymm2
777 ; 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]
778 ; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
779 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm3, %ymm3
780 ; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3
781 ; AVX2NOBW-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
782 ; AVX2NOBW-NEXT: vpand %ymm4, %ymm3, %ymm3
783 ; 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]
784 ; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
785 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1
786 ; AVX2NOBW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
787 ; AVX2NOBW-NEXT: vpand %ymm4, %ymm1, %ymm1
788 ; AVX2NOBW-NEXT: vpackuswb %ymm3, %ymm1, %ymm1
789 ; AVX2NOBW-NEXT: vpsubb %ymm1, %ymm0, %ymm0
790 ; AVX2NOBW-NEXT: retq
792 ; AVX512BW-LABEL: test_remconstant_32i8:
794 ; 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
795 ; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
796 ; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
797 ; AVX512BW-NEXT: vpsrlw $8, %zmm1, %zmm1
798 ; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1
799 ; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm2
800 ; 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
801 ; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2
802 ; AVX512BW-NEXT: vpsrlw $8, %zmm2, %zmm2
803 ; AVX512BW-NEXT: vpmovwb %zmm2, %ymm2
804 ; AVX512BW-NEXT: vpaddb %ymm1, %ymm2, %ymm1
805 ; 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
806 ; AVX512BW-NEXT: vpsrlvw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
807 ; AVX512BW-NEXT: vpmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
808 ; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1
809 ; AVX512BW-NEXT: vpsubb %ymm1, %ymm0, %ymm0
810 ; AVX512BW-NEXT: retq
811 %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>