1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X32 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X64 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Verify that we correctly fold target specific packed vector shifts by 6*9880d681SAndroid Build Coastguard Worker; immediate count into a simple build_vector when the elements of the vector 7*9880d681SAndroid Build Coastguard Worker; in input to the packed shift are all constants or undef. 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test1() { 10*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test1: 11*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 12*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = [8,16,32,64,8,16,32,64] 13*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 14*9880d681SAndroid Build Coastguard Worker; 15*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test1: 16*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 17*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = [8,16,32,64,8,16,32,64] 18*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 19*9880d681SAndroid Build Coastguard Worker %1 = tail call <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16> <i16 1, i16 2, i16 4, i16 8, i16 1, i16 2, i16 4, i16 8>, i32 3) 20*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test2() { 24*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test2: 25*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 26*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = [0,1,2,4,0,1,2,4] 27*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 28*9880d681SAndroid Build Coastguard Worker; 29*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test2: 30*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 31*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = [0,1,2,4,0,1,2,4] 32*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 33*9880d681SAndroid Build Coastguard Worker %1 = tail call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> <i16 4, i16 8, i16 16, i16 32, i16 4, i16 8, i16 16, i16 32>, i32 3) 34*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test3() { 38*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test3: 39*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 40*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = [0,1,2,4,0,1,2,4] 41*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 42*9880d681SAndroid Build Coastguard Worker; 43*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test3: 44*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 45*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = [0,1,2,4,0,1,2,4] 46*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 47*9880d681SAndroid Build Coastguard Worker %1 = tail call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> <i16 4, i16 8, i16 16, i16 32, i16 4, i16 8, i16 16, i16 32>, i32 3) 48*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test4() { 52*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test4: 53*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 54*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = [8,16,32,64] 55*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 56*9880d681SAndroid Build Coastguard Worker; 57*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test4: 58*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 59*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = [8,16,32,64] 60*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 61*9880d681SAndroid Build Coastguard Worker %1 = tail call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> <i32 1, i32 2, i32 4, i32 8>, i32 3) 62*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5() { 66*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test5: 67*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 68*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = [0,1,2,4] 69*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 70*9880d681SAndroid Build Coastguard Worker; 71*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test5: 72*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 73*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = [0,1,2,4] 74*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 75*9880d681SAndroid Build Coastguard Worker %1 = tail call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> <i32 4, i32 8, i32 16, i32 32>, i32 3) 76*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test6() { 80*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test6: 81*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 82*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = [0,1,2,4] 83*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 84*9880d681SAndroid Build Coastguard Worker; 85*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test6: 86*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 87*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = [0,1,2,4] 88*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 89*9880d681SAndroid Build Coastguard Worker %1 = tail call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> <i32 4, i32 8, i32 16, i32 32>, i32 3) 90*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test7() { 94*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test7: 95*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 96*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movdqa {{.*#+}} xmm0 = [1,0,2,0] 97*9880d681SAndroid Build Coastguard Worker; X32-NEXT: psllq $3, %xmm0 98*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 99*9880d681SAndroid Build Coastguard Worker; 100*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test7: 101*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 102*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = [8,16] 103*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 104*9880d681SAndroid Build Coastguard Worker %1 = tail call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> <i64 1, i64 2>, i32 3) 105*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test8() { 109*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test8: 110*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 111*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movdqa {{.*#+}} xmm0 = [8,0,16,0] 112*9880d681SAndroid Build Coastguard Worker; X32-NEXT: psrlq $3, %xmm0 113*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 114*9880d681SAndroid Build Coastguard Worker; 115*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test8: 116*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 117*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = [1,2] 118*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 119*9880d681SAndroid Build Coastguard Worker %1 = tail call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> <i64 8, i64 16>, i32 3) 120*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test9() { 124*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test9: 125*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 126*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = <1,1,u,u,3,u,8,16> 127*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 128*9880d681SAndroid Build Coastguard Worker; 129*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test9: 130*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 131*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = <1,1,u,u,3,u,8,16> 132*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 133*9880d681SAndroid Build Coastguard Worker %1 = tail call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> <i16 15, i16 8, i16 undef, i16 undef, i16 31, i16 undef, i16 64, i16 128>, i32 3) 134*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test10() { 138*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test10: 139*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 140*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = <u,1,u,4> 141*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 142*9880d681SAndroid Build Coastguard Worker; 143*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test10: 144*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 145*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = <u,1,u,4> 146*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 147*9880d681SAndroid Build Coastguard Worker %1 = tail call <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32> <i32 undef, i32 8, i32 undef, i32 32>, i32 3) 148*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test11() { 152*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test11: 153*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 154*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movdqa {{.*#+}} xmm0 = <u,u,31,0> 155*9880d681SAndroid Build Coastguard Worker; X32-NEXT: psrlq $3, %xmm0 156*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 157*9880d681SAndroid Build Coastguard Worker; 158*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test11: 159*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 160*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = <u,3> 161*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 162*9880d681SAndroid Build Coastguard Worker %1 = tail call <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64> <i64 undef, i64 31>, i32 3) 163*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test12() { 167*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test12: 168*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 169*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = <1,1,u,u,3,u,8,16> 170*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 171*9880d681SAndroid Build Coastguard Worker; 172*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test12: 173*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 174*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = <1,1,u,u,3,u,8,16> 175*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 176*9880d681SAndroid Build Coastguard Worker %1 = tail call <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16> <i16 15, i16 8, i16 undef, i16 undef, i16 31, i16 undef, i16 64, i16 128>, i32 3) 177*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test13() { 181*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test13: 182*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 183*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = <u,1,u,4> 184*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 185*9880d681SAndroid Build Coastguard Worker; 186*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test13: 187*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 188*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = <u,1,u,4> 189*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 190*9880d681SAndroid Build Coastguard Worker %1 = tail call <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32> <i32 undef, i32 8, i32 undef, i32 32>, i32 3) 191*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 192*9880d681SAndroid Build Coastguard Worker} 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test14() { 195*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test14: 196*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 197*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = <1,1,u,u,3,u,8,16> 198*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 199*9880d681SAndroid Build Coastguard Worker; 200*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test14: 201*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 202*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = <1,1,u,u,3,u,8,16> 203*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 204*9880d681SAndroid Build Coastguard Worker %1 = tail call <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16> <i16 15, i16 8, i16 undef, i16 undef, i16 31, i16 undef, i16 64, i16 128>, i32 3) 205*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test15() { 209*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test15: 210*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 211*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movaps {{.*#+}} xmm0 = <u,64,u,256> 212*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 213*9880d681SAndroid Build Coastguard Worker; 214*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test15: 215*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 216*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = <u,64,u,256> 217*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 218*9880d681SAndroid Build Coastguard Worker %1 = tail call <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32> <i32 undef, i32 8, i32 undef, i32 32>, i32 3) 219*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test16() { 223*9880d681SAndroid Build Coastguard Worker; X32-LABEL: test16: 224*9880d681SAndroid Build Coastguard Worker; X32: # BB#0: 225*9880d681SAndroid Build Coastguard Worker; X32-NEXT: movdqa {{.*#+}} xmm0 = <u,u,31,0> 226*9880d681SAndroid Build Coastguard Worker; X32-NEXT: psllq $3, %xmm0 227*9880d681SAndroid Build Coastguard Worker; X32-NEXT: retl 228*9880d681SAndroid Build Coastguard Worker; 229*9880d681SAndroid Build Coastguard Worker; X64-LABEL: test16: 230*9880d681SAndroid Build Coastguard Worker; X64: # BB#0: 231*9880d681SAndroid Build Coastguard Worker; X64-NEXT: movaps {{.*#+}} xmm0 = <u,248> 232*9880d681SAndroid Build Coastguard Worker; X64-NEXT: retq 233*9880d681SAndroid Build Coastguard Worker %1 = tail call <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64> <i64 undef, i64 31>, i32 3) 234*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 235*9880d681SAndroid Build Coastguard Worker} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.sse2.pslli.w(<8 x i16>, i32) 238*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.sse2.psrli.w(<8 x i16>, i32) 239*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.sse2.psrai.w(<8 x i16>, i32) 240*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.x86.sse2.pslli.d(<4 x i32>, i32) 241*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.x86.sse2.psrli.d(<4 x i32>, i32) 242*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.x86.sse2.psrai.d(<4 x i32>, i32) 243*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.x86.sse2.pslli.q(<2 x i64>, i32) 244*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.x86.sse2.psrli.q(<2 x i64>, i32) 245*9880d681SAndroid Build Coastguard Worker 246