1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse2 < %s | FileCheck %s --check-prefix=SSE2 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx < %s | FileCheck %s --check-prefix=AVX 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test1(<8 x i16> %A, <8 x i16> %B) { 6*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test1: 7*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 8*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd %xmm1, %eax 9*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movzwl %ax, %eax 10*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd %eax, %xmm1 11*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: psllw %xmm1, %xmm0 12*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 13*9880d681SAndroid Build Coastguard Worker; 14*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test1: 15*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 16*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 17*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7] 18*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsllw %xmm1, %xmm0, %xmm0 19*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %vecinit14 = shufflevector <8 x i16> %B, <8 x i16> undef, <8 x i32> zeroinitializer 22*9880d681SAndroid Build Coastguard Worker %shl = shl <8 x i16> %A, %vecinit14 23*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %shl 24*9880d681SAndroid Build Coastguard Worker} 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) { 27*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test2: 28*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 29*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: xorps %xmm2, %xmm2 30*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 31*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pslld %xmm2, %xmm0 32*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 33*9880d681SAndroid Build Coastguard Worker; 34*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test2: 35*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 36*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 37*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 38*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpslld %xmm1, %xmm0, %xmm0 39*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 40*9880d681SAndroid Build Coastguard Workerentry: 41*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x i32> %B, <4 x i32> undef, <4 x i32> zeroinitializer 42*9880d681SAndroid Build Coastguard Worker %shl = shl <4 x i32> %A, %vecinit6 43*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %shl 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test3(<2 x i64> %A, <2 x i64> %B) { 47*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test3: 48*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 49*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: psllq %xmm1, %xmm0 50*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 51*9880d681SAndroid Build Coastguard Worker; 52*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test3: 53*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 54*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsllq %xmm1, %xmm0, %xmm0 55*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 56*9880d681SAndroid Build Coastguard Workerentry: 57*9880d681SAndroid Build Coastguard Worker %vecinit2 = shufflevector <2 x i64> %B, <2 x i64> undef, <2 x i32> zeroinitializer 58*9880d681SAndroid Build Coastguard Worker %shl = shl <2 x i64> %A, %vecinit2 59*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %shl 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test4(<8 x i16> %A, <8 x i16> %B) { 63*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test4: 64*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 65*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd %xmm1, %eax 66*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movzwl %ax, %eax 67*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd %eax, %xmm1 68*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: psrlw %xmm1, %xmm0 69*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 70*9880d681SAndroid Build Coastguard Worker; 71*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test4: 72*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 73*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 74*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7] 75*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrlw %xmm1, %xmm0, %xmm0 76*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 77*9880d681SAndroid Build Coastguard Workerentry: 78*9880d681SAndroid Build Coastguard Worker %vecinit14 = shufflevector <8 x i16> %B, <8 x i16> undef, <8 x i32> zeroinitializer 79*9880d681SAndroid Build Coastguard Worker %shr = lshr <8 x i16> %A, %vecinit14 80*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %shr 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5(<4 x i32> %A, <4 x i32> %B) { 84*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test5: 85*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 86*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: xorps %xmm2, %xmm2 87*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 88*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: psrld %xmm2, %xmm0 89*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 90*9880d681SAndroid Build Coastguard Worker; 91*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test5: 92*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 93*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 94*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 95*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrld %xmm1, %xmm0, %xmm0 96*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 97*9880d681SAndroid Build Coastguard Workerentry: 98*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x i32> %B, <4 x i32> undef, <4 x i32> zeroinitializer 99*9880d681SAndroid Build Coastguard Worker %shr = lshr <4 x i32> %A, %vecinit6 100*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %shr 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test6(<2 x i64> %A, <2 x i64> %B) { 104*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test6: 105*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 106*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: psrlq %xmm1, %xmm0 107*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 108*9880d681SAndroid Build Coastguard Worker; 109*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test6: 110*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 111*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrlq %xmm1, %xmm0, %xmm0 112*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 113*9880d681SAndroid Build Coastguard Workerentry: 114*9880d681SAndroid Build Coastguard Worker %vecinit2 = shufflevector <2 x i64> %B, <2 x i64> undef, <2 x i32> zeroinitializer 115*9880d681SAndroid Build Coastguard Worker %shr = lshr <2 x i64> %A, %vecinit2 116*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %shr 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) { 120*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test7: 121*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 122*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd %xmm1, %eax 123*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movzwl %ax, %eax 124*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd %eax, %xmm1 125*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: psraw %xmm1, %xmm0 126*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 127*9880d681SAndroid Build Coastguard Worker; 128*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test7: 129*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 130*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 131*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3,4,5,6,7] 132*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsraw %xmm1, %xmm0, %xmm0 133*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 134*9880d681SAndroid Build Coastguard Workerentry: 135*9880d681SAndroid Build Coastguard Worker %vecinit14 = shufflevector <8 x i16> %B, <8 x i16> undef, <8 x i32> zeroinitializer 136*9880d681SAndroid Build Coastguard Worker %shr = ashr <8 x i16> %A, %vecinit14 137*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %shr 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test8(<4 x i32> %A, <4 x i32> %B) { 141*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: test8: 142*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 143*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: xorps %xmm2, %xmm2 144*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 145*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: psrad %xmm2, %xmm0 146*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 147*9880d681SAndroid Build Coastguard Worker; 148*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: test8: 149*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 150*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 151*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 152*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrad %xmm1, %xmm0, %xmm0 153*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 154*9880d681SAndroid Build Coastguard Workerentry: 155*9880d681SAndroid Build Coastguard Worker %vecinit6 = shufflevector <4 x i32> %B, <4 x i32> undef, <4 x i32> zeroinitializer 156*9880d681SAndroid Build Coastguard Worker %shr = ashr <4 x i32> %A, %vecinit6 157*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %shr 158*9880d681SAndroid Build Coastguard Worker} 159