[x86] Add two more triples to stabilize the precise assembly syntax
[oota-llvm.git] / test / CodeGen / X86 / vector-idiv.ll
1 ; RUN: llc -march=x86-64 -mcpu=core2 -mattr=+sse4.1 < %s | FileCheck %s --check-prefix=SSE41
2 ; RUN: llc -march=x86-64 -mcpu=core2 < %s | FileCheck %s --check-prefix=SSE
3 ; RUN: llc -march=x86-64 -mcpu=core-avx2 < %s | FileCheck %s --check-prefix=AVX
4
5 target triple = "x86_64-unknown-unknown"
6
7 define <4 x i32> @test1(<4 x i32> %a) {
8 ; SSE41-LABEL: test1:
9 ; SSE41:       # BB#0:
10 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
11 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
12 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
13 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
14 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,0,3,0]
15 ; SSE41-NEXT:    pmuludq %xmm1, %xmm3
16 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
17 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,1,3]
18 ; SSE41-NEXT:    psubd %xmm1, %xmm0
19 ; SSE41-NEXT:    psrld $1, %xmm0
20 ; SSE41-NEXT:    paddd %xmm1, %xmm0
21 ; SSE41-NEXT:    psrld $2, %xmm0
22 ; SSE41-NEXT:    retq
23 ;
24 ; SSE-LABEL: test1:
25 ; SSE:       # BB#0:
26 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [613566757,613566757,613566757,613566757]
27 ; SSE-NEXT:    movdqa %xmm0, %xmm2
28 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
29 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
30 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,0,3,0]
31 ; SSE-NEXT:    pmuludq %xmm1, %xmm3
32 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
33 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,1,3]
34 ; SSE-NEXT:    psubd %xmm1, %xmm0
35 ; SSE-NEXT:    psrld $1, %xmm0
36 ; SSE-NEXT:    paddd %xmm1, %xmm0
37 ; SSE-NEXT:    psrld $2, %xmm0
38 ; SSE-NEXT:    retq
39 ;
40 ; AVX-LABEL: test1:
41 ; AVX:       # BB#0:
42 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
43 ; AVX-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
44 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
45 ; AVX-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,0,3,0]
46 ; AVX-NEXT:    vpmuludq %xmm1, %xmm3, %xmm1
47 ; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm2[1,3],xmm1[1,3]
48 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
49 ; AVX-NEXT:    vpsubd %xmm1, %xmm0, %xmm0
50 ; AVX-NEXT:    vpsrld $1, %xmm0, %xmm0
51 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
52 ; AVX-NEXT:    vpsrld $2, %xmm0, %xmm0
53 ; AVX-NEXT:    retq
54   %div = udiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
55   ret <4 x i32> %div
56 }
57
58 define <8 x i32> @test2(<8 x i32> %a) {
59 ; SSE41-LABEL: test2:
60 ; SSE41:       # BB#0:
61 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
62 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
63 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
64 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,0]
65 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,0,3,0]
66 ; SSE41-NEXT:    pmuludq %xmm4, %xmm5
67 ; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
68 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,1,3]
69 ; SSE41-NEXT:    psubd %xmm3, %xmm0
70 ; SSE41-NEXT:    psrld $1, %xmm0
71 ; SSE41-NEXT:    paddd %xmm3, %xmm0
72 ; SSE41-NEXT:    psrld $2, %xmm0
73 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
74 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,0,3,0]
75 ; SSE41-NEXT:    pmuludq %xmm4, %xmm3
76 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
77 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
78 ; SSE41-NEXT:    psubd %xmm2, %xmm1
79 ; SSE41-NEXT:    psrld $1, %xmm1
80 ; SSE41-NEXT:    paddd %xmm2, %xmm1
81 ; SSE41-NEXT:    psrld $2, %xmm1
82 ; SSE41-NEXT:    retq
83 ;
84 ; SSE-LABEL: test2:
85 ; SSE:       # BB#0:
86 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
87 ; SSE-NEXT:    movdqa %xmm0, %xmm3
88 ; SSE-NEXT:    pmuludq %xmm2, %xmm3
89 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,0]
90 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,0,3,0]
91 ; SSE-NEXT:    pmuludq %xmm4, %xmm5
92 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
93 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,1,3]
94 ; SSE-NEXT:    psubd %xmm3, %xmm0
95 ; SSE-NEXT:    psrld $1, %xmm0
96 ; SSE-NEXT:    paddd %xmm3, %xmm0
97 ; SSE-NEXT:    psrld $2, %xmm0
98 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
99 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,0,3,0]
100 ; SSE-NEXT:    pmuludq %xmm4, %xmm3
101 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
102 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
103 ; SSE-NEXT:    psubd %xmm2, %xmm1
104 ; SSE-NEXT:    psrld $1, %xmm1
105 ; SSE-NEXT:    paddd %xmm2, %xmm1
106 ; SSE-NEXT:    psrld $2, %xmm1
107 ; SSE-NEXT:    retq
108 ;
109 ; AVX-LABEL: test2:
110 ; AVX:       # BB#0:
111 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
112 ; AVX-NEXT:    vpalignr {{.*#+}} ymm2 = ymm1[4,5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3],ymm1[20,21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19]
113 ; AVX-NEXT:    vpalignr {{.*#+}} ymm3 = ymm0[4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,20,21,22,23,24,25,26,27,28,29,30,31,16,17,18,19]
114 ; AVX-NEXT:    vpmuludq %ymm2, %ymm3, %ymm2
115 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm1
116 ; AVX-NEXT:    vpalignr {{.*#+}} ymm1 = ymm1[4,5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3],ymm1[20,21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19]
117 ; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
118 ; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
119 ; AVX-NEXT:    vpsrld $1, %ymm0, %ymm0
120 ; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
121 ; AVX-NEXT:    vpsrld $2, %ymm0, %ymm0
122 ; AVX-NEXT:    retq
123   %div = udiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
124   ret <8 x i32> %div
125 }
126
127 define <8 x i16> @test3(<8 x i16> %a) {
128 ; SSE41-LABEL: test3:
129 ; SSE41:       # BB#0:
130 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
131 ; SSE41-NEXT:    pmulhuw %xmm0, %xmm1
132 ; SSE41-NEXT:    psubw %xmm1, %xmm0
133 ; SSE41-NEXT:    psrlw $1, %xmm0
134 ; SSE41-NEXT:    paddw %xmm1, %xmm0
135 ; SSE41-NEXT:    psrlw $2, %xmm0
136 ; SSE41-NEXT:    retq
137 ;
138 ; SSE-LABEL: test3:
139 ; SSE:       # BB#0:
140 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [9363,9363,9363,9363,9363,9363,9363,9363]
141 ; SSE-NEXT:    pmulhuw %xmm0, %xmm1
142 ; SSE-NEXT:    psubw %xmm1, %xmm0
143 ; SSE-NEXT:    psrlw $1, %xmm0
144 ; SSE-NEXT:    paddw %xmm1, %xmm0
145 ; SSE-NEXT:    psrlw $2, %xmm0
146 ; SSE-NEXT:    retq
147 ;
148 ; AVX-LABEL: test3:
149 ; AVX:       # BB#0:
150 ; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %xmm0, %xmm1
151 ; AVX-NEXT:    vpsubw %xmm1, %xmm0, %xmm0
152 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm0
153 ; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
154 ; AVX-NEXT:    vpsrlw $2, %xmm0, %xmm0
155 ; AVX-NEXT:    retq
156   %div = udiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
157   ret <8 x i16> %div
158 }
159
160 define <16 x i16> @test4(<16 x i16> %a) {
161 ; SSE41-LABEL: test4:
162 ; SSE41:       # BB#0:
163 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363]
164 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
165 ; SSE41-NEXT:    pmulhuw %xmm2, %xmm3
166 ; SSE41-NEXT:    psubw %xmm3, %xmm0
167 ; SSE41-NEXT:    psrlw $1, %xmm0
168 ; SSE41-NEXT:    paddw %xmm3, %xmm0
169 ; SSE41-NEXT:    psrlw $2, %xmm0
170 ; SSE41-NEXT:    pmulhuw %xmm1, %xmm2
171 ; SSE41-NEXT:    psubw %xmm2, %xmm1
172 ; SSE41-NEXT:    psrlw $1, %xmm1
173 ; SSE41-NEXT:    paddw %xmm2, %xmm1
174 ; SSE41-NEXT:    psrlw $2, %xmm1
175 ; SSE41-NEXT:    retq
176 ;
177 ; SSE-LABEL: test4:
178 ; SSE:       # BB#0:
179 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [9363,9363,9363,9363,9363,9363,9363,9363]
180 ; SSE-NEXT:    movdqa %xmm0, %xmm3
181 ; SSE-NEXT:    pmulhuw %xmm2, %xmm3
182 ; SSE-NEXT:    psubw %xmm3, %xmm0
183 ; SSE-NEXT:    psrlw $1, %xmm0
184 ; SSE-NEXT:    paddw %xmm3, %xmm0
185 ; SSE-NEXT:    psrlw $2, %xmm0
186 ; SSE-NEXT:    pmulhuw %xmm1, %xmm2
187 ; SSE-NEXT:    psubw %xmm2, %xmm1
188 ; SSE-NEXT:    psrlw $1, %xmm1
189 ; SSE-NEXT:    paddw %xmm2, %xmm1
190 ; SSE-NEXT:    psrlw $2, %xmm1
191 ; SSE-NEXT:    retq
192 ;
193 ; AVX-LABEL: test4:
194 ; AVX:       # BB#0:
195 ; AVX-NEXT:    vpmulhuw {{.*}}(%rip), %ymm0, %ymm1
196 ; AVX-NEXT:    vpsubw %ymm1, %ymm0, %ymm0
197 ; AVX-NEXT:    vpsrlw $1, %ymm0, %ymm0
198 ; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
199 ; AVX-NEXT:    vpsrlw $2, %ymm0, %ymm0
200 ; AVX-NEXT:    retq
201   %div = 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>
202   ret <16 x i16> %div
203 }
204
205 define <8 x i16> @test5(<8 x i16> %a) {
206 ; SSE41-LABEL: test5:
207 ; SSE41:       # BB#0:
208 ; SSE41-NEXT:    pmulhw {{.*}}(%rip), %xmm0
209 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
210 ; SSE41-NEXT:    psrlw $15, %xmm1
211 ; SSE41-NEXT:    psraw $1, %xmm0
212 ; SSE41-NEXT:    paddw %xmm1, %xmm0
213 ; SSE41-NEXT:    retq
214 ;
215 ; SSE-LABEL: test5:
216 ; SSE:       # BB#0:
217 ; SSE-NEXT:    pmulhw {{.*}}(%rip), %xmm0
218 ; SSE-NEXT:    movdqa %xmm0, %xmm1
219 ; SSE-NEXT:    psrlw $15, %xmm1
220 ; SSE-NEXT:    psraw $1, %xmm0
221 ; SSE-NEXT:    paddw %xmm1, %xmm0
222 ; SSE-NEXT:    retq
223 ;
224 ; AVX-LABEL: test5:
225 ; AVX:       # BB#0:
226 ; AVX-NEXT:    vpmulhw {{.*}}(%rip), %xmm0, %xmm0
227 ; AVX-NEXT:    vpsrlw $15, %xmm0, %xmm1
228 ; AVX-NEXT:    vpsraw $1, %xmm0, %xmm0
229 ; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
230 ; AVX-NEXT:    retq
231   %div = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
232   ret <8 x i16> %div
233 }
234
235 define <16 x i16> @test6(<16 x i16> %a) {
236 ; SSE41-LABEL: test6:
237 ; SSE41:       # BB#0:
238 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]
239 ; SSE41-NEXT:    pmulhw %xmm2, %xmm0
240 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
241 ; SSE41-NEXT:    psrlw $15, %xmm3
242 ; SSE41-NEXT:    psraw $1, %xmm0
243 ; SSE41-NEXT:    paddw %xmm3, %xmm0
244 ; SSE41-NEXT:    pmulhw %xmm2, %xmm1
245 ; SSE41-NEXT:    movdqa %xmm1, %xmm2
246 ; SSE41-NEXT:    psrlw $15, %xmm2
247 ; SSE41-NEXT:    psraw $1, %xmm1
248 ; SSE41-NEXT:    paddw %xmm2, %xmm1
249 ; SSE41-NEXT:    retq
250 ;
251 ; SSE-LABEL: test6:
252 ; SSE:       # BB#0:
253 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [18725,18725,18725,18725,18725,18725,18725,18725]
254 ; SSE-NEXT:    pmulhw %xmm2, %xmm0
255 ; SSE-NEXT:    movdqa %xmm0, %xmm3
256 ; SSE-NEXT:    psrlw $15, %xmm3
257 ; SSE-NEXT:    psraw $1, %xmm0
258 ; SSE-NEXT:    paddw %xmm3, %xmm0
259 ; SSE-NEXT:    pmulhw %xmm2, %xmm1
260 ; SSE-NEXT:    movdqa %xmm1, %xmm2
261 ; SSE-NEXT:    psrlw $15, %xmm2
262 ; SSE-NEXT:    psraw $1, %xmm1
263 ; SSE-NEXT:    paddw %xmm2, %xmm1
264 ; SSE-NEXT:    retq
265 ;
266 ; AVX-LABEL: test6:
267 ; AVX:       # BB#0:
268 ; AVX-NEXT:    vpmulhw {{.*}}(%rip), %ymm0, %ymm0
269 ; AVX-NEXT:    vpsrlw $15, %ymm0, %ymm1
270 ; AVX-NEXT:    vpsraw $1, %ymm0, %ymm0
271 ; AVX-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
272 ; AVX-NEXT:    retq
273   %div = sdiv <16 x i16> %a, <i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7,i16 7, i16 7, i16 7, i16 7>
274   ret <16 x i16> %div
275 }
276
277 define <16 x i8> @test7(<16 x i8> %a) {
278 ; SSE41-LABEL: test7:
279 ; SSE41:       # BB#0:
280 ; SSE41-NEXT:    pextrb $1, %xmm0, %eax
281 ; SSE41-NEXT:    movsbl %al, %eax
282 ; SSE41-NEXT:    imull $-109, %eax, %ecx
283 ; SSE41-NEXT:    shrl $8, %ecx
284 ; SSE41-NEXT:    addb %cl, %al
285 ; SSE41-NEXT:    movb %al, %cl
286 ; SSE41-NEXT:    shrb $7, %cl
287 ; SSE41-NEXT:    sarb $2, %al
288 ; SSE41-NEXT:    addb %cl, %al
289 ; SSE41-NEXT:    movzbl %al, %eax
290 ; SSE41-NEXT:    pextrb $0, %xmm0, %ecx
291 ; SSE41-NEXT:    movsbl %cl, %ecx
292 ; SSE41-NEXT:    imull $-109, %ecx, %edx
293 ; SSE41-NEXT:    shrl $8, %edx
294 ; SSE41-NEXT:    addb %dl, %cl
295 ; SSE41-NEXT:    movb %cl, %dl
296 ; SSE41-NEXT:    shrb $7, %dl
297 ; SSE41-NEXT:    sarb $2, %cl
298 ; SSE41-NEXT:    addb %dl, %cl
299 ; SSE41-NEXT:    movzbl %cl, %ecx
300 ; SSE41-NEXT:    movd %ecx, %xmm1
301 ; SSE41-NEXT:    pinsrb $1, %eax, %xmm1
302 ; SSE41-NEXT:    pextrb $2, %xmm0, %eax
303 ; SSE41-NEXT:    movsbl %al, %eax
304 ; SSE41-NEXT:    imull $-109, %eax, %ecx
305 ; SSE41-NEXT:    shrl $8, %ecx
306 ; SSE41-NEXT:    addb %cl, %al
307 ; SSE41-NEXT:    movb %al, %cl
308 ; SSE41-NEXT:    shrb $7, %cl
309 ; SSE41-NEXT:    sarb $2, %al
310 ; SSE41-NEXT:    addb %cl, %al
311 ; SSE41-NEXT:    movzbl %al, %eax
312 ; SSE41-NEXT:    pinsrb $2, %eax, %xmm1
313 ; SSE41-NEXT:    pextrb $3, %xmm0, %eax
314 ; SSE41-NEXT:    movsbl %al, %eax
315 ; SSE41-NEXT:    imull $-109, %eax, %ecx
316 ; SSE41-NEXT:    shrl $8, %ecx
317 ; SSE41-NEXT:    addb %cl, %al
318 ; SSE41-NEXT:    movb %al, %cl
319 ; SSE41-NEXT:    shrb $7, %cl
320 ; SSE41-NEXT:    sarb $2, %al
321 ; SSE41-NEXT:    addb %cl, %al
322 ; SSE41-NEXT:    movzbl %al, %eax
323 ; SSE41-NEXT:    pinsrb $3, %eax, %xmm1
324 ; SSE41-NEXT:    pextrb $4, %xmm0, %eax
325 ; SSE41-NEXT:    movsbl %al, %eax
326 ; SSE41-NEXT:    imull $-109, %eax, %ecx
327 ; SSE41-NEXT:    shrl $8, %ecx
328 ; SSE41-NEXT:    addb %cl, %al
329 ; SSE41-NEXT:    movb %al, %cl
330 ; SSE41-NEXT:    shrb $7, %cl
331 ; SSE41-NEXT:    sarb $2, %al
332 ; SSE41-NEXT:    addb %cl, %al
333 ; SSE41-NEXT:    movzbl %al, %eax
334 ; SSE41-NEXT:    pinsrb $4, %eax, %xmm1
335 ; SSE41-NEXT:    pextrb $5, %xmm0, %eax
336 ; SSE41-NEXT:    movsbl %al, %eax
337 ; SSE41-NEXT:    imull $-109, %eax, %ecx
338 ; SSE41-NEXT:    shrl $8, %ecx
339 ; SSE41-NEXT:    addb %cl, %al
340 ; SSE41-NEXT:    movb %al, %cl
341 ; SSE41-NEXT:    shrb $7, %cl
342 ; SSE41-NEXT:    sarb $2, %al
343 ; SSE41-NEXT:    addb %cl, %al
344 ; SSE41-NEXT:    movzbl %al, %eax
345 ; SSE41-NEXT:    pinsrb $5, %eax, %xmm1
346 ; SSE41-NEXT:    pextrb $6, %xmm0, %eax
347 ; SSE41-NEXT:    movsbl %al, %eax
348 ; SSE41-NEXT:    imull $-109, %eax, %ecx
349 ; SSE41-NEXT:    shrl $8, %ecx
350 ; SSE41-NEXT:    addb %cl, %al
351 ; SSE41-NEXT:    movb %al, %cl
352 ; SSE41-NEXT:    shrb $7, %cl
353 ; SSE41-NEXT:    sarb $2, %al
354 ; SSE41-NEXT:    addb %cl, %al
355 ; SSE41-NEXT:    movzbl %al, %eax
356 ; SSE41-NEXT:    pinsrb $6, %eax, %xmm1
357 ; SSE41-NEXT:    pextrb $7, %xmm0, %eax
358 ; SSE41-NEXT:    movsbl %al, %eax
359 ; SSE41-NEXT:    imull $-109, %eax, %ecx
360 ; SSE41-NEXT:    shrl $8, %ecx
361 ; SSE41-NEXT:    addb %cl, %al
362 ; SSE41-NEXT:    movb %al, %cl
363 ; SSE41-NEXT:    shrb $7, %cl
364 ; SSE41-NEXT:    sarb $2, %al
365 ; SSE41-NEXT:    addb %cl, %al
366 ; SSE41-NEXT:    movzbl %al, %eax
367 ; SSE41-NEXT:    pinsrb $7, %eax, %xmm1
368 ; SSE41-NEXT:    pextrb $8, %xmm0, %eax
369 ; SSE41-NEXT:    movsbl %al, %eax
370 ; SSE41-NEXT:    imull $-109, %eax, %ecx
371 ; SSE41-NEXT:    shrl $8, %ecx
372 ; SSE41-NEXT:    addb %cl, %al
373 ; SSE41-NEXT:    movb %al, %cl
374 ; SSE41-NEXT:    shrb $7, %cl
375 ; SSE41-NEXT:    sarb $2, %al
376 ; SSE41-NEXT:    addb %cl, %al
377 ; SSE41-NEXT:    movzbl %al, %eax
378 ; SSE41-NEXT:    pinsrb $8, %eax, %xmm1
379 ; SSE41-NEXT:    pextrb $9, %xmm0, %eax
380 ; SSE41-NEXT:    movsbl %al, %eax
381 ; SSE41-NEXT:    imull $-109, %eax, %ecx
382 ; SSE41-NEXT:    shrl $8, %ecx
383 ; SSE41-NEXT:    addb %cl, %al
384 ; SSE41-NEXT:    movb %al, %cl
385 ; SSE41-NEXT:    shrb $7, %cl
386 ; SSE41-NEXT:    sarb $2, %al
387 ; SSE41-NEXT:    addb %cl, %al
388 ; SSE41-NEXT:    movzbl %al, %eax
389 ; SSE41-NEXT:    pinsrb $9, %eax, %xmm1
390 ; SSE41-NEXT:    pextrb $10, %xmm0, %eax
391 ; SSE41-NEXT:    movsbl %al, %eax
392 ; SSE41-NEXT:    imull $-109, %eax, %ecx
393 ; SSE41-NEXT:    shrl $8, %ecx
394 ; SSE41-NEXT:    addb %cl, %al
395 ; SSE41-NEXT:    movb %al, %cl
396 ; SSE41-NEXT:    shrb $7, %cl
397 ; SSE41-NEXT:    sarb $2, %al
398 ; SSE41-NEXT:    addb %cl, %al
399 ; SSE41-NEXT:    movzbl %al, %eax
400 ; SSE41-NEXT:    pinsrb $10, %eax, %xmm1
401 ; SSE41-NEXT:    pextrb $11, %xmm0, %eax
402 ; SSE41-NEXT:    movsbl %al, %eax
403 ; SSE41-NEXT:    imull $-109, %eax, %ecx
404 ; SSE41-NEXT:    shrl $8, %ecx
405 ; SSE41-NEXT:    addb %cl, %al
406 ; SSE41-NEXT:    movb %al, %cl
407 ; SSE41-NEXT:    shrb $7, %cl
408 ; SSE41-NEXT:    sarb $2, %al
409 ; SSE41-NEXT:    addb %cl, %al
410 ; SSE41-NEXT:    movzbl %al, %eax
411 ; SSE41-NEXT:    pinsrb $11, %eax, %xmm1
412 ; SSE41-NEXT:    pextrb $12, %xmm0, %eax
413 ; SSE41-NEXT:    movsbl %al, %eax
414 ; SSE41-NEXT:    imull $-109, %eax, %ecx
415 ; SSE41-NEXT:    shrl $8, %ecx
416 ; SSE41-NEXT:    addb %cl, %al
417 ; SSE41-NEXT:    movb %al, %cl
418 ; SSE41-NEXT:    shrb $7, %cl
419 ; SSE41-NEXT:    sarb $2, %al
420 ; SSE41-NEXT:    addb %cl, %al
421 ; SSE41-NEXT:    movzbl %al, %eax
422 ; SSE41-NEXT:    pinsrb $12, %eax, %xmm1
423 ; SSE41-NEXT:    pextrb $13, %xmm0, %eax
424 ; SSE41-NEXT:    movsbl %al, %eax
425 ; SSE41-NEXT:    imull $-109, %eax, %ecx
426 ; SSE41-NEXT:    shrl $8, %ecx
427 ; SSE41-NEXT:    addb %cl, %al
428 ; SSE41-NEXT:    movb %al, %cl
429 ; SSE41-NEXT:    shrb $7, %cl
430 ; SSE41-NEXT:    sarb $2, %al
431 ; SSE41-NEXT:    addb %cl, %al
432 ; SSE41-NEXT:    movzbl %al, %eax
433 ; SSE41-NEXT:    pinsrb $13, %eax, %xmm1
434 ; SSE41-NEXT:    pextrb $14, %xmm0, %eax
435 ; SSE41-NEXT:    movsbl %al, %eax
436 ; SSE41-NEXT:    imull $-109, %eax, %ecx
437 ; SSE41-NEXT:    shrl $8, %ecx
438 ; SSE41-NEXT:    addb %cl, %al
439 ; SSE41-NEXT:    movb %al, %cl
440 ; SSE41-NEXT:    shrb $7, %cl
441 ; SSE41-NEXT:    sarb $2, %al
442 ; SSE41-NEXT:    addb %cl, %al
443 ; SSE41-NEXT:    movzbl %al, %eax
444 ; SSE41-NEXT:    pinsrb $14, %eax, %xmm1
445 ; SSE41-NEXT:    pextrb $15, %xmm0, %eax
446 ; SSE41-NEXT:    movsbl %al, %eax
447 ; SSE41-NEXT:    imull $-109, %eax, %ecx
448 ; SSE41-NEXT:    shrl $8, %ecx
449 ; SSE41-NEXT:    addb %cl, %al
450 ; SSE41-NEXT:    movb %al, %cl
451 ; SSE41-NEXT:    shrb $7, %cl
452 ; SSE41-NEXT:    sarb $2, %al
453 ; SSE41-NEXT:    addb %cl, %al
454 ; SSE41-NEXT:    movzbl %al, %eax
455 ; SSE41-NEXT:    pinsrb $15, %eax, %xmm1
456 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
457 ; SSE41-NEXT:    retq
458 ;
459 ; SSE-LABEL: test7:
460 ; SSE:       # BB#0:
461 ; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
462 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
463 ; SSE-NEXT:    imull $-109, %eax, %ecx
464 ; SSE-NEXT:    shrl $8, %ecx
465 ; SSE-NEXT:    addb %al, %cl
466 ; SSE-NEXT:    movb %cl, %al
467 ; SSE-NEXT:    shrb $7, %al
468 ; SSE-NEXT:    sarb $2, %cl
469 ; SSE-NEXT:    addb %al, %cl
470 ; SSE-NEXT:    movzbl %cl, %eax
471 ; SSE-NEXT:    movd %eax, %xmm0
472 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
473 ; SSE-NEXT:    imull $-109, %eax, %ecx
474 ; SSE-NEXT:    shrl $8, %ecx
475 ; SSE-NEXT:    addb %al, %cl
476 ; SSE-NEXT:    movb %cl, %al
477 ; SSE-NEXT:    shrb $7, %al
478 ; SSE-NEXT:    sarb $2, %cl
479 ; SSE-NEXT:    addb %al, %cl
480 ; SSE-NEXT:    movzbl %cl, %eax
481 ; SSE-NEXT:    movd %eax, %xmm1
482 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = 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]
483 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
484 ; SSE-NEXT:    imull $-109, %eax, %ecx
485 ; SSE-NEXT:    shrl $8, %ecx
486 ; SSE-NEXT:    addb %al, %cl
487 ; SSE-NEXT:    movb %cl, %al
488 ; SSE-NEXT:    shrb $7, %al
489 ; SSE-NEXT:    sarb $2, %cl
490 ; SSE-NEXT:    addb %al, %cl
491 ; SSE-NEXT:    movzbl %cl, %eax
492 ; SSE-NEXT:    movd %eax, %xmm2
493 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
494 ; SSE-NEXT:    imull $-109, %eax, %ecx
495 ; SSE-NEXT:    shrl $8, %ecx
496 ; SSE-NEXT:    addb %al, %cl
497 ; SSE-NEXT:    movb %cl, %al
498 ; SSE-NEXT:    shrb $7, %al
499 ; SSE-NEXT:    sarb $2, %cl
500 ; SSE-NEXT:    addb %al, %cl
501 ; SSE-NEXT:    movzbl %cl, %eax
502 ; SSE-NEXT:    movd %eax, %xmm0
503 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
504 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
505 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
506 ; SSE-NEXT:    imull $-109, %eax, %ecx
507 ; SSE-NEXT:    shrl $8, %ecx
508 ; SSE-NEXT:    addb %al, %cl
509 ; SSE-NEXT:    movb %cl, %al
510 ; SSE-NEXT:    shrb $7, %al
511 ; SSE-NEXT:    sarb $2, %cl
512 ; SSE-NEXT:    addb %al, %cl
513 ; SSE-NEXT:    movzbl %cl, %eax
514 ; SSE-NEXT:    movd %eax, %xmm1
515 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
516 ; SSE-NEXT:    imull $-109, %eax, %ecx
517 ; SSE-NEXT:    shrl $8, %ecx
518 ; SSE-NEXT:    addb %al, %cl
519 ; SSE-NEXT:    movb %cl, %al
520 ; SSE-NEXT:    shrb $7, %al
521 ; SSE-NEXT:    sarb $2, %cl
522 ; SSE-NEXT:    addb %al, %cl
523 ; SSE-NEXT:    movzbl %cl, %eax
524 ; SSE-NEXT:    movd %eax, %xmm2
525 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
526 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
527 ; SSE-NEXT:    imull $-109, %eax, %ecx
528 ; SSE-NEXT:    shrl $8, %ecx
529 ; SSE-NEXT:    addb %al, %cl
530 ; SSE-NEXT:    movb %cl, %al
531 ; SSE-NEXT:    shrb $7, %al
532 ; SSE-NEXT:    sarb $2, %cl
533 ; SSE-NEXT:    addb %al, %cl
534 ; SSE-NEXT:    movzbl %cl, %eax
535 ; SSE-NEXT:    movd %eax, %xmm3
536 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
537 ; SSE-NEXT:    imull $-109, %eax, %ecx
538 ; SSE-NEXT:    shrl $8, %ecx
539 ; SSE-NEXT:    addb %al, %cl
540 ; SSE-NEXT:    movb %cl, %al
541 ; SSE-NEXT:    shrb $7, %al
542 ; SSE-NEXT:    sarb $2, %cl
543 ; SSE-NEXT:    addb %al, %cl
544 ; SSE-NEXT:    movzbl %cl, %eax
545 ; SSE-NEXT:    movd %eax, %xmm1
546 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = 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]
547 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = 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]
548 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = 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]
549 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
550 ; SSE-NEXT:    imull $-109, %eax, %ecx
551 ; SSE-NEXT:    shrl $8, %ecx
552 ; SSE-NEXT:    addb %al, %cl
553 ; SSE-NEXT:    movb %cl, %al
554 ; SSE-NEXT:    shrb $7, %al
555 ; SSE-NEXT:    sarb $2, %cl
556 ; SSE-NEXT:    addb %al, %cl
557 ; SSE-NEXT:    movzbl %cl, %eax
558 ; SSE-NEXT:    movd %eax, %xmm2
559 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
560 ; SSE-NEXT:    imull $-109, %eax, %ecx
561 ; SSE-NEXT:    shrl $8, %ecx
562 ; SSE-NEXT:    addb %al, %cl
563 ; SSE-NEXT:    movb %cl, %al
564 ; SSE-NEXT:    shrb $7, %al
565 ; SSE-NEXT:    sarb $2, %cl
566 ; SSE-NEXT:    addb %al, %cl
567 ; SSE-NEXT:    movzbl %cl, %eax
568 ; SSE-NEXT:    movd %eax, %xmm0
569 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
570 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
571 ; SSE-NEXT:    imull $-109, %eax, %ecx
572 ; SSE-NEXT:    shrl $8, %ecx
573 ; SSE-NEXT:    addb %al, %cl
574 ; SSE-NEXT:    movb %cl, %al
575 ; SSE-NEXT:    shrb $7, %al
576 ; SSE-NEXT:    sarb $2, %cl
577 ; SSE-NEXT:    addb %al, %cl
578 ; SSE-NEXT:    movzbl %cl, %eax
579 ; SSE-NEXT:    movd %eax, %xmm3
580 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
581 ; SSE-NEXT:    imull $-109, %eax, %ecx
582 ; SSE-NEXT:    shrl $8, %ecx
583 ; SSE-NEXT:    addb %al, %cl
584 ; SSE-NEXT:    movb %cl, %al
585 ; SSE-NEXT:    shrb $7, %al
586 ; SSE-NEXT:    sarb $2, %cl
587 ; SSE-NEXT:    addb %al, %cl
588 ; SSE-NEXT:    movzbl %cl, %eax
589 ; SSE-NEXT:    movd %eax, %xmm2
590 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
591 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
592 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
593 ; SSE-NEXT:    imull $-109, %eax, %ecx
594 ; SSE-NEXT:    shrl $8, %ecx
595 ; SSE-NEXT:    addb %al, %cl
596 ; SSE-NEXT:    movb %cl, %al
597 ; SSE-NEXT:    shrb $7, %al
598 ; SSE-NEXT:    sarb $2, %cl
599 ; SSE-NEXT:    addb %al, %cl
600 ; SSE-NEXT:    movzbl %cl, %eax
601 ; SSE-NEXT:    movd %eax, %xmm0
602 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
603 ; SSE-NEXT:    imull $-109, %eax, %ecx
604 ; SSE-NEXT:    shrl $8, %ecx
605 ; SSE-NEXT:    addb %al, %cl
606 ; SSE-NEXT:    movb %cl, %al
607 ; SSE-NEXT:    shrb $7, %al
608 ; SSE-NEXT:    sarb $2, %cl
609 ; SSE-NEXT:    addb %al, %cl
610 ; SSE-NEXT:    movzbl %cl, %eax
611 ; SSE-NEXT:    movd %eax, %xmm3
612 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
613 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
614 ; SSE-NEXT:    imull $-109, %eax, %ecx
615 ; SSE-NEXT:    shrl $8, %ecx
616 ; SSE-NEXT:    addb %al, %cl
617 ; SSE-NEXT:    movb %cl, %al
618 ; SSE-NEXT:    shrb $7, %al
619 ; SSE-NEXT:    sarb $2, %cl
620 ; SSE-NEXT:    addb %al, %cl
621 ; SSE-NEXT:    movzbl %cl, %eax
622 ; SSE-NEXT:    movd %eax, %xmm4
623 ; SSE-NEXT:    movsbl -{{[0-9]+}}(%rsp), %eax
624 ; SSE-NEXT:    imull $-109, %eax, %ecx
625 ; SSE-NEXT:    shrl $8, %ecx
626 ; SSE-NEXT:    addb %al, %cl
627 ; SSE-NEXT:    movb %cl, %al
628 ; SSE-NEXT:    shrb $7, %al
629 ; SSE-NEXT:    sarb $2, %cl
630 ; SSE-NEXT:    addb %al, %cl
631 ; SSE-NEXT:    movzbl %cl, %eax
632 ; SSE-NEXT:    movd %eax, %xmm0
633 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
634 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
635 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
636 ; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
637 ; SSE-NEXT:    retq
638 ;
639 ; AVX-LABEL: test7:
640 ; AVX:       # BB#0:
641 ; AVX-NEXT:    vpextrb $1, %xmm0, %eax
642 ; AVX-NEXT:    movsbl %al, %eax
643 ; AVX-NEXT:    imull $-109, %eax, %ecx
644 ; AVX-NEXT:    shrl $8, %ecx
645 ; AVX-NEXT:    addb %cl, %al
646 ; AVX-NEXT:    movb %al, %cl
647 ; AVX-NEXT:    shrb $7, %cl
648 ; AVX-NEXT:    sarb $2, %al
649 ; AVX-NEXT:    addb %cl, %al
650 ; AVX-NEXT:    movzbl %al, %eax
651 ; AVX-NEXT:    vpextrb $0, %xmm0, %ecx
652 ; AVX-NEXT:    movsbl %cl, %ecx
653 ; AVX-NEXT:    imull $-109, %ecx, %edx
654 ; AVX-NEXT:    shrl $8, %edx
655 ; AVX-NEXT:    addb %dl, %cl
656 ; AVX-NEXT:    movb %cl, %dl
657 ; AVX-NEXT:    shrb $7, %dl
658 ; AVX-NEXT:    sarb $2, %cl
659 ; AVX-NEXT:    addb %dl, %cl
660 ; AVX-NEXT:    movzbl %cl, %ecx
661 ; AVX-NEXT:    vmovd %ecx, %xmm1
662 ; AVX-NEXT:    vpextrb $2, %xmm0, %ecx
663 ; AVX-NEXT:    movsbl %cl, %ecx
664 ; AVX-NEXT:    imull $-109, %ecx, %edx
665 ; AVX-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
666 ; AVX-NEXT:    shrl $8, %edx
667 ; AVX-NEXT:    addb %dl, %cl
668 ; AVX-NEXT:    movb %cl, %al
669 ; AVX-NEXT:    shrb $7, %al
670 ; AVX-NEXT:    sarb $2, %cl
671 ; AVX-NEXT:    addb %al, %cl
672 ; AVX-NEXT:    movzbl %cl, %eax
673 ; AVX-NEXT:    vpextrb $3, %xmm0, %ecx
674 ; AVX-NEXT:    movsbl %cl, %ecx
675 ; AVX-NEXT:    imull $-109, %ecx, %edx
676 ; AVX-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
677 ; AVX-NEXT:    shrl $8, %edx
678 ; AVX-NEXT:    addb %dl, %cl
679 ; AVX-NEXT:    movb %cl, %al
680 ; AVX-NEXT:    shrb $7, %al
681 ; AVX-NEXT:    sarb $2, %cl
682 ; AVX-NEXT:    addb %al, %cl
683 ; AVX-NEXT:    movzbl %cl, %eax
684 ; AVX-NEXT:    vpextrb $4, %xmm0, %ecx
685 ; AVX-NEXT:    movsbl %cl, %ecx
686 ; AVX-NEXT:    imull $-109, %ecx, %edx
687 ; AVX-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
688 ; AVX-NEXT:    shrl $8, %edx
689 ; AVX-NEXT:    addb %dl, %cl
690 ; AVX-NEXT:    movb %cl, %al
691 ; AVX-NEXT:    shrb $7, %al
692 ; AVX-NEXT:    sarb $2, %cl
693 ; AVX-NEXT:    addb %al, %cl
694 ; AVX-NEXT:    movzbl %cl, %eax
695 ; AVX-NEXT:    vpextrb $5, %xmm0, %ecx
696 ; AVX-NEXT:    movsbl %cl, %ecx
697 ; AVX-NEXT:    imull $-109, %ecx, %edx
698 ; AVX-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
699 ; AVX-NEXT:    shrl $8, %edx
700 ; AVX-NEXT:    addb %dl, %cl
701 ; AVX-NEXT:    movb %cl, %al
702 ; AVX-NEXT:    shrb $7, %al
703 ; AVX-NEXT:    sarb $2, %cl
704 ; AVX-NEXT:    addb %al, %cl
705 ; AVX-NEXT:    movzbl %cl, %eax
706 ; AVX-NEXT:    vpextrb $6, %xmm0, %ecx
707 ; AVX-NEXT:    movsbl %cl, %ecx
708 ; AVX-NEXT:    imull $-109, %ecx, %edx
709 ; AVX-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
710 ; AVX-NEXT:    shrl $8, %edx
711 ; AVX-NEXT:    addb %dl, %cl
712 ; AVX-NEXT:    movb %cl, %al
713 ; AVX-NEXT:    shrb $7, %al
714 ; AVX-NEXT:    sarb $2, %cl
715 ; AVX-NEXT:    addb %al, %cl
716 ; AVX-NEXT:    movzbl %cl, %eax
717 ; AVX-NEXT:    vpextrb $7, %xmm0, %ecx
718 ; AVX-NEXT:    movsbl %cl, %ecx
719 ; AVX-NEXT:    imull $-109, %ecx, %edx
720 ; AVX-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
721 ; AVX-NEXT:    shrl $8, %edx
722 ; AVX-NEXT:    addb %dl, %cl
723 ; AVX-NEXT:    movb %cl, %al
724 ; AVX-NEXT:    shrb $7, %al
725 ; AVX-NEXT:    sarb $2, %cl
726 ; AVX-NEXT:    addb %al, %cl
727 ; AVX-NEXT:    movzbl %cl, %eax
728 ; AVX-NEXT:    vpextrb $8, %xmm0, %ecx
729 ; AVX-NEXT:    movsbl %cl, %ecx
730 ; AVX-NEXT:    imull $-109, %ecx, %edx
731 ; AVX-NEXT:    vpinsrb $7, %eax, %xmm1, %xmm1
732 ; AVX-NEXT:    shrl $8, %edx
733 ; AVX-NEXT:    addb %dl, %cl
734 ; AVX-NEXT:    movb %cl, %al
735 ; AVX-NEXT:    shrb $7, %al
736 ; AVX-NEXT:    sarb $2, %cl
737 ; AVX-NEXT:    addb %al, %cl
738 ; AVX-NEXT:    movzbl %cl, %eax
739 ; AVX-NEXT:    vpextrb $9, %xmm0, %ecx
740 ; AVX-NEXT:    movsbl %cl, %ecx
741 ; AVX-NEXT:    imull $-109, %ecx, %edx
742 ; AVX-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
743 ; AVX-NEXT:    shrl $8, %edx
744 ; AVX-NEXT:    addb %dl, %cl
745 ; AVX-NEXT:    movb %cl, %al
746 ; AVX-NEXT:    shrb $7, %al
747 ; AVX-NEXT:    sarb $2, %cl
748 ; AVX-NEXT:    addb %al, %cl
749 ; AVX-NEXT:    movzbl %cl, %eax
750 ; AVX-NEXT:    vpextrb $10, %xmm0, %ecx
751 ; AVX-NEXT:    movsbl %cl, %ecx
752 ; AVX-NEXT:    imull $-109, %ecx, %edx
753 ; AVX-NEXT:    vpinsrb $9, %eax, %xmm1, %xmm1
754 ; AVX-NEXT:    shrl $8, %edx
755 ; AVX-NEXT:    addb %dl, %cl
756 ; AVX-NEXT:    movb %cl, %al
757 ; AVX-NEXT:    shrb $7, %al
758 ; AVX-NEXT:    sarb $2, %cl
759 ; AVX-NEXT:    addb %al, %cl
760 ; AVX-NEXT:    movzbl %cl, %eax
761 ; AVX-NEXT:    vpextrb $11, %xmm0, %ecx
762 ; AVX-NEXT:    movsbl %cl, %ecx
763 ; AVX-NEXT:    imull $-109, %ecx, %edx
764 ; AVX-NEXT:    vpinsrb $10, %eax, %xmm1, %xmm1
765 ; AVX-NEXT:    shrl $8, %edx
766 ; AVX-NEXT:    addb %dl, %cl
767 ; AVX-NEXT:    movb %cl, %al
768 ; AVX-NEXT:    shrb $7, %al
769 ; AVX-NEXT:    sarb $2, %cl
770 ; AVX-NEXT:    addb %al, %cl
771 ; AVX-NEXT:    movzbl %cl, %eax
772 ; AVX-NEXT:    vpextrb $12, %xmm0, %ecx
773 ; AVX-NEXT:    movsbl %cl, %ecx
774 ; AVX-NEXT:    imull $-109, %ecx, %edx
775 ; AVX-NEXT:    vpinsrb $11, %eax, %xmm1, %xmm1
776 ; AVX-NEXT:    shrl $8, %edx
777 ; AVX-NEXT:    addb %dl, %cl
778 ; AVX-NEXT:    movb %cl, %al
779 ; AVX-NEXT:    shrb $7, %al
780 ; AVX-NEXT:    sarb $2, %cl
781 ; AVX-NEXT:    addb %al, %cl
782 ; AVX-NEXT:    movzbl %cl, %eax
783 ; AVX-NEXT:    vpextrb $13, %xmm0, %ecx
784 ; AVX-NEXT:    movsbl %cl, %ecx
785 ; AVX-NEXT:    imull $-109, %ecx, %edx
786 ; AVX-NEXT:    vpinsrb $12, %eax, %xmm1, %xmm1
787 ; AVX-NEXT:    shrl $8, %edx
788 ; AVX-NEXT:    addb %dl, %cl
789 ; AVX-NEXT:    movb %cl, %al
790 ; AVX-NEXT:    shrb $7, %al
791 ; AVX-NEXT:    sarb $2, %cl
792 ; AVX-NEXT:    addb %al, %cl
793 ; AVX-NEXT:    movzbl %cl, %eax
794 ; AVX-NEXT:    vpextrb $14, %xmm0, %ecx
795 ; AVX-NEXT:    movsbl %cl, %ecx
796 ; AVX-NEXT:    imull $-109, %ecx, %edx
797 ; AVX-NEXT:    vpinsrb $13, %eax, %xmm1, %xmm1
798 ; AVX-NEXT:    shrl $8, %edx
799 ; AVX-NEXT:    addb %dl, %cl
800 ; AVX-NEXT:    movb %cl, %al
801 ; AVX-NEXT:    shrb $7, %al
802 ; AVX-NEXT:    sarb $2, %cl
803 ; AVX-NEXT:    addb %al, %cl
804 ; AVX-NEXT:    movzbl %cl, %eax
805 ; AVX-NEXT:    vpextrb $15, %xmm0, %ecx
806 ; AVX-NEXT:    movsbl %cl, %ecx
807 ; AVX-NEXT:    imull $-109, %ecx, %edx
808 ; AVX-NEXT:    vpinsrb $14, %eax, %xmm1, %xmm0
809 ; AVX-NEXT:    shrl $8, %edx
810 ; AVX-NEXT:    addb %dl, %cl
811 ; AVX-NEXT:    movb %cl, %al
812 ; AVX-NEXT:    shrb $7, %al
813 ; AVX-NEXT:    sarb $2, %cl
814 ; AVX-NEXT:    addb %al, %cl
815 ; AVX-NEXT:    movzbl %cl, %eax
816 ; AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
817 ; AVX-NEXT:    retq
818   %div = sdiv <16 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>
819   ret <16 x i8> %div
820 }
821
822 define <4 x i32> @test8(<4 x i32> %a) {
823 ; SSE41-LABEL: test8:
824 ; SSE41:       # BB#0:
825 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
826 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
827 ; SSE41-NEXT:    pmuldq %xmm1, %xmm2
828 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
829 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,0,3,0]
830 ; SSE41-NEXT:    pmuldq %xmm1, %xmm3
831 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
832 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,1,3]
833 ; SSE41-NEXT:    paddd %xmm0, %xmm1
834 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
835 ; SSE41-NEXT:    psrld $31, %xmm0
836 ; SSE41-NEXT:    psrad $2, %xmm1
837 ; SSE41-NEXT:    paddd %xmm0, %xmm1
838 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
839 ; SSE41-NEXT:    retq
840 ;
841 ; SSE-LABEL: test8:
842 ; SSE:       # BB#0:
843 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027]
844 ; SSE-NEXT:    movdqa %xmm1, %xmm2
845 ; SSE-NEXT:    psrad $31, %xmm2
846 ; SSE-NEXT:    pand %xmm0, %xmm2
847 ; SSE-NEXT:    movdqa %xmm0, %xmm3
848 ; SSE-NEXT:    psrad $31, %xmm3
849 ; SSE-NEXT:    pand %xmm1, %xmm3
850 ; SSE-NEXT:    paddd %xmm2, %xmm3
851 ; SSE-NEXT:    movdqa %xmm0, %xmm2
852 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
853 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
854 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[1,0,3,0]
855 ; SSE-NEXT:    pmuludq %xmm1, %xmm4
856 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm4[1,3]
857 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,1,3]
858 ; SSE-NEXT:    psubd %xmm3, %xmm1
859 ; SSE-NEXT:    paddd %xmm0, %xmm1
860 ; SSE-NEXT:    movdqa %xmm1, %xmm0
861 ; SSE-NEXT:    psrld $31, %xmm0
862 ; SSE-NEXT:    psrad $2, %xmm1
863 ; SSE-NEXT:    paddd %xmm0, %xmm1
864 ; SSE-NEXT:    movdqa %xmm1, %xmm0
865 ; SSE-NEXT:    retq
866 ;
867 ; AVX-LABEL: test8:
868 ; AVX:       # BB#0:
869 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
870 ; AVX-NEXT:    vpmuldq %xmm1, %xmm0, %xmm2
871 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
872 ; AVX-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[1,0,3,0]
873 ; AVX-NEXT:    vpmuldq %xmm1, %xmm3, %xmm1
874 ; AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm2[1,3],xmm1[1,3]
875 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3]
876 ; AVX-NEXT:    vpaddd %xmm0, %xmm1, %xmm0
877 ; AVX-NEXT:    vpsrld $31, %xmm0, %xmm1
878 ; AVX-NEXT:    vpsrad $2, %xmm0, %xmm0
879 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
880 ; AVX-NEXT:    retq
881   %div = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7>
882   ret <4 x i32> %div
883 }
884
885 define <8 x i32> @test9(<8 x i32> %a) {
886 ; SSE41-LABEL: test9:
887 ; SSE41:       # BB#0:
888 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2454267027,2454267027,2454267027,2454267027]
889 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
890 ; SSE41-NEXT:    pmuldq %xmm3, %xmm2
891 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[1,0,3,0]
892 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,0,3,0]
893 ; SSE41-NEXT:    pmuldq %xmm4, %xmm5
894 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm5[1,3]
895 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
896 ; SSE41-NEXT:    paddd %xmm0, %xmm2
897 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
898 ; SSE41-NEXT:    psrld $31, %xmm0
899 ; SSE41-NEXT:    psrad $2, %xmm2
900 ; SSE41-NEXT:    paddd %xmm0, %xmm2
901 ; SSE41-NEXT:    pmuldq %xmm1, %xmm3
902 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,0,3,0]
903 ; SSE41-NEXT:    pmuldq %xmm4, %xmm0
904 ; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm0[1,3]
905 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,1,3]
906 ; SSE41-NEXT:    paddd %xmm1, %xmm3
907 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
908 ; SSE41-NEXT:    psrld $31, %xmm0
909 ; SSE41-NEXT:    psrad $2, %xmm3
910 ; SSE41-NEXT:    paddd %xmm0, %xmm3
911 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
912 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
913 ; SSE41-NEXT:    retq
914 ;
915 ; SSE-LABEL: test9:
916 ; SSE:       # BB#0:
917 ; SSE-NEXT:    movdqa %xmm0, %xmm2
918 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [2454267027,2454267027,2454267027,2454267027]
919 ; SSE-NEXT:    movdqa %xmm3, %xmm4
920 ; SSE-NEXT:    psrad $31, %xmm4
921 ; SSE-NEXT:    movdqa %xmm4, %xmm0
922 ; SSE-NEXT:    pand %xmm2, %xmm0
923 ; SSE-NEXT:    movdqa %xmm2, %xmm5
924 ; SSE-NEXT:    psrad $31, %xmm5
925 ; SSE-NEXT:    pand %xmm3, %xmm5
926 ; SSE-NEXT:    paddd %xmm0, %xmm5
927 ; SSE-NEXT:    movdqa %xmm2, %xmm0
928 ; SSE-NEXT:    pmuludq %xmm3, %xmm0
929 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,0,3,0]
930 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,0,3,0]
931 ; SSE-NEXT:    pmuludq %xmm6, %xmm7
932 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm7[1,3]
933 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
934 ; SSE-NEXT:    psubd %xmm5, %xmm0
935 ; SSE-NEXT:    paddd %xmm2, %xmm0
936 ; SSE-NEXT:    movdqa %xmm0, %xmm2
937 ; SSE-NEXT:    psrld $31, %xmm2
938 ; SSE-NEXT:    psrad $2, %xmm0
939 ; SSE-NEXT:    paddd %xmm2, %xmm0
940 ; SSE-NEXT:    pand %xmm1, %xmm4
941 ; SSE-NEXT:    movdqa %xmm1, %xmm5
942 ; SSE-NEXT:    psrad $31, %xmm5
943 ; SSE-NEXT:    pand %xmm3, %xmm5
944 ; SSE-NEXT:    paddd %xmm4, %xmm5
945 ; SSE-NEXT:    pmuludq %xmm1, %xmm3
946 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[1,0,3,0]
947 ; SSE-NEXT:    pmuludq %xmm6, %xmm2
948 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm2[1,3]
949 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,2,1,3]
950 ; SSE-NEXT:    psubd %xmm5, %xmm2
951 ; SSE-NEXT:    paddd %xmm1, %xmm2
952 ; SSE-NEXT:    movdqa %xmm2, %xmm1
953 ; SSE-NEXT:    psrld $31, %xmm1
954 ; SSE-NEXT:    psrad $2, %xmm2
955 ; SSE-NEXT:    paddd %xmm1, %xmm2
956 ; SSE-NEXT:    movdqa %xmm2, %xmm1
957 ; SSE-NEXT:    retq
958 ;
959 ; AVX-LABEL: test9:
960 ; AVX:       # BB#0:
961 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
962 ; AVX-NEXT:    vpalignr {{.*#+}} ymm2 = ymm1[4,5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3],ymm1[20,21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19]
963 ; AVX-NEXT:    vpalignr {{.*#+}} ymm3 = ymm0[4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,20,21,22,23,24,25,26,27,28,29,30,31,16,17,18,19]
964 ; AVX-NEXT:    vpmuldq %ymm2, %ymm3, %ymm2
965 ; AVX-NEXT:    vpmuldq %ymm1, %ymm0, %ymm1
966 ; AVX-NEXT:    vpalignr {{.*#+}} ymm1 = ymm1[4,5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3],ymm1[20,21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19]
967 ; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
968 ; AVX-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
969 ; AVX-NEXT:    vpsrld $31, %ymm0, %ymm1
970 ; AVX-NEXT:    vpsrad $2, %ymm0, %ymm0
971 ; AVX-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
972 ; AVX-NEXT:    retq
973   %div = sdiv <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
974   ret <8 x i32> %div
975 }
976
977 define <8 x i32> @test10(<8 x i32> %a) {
978 ; SSE41-LABEL: test10:
979 ; SSE41:       # BB#0:
980 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
981 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
982 ; SSE41-NEXT:    pmuludq %xmm2, %xmm3
983 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,0]
984 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,0,3,0]
985 ; SSE41-NEXT:    pmuludq %xmm4, %xmm5
986 ; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
987 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,1,3]
988 ; SSE41-NEXT:    movdqa %xmm0, %xmm5
989 ; SSE41-NEXT:    psubd %xmm3, %xmm5
990 ; SSE41-NEXT:    psrld $1, %xmm5
991 ; SSE41-NEXT:    paddd %xmm3, %xmm5
992 ; SSE41-NEXT:    psrld $2, %xmm5
993 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7]
994 ; SSE41-NEXT:    pmulld %xmm3, %xmm5
995 ; SSE41-NEXT:    psubd %xmm5, %xmm0
996 ; SSE41-NEXT:    pmuludq %xmm1, %xmm2
997 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,0,3,0]
998 ; SSE41-NEXT:    pmuludq %xmm4, %xmm5
999 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm5[1,3]
1000 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
1001 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
1002 ; SSE41-NEXT:    psubd %xmm2, %xmm4
1003 ; SSE41-NEXT:    psrld $1, %xmm4
1004 ; SSE41-NEXT:    paddd %xmm2, %xmm4
1005 ; SSE41-NEXT:    psrld $2, %xmm4
1006 ; SSE41-NEXT:    pmulld %xmm3, %xmm4
1007 ; SSE41-NEXT:    psubd %xmm4, %xmm1
1008 ; SSE41-NEXT:    retq
1009 ;
1010 ; SSE-LABEL: test10:
1011 ; SSE:       # BB#0:
1012 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [613566757,613566757,613566757,613566757]
1013 ; SSE-NEXT:    movdqa %xmm0, %xmm3
1014 ; SSE-NEXT:    pmuludq %xmm2, %xmm3
1015 ; SSE-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,0]
1016 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,0,3,0]
1017 ; SSE-NEXT:    pmuludq %xmm4, %xmm5
1018 ; SSE-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
1019 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,1,3]
1020 ; SSE-NEXT:    movdqa %xmm0, %xmm5
1021 ; SSE-NEXT:    psubd %xmm3, %xmm5
1022 ; SSE-NEXT:    psrld $1, %xmm5
1023 ; SSE-NEXT:    paddd %xmm3, %xmm5
1024 ; SSE-NEXT:    psrld $2, %xmm5
1025 ; SSE-NEXT:    movdqa {{.*#+}} xmm3 = [7,7,7,7]
1026 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,0,3,0]
1027 ; SSE-NEXT:    pmuludq %xmm3, %xmm5
1028 ; SSE-NEXT:    pmuludq %xmm3, %xmm6
1029 ; SSE-NEXT:    shufps {{.*#+}} xmm5 = xmm5[0,2],xmm6[0,2]
1030 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,2,1,3]
1031 ; SSE-NEXT:    psubd %xmm5, %xmm0
1032 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
1033 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm1[1,0,3,0]
1034 ; SSE-NEXT:    pmuludq %xmm4, %xmm5
1035 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm5[1,3]
1036 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
1037 ; SSE-NEXT:    movdqa %xmm1, %xmm4
1038 ; SSE-NEXT:    psubd %xmm2, %xmm4
1039 ; SSE-NEXT:    psrld $1, %xmm4
1040 ; SSE-NEXT:    paddd %xmm2, %xmm4
1041 ; SSE-NEXT:    psrld $2, %xmm4
1042 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,0,3,0]
1043 ; SSE-NEXT:    pmuludq %xmm3, %xmm4
1044 ; SSE-NEXT:    pmuludq %xmm3, %xmm2
1045 ; SSE-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,2],xmm2[0,2]
1046 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,2,1,3]
1047 ; SSE-NEXT:    psubd %xmm2, %xmm1
1048 ; SSE-NEXT:    retq
1049 ;
1050 ; AVX-LABEL: test10:
1051 ; AVX:       # BB#0:
1052 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
1053 ; AVX-NEXT:    vpalignr {{.*#+}} ymm2 = ymm1[4,5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3],ymm1[20,21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19]
1054 ; AVX-NEXT:    vpalignr {{.*#+}} ymm3 = ymm0[4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,20,21,22,23,24,25,26,27,28,29,30,31,16,17,18,19]
1055 ; AVX-NEXT:    vpmuludq %ymm2, %ymm3, %ymm2
1056 ; AVX-NEXT:    vpmuludq %ymm1, %ymm0, %ymm1
1057 ; AVX-NEXT:    vpalignr {{.*#+}} ymm1 = ymm1[4,5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3],ymm1[20,21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19]
1058 ; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
1059 ; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm2
1060 ; AVX-NEXT:    vpsrld $1, %ymm2, %ymm2
1061 ; AVX-NEXT:    vpaddd %ymm1, %ymm2, %ymm1
1062 ; AVX-NEXT:    vpsrld $2, %ymm1, %ymm1
1063 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
1064 ; AVX-NEXT:    vpmulld %ymm2, %ymm1, %ymm1
1065 ; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1066 ; AVX-NEXT:    retq
1067   %rem = urem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
1068   ret <8 x i32> %rem
1069 }
1070
1071 define <8 x i32> @test11(<8 x i32> %a) {
1072 ; SSE41-LABEL: test11:
1073 ; SSE41:       # BB#0:
1074 ; SSE41-NEXT:    movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]
1075 ; SSE41-NEXT:    movdqa %xmm0, %xmm3
1076 ; SSE41-NEXT:    pmuldq %xmm2, %xmm3
1077 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[1,0,3,0]
1078 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[1,0,3,0]
1079 ; SSE41-NEXT:    pmuldq %xmm4, %xmm5
1080 ; SSE41-NEXT:    shufps {{.*#+}} xmm3 = xmm3[1,3],xmm5[1,3]
1081 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,2,1,3]
1082 ; SSE41-NEXT:    paddd %xmm0, %xmm3
1083 ; SSE41-NEXT:    movdqa %xmm3, %xmm5
1084 ; SSE41-NEXT:    psrld $31, %xmm5
1085 ; SSE41-NEXT:    psrad $2, %xmm3
1086 ; SSE41-NEXT:    paddd %xmm5, %xmm3
1087 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [7,7,7,7]
1088 ; SSE41-NEXT:    pmulld %xmm5, %xmm3
1089 ; SSE41-NEXT:    psubd %xmm3, %xmm0
1090 ; SSE41-NEXT:    pmuldq %xmm1, %xmm2
1091 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,0,3,0]
1092 ; SSE41-NEXT:    pmuldq %xmm4, %xmm3
1093 ; SSE41-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
1094 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
1095 ; SSE41-NEXT:    paddd %xmm1, %xmm2
1096 ; SSE41-NEXT:    movdqa %xmm2, %xmm3
1097 ; SSE41-NEXT:    psrld $31, %xmm3
1098 ; SSE41-NEXT:    psrad $2, %xmm2
1099 ; SSE41-NEXT:    paddd %xmm3, %xmm2
1100 ; SSE41-NEXT:    pmulld %xmm5, %xmm2
1101 ; SSE41-NEXT:    psubd %xmm2, %xmm1
1102 ; SSE41-NEXT:    retq
1103 ;
1104 ; SSE-LABEL: test11:
1105 ; SSE:       # BB#0:
1106 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027]
1107 ; SSE-NEXT:    movdqa %xmm2, %xmm3
1108 ; SSE-NEXT:    psrad $31, %xmm3
1109 ; SSE-NEXT:    movdqa %xmm3, %xmm4
1110 ; SSE-NEXT:    pand %xmm0, %xmm4
1111 ; SSE-NEXT:    movdqa %xmm0, %xmm6
1112 ; SSE-NEXT:    psrad $31, %xmm6
1113 ; SSE-NEXT:    pand %xmm2, %xmm6
1114 ; SSE-NEXT:    paddd %xmm4, %xmm6
1115 ; SSE-NEXT:    movdqa %xmm0, %xmm4
1116 ; SSE-NEXT:    pmuludq %xmm2, %xmm4
1117 ; SSE-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,0,3,0]
1118 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm0[1,0,3,0]
1119 ; SSE-NEXT:    pmuludq %xmm5, %xmm7
1120 ; SSE-NEXT:    shufps {{.*#+}} xmm4 = xmm4[1,3],xmm7[1,3]
1121 ; SSE-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,2,1,3]
1122 ; SSE-NEXT:    psubd %xmm6, %xmm7
1123 ; SSE-NEXT:    paddd %xmm0, %xmm7
1124 ; SSE-NEXT:    movdqa %xmm7, %xmm4
1125 ; SSE-NEXT:    psrld $31, %xmm4
1126 ; SSE-NEXT:    psrad $2, %xmm7
1127 ; SSE-NEXT:    paddd %xmm4, %xmm7
1128 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [7,7,7,7]
1129 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,0,3,0]
1130 ; SSE-NEXT:    pmuludq %xmm4, %xmm7
1131 ; SSE-NEXT:    pmuludq %xmm4, %xmm6
1132 ; SSE-NEXT:    shufps {{.*#+}} xmm7 = xmm7[0,2],xmm6[0,2]
1133 ; SSE-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[0,2,1,3]
1134 ; SSE-NEXT:    psubd %xmm6, %xmm0
1135 ; SSE-NEXT:    pand %xmm1, %xmm3
1136 ; SSE-NEXT:    movdqa %xmm1, %xmm6
1137 ; SSE-NEXT:    psrad $31, %xmm6
1138 ; SSE-NEXT:    pand %xmm2, %xmm6
1139 ; SSE-NEXT:    paddd %xmm3, %xmm6
1140 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
1141 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,0,3,0]
1142 ; SSE-NEXT:    pmuludq %xmm5, %xmm3
1143 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[1,3],xmm3[1,3]
1144 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
1145 ; SSE-NEXT:    psubd %xmm6, %xmm2
1146 ; SSE-NEXT:    paddd %xmm1, %xmm2
1147 ; SSE-NEXT:    movdqa %xmm2, %xmm3
1148 ; SSE-NEXT:    psrld $31, %xmm3
1149 ; SSE-NEXT:    psrad $2, %xmm2
1150 ; SSE-NEXT:    paddd %xmm3, %xmm2
1151 ; SSE-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,0,3,0]
1152 ; SSE-NEXT:    pmuludq %xmm4, %xmm2
1153 ; SSE-NEXT:    pmuludq %xmm4, %xmm3
1154 ; SSE-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2]
1155 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,1,3]
1156 ; SSE-NEXT:    psubd %xmm2, %xmm1
1157 ; SSE-NEXT:    retq
1158 ;
1159 ; AVX-LABEL: test11:
1160 ; AVX:       # BB#0:
1161 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm1
1162 ; AVX-NEXT:    vpalignr {{.*#+}} ymm2 = ymm1[4,5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3],ymm1[20,21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19]
1163 ; AVX-NEXT:    vpalignr {{.*#+}} ymm3 = ymm0[4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,20,21,22,23,24,25,26,27,28,29,30,31,16,17,18,19]
1164 ; AVX-NEXT:    vpmuldq %ymm2, %ymm3, %ymm2
1165 ; AVX-NEXT:    vpmuldq %ymm1, %ymm0, %ymm1
1166 ; AVX-NEXT:    vpalignr {{.*#+}} ymm1 = ymm1[4,5,6,7,8,9,10,11,12,13,14,15],ymm0[0,1,2,3],ymm1[20,21,22,23,24,25,26,27,28,29,30,31],ymm0[16,17,18,19]
1167 ; AVX-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0],ymm2[1],ymm1[2],ymm2[3],ymm1[4],ymm2[5],ymm1[6],ymm2[7]
1168 ; AVX-NEXT:    vpaddd %ymm0, %ymm1, %ymm1
1169 ; AVX-NEXT:    vpsrld $31, %ymm1, %ymm2
1170 ; AVX-NEXT:    vpsrad $2, %ymm1, %ymm1
1171 ; AVX-NEXT:    vpaddd %ymm2, %ymm1, %ymm1
1172 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %ymm2
1173 ; AVX-NEXT:    vpmulld %ymm2, %ymm1, %ymm1
1174 ; AVX-NEXT:    vpsubd %ymm1, %ymm0, %ymm0
1175 ; AVX-NEXT:    retq
1176   %rem = srem <8 x i32> %a, <i32 7, i32 7, i32 7, i32 7,i32 7, i32 7, i32 7, i32 7>
1177   ret <8 x i32> %rem
1178 }
1179
1180 define <2 x i16> @test12() {
1181 ; SSE41-LABEL: test12:
1182 ; SSE41:       # BB#0:
1183 ; SSE41-NEXT:    xorps %xmm0, %xmm0
1184 ; SSE41-NEXT:    retq
1185 ;
1186 ; SSE-LABEL: test12:
1187 ; SSE:       # BB#0:
1188 ; SSE-NEXT:    xorps %xmm0, %xmm0
1189 ; SSE-NEXT:    retq
1190 ;
1191 ; AVX-LABEL: test12:
1192 ; AVX:       # BB#0:
1193 ; AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1194 ; AVX-NEXT:    retq
1195   %I8 = insertelement <2 x i16> zeroinitializer, i16 -1, i32 0
1196   %I9 = insertelement <2 x i16> %I8, i16 -1, i32 1
1197   %B9 = urem <2 x i16> %I9, %I9
1198   ret <2 x i16> %B9
1199 }
1200
1201 define <4 x i32> @PR20355(<4 x i32> %a) {
1202 ; SSE41-LABEL: PR20355:
1203 ; SSE41:       # BB#0: # %entry
1204 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [1431655766,1431655766,1431655766,1431655766]
1205 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,0,3,0]
1206 ; SSE41-NEXT:    pmuldq %xmm1, %xmm0
1207 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
1208 ; SSE41-NEXT:    pmuldq %xmm2, %xmm1
1209 ; SSE41-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
1210 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,2,1,3]
1211 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
1212 ; SSE41-NEXT:    psrld $31, %xmm0
1213 ; SSE41-NEXT:    paddd %xmm1, %xmm0
1214 ; SSE41-NEXT:    retq
1215 ;
1216 ; SSE-LABEL: PR20355:
1217 ; SSE:       # BB#0: # %entry
1218 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1431655766,1431655766,1431655766,1431655766]
1219 ; SSE-NEXT:    movdqa %xmm1, %xmm2
1220 ; SSE-NEXT:    psrad $31, %xmm2
1221 ; SSE-NEXT:    pand %xmm0, %xmm2
1222 ; SSE-NEXT:    movdqa %xmm0, %xmm3
1223 ; SSE-NEXT:    psrad $31, %xmm3
1224 ; SSE-NEXT:    pand %xmm1, %xmm3
1225 ; SSE-NEXT:    paddd %xmm2, %xmm3
1226 ; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,0,3,0]
1227 ; SSE-NEXT:    pmuludq %xmm1, %xmm0
1228 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
1229 ; SSE-NEXT:    pmuludq %xmm2, %xmm1
1230 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3],xmm1[1,3]
1231 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,2,1,3]
1232 ; SSE-NEXT:    psubd %xmm3, %xmm1
1233 ; SSE-NEXT:    movdqa %xmm1, %xmm0
1234 ; SSE-NEXT:    psrld $31, %xmm0
1235 ; SSE-NEXT:    paddd %xmm1, %xmm0
1236 ; SSE-NEXT:    retq
1237 ;
1238 ; AVX-LABEL: PR20355:
1239 ; AVX:       # BB#0: # %entry
1240 ; AVX-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
1241 ; AVX-NEXT:    vpmuldq %xmm1, %xmm0, %xmm2
1242 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,0,3,0]
1243 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,0,3,0]
1244 ; AVX-NEXT:    vpmuldq %xmm1, %xmm0, %xmm0
1245 ; AVX-NEXT:    vshufps {{.*#+}} xmm0 = xmm2[1,3],xmm0[1,3]
1246 ; AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
1247 ; AVX-NEXT:    vpsrld $31, %xmm0, %xmm1
1248 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
1249 ; AVX-NEXT:    retq
1250 entry:
1251   %sdiv = sdiv <4 x i32> %a, <i32 3, i32 3, i32 3, i32 3>
1252   ret <4 x i32> %sdiv
1253 }