1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon -asm-verbose=false < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdefine float @test_dup_sv2S(<2 x float> %v) #0 { 4*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_sv2S: 5*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: mov s{{[0-9]+}}, {{v[0-9]+}}.s[1] 6*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 7*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <2 x float> %v, i32 1 8*9880d681SAndroid Build Coastguard Worker ret float %tmp1 9*9880d681SAndroid Build Coastguard Worker} 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine float @test_dup_sv2S_0(<2 x float> %v) #0 { 12*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_sv2S_0: 13*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: dup {{[vsd][0-9]+}} 14*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: ins {{[vsd][0-9]+}} 15*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 16*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <2 x float> %v, i32 0 17*9880d681SAndroid Build Coastguard Worker ret float %tmp1 18*9880d681SAndroid Build Coastguard Worker} 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine float @test_dup_sv4S(<4 x float> %v) #0 { 21*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_sv4S: 22*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: mov s{{[0-9]+}}, {{v[0-9]+}}.s[1] 23*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 24*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <4 x float> %v, i32 1 25*9880d681SAndroid Build Coastguard Worker ret float %tmp1 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine float @test_dup_sv4S_0(<4 x float> %v) #0 { 29*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_sv4S_0: 30*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: dup {{[vsd][0-9]+}} 31*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: ins {{[vsd][0-9]+}} 32*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 33*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <4 x float> %v, i32 0 34*9880d681SAndroid Build Coastguard Worker ret float %tmp1 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine double @test_dup_dvD(<1 x double> %v) #0 { 38*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_dvD: 39*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: dup {{[vsd][0-9]+}} 40*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: ins {{[vsd][0-9]+}} 41*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 42*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <1 x double> %v, i32 0 43*9880d681SAndroid Build Coastguard Worker ret double %tmp1 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine double @test_dup_dv2D(<2 x double> %v) #0 { 47*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_dv2D: 48*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: mov d{{[0-9]+}}, {{v[0-9]+}}.d[1] 49*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 50*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <2 x double> %v, i32 1 51*9880d681SAndroid Build Coastguard Worker ret double %tmp1 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine double @test_dup_dv2D_0(<2 x double> %v) #0 { 55*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_dv2D_0: 56*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: dup {{[vsd][0-9]+}} 57*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: ins {{[vsd][0-9]+}} 58*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 59*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <2 x double> %v, i32 0 60*9880d681SAndroid Build Coastguard Worker ret double %tmp1 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine half @test_dup_hv8H(<8 x half> %v) #0 { 64*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_hv8H: 65*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: mov h{{[0-9]+}}, {{v[0-9]+}}.h[1] 66*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 67*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <8 x half> %v, i32 1 68*9880d681SAndroid Build Coastguard Worker ret half %tmp1 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine half @test_dup_hv8H_0(<8 x half> %v) #0 { 72*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_dup_hv8H_0: 73*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: dup {{[vsdh][0-9]+}} 74*9880d681SAndroid Build Coastguard Worker ; CHECK-NOT: ins {{[vsdh][0-9]+}} 75*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 76*9880d681SAndroid Build Coastguard Worker %tmp1 = extractelement <8 x half> %v, i32 0 77*9880d681SAndroid Build Coastguard Worker ret half %tmp1 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine <1 x i8> @test_vector_dup_bv16B(<16 x i8> %v1) #0 { 81*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_vector_dup_bv16B: 82*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: umov [[W:w[0-9]+]], v0.b[14] 83*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: fmov s0, [[W]] 84*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 85*9880d681SAndroid Build Coastguard Worker %shuffle.i = shufflevector <16 x i8> %v1, <16 x i8> undef, <1 x i32> <i32 14> 86*9880d681SAndroid Build Coastguard Worker ret <1 x i8> %shuffle.i 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <1 x i8> @test_vector_dup_bv8B(<8 x i8> %v1) #0 { 90*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_vector_dup_bv8B: 91*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: dup v0.8b, v0.b[7] 92*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 93*9880d681SAndroid Build Coastguard Worker %shuffle.i = shufflevector <8 x i8> %v1, <8 x i8> undef, <1 x i32> <i32 7> 94*9880d681SAndroid Build Coastguard Worker ret <1 x i8> %shuffle.i 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine <1 x i16> @test_vector_dup_hv8H(<8 x i16> %v1) #0 { 98*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_vector_dup_hv8H: 99*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: umov [[W:w[0-9]+]], v0.h[7] 100*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: fmov s0, [[W]] 101*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 102*9880d681SAndroid Build Coastguard Worker %shuffle.i = shufflevector <8 x i16> %v1, <8 x i16> undef, <1 x i32> <i32 7> 103*9880d681SAndroid Build Coastguard Worker ret <1 x i16> %shuffle.i 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine <1 x i16> @test_vector_dup_hv4H(<4 x i16> %v1) #0 { 107*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_vector_dup_hv4H: 108*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: dup v0.4h, v0.h[3] 109*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 110*9880d681SAndroid Build Coastguard Worker %shuffle.i = shufflevector <4 x i16> %v1, <4 x i16> undef, <1 x i32> <i32 3> 111*9880d681SAndroid Build Coastguard Worker ret <1 x i16> %shuffle.i 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine <1 x i32> @test_vector_dup_sv4S(<4 x i32> %v1) #0 { 115*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_vector_dup_sv4S: 116*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: mov [[W:w[0-9]+]], v0.s[3] 117*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: fmov s0, [[W]] 118*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 119*9880d681SAndroid Build Coastguard Worker %shuffle = shufflevector <4 x i32> %v1, <4 x i32> undef, <1 x i32> <i32 3> 120*9880d681SAndroid Build Coastguard Worker ret <1 x i32> %shuffle 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine <1 x i32> @test_vector_dup_sv2S(<2 x i32> %v1) #0 { 124*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_vector_dup_sv2S: 125*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: dup v0.2s, v0.s[1] 126*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 127*9880d681SAndroid Build Coastguard Worker %shuffle = shufflevector <2 x i32> %v1, <2 x i32> undef, <1 x i32> <i32 1> 128*9880d681SAndroid Build Coastguard Worker ret <1 x i32> %shuffle 129*9880d681SAndroid Build Coastguard Worker} 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @test_vector_dup_dv2D(<2 x i64> %v1) #0 { 132*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_vector_dup_dv2D: 133*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ext {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #8 134*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 135*9880d681SAndroid Build Coastguard Worker %shuffle.i = shufflevector <2 x i64> %v1, <2 x i64> undef, <1 x i32> <i32 1> 136*9880d681SAndroid Build Coastguard Worker ret <1 x i64> %shuffle.i 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @test_vector_copy_dup_dv2D(<1 x i64> %a, <2 x i64> %c) #0 { 140*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: test_vector_copy_dup_dv2D: 141*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: {{dup|mov}} {{d[0-9]+}}, {{v[0-9]+}}.d[1] 142*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: ret 143*9880d681SAndroid Build Coastguard Worker %vget_lane = extractelement <2 x i64> %c, i32 1 144*9880d681SAndroid Build Coastguard Worker %vset_lane = insertelement <1 x i64> undef, i64 %vget_lane, i32 0 145*9880d681SAndroid Build Coastguard Worker ret <1 x i64> %vset_lane 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; Undefined behaviour, so we really don't care what actually gets emitted, just 149*9880d681SAndroid Build Coastguard Worker; as long as we don't crash (since it could be dynamically unreachable). 150*9880d681SAndroid Build Coastguard Workerdefine i32 @test_out_of_range_extract(<4 x i32> %vec) { 151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_out_of_range_extract: 152*9880d681SAndroid Build Coastguard Worker; CHECK: ret 153*9880d681SAndroid Build Coastguard Worker %elt = extractelement <4 x i32> %vec, i32 4 154*9880d681SAndroid Build Coastguard Worker ret i32 %elt 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; Undefined behaviour, so we really don't care what actually gets emitted, just 158*9880d681SAndroid Build Coastguard Worker; as long as we don't crash (since it could be dynamically unreachable). 159*9880d681SAndroid Build Coastguard Workerdefine void @test_out_of_range_insert(<4 x i32> %vec, i32 %elt) { 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_out_of_range_insert: 161*9880d681SAndroid Build Coastguard Worker; CHECK: ret 162*9880d681SAndroid Build Coastguard Worker insertelement <4 x i32> %vec, i32 %elt, i32 4 163*9880d681SAndroid Build Coastguard Worker ret void 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 167