@@ -382,3 +382,32 @@ define <4 x i32> @combine_vec_ashr_positive_splat(<4 x i32> %x, <4 x i32> %y) {
382
382
%2 = ashr <4 x i32 > %1 , <i32 10 , i32 10 , i32 10 , i32 10 >
383
383
ret <4 x i32 > %2
384
384
}
385
+
386
+ define <4 x i32 > @combine_vec_ashr_out_of_bound (<4 x i32 > %x , <4 x i32 > %y ) {
387
+ ; SSE-LABEL: combine_vec_ashr_out_of_bound:
388
+ ; SSE: # %bb.0:
389
+ ; SSE-NEXT: pshuflw {{.*#+}} xmm2 = xmm1[2,3,3,3,4,5,6,7]
390
+ ; SSE-NEXT: movdqa %xmm0, %xmm3
391
+ ; SSE-NEXT: psrad %xmm2, %xmm3
392
+ ; SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
393
+ ; SSE-NEXT: pshuflw {{.*#+}} xmm4 = xmm2[2,3,3,3,4,5,6,7]
394
+ ; SSE-NEXT: movdqa %xmm0, %xmm5
395
+ ; SSE-NEXT: psrad %xmm4, %xmm5
396
+ ; SSE-NEXT: pblendw {{.*#+}} xmm5 = xmm3[0,1,2,3],xmm5[4,5,6,7]
397
+ ; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,1,1,1,4,5,6,7]
398
+ ; SSE-NEXT: movdqa %xmm0, %xmm3
399
+ ; SSE-NEXT: psrad %xmm1, %xmm3
400
+ ; SSE-NEXT: pshuflw {{.*#+}} xmm1 = xmm2[0,1,1,1,4,5,6,7]
401
+ ; SSE-NEXT: psrad %xmm1, %xmm0
402
+ ; SSE-NEXT: pblendw {{.*#+}} xmm0 = xmm3[0,1,2,3],xmm0[4,5,6,7]
403
+ ; SSE-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm5[2,3],xmm0[4,5],xmm5[6,7]
404
+ ; SSE-NEXT: retq
405
+ ;
406
+ ; AVX-LABEL: combine_vec_ashr_out_of_bound:
407
+ ; AVX: # %bb.0:
408
+ ; AVX-NEXT: vpsravd %xmm1, %xmm0, %xmm0
409
+ ; AVX-NEXT: retq
410
+ %1 = tail call <4 x i32 > @llvm.umin.v4i32 (<4 x i32 > %y , <4 x i32 > <i32 31 , i32 31 , i32 31 , i32 31 >)
411
+ %2 = ashr <4 x i32 > %x , %1
412
+ ret <4 x i32 > %2
413
+ }
0 commit comments