1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -asm-verbose=false | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @v_dup8(i8 %A) nounwind { 4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup8: 5*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8b 6*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <8 x i8> zeroinitializer, i8 %A, i32 0 7*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <8 x i8> %tmp1, i8 %A, i32 1 8*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <8 x i8> %tmp2, i8 %A, i32 2 9*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <8 x i8> %tmp3, i8 %A, i32 3 10*9880d681SAndroid Build Coastguard Worker %tmp5 = insertelement <8 x i8> %tmp4, i8 %A, i32 4 11*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement <8 x i8> %tmp5, i8 %A, i32 5 12*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <8 x i8> %tmp6, i8 %A, i32 6 13*9880d681SAndroid Build Coastguard Worker %tmp8 = insertelement <8 x i8> %tmp7, i8 %A, i32 7 14*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp8 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @v_dup16(i16 %A) nounwind { 18*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup16: 19*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4h 20*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x i16> zeroinitializer, i16 %A, i32 0 21*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <4 x i16> %tmp1, i16 %A, i32 1 22*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <4 x i16> %tmp2, i16 %A, i32 2 23*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <4 x i16> %tmp3, i16 %A, i32 3 24*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp4 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @v_dup32(i32 %A) nounwind { 28*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup32: 29*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s 30*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <2 x i32> zeroinitializer, i32 %A, i32 0 31*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <2 x i32> %tmp1, i32 %A, i32 1 32*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp2 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @v_dupfloat(float %A) nounwind { 36*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupfloat: 37*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s 38*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <2 x float> zeroinitializer, float %A, i32 0 39*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <2 x float> %tmp1, float %A, i32 1 40*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp2 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @v_dupQ8(i8 %A) nounwind { 44*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ8: 45*9880d681SAndroid Build Coastguard Worker;CHECK: dup.16b 46*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <16 x i8> zeroinitializer, i8 %A, i32 0 47*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <16 x i8> %tmp1, i8 %A, i32 1 48*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <16 x i8> %tmp2, i8 %A, i32 2 49*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <16 x i8> %tmp3, i8 %A, i32 3 50*9880d681SAndroid Build Coastguard Worker %tmp5 = insertelement <16 x i8> %tmp4, i8 %A, i32 4 51*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement <16 x i8> %tmp5, i8 %A, i32 5 52*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <16 x i8> %tmp6, i8 %A, i32 6 53*9880d681SAndroid Build Coastguard Worker %tmp8 = insertelement <16 x i8> %tmp7, i8 %A, i32 7 54*9880d681SAndroid Build Coastguard Worker %tmp9 = insertelement <16 x i8> %tmp8, i8 %A, i32 8 55*9880d681SAndroid Build Coastguard Worker %tmp10 = insertelement <16 x i8> %tmp9, i8 %A, i32 9 56*9880d681SAndroid Build Coastguard Worker %tmp11 = insertelement <16 x i8> %tmp10, i8 %A, i32 10 57*9880d681SAndroid Build Coastguard Worker %tmp12 = insertelement <16 x i8> %tmp11, i8 %A, i32 11 58*9880d681SAndroid Build Coastguard Worker %tmp13 = insertelement <16 x i8> %tmp12, i8 %A, i32 12 59*9880d681SAndroid Build Coastguard Worker %tmp14 = insertelement <16 x i8> %tmp13, i8 %A, i32 13 60*9880d681SAndroid Build Coastguard Worker %tmp15 = insertelement <16 x i8> %tmp14, i8 %A, i32 14 61*9880d681SAndroid Build Coastguard Worker %tmp16 = insertelement <16 x i8> %tmp15, i8 %A, i32 15 62*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp16 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @v_dupQ16(i16 %A) nounwind { 66*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ16: 67*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8h 68*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <8 x i16> zeroinitializer, i16 %A, i32 0 69*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <8 x i16> %tmp1, i16 %A, i32 1 70*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <8 x i16> %tmp2, i16 %A, i32 2 71*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <8 x i16> %tmp3, i16 %A, i32 3 72*9880d681SAndroid Build Coastguard Worker %tmp5 = insertelement <8 x i16> %tmp4, i16 %A, i32 4 73*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement <8 x i16> %tmp5, i16 %A, i32 5 74*9880d681SAndroid Build Coastguard Worker %tmp7 = insertelement <8 x i16> %tmp6, i16 %A, i32 6 75*9880d681SAndroid Build Coastguard Worker %tmp8 = insertelement <8 x i16> %tmp7, i16 %A, i32 7 76*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp8 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @v_dupQ32(i32 %A) nounwind { 80*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ32: 81*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s 82*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %A, i32 0 83*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <4 x i32> %tmp1, i32 %A, i32 1 84*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <4 x i32> %tmp2, i32 %A, i32 2 85*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <4 x i32> %tmp3, i32 %A, i32 3 86*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp4 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @v_dupQfloat(float %A) nounwind { 90*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQfloat: 91*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s 92*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x float> zeroinitializer, float %A, i32 0 93*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <4 x float> %tmp1, float %A, i32 1 94*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <4 x float> %tmp2, float %A, i32 2 95*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <4 x float> %tmp3, float %A, i32 3 96*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp4 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker; Check to make sure it works with shuffles, too. 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @v_shuffledup8(i8 %A) nounwind { 102*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup8: 103*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8b 104*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <8 x i8> undef, i8 %A, i32 0 105*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> zeroinitializer 106*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @v_shuffledup16(i16 %A) nounwind { 110*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup16: 111*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4h 112*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x i16> undef, i16 %A, i32 0 113*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> zeroinitializer 114*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp2 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @v_shuffledup32(i32 %A) nounwind { 118*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup32: 119*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s 120*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <2 x i32> undef, i32 %A, i32 0 121*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer 122*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp2 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @v_shuffledupfloat(float %A) nounwind { 126*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupfloat: 127*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s 128*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <2 x float> undef, float %A, i32 0 129*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer 130*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp2 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @v_shuffledupQ8(i8 %A) nounwind { 134*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ8: 135*9880d681SAndroid Build Coastguard Worker;CHECK: dup.16b 136*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <16 x i8> undef, i8 %A, i32 0 137*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> zeroinitializer 138*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp2 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @v_shuffledupQ16(i16 %A) nounwind { 142*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ16: 143*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8h 144*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <8 x i16> undef, i16 %A, i32 0 145*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> zeroinitializer 146*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp2 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @v_shuffledupQ32(i32 %A) nounwind { 150*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ32: 151*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s 152*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x i32> undef, i32 %A, i32 0 153*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> zeroinitializer 154*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp2 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @v_shuffledupQfloat(float %A) nounwind { 158*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQfloat: 159*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s 160*9880d681SAndroid Build Coastguard Worker %tmp1 = insertelement <4 x float> undef, float %A, i32 0 161*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer 162*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp2 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @vduplane8(<8 x i8>* %A) nounwind { 166*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane8: 167*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8b 168*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 169*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 > 170*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %tmp2 171*9880d681SAndroid Build Coastguard Worker} 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vduplane16(<4 x i16>* %A) nounwind { 174*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane16: 175*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4h 176*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 177*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 > 178*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %tmp2 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vduplane32(<2 x i32>* %A) nounwind { 182*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane32: 183*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s 184*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 185*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> < i32 1, i32 1 > 186*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %tmp2 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @vduplanefloat(<2 x float>* %A) nounwind { 190*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplanefloat: 191*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s 192*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %A 193*9880d681SAndroid Build Coastguard Worker %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> < i32 1, i32 1 > 194*9880d681SAndroid Build Coastguard Worker ret <2 x float> %tmp2 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @vduplaneQ8(<8 x i8>* %A) nounwind { 198*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ8: 199*9880d681SAndroid Build Coastguard Worker;CHECK: dup.16b 200*9880d681SAndroid Build Coastguard Worker %tmp1 = load <8 x i8>, <8 x i8>* %A 201*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 > 202*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %tmp2 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vduplaneQ16(<4 x i16>* %A) nounwind { 206*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ16: 207*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8h 208*9880d681SAndroid Build Coastguard Worker %tmp1 = load <4 x i16>, <4 x i16>* %A 209*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 > 210*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %tmp2 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vduplaneQ32(<2 x i32>* %A) nounwind { 214*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ32: 215*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s 216*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x i32>, <2 x i32>* %A 217*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 > 218*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %tmp2 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vduplaneQfloat(<2 x float>* %A) nounwind { 222*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQfloat: 223*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s 224*9880d681SAndroid Build Coastguard Worker %tmp1 = load <2 x float>, <2 x float>* %A 225*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 > 226*9880d681SAndroid Build Coastguard Worker ret <4 x float> %tmp2 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @foo(<2 x i64> %arg0_int64x1_t) nounwind readnone { 230*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: foo: 231*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2d 232*9880d681SAndroid Build Coastguard Workerentry: 233*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 1, i32 1> 234*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %0 235*9880d681SAndroid Build Coastguard Worker} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bar(<2 x i64> %arg0_int64x1_t) nounwind readnone { 238*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: bar: 239*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2d 240*9880d681SAndroid Build Coastguard Workerentry: 241*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 242*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %0 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @baz(<2 x double> %arg0_int64x1_t) nounwind readnone { 246*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: baz: 247*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2d 248*9880d681SAndroid Build Coastguard Workerentry: 249*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 1, i32 1> 250*9880d681SAndroid Build Coastguard Worker ret <2 x double> %0 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @qux(<2 x double> %arg0_int64x1_t) nounwind readnone { 254*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: qux: 255*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2d 256*9880d681SAndroid Build Coastguard Workerentry: 257*9880d681SAndroid Build Coastguard Worker %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 0, i32 0> 258*9880d681SAndroid Build Coastguard Worker ret <2 x double> %0 259*9880d681SAndroid Build Coastguard Worker} 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @f(i32 %a, i32 %b) nounwind readnone { 262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f: 263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov s0, w0 264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], w1 265*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 266*9880d681SAndroid Build Coastguard Worker %vecinit = insertelement <2 x i32> undef, i32 %a, i32 0 267*9880d681SAndroid Build Coastguard Worker %vecinit1 = insertelement <2 x i32> %vecinit, i32 %b, i32 1 268*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %vecinit1 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @g(i32 %a, i32 %b) nounwind readnone { 272*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: g: 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov s0, w0 274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], w1 275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[2], w1 276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], w0 277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 278*9880d681SAndroid Build Coastguard Worker %vecinit = insertelement <4 x i32> undef, i32 %a, i32 0 279*9880d681SAndroid Build Coastguard Worker %vecinit1 = insertelement <4 x i32> %vecinit, i32 %b, i32 1 280*9880d681SAndroid Build Coastguard Worker %vecinit2 = insertelement <4 x i32> %vecinit1, i32 %b, i32 2 281*9880d681SAndroid Build Coastguard Worker %vecinit3 = insertelement <4 x i32> %vecinit2, i32 %a, i32 3 282*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %vecinit3 283*9880d681SAndroid Build Coastguard Worker} 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @h(i64 %a, i64 %b) nounwind readnone { 286*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: h: 287*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov d0, x0 288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.d v0[1], x1 289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 290*9880d681SAndroid Build Coastguard Worker %vecinit = insertelement <2 x i64> undef, i64 %a, i32 0 291*9880d681SAndroid Build Coastguard Worker %vecinit1 = insertelement <2 x i64> %vecinit, i64 %b, i32 1 292*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %vecinit1 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Worker; We used to spot this as a BUILD_VECTOR implementable by dup, but assume that 296*9880d681SAndroid Build Coastguard Worker; the single value needed was of the same type as the vector. This is false if 297*9880d681SAndroid Build Coastguard Worker; the scalar corresponding to the vector type is illegal (e.g. a <4 x i16> 298*9880d681SAndroid Build Coastguard Worker; BUILD_VECTOR will have an i32 as its source). In that case, the operation is 299*9880d681SAndroid Build Coastguard Worker; not a simple "dup vD.4h, vN.h[idx]" after all, and we crashed. 300*9880d681SAndroid Build Coastguard Worker; 301*9880d681SAndroid Build Coastguard Worker; *However*, it is a dup vD.4h, vN.h[2*idx]. 302*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_build_illegal(<4 x i32> %in) { 303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_build_illegal: 304*9880d681SAndroid Build Coastguard Worker; CHECK: dup.4h v0, v0[6] 305*9880d681SAndroid Build Coastguard Worker %val = extractelement <4 x i32> %in, i32 3 306*9880d681SAndroid Build Coastguard Worker %smallval = trunc i32 %val to i16 307*9880d681SAndroid Build Coastguard Worker %vec = insertelement <4x i16> undef, i16 %smallval, i32 3 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %vec 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker; We used to inherit an already extract_subvectored v4i16 from 313*9880d681SAndroid Build Coastguard Worker; SelectionDAGBuilder here. We then added a DUPLANE on top of that, preventing 314*9880d681SAndroid Build Coastguard Worker; the formation of an indexed-by-7 MLS. 315*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_high_splat(<4 x i16> %a, <4 x i16> %b, <8 x i16> %v) #0 { 316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_high_splat: 317*9880d681SAndroid Build Coastguard Worker; CHECK: mls.4h v0, v1, v2[7] 318*9880d681SAndroid Build Coastguard Workerentry: 319*9880d681SAndroid Build Coastguard Worker %shuffle = shufflevector <8 x i16> %v, <8 x i16> undef, <4 x i32> <i32 7, i32 7, i32 7, i32 7> 320*9880d681SAndroid Build Coastguard Worker %mul = mul <4 x i16> %shuffle, %b 321*9880d681SAndroid Build Coastguard Worker %sub = sub <4 x i16> %a, %mul 322*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %sub 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker; Also test the DUP path in the PerfectShuffle generator. 326*9880d681SAndroid Build Coastguard Worker 327*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_perfectshuffle_dupext_v4i16: 328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup.4h v0, v0[0] 329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ext.8b v0, v0, v1, #4 330*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_perfectshuffle_dupext_v4i16(<4 x i16> %a, <4 x i16> %b) nounwind { 331*9880d681SAndroid Build Coastguard Worker %r = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 0, i32 4, i32 5> 332*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %r 333*9880d681SAndroid Build Coastguard Worker} 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_perfectshuffle_dupext_v4f16: 336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup.4h v0, v0[0] 337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ext.8b v0, v0, v1, #4 338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 339*9880d681SAndroid Build Coastguard Workerdefine <4 x half> @test_perfectshuffle_dupext_v4f16(<4 x half> %a, <4 x half> %b) nounwind { 340*9880d681SAndroid Build Coastguard Worker %r = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 0, i32 0, i32 4, i32 5> 341*9880d681SAndroid Build Coastguard Worker ret <4 x half> %r 342*9880d681SAndroid Build Coastguard Worker} 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_perfectshuffle_dupext_v4i32: 345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup.4s v0, v0[0] 346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ext.16b v0, v0, v1, #8 347*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 348*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_perfectshuffle_dupext_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind { 349*9880d681SAndroid Build Coastguard Worker %r = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 4, i32 5> 350*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %r 351*9880d681SAndroid Build Coastguard Worker} 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_perfectshuffle_dupext_v4f32: 354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup.4s v0, v0[0] 355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ext.16b v0, v0, v1, #8 356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 357*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_perfectshuffle_dupext_v4f32(<4 x float> %a, <4 x float> %b) nounwind { 358*9880d681SAndroid Build Coastguard Worker %r = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 4, i32 5> 359*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r 360*9880d681SAndroid Build Coastguard Worker} 361