@@ -237,5 +237,69 @@ define <4 x i32> @knownbits_mask_sub_shuffle_lshr(<4 x i32> %a0) nounwind {
237
237
%3 = shufflevector <4 x i32 > %2 , <4 x i32 > undef , <4 x i32 > <i32 0 , i32 0 , i32 3 , i32 3 >
238
238
%4 = lshr <4 x i32 > %3 , <i32 22 , i32 22 , i32 22 , i32 22 >
239
239
ret <4 x i32 > %4
240
+ }
240
241
242
+ define <4 x i32 > @knownbits_mask_udiv_shuffle_lshr (<4 x i32 > %a0 , <4 x i32 > %a1 ) nounwind {
243
+ ; X32-LABEL: knownbits_mask_udiv_shuffle_lshr:
244
+ ; X32: # BB#0:
245
+ ; X32-NEXT: pushl %esi
246
+ ; X32-NEXT: vpand {{\.LCPI.*}}, %xmm0, %xmm0
247
+ ; X32-NEXT: vpextrd $1, %xmm1, %ecx
248
+ ; X32-NEXT: vpextrd $1, %xmm0, %eax
249
+ ; X32-NEXT: xorl %edx, %edx
250
+ ; X32-NEXT: divl %ecx
251
+ ; X32-NEXT: movl %eax, %ecx
252
+ ; X32-NEXT: vmovd %xmm1, %esi
253
+ ; X32-NEXT: vmovd %xmm0, %eax
254
+ ; X32-NEXT: xorl %edx, %edx
255
+ ; X32-NEXT: divl %esi
256
+ ; X32-NEXT: vmovd %eax, %xmm2
257
+ ; X32-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2
258
+ ; X32-NEXT: vpextrd $2, %xmm1, %ecx
259
+ ; X32-NEXT: vpextrd $2, %xmm0, %eax
260
+ ; X32-NEXT: xorl %edx, %edx
261
+ ; X32-NEXT: divl %ecx
262
+ ; X32-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
263
+ ; X32-NEXT: vpextrd $3, %xmm1, %ecx
264
+ ; X32-NEXT: vpextrd $3, %xmm0, %eax
265
+ ; X32-NEXT: xorl %edx, %edx
266
+ ; X32-NEXT: divl %ecx
267
+ ; X32-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
268
+ ; X32-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,3,3]
269
+ ; X32-NEXT: vpsrld $22, %xmm0, %xmm0
270
+ ; X32-NEXT: popl %esi
271
+ ; X32-NEXT: retl
272
+ ;
273
+ ; X64-LABEL: knownbits_mask_udiv_shuffle_lshr:
274
+ ; X64: # BB#0:
275
+ ; X64-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
276
+ ; X64-NEXT: vpextrd $1, %xmm1, %ecx
277
+ ; X64-NEXT: vpextrd $1, %xmm0, %eax
278
+ ; X64-NEXT: xorl %edx, %edx
279
+ ; X64-NEXT: divl %ecx
280
+ ; X64-NEXT: movl %eax, %ecx
281
+ ; X64-NEXT: vmovd %xmm1, %esi
282
+ ; X64-NEXT: vmovd %xmm0, %eax
283
+ ; X64-NEXT: xorl %edx, %edx
284
+ ; X64-NEXT: divl %esi
285
+ ; X64-NEXT: vmovd %eax, %xmm2
286
+ ; X64-NEXT: vpinsrd $1, %ecx, %xmm2, %xmm2
287
+ ; X64-NEXT: vpextrd $2, %xmm1, %ecx
288
+ ; X64-NEXT: vpextrd $2, %xmm0, %eax
289
+ ; X64-NEXT: xorl %edx, %edx
290
+ ; X64-NEXT: divl %ecx
291
+ ; X64-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
292
+ ; X64-NEXT: vpextrd $3, %xmm1, %ecx
293
+ ; X64-NEXT: vpextrd $3, %xmm0, %eax
294
+ ; X64-NEXT: xorl %edx, %edx
295
+ ; X64-NEXT: divl %ecx
296
+ ; X64-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
297
+ ; X64-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,3,3]
298
+ ; X64-NEXT: vpsrld $22, %xmm0, %xmm0
299
+ ; X64-NEXT: retq
300
+ %1 = and <4 x i32 > %a0 , <i32 32767 , i32 -1 , i32 -1 , i32 32767 >
301
+ %2 = udiv <4 x i32 > %1 , %a1
302
+ %3 = shufflevector <4 x i32 > %2 , <4 x i32 > undef , <4 x i32 > <i32 0 , i32 0 , i32 3 , i32 3 >
303
+ %4 = lshr <4 x i32 > %3 , <i32 22 , i32 22 , i32 22 , i32 22 >
304
+ ret <4 x i32 > %4
241
305
}
0 commit comments