Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / X86 / vector-idiv-udiv-256.ll
blob198c6de8b0efb5f38e8ad9fc057be5bc89fc42b0
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 {{.*}}(%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 {{.*}}(%rip), %ymm0, %ymm0
215 ; AVX2NOBW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
216 ; AVX2NOBW-NEXT:    vpsrlw $2, %ymm0, %ymm0
217 ; AVX2NOBW-NEXT:    vpand {{.*}}(%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 {{.*}}(%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 {{.*}}(%rip), %ymm0, %ymm0
229 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
230 ; AVX512BW-NEXT:    vpsrlw $2, %ymm0, %ymm0
231 ; AVX512BW-NEXT:    vpand {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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:    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]
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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%rip), %zmm1, %zmm1
348 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
349 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm1, %zmm1
350 ; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1
351 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
352 ; AVX512BW-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
353 ; 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
354 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm0, %zmm0
355 ; AVX512BW-NEXT:    vpsrlw $8, %zmm0, %zmm0
356 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
357 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
358 ; 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
359 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm0, %zmm0
360 ; AVX512BW-NEXT:    vpmovwb %zmm0, %ymm0
361 ; AVX512BW-NEXT:    retq
362   %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>
363   ret <32 x i8> %res
367 ; urem by 7
370 define <4 x i64> @test_rem7_4i64(<4 x i64> %a) nounwind {
371 ; AVX1-LABEL: test_rem7_4i64:
372 ; AVX1:       # %bb.0:
373 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
374 ; AVX1-NEXT:    vpextrq $1, %xmm1, %rcx
375 ; AVX1-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
376 ; AVX1-NEXT:    movq %rcx, %rax
377 ; AVX1-NEXT:    mulq %rsi
378 ; AVX1-NEXT:    movq %rcx, %rax
379 ; AVX1-NEXT:    subq %rdx, %rax
380 ; AVX1-NEXT:    shrq %rax
381 ; AVX1-NEXT:    addq %rdx, %rax
382 ; AVX1-NEXT:    shrq $2, %rax
383 ; AVX1-NEXT:    leaq (,%rax,8), %rdx
384 ; AVX1-NEXT:    subq %rdx, %rax
385 ; AVX1-NEXT:    addq %rcx, %rax
386 ; AVX1-NEXT:    vmovq %rax, %xmm2
387 ; AVX1-NEXT:    vmovq %xmm1, %rcx
388 ; AVX1-NEXT:    movq %rcx, %rax
389 ; AVX1-NEXT:    mulq %rsi
390 ; AVX1-NEXT:    movq %rcx, %rax
391 ; AVX1-NEXT:    subq %rdx, %rax
392 ; AVX1-NEXT:    shrq %rax
393 ; AVX1-NEXT:    addq %rdx, %rax
394 ; AVX1-NEXT:    shrq $2, %rax
395 ; AVX1-NEXT:    leaq (,%rax,8), %rdx
396 ; AVX1-NEXT:    subq %rdx, %rax
397 ; AVX1-NEXT:    addq %rcx, %rax
398 ; AVX1-NEXT:    vmovq %rax, %xmm1
399 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
400 ; AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
401 ; AVX1-NEXT:    movq %rcx, %rax
402 ; AVX1-NEXT:    mulq %rsi
403 ; AVX1-NEXT:    movq %rcx, %rax
404 ; AVX1-NEXT:    subq %rdx, %rax
405 ; AVX1-NEXT:    shrq %rax
406 ; AVX1-NEXT:    addq %rdx, %rax
407 ; AVX1-NEXT:    shrq $2, %rax
408 ; AVX1-NEXT:    leaq (,%rax,8), %rdx
409 ; AVX1-NEXT:    subq %rdx, %rax
410 ; AVX1-NEXT:    addq %rcx, %rax
411 ; AVX1-NEXT:    vmovq %rax, %xmm2
412 ; AVX1-NEXT:    vmovq %xmm0, %rcx
413 ; AVX1-NEXT:    movq %rcx, %rax
414 ; AVX1-NEXT:    mulq %rsi
415 ; AVX1-NEXT:    movq %rcx, %rax
416 ; AVX1-NEXT:    subq %rdx, %rax
417 ; AVX1-NEXT:    shrq %rax
418 ; AVX1-NEXT:    addq %rdx, %rax
419 ; AVX1-NEXT:    shrq $2, %rax
420 ; AVX1-NEXT:    leaq (,%rax,8), %rdx
421 ; AVX1-NEXT:    subq %rdx, %rax
422 ; AVX1-NEXT:    addq %rcx, %rax
423 ; AVX1-NEXT:    vmovq %rax, %xmm0
424 ; AVX1-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
425 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
426 ; AVX1-NEXT:    retq
428 ; AVX2-LABEL: test_rem7_4i64:
429 ; AVX2:       # %bb.0:
430 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
431 ; AVX2-NEXT:    vpextrq $1, %xmm1, %rcx
432 ; AVX2-NEXT:    movabsq $2635249153387078803, %rsi # imm = 0x2492492492492493
433 ; AVX2-NEXT:    movq %rcx, %rax
434 ; AVX2-NEXT:    mulq %rsi
435 ; AVX2-NEXT:    movq %rcx, %rax
436 ; AVX2-NEXT:    subq %rdx, %rax
437 ; AVX2-NEXT:    shrq %rax
438 ; AVX2-NEXT:    addq %rdx, %rax
439 ; AVX2-NEXT:    shrq $2, %rax
440 ; AVX2-NEXT:    leaq (,%rax,8), %rdx
441 ; AVX2-NEXT:    subq %rdx, %rax
442 ; AVX2-NEXT:    addq %rcx, %rax
443 ; AVX2-NEXT:    vmovq %rax, %xmm2
444 ; AVX2-NEXT:    vmovq %xmm1, %rcx
445 ; AVX2-NEXT:    movq %rcx, %rax
446 ; AVX2-NEXT:    mulq %rsi
447 ; AVX2-NEXT:    movq %rcx, %rax
448 ; AVX2-NEXT:    subq %rdx, %rax
449 ; AVX2-NEXT:    shrq %rax
450 ; AVX2-NEXT:    addq %rdx, %rax
451 ; AVX2-NEXT:    shrq $2, %rax
452 ; AVX2-NEXT:    leaq (,%rax,8), %rdx
453 ; AVX2-NEXT:    subq %rdx, %rax
454 ; AVX2-NEXT:    addq %rcx, %rax
455 ; AVX2-NEXT:    vmovq %rax, %xmm1
456 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
457 ; AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
458 ; AVX2-NEXT:    movq %rcx, %rax
459 ; AVX2-NEXT:    mulq %rsi
460 ; AVX2-NEXT:    movq %rcx, %rax
461 ; AVX2-NEXT:    subq %rdx, %rax
462 ; AVX2-NEXT:    shrq %rax
463 ; AVX2-NEXT:    addq %rdx, %rax
464 ; AVX2-NEXT:    shrq $2, %rax
465 ; AVX2-NEXT:    leaq (,%rax,8), %rdx
466 ; AVX2-NEXT:    subq %rdx, %rax
467 ; AVX2-NEXT:    addq %rcx, %rax
468 ; AVX2-NEXT:    vmovq %rax, %xmm2
469 ; AVX2-NEXT:    vmovq %xmm0, %rcx
470 ; AVX2-NEXT:    movq %rcx, %rax
471 ; AVX2-NEXT:    mulq %rsi
472 ; AVX2-NEXT:    movq %rcx, %rax
473 ; AVX2-NEXT:    subq %rdx, %rax
474 ; AVX2-NEXT:    shrq %rax
475 ; AVX2-NEXT:    addq %rdx, %rax
476 ; AVX2-NEXT:    shrq $2, %rax
477 ; AVX2-NEXT:    leaq (,%rax,8), %rdx
478 ; AVX2-NEXT:    subq %rdx, %rax
479 ; AVX2-NEXT:    addq %rcx, %rax
480 ; AVX2-NEXT:    vmovq %rax, %xmm0
481 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
482 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
483 ; AVX2-NEXT:    retq
484   %res = urem <4 x i64> %a, <i64 7, i64 7, i64 7, i64 7>
485   ret <4 x i64> %res
488 define <8 x i32> @test_rem7_8i32(<8 x i32> %a) nounwind {
489 ; AVX1-LABEL: test_rem7_8i32:
490 ; AVX1:       # %bb.0:
491 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
492 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3]
493 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm3 = [613566757,613566757,613566757,613566757]
494 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
495 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm1, %xmm4
496 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
497 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3],xmm4[4,5],xmm2[6,7]
498 ; AVX1-NEXT:    vpsubd %xmm2, %xmm1, %xmm4
499 ; AVX1-NEXT:    vpsrld $1, %xmm4, %xmm4
500 ; AVX1-NEXT:    vpaddd %xmm2, %xmm4, %xmm2
501 ; AVX1-NEXT:    vpsrld $2, %xmm2, %xmm2
502 ; AVX1-NEXT:    vpslld $3, %xmm2, %xmm4
503 ; AVX1-NEXT:    vpsubd %xmm4, %xmm2, %xmm2
504 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
505 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
506 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm2, %xmm2
507 ; AVX1-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
508 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
509 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
510 ; AVX1-NEXT:    vpsubd %xmm2, %xmm0, %xmm3
511 ; AVX1-NEXT:    vpsrld $1, %xmm3, %xmm3
512 ; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
513 ; AVX1-NEXT:    vpsrld $2, %xmm2, %xmm2
514 ; AVX1-NEXT:    vpslld $3, %xmm2, %xmm3
515 ; AVX1-NEXT:    vpsubd %xmm3, %xmm2, %xmm2
516 ; AVX1-NEXT:    vpaddd %xmm2, %xmm0, %xmm0
517 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
518 ; AVX1-NEXT:    retq
520 ; AVX2-LABEL: test_rem7_8i32:
521 ; AVX2:       # %bb.0:
522 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm1 = ymm0[1,1,3,3,5,5,7,7]
523 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [613566757,613566757,613566757,613566757,613566757,613566757,613566757,613566757]
524 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm1, %ymm1
525 ; AVX2-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
526 ; AVX2-NEXT:    vpshufd {{.*#+}} ymm2 = ymm2[1,1,3,3,5,5,7,7]
527 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm2[0],ymm1[1],ymm2[2],ymm1[3],ymm2[4],ymm1[5],ymm2[6],ymm1[7]
528 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm2
529 ; AVX2-NEXT:    vpsrld $1, %ymm2, %ymm2
530 ; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm1
531 ; AVX2-NEXT:    vpsrld $2, %ymm1, %ymm1
532 ; AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm2 = [7,7,7,7,7,7,7,7]
533 ; AVX2-NEXT:    vpmulld %ymm2, %ymm1, %ymm1
534 ; AVX2-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
535 ; AVX2-NEXT:    retq
536   %res = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7, i32 7>
537   ret <8 x i32> %res
540 define <16 x i16> @test_rem7_16i16(<16 x i16> %a) nounwind {
541 ; AVX1-LABEL: test_rem7_16i16:
542 ; AVX1:       # %bb.0:
543 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
544 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363]
545 ; AVX1-NEXT:    vpmulhuw %xmm2, %xmm1, %xmm3
546 ; AVX1-NEXT:    vpsubw %xmm3, %xmm1, %xmm4
547 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm4
548 ; AVX1-NEXT:    vpaddw %xmm3, %xmm4, %xmm3
549 ; AVX1-NEXT:    vpsrlw $2, %xmm3, %xmm3
550 ; AVX1-NEXT:    vpsllw $3, %xmm3, %xmm4
551 ; AVX1-NEXT:    vpsubw %xmm4, %xmm3, %xmm3
552 ; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
553 ; AVX1-NEXT:    vpmulhuw %xmm2, %xmm0, %xmm2
554 ; AVX1-NEXT:    vpsubw %xmm2, %xmm0, %xmm3
555 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
556 ; AVX1-NEXT:    vpaddw %xmm2, %xmm3, %xmm2
557 ; AVX1-NEXT:    vpsrlw $2, %xmm2, %xmm2
558 ; AVX1-NEXT:    vpsllw $3, %xmm2, %xmm3
559 ; AVX1-NEXT:    vpsubw %xmm3, %xmm2, %xmm2
560 ; AVX1-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
561 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
562 ; AVX1-NEXT:    retq
564 ; AVX2-LABEL: test_rem7_16i16:
565 ; AVX2:       # %bb.0:
566 ; AVX2-NEXT:    vpmulhuw {{.*}}(%rip), %ymm0, %ymm1
567 ; AVX2-NEXT:    vpsubw %ymm1, %ymm0, %ymm2
568 ; AVX2-NEXT:    vpsrlw $1, %ymm2, %ymm2
569 ; AVX2-NEXT:    vpaddw %ymm1, %ymm2, %ymm1
570 ; AVX2-NEXT:    vpsrlw $2, %ymm1, %ymm1
571 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %ymm1, %ymm1
572 ; AVX2-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
573 ; AVX2-NEXT:    retq
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>
575   ret <16 x i16> %res
578 define <32 x i8> @test_rem7_32i8(<32 x i8> %a) nounwind {
579 ; AVX1-LABEL: test_rem7_32i8:
580 ; AVX1:       # %bb.0:
581 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
582 ; AVX1-NEXT:    vpxor %xmm8, %xmm8, %xmm8
583 ; 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]
584 ; AVX1-NEXT:    vmovdqa {{.*#+}} 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:    vmovdqa {{.*#+}} 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:    vmovdqa {{.*#+}} 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:    vmovdqa {{.*#+}} xmm2 = [248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248]
601 ; AVX1-NEXT:    vpand %xmm2, %xmm7, %xmm7
602 ; AVX1-NEXT:    vpsubb %xmm7, %xmm3, %xmm3
603 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
604 ; 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]
605 ; AVX1-NEXT:    vpmullw %xmm4, %xmm3, %xmm3
606 ; AVX1-NEXT:    vpsrlw $8, %xmm3, %xmm3
607 ; 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
608 ; AVX1-NEXT:    vpmullw %xmm4, %xmm7, %xmm4
609 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
610 ; AVX1-NEXT:    vpackuswb %xmm3, %xmm4, %xmm3
611 ; AVX1-NEXT:    vpsubb %xmm3, %xmm0, %xmm4
612 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm4
613 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
614 ; AVX1-NEXT:    vpaddb %xmm3, %xmm4, %xmm3
615 ; AVX1-NEXT:    vpsrlw $2, %xmm3, %xmm3
616 ; AVX1-NEXT:    vpand %xmm5, %xmm3, %xmm3
617 ; AVX1-NEXT:    vpsllw $3, %xmm3, %xmm4
618 ; AVX1-NEXT:    vpand %xmm2, %xmm4, %xmm2
619 ; AVX1-NEXT:    vpsubb %xmm2, %xmm3, %xmm2
620 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
621 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
622 ; AVX1-NEXT:    retq
624 ; AVX2NOBW-LABEL: test_rem7_32i8:
625 ; AVX2NOBW:       # %bb.0:
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:    vmovdqa {{.*#+}} 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 {{.*}}(%rip), %ymm2, %ymm2
638 ; AVX2NOBW-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
639 ; AVX2NOBW-NEXT:    vpsrlw $2, %ymm1, %ymm1
640 ; AVX2NOBW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
641 ; AVX2NOBW-NEXT:    vpsllw $3, %ymm1, %ymm2
642 ; AVX2NOBW-NEXT:    vpand {{.*}}(%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:
648 ; AVX512BW:       # %bb.0:
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 {{.*}}(%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 {{.*}}(%rip), %ymm2, %ymm2
656 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
657 ; AVX512BW-NEXT:    vpsrlw $2, %ymm1, %ymm1
658 ; AVX512BW-NEXT:    vpand {{.*}}(%rip), %ymm1, %ymm1
659 ; AVX512BW-NEXT:    vpsllw $3, %ymm1, %ymm2
660 ; AVX512BW-NEXT:    vpand {{.*}}(%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>
665   ret <32 x i8> %res
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:
674 ; AVX1:       # %bb.0:
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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%rip), %xmm2, %xmm2
703 ; AVX1-NEXT:    vpsrlw $8, %xmm2, %xmm2
704 ; AVX1-NEXT:    vpmullw {{.*}}(%rip), %xmm2, %xmm5
705 ; AVX1-NEXT:    vmovdqa {{.*#+}} 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 {{.*}}(%rip), %xmm4, %xmm4
709 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
710 ; AVX1-NEXT:    vpmullw {{.*}}(%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:    vpunpckhbw {{.*#+}} xmm5 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%rip), %xmm1, %xmm1
740 ; AVX1-NEXT:    vpsrlw $8, %xmm1, %xmm1
741 ; AVX1-NEXT:    vpmullw {{.*}}(%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 {{.*}}(%rip), %xmm4, %xmm4
745 ; AVX1-NEXT:    vpsrlw $8, %xmm4, %xmm4
746 ; AVX1-NEXT:    vpmullw {{.*}}(%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
751 ; AVX1-NEXT:    retq
753 ; AVX2NOBW-LABEL: test_remconstant_32i8:
754 ; AVX2NOBW:       # %bb.0:
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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%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 {{.*}}(%rip), %ymm3, %ymm3
779 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm3, %ymm3
780 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%rip), %ymm3, %ymm3
781 ; AVX2NOBW-NEXT:    vmovdqa {{.*#+}} 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 {{.*}}(%rip), %ymm1, %ymm1
785 ; AVX2NOBW-NEXT:    vpsrlw $8, %ymm1, %ymm1
786 ; AVX2NOBW-NEXT:    vpmullw {{.*}}(%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:
793 ; AVX512BW:       # %bb.0:
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 {{.*}}(%rip), %zmm1, %zmm1
796 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm1, %zmm1
797 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm1, %zmm1
798 ; AVX512BW-NEXT:    vpsrlw $8, %zmm1, %zmm1
799 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
800 ; AVX512BW-NEXT:    vpsubb %ymm1, %ymm0, %ymm2
801 ; 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
802 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm2, %zmm2
803 ; AVX512BW-NEXT:    vpsrlw $8, %zmm2, %zmm2
804 ; AVX512BW-NEXT:    vpmovwb %zmm2, %ymm2
805 ; AVX512BW-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
806 ; 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
807 ; AVX512BW-NEXT:    vpsrlvw {{.*}}(%rip), %zmm1, %zmm1
808 ; AVX512BW-NEXT:    vpmullw {{.*}}(%rip), %zmm1, %zmm1
809 ; AVX512BW-NEXT:    vpmovwb %zmm1, %ymm1
810 ; AVX512BW-NEXT:    vpsubb %ymm1, %ymm0, %ymm0
811 ; AVX512BW-NEXT:    retq
812   %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>
813   ret <32 x i8> %res