1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -float-abi=soft -mattr=+neon -verify-machineinstrs %s -o - \ 2*9880d681SAndroid Build Coastguard Worker; RUN: | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @v_dup8(i8 %A) nounwind { 5*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup8: 6*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8 7*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <8 x i8> zeroinitializer, i8 %A, i32 0 8*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <8 x i8> %tmp1, i8 %A, i32 1 9*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <8 x i8> %tmp2, i8 %A, i32 2 10*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <8 x i8> %tmp3, i8 %A, i32 3 11*9880d681SAndroid Build Coastguard Worker %tmp5 = insertelement <8 x i8> %tmp4, i8 %A, i32 4 12*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement <8 x i8> %tmp5, i8 %A, i32 5 13*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <8 x i8> %tmp6, i8 %A, i32 6 14*9880d681SAndroid Build Coastguard Worker %tmp8 = insertelement <8 x i8> %tmp7, i8 %A, i32 7 15*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp8 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @v_dup16(i16 %A) nounwind { 19*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup16: 20*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16 21*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x i16> zeroinitializer, i16 %A, i32 0 22*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <4 x i16> %tmp1, i16 %A, i32 1 23*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <4 x i16> %tmp2, i16 %A, i32 2 24*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <4 x i16> %tmp3, i16 %A, i32 3 25*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp4 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @v_dup32(i32 %A) nounwind { 29*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup32: 30*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 31*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <2 x i32> zeroinitializer, i32 %A, i32 0 32*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <2 x i32> %tmp1, i32 %A, i32 1 33*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp2 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @v_dupfloat(float %A) nounwind { 37*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupfloat: 38*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 39*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <2 x float> zeroinitializer, float %A, i32 0 40*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <2 x float> %tmp1, float %A, i32 1 41*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp2 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @v_dupQ8(i8 %A) nounwind { 45*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ8: 46*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8 47*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <16 x i8> zeroinitializer, i8 %A, i32 0 48*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <16 x i8> %tmp1, i8 %A, i32 1 49*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <16 x i8> %tmp2, i8 %A, i32 2 50*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <16 x i8> %tmp3, i8 %A, i32 3 51*9880d681SAndroid Build Coastguard Worker %tmp5 = insertelement <16 x i8> %tmp4, i8 %A, i32 4 52*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement <16 x i8> %tmp5, i8 %A, i32 5 53*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <16 x i8> %tmp6, i8 %A, i32 6 54*9880d681SAndroid Build Coastguard Worker %tmp8 = insertelement <16 x i8> %tmp7, i8 %A, i32 7 55*9880d681SAndroid Build Coastguard Worker %tmp9 = insertelement <16 x i8> %tmp8, i8 %A, i32 8 56*9880d681SAndroid Build Coastguard Worker %tmp10 = insertelement <16 x i8> %tmp9, i8 %A, i32 9 57*9880d681SAndroid Build Coastguard Worker %tmp11 = insertelement <16 x i8> %tmp10, i8 %A, i32 10 58*9880d681SAndroid Build Coastguard Worker %tmp12 = insertelement <16 x i8> %tmp11, i8 %A, i32 11 59*9880d681SAndroid Build Coastguard Worker %tmp13 = insertelement <16 x i8> %tmp12, i8 %A, i32 12 60*9880d681SAndroid Build Coastguard Worker %tmp14 = insertelement <16 x i8> %tmp13, i8 %A, i32 13 61*9880d681SAndroid Build Coastguard Worker %tmp15 = insertelement <16 x i8> %tmp14, i8 %A, i32 14 62*9880d681SAndroid Build Coastguard Worker %tmp16 = insertelement <16 x i8> %tmp15, i8 %A, i32 15 63*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp16 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @v_dupQ16(i16 %A) nounwind { 67*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ16: 68*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16 69*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <8 x i16> zeroinitializer, i16 %A, i32 0 70*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <8 x i16> %tmp1, i16 %A, i32 1 71*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <8 x i16> %tmp2, i16 %A, i32 2 72*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <8 x i16> %tmp3, i16 %A, i32 3 73*9880d681SAndroid Build Coastguard Worker %tmp5 = insertelement <8 x i16> %tmp4, i16 %A, i32 4 74*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement <8 x i16> %tmp5, i16 %A, i32 5 75*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <8 x i16> %tmp6, i16 %A, i32 6 76*9880d681SAndroid Build Coastguard Worker %tmp8 = insertelement <8 x i16> %tmp7, i16 %A, i32 7 77*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp8 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @v_dupQ32(i32 %A) nounwind { 81*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ32: 82*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 83*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %A, i32 0 84*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <4 x i32> %tmp1, i32 %A, i32 1 85*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <4 x i32> %tmp2, i32 %A, i32 2 86*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <4 x i32> %tmp3, i32 %A, i32 3 87*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp4 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @v_dupQfloat(float %A) nounwind { 91*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQfloat: 92*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 93*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x float> zeroinitializer, float %A, i32 0 94*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <4 x float> %tmp1, float %A, i32 1 95*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <4 x float> %tmp2, float %A, i32 2 96*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <4 x float> %tmp3, float %A, i32 3 97*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp4 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; Check to make sure it works with shuffles, too. 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @v_shuffledup8(i8 %A) nounwind { 103*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup8: 104*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8 105*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <8 x i8> undef, i8 %A, i32 0 106*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> zeroinitializer 107*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @v_shuffledup16(i16 %A) nounwind { 111*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup16: 112*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16 113*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x i16> undef, i16 %A, i32 0 114*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> zeroinitializer 115*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp2 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @v_shuffledup32(i32 %A) nounwind { 119*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup32: 120*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 121*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <2 x i32> undef, i32 %A, i32 0 122*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer 123*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp2 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @v_shuffledupfloat(float %A) nounwind { 127*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupfloat: 128*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 129*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <2 x float> undef, float %A, i32 0 130*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer 131*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp2 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @v_shuffledupQ8(i8 %A) nounwind { 135*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ8: 136*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8 137*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <16 x i8> undef, i8 %A, i32 0 138*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> zeroinitializer 139*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp2 140*9880d681SAndroid Build Coastguard Worker} 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @v_shuffledupQ16(i16 %A) nounwind { 143*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ16: 144*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16 145*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <8 x i16> undef, i16 %A, i32 0 146*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> zeroinitializer 147*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp2 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @v_shuffledupQ32(i32 %A) nounwind { 151*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ32: 152*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 153*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x i32> undef, i32 %A, i32 0 154*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> zeroinitializer 155*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp2 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @v_shuffledupQfloat(float %A) nounwind { 159*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQfloat: 160*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 161*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x float> undef, float %A, i32 0 162*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer 163*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp2 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @vduplane8(<8 x i8>* %A) nounwind { 167*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane8: 168*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8 169*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 170*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 > 171*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 172*9880d681SAndroid Build Coastguard Worker} 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vduplane16(<4 x i16>* %A) nounwind { 175*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane16: 176*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16 177*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 178*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 > 179*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp2 180*9880d681SAndroid Build Coastguard Worker} 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vduplane32(<2 x i32>* %A) nounwind { 183*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane32: 184*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 185*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 186*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> < i32 1, i32 1 > 187*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp2 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @vduplanefloat(<2 x float>* %A) nounwind { 191*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplanefloat: 192*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 193*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %A 194*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> < i32 1, i32 1 > 195*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp2 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @vduplaneQ8(<8 x i8>* %A) nounwind { 199*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ8: 200*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8 201*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 202*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <16 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 > 203*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp2 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vduplaneQ16(<4 x i16>* %A) nounwind { 207*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ16: 208*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16 209*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 210*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <8 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 > 211*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp2 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vduplaneQ32(<2 x i32>* %A) nounwind { 215*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ32: 216*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 217*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 218*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 > 219*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp2 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vduplaneQfloat(<2 x float>* %A) nounwind { 223*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQfloat: 224*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 225*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %A 226*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 > 227*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp2 228*9880d681SAndroid Build Coastguard Worker} 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @foo(<2 x i64> %arg0_int64x1_t) nounwind readnone { 231*9880d681SAndroid Build Coastguard Workerentry: 232*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 1, i32 1> 233*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %0 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bar(<2 x i64> %arg0_int64x1_t) nounwind readnone { 237*9880d681SAndroid Build Coastguard Workerentry: 238*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 239*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %0 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @baz(<2 x double> %arg0_int64x1_t) nounwind readnone { 243*9880d681SAndroid Build Coastguard Workerentry: 244*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 1, i32 1> 245*9880d681SAndroid Build Coastguard Worker ret <2 x double> %0 246*9880d681SAndroid Build Coastguard Worker} 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @qux(<2 x double> %arg0_int64x1_t) nounwind readnone { 249*9880d681SAndroid Build Coastguard Workerentry: 250*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 0, i32 0> 251*9880d681SAndroid Build Coastguard Worker ret <2 x double> %0 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker; Radar 7373643 255*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: redundantVdup: 256*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.i8 257*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: vdup.8 258*9880d681SAndroid Build Coastguard Worker;CHECK: vstr 259*9880d681SAndroid Build Coastguard Workerdefine void @redundantVdup(<8 x i8>* %ptr) nounwind { 260*9880d681SAndroid Build Coastguard Worker %1 = insertelement <8 x i8> undef, i8 -128, i32 0 261*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i8> %1, <8 x i8> undef, <8 x i32> zeroinitializer 262*9880d681SAndroid Build Coastguard Worker store <8 x i8> %2, <8 x i8>* %ptr, align 8 263*9880d681SAndroid Build Coastguard Worker ret void 264*9880d681SAndroid Build Coastguard Worker} 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @tdupi(i32 %x, i32 %y) { 267*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: tdupi: 268*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 269*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i32> undef, i32 %x, i32 0 270*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x i32> %1, i32 %x, i32 1 271*9880d681SAndroid Build Coastguard Worker %3 = insertelement <4 x i32> %2, i32 %x, i32 2 272*9880d681SAndroid Build Coastguard Worker %4 = insertelement <4 x i32> %3, i32 %y, i32 3 273*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %4 274*9880d681SAndroid Build Coastguard Worker} 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @tdupf(float %x, float %y) { 277*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: tdupf: 278*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 279*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x float> undef, float %x, i32 0 280*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x float> %1, float %x, i32 1 281*9880d681SAndroid Build Coastguard Worker %3 = insertelement <4 x float> %2, float %x, i32 2 282*9880d681SAndroid Build Coastguard Worker %4 = insertelement <4 x float> %3, float %y, i32 3 283*9880d681SAndroid Build Coastguard Worker ret <4 x float> %4 284*9880d681SAndroid Build Coastguard Worker} 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker; This test checks that when splatting an element from a vector into another, 287*9880d681SAndroid Build Coastguard Worker; the value isn't moved out to GPRs first. 288*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @tduplane(<4 x i32> %invec) { 289*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: tduplane: 290*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: vmov {{.*}}, d16[1] 291*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 {{.*}}, d16[1] 292*9880d681SAndroid Build Coastguard Worker %in = extractelement <4 x i32> %invec, i32 1 293*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i32> undef, i32 %in, i32 0 294*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x i32> %1, i32 %in, i32 1 295*9880d681SAndroid Build Coastguard Worker %3 = insertelement <4 x i32> %2, i32 %in, i32 2 296*9880d681SAndroid Build Coastguard Worker %4 = insertelement <4 x i32> %3, i32 255, i32 3 297*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %4 298*9880d681SAndroid Build Coastguard Worker} 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @check_f32(<4 x float> %v) nounwind { 301*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_f32: 302*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 {{.*}}, d{{..}}[1] 303*9880d681SAndroid Build Coastguard Worker %x = extractelement <4 x float> %v, i32 3 304*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x float> undef, float %x, i32 0 305*9880d681SAndroid Build Coastguard Worker %2 = insertelement <2 x float> %1, float %x, i32 1 306*9880d681SAndroid Build Coastguard Worker ret <2 x float> %2 307*9880d681SAndroid Build Coastguard Worker} 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @check_i32(<4 x i32> %v) nounwind { 310*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_i32: 311*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 {{.*}}, d{{..}}[1] 312*9880d681SAndroid Build Coastguard Worker %x = extractelement <4 x i32> %v, i32 3 313*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i32> undef, i32 %x, i32 0 314*9880d681SAndroid Build Coastguard Worker %2 = insertelement <2 x i32> %1, i32 %x, i32 1 315*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %2 316*9880d681SAndroid Build Coastguard Worker} 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @check_i16(<8 x i16> %v) nounwind { 319*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_i16: 320*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16 {{.*}}, d{{..}}[3] 321*9880d681SAndroid Build Coastguard Worker %x = extractelement <8 x i16> %v, i32 3 322*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i16> undef, i16 %x, i32 0 323*9880d681SAndroid Build Coastguard Worker %2 = insertelement <4 x i16> %1, i16 %x, i32 1 324*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %2 325*9880d681SAndroid Build Coastguard Worker} 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @check_i8(<16 x i8> %v) nounwind { 328*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_i8: 329*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8 {{.*}}, d{{..}}[3] 330*9880d681SAndroid Build Coastguard Worker %x = extractelement <16 x i8> %v, i32 3 331*9880d681SAndroid Build Coastguard Worker %1 = insertelement <8 x i8> undef, i8 %x, i32 0 332*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i8> %1, i8 %x, i32 1 333*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %2 334*9880d681SAndroid Build Coastguard Worker} 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker; Check that an SPR splat produces a vdup. 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @check_spr_splat2(<2 x float> %p, i16 %q) { 339*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_spr_splat2: 340*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 d 341*9880d681SAndroid Build Coastguard Worker %conv = sitofp i16 %q to float 342*9880d681SAndroid Build Coastguard Worker %splat.splatinsert = insertelement <2 x float> undef, float %conv, i32 0 343*9880d681SAndroid Build Coastguard Worker %splat.splat = shufflevector <2 x float> %splat.splatinsert, <2 x float> undef, <2 x i32> zeroinitializer 344*9880d681SAndroid Build Coastguard Worker %sub = fsub <2 x float> %splat.splat, %p 345*9880d681SAndroid Build Coastguard Worker ret <2 x float> %sub 346*9880d681SAndroid Build Coastguard Worker} 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @check_spr_splat4(<4 x float> %p, i16 %q) { 349*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_spr_splat4: 350*9880d681SAndroid Build Coastguard Worker;CHECK: vld1.16 351*9880d681SAndroid Build Coastguard Worker %conv = sitofp i16 %q to float 352*9880d681SAndroid Build Coastguard Worker %splat.splatinsert = insertelement <4 x float> undef, float %conv, i32 0 353*9880d681SAndroid Build Coastguard Worker %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer 354*9880d681SAndroid Build Coastguard Worker %sub = fsub <4 x float> %splat.splat, %p 355*9880d681SAndroid Build Coastguard Worker ret <4 x float> %sub 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker; Same codegen as above test; scalar is splatted using vld1, so shuffle index is irrelevant. 358*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @check_spr_splat4_lane1(<4 x float> %p, i16 %q) { 359*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_spr_splat4_lane1: 360*9880d681SAndroid Build Coastguard Worker;CHECK: vld1.16 361*9880d681SAndroid Build Coastguard Worker %conv = sitofp i16 %q to float 362*9880d681SAndroid Build Coastguard Worker %splat.splatinsert = insertelement <4 x float> undef, float %conv, i32 1 363*9880d681SAndroid Build Coastguard Worker %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 364*9880d681SAndroid Build Coastguard Worker %sub = fsub <4 x float> %splat.splat, %p 365*9880d681SAndroid Build Coastguard Worker ret <4 x float> %sub 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Worker; Also make sure we don't barf on variable-index extractelts, where we almost 369*9880d681SAndroid Build Coastguard Worker; could have generated a vdup. 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @check_i8_varidx(<16 x i8> %v, i32 %idx) { 372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: check_i8_varidx: 373*9880d681SAndroid Build Coastguard Worker; CHECK: mov r[[FP:[0-9]+]], sp 374*9880d681SAndroid Build Coastguard Worker; CHECK: ldr r[[IDX:[0-9]+]], [r[[FP]], #4] 375*9880d681SAndroid Build Coastguard Worker; CHECK: mov r[[SPCOPY:[0-9]+]], sp 376*9880d681SAndroid Build Coastguard Worker; CHECK: vst1.64 {d{{.*}}, d{{.*}}}, [r[[SPCOPY]]:128], r[[IDX]] 377*9880d681SAndroid Build Coastguard Worker; CHECK: vld1.8 {d{{.*}}[]}, [r[[SPCOPY]]] 378*9880d681SAndroid Build Coastguard Worker %x = extractelement <16 x i8> %v, i32 %idx 379*9880d681SAndroid Build Coastguard Worker %1 = insertelement <8 x i8> undef, i8 %x, i32 0 380*9880d681SAndroid Build Coastguard Worker %2 = insertelement <8 x i8> %1, i8 %x, i32 1 381*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %2 382*9880d681SAndroid Build Coastguard Worker} 383