1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -float-abi=soft -mattr=+neon %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-LE 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armeb-eabi -float-abi=soft -mattr=+neon %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-BE 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @vcombine8(<8 x i8>* %A, <8 x i8>* %B) nounwind { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombine8 6*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0] 7*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1] 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: vmov r0, r1, [[LD0]] 10*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: vmov r2, r3, [[LD1]] 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: vmov r1, r0, d16 13*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: vmov r3, r2, d17 14*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 15*9880d681SAndroid Build Coastguard Worker %tmp2 = load <8 x i8>, <8 x i8>* %B 16*9880d681SAndroid Build Coastguard Worker %tmp3 = shufflevector <8 x i8> %tmp1, <8 x i8> %tmp2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 17*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp3 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vcombine16(<4 x i16>* %A, <4 x i16>* %B) nounwind { 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombine16 22*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0] 23*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1] 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: vmov r0, r1, [[LD0]] 26*9880d681SAndroid Build Coastguard Worker; CHECK-LE-DAG: vmov r2, r3, [[LD1]] 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: vmov r1, r0, d16 29*9880d681SAndroid Build Coastguard Worker; CHECK-BE-DAG: vmov r3, r2, d17 30*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 31*9880d681SAndroid Build Coastguard Worker %tmp2 = load <4 x i16>, <4 x i16>* %B 32*9880d681SAndroid Build Coastguard Worker %tmp3 = shufflevector <4 x i16> %tmp1, <4 x i16> %tmp2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> 33*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp3 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vcombine32(<2 x i32>* %A, <2 x i32>* %B) nounwind { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombine32 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0] 40*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1] 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, [[LD0]] 43*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r2, r3, [[LD1]] 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, d16 46*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r3, r2, d17 47*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 48*9880d681SAndroid Build Coastguard Worker %tmp2 = load <2 x i32>, <2 x i32>* %B 49*9880d681SAndroid Build Coastguard Worker %tmp3 = shufflevector <2 x i32> %tmp1, <2 x i32> %tmp2, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 50*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp3 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vcombinefloat(<2 x float>* %A, <2 x float>* %B) nounwind { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombinefloat 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0] 57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1] 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, [[LD0]] 60*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r2, r3, [[LD1]] 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, d16 63*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r3, r2, d17 64*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %A 65*9880d681SAndroid Build Coastguard Worker %tmp2 = load <2 x float>, <2 x float>* %B 66*9880d681SAndroid Build Coastguard Worker %tmp3 = shufflevector <2 x float> %tmp1, <2 x float> %tmp2, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 67*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp3 68*9880d681SAndroid Build Coastguard Worker} 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @vcombine64(<1 x i64>* %A, <1 x i64>* %B) nounwind { 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vcombine64 72*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD0:d[0-9]+]], [r0] 73*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vldr [[LD1:d[0-9]+]], [r1] 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, [[LD0]] 76*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r2, r3, [[LD1]] 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, [[LD0]] 79*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r3, r2, [[LD1]] 80*9880d681SAndroid Build Coastguard Worker %tmp1 = load <1 x i64>, <1 x i64>* %A 81*9880d681SAndroid Build Coastguard Worker %tmp2 = load <1 x i64>, <1 x i64>* %B 82*9880d681SAndroid Build Coastguard Worker %tmp3 = shufflevector <1 x i64> %tmp1, <1 x i64> %tmp2, <2 x i32> <i32 0, i32 1> 83*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %tmp3 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; Check for vget_low and vget_high implemented with shufflevector. PR8411. 87*9880d681SAndroid Build Coastguard Worker; They should not require storing to the stack. 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vget_low16(<8 x i16>* %A) nounwind { 90*9880d681SAndroid Build Coastguard Worker; CHECK: vget_low16 91*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vst 92*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, d16 93*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, d16 94*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i16>, <8 x i16>* %A 95*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 96*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp2 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @vget_high8(<16 x i8>* %A) nounwind { 100*9880d681SAndroid Build Coastguard Worker; CHECK: vget_high8 101*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vst 102*9880d681SAndroid Build Coastguard Worker; CHECK-LE: vmov r0, r1, d17 103*9880d681SAndroid Build Coastguard Worker; CHECK-BE: vmov r1, r0, d16 104*9880d681SAndroid Build Coastguard Worker %tmp1 = load <16 x i8>, <16 x i8>* %A 105*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 106*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 107*9880d681SAndroid Build Coastguard Worker} 108