1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -mtriple=arm64-none-linux-gnu -mattr=+neon | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker%struct.uint8x16x2_t = type { [2 x <16 x i8>] } 5*9880d681SAndroid Build Coastguard Worker%struct.poly8x16x2_t = type { [2 x <16 x i8>] } 6*9880d681SAndroid Build Coastguard Worker%struct.uint8x16x3_t = type { [3 x <16 x i8>] } 7*9880d681SAndroid Build Coastguard Worker%struct.int8x16x2_t = type { [2 x <16 x i8>] } 8*9880d681SAndroid Build Coastguard Worker%struct.int16x8x2_t = type { [2 x <8 x i16>] } 9*9880d681SAndroid Build Coastguard Worker%struct.int32x4x2_t = type { [2 x <4 x i32>] } 10*9880d681SAndroid Build Coastguard Worker%struct.int64x2x2_t = type { [2 x <2 x i64>] } 11*9880d681SAndroid Build Coastguard Worker%struct.float32x4x2_t = type { [2 x <4 x float>] } 12*9880d681SAndroid Build Coastguard Worker%struct.float64x2x2_t = type { [2 x <2 x double>] } 13*9880d681SAndroid Build Coastguard Worker%struct.int8x8x2_t = type { [2 x <8 x i8>] } 14*9880d681SAndroid Build Coastguard Worker%struct.int16x4x2_t = type { [2 x <4 x i16>] } 15*9880d681SAndroid Build Coastguard Worker%struct.int32x2x2_t = type { [2 x <2 x i32>] } 16*9880d681SAndroid Build Coastguard Worker%struct.int64x1x2_t = type { [2 x <1 x i64>] } 17*9880d681SAndroid Build Coastguard Worker%struct.float32x2x2_t = type { [2 x <2 x float>] } 18*9880d681SAndroid Build Coastguard Worker%struct.float64x1x2_t = type { [2 x <1 x double>] } 19*9880d681SAndroid Build Coastguard Worker%struct.int8x16x3_t = type { [3 x <16 x i8>] } 20*9880d681SAndroid Build Coastguard Worker%struct.int16x8x3_t = type { [3 x <8 x i16>] } 21*9880d681SAndroid Build Coastguard Worker%struct.int32x4x3_t = type { [3 x <4 x i32>] } 22*9880d681SAndroid Build Coastguard Worker%struct.int64x2x3_t = type { [3 x <2 x i64>] } 23*9880d681SAndroid Build Coastguard Worker%struct.float32x4x3_t = type { [3 x <4 x float>] } 24*9880d681SAndroid Build Coastguard Worker%struct.float64x2x3_t = type { [3 x <2 x double>] } 25*9880d681SAndroid Build Coastguard Worker%struct.int8x8x3_t = type { [3 x <8 x i8>] } 26*9880d681SAndroid Build Coastguard Worker%struct.int16x4x3_t = type { [3 x <4 x i16>] } 27*9880d681SAndroid Build Coastguard Worker%struct.int32x2x3_t = type { [3 x <2 x i32>] } 28*9880d681SAndroid Build Coastguard Worker%struct.int64x1x3_t = type { [3 x <1 x i64>] } 29*9880d681SAndroid Build Coastguard Worker%struct.float32x2x3_t = type { [3 x <2 x float>] } 30*9880d681SAndroid Build Coastguard Worker%struct.float64x1x3_t = type { [3 x <1 x double>] } 31*9880d681SAndroid Build Coastguard Worker%struct.int8x16x4_t = type { [4 x <16 x i8>] } 32*9880d681SAndroid Build Coastguard Worker%struct.int16x8x4_t = type { [4 x <8 x i16>] } 33*9880d681SAndroid Build Coastguard Worker%struct.int32x4x4_t = type { [4 x <4 x i32>] } 34*9880d681SAndroid Build Coastguard Worker%struct.int64x2x4_t = type { [4 x <2 x i64>] } 35*9880d681SAndroid Build Coastguard Worker%struct.float32x4x4_t = type { [4 x <4 x float>] } 36*9880d681SAndroid Build Coastguard Worker%struct.float64x2x4_t = type { [4 x <2 x double>] } 37*9880d681SAndroid Build Coastguard Worker%struct.int8x8x4_t = type { [4 x <8 x i8>] } 38*9880d681SAndroid Build Coastguard Worker%struct.int16x4x4_t = type { [4 x <4 x i16>] } 39*9880d681SAndroid Build Coastguard Worker%struct.int32x2x4_t = type { [4 x <2 x i32>] } 40*9880d681SAndroid Build Coastguard Worker%struct.int64x1x4_t = type { [4 x <1 x i64>] } 41*9880d681SAndroid Build Coastguard Worker%struct.float32x2x4_t = type { [4 x <2 x float>] } 42*9880d681SAndroid Build Coastguard Worker%struct.float64x1x4_t = type { [4 x <1 x double>] } 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_ld_from_poll_v16i8(<16 x i8> %a) { 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v16i8: 46*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 47*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 48*9880d681SAndroid Build Coastguard Workerentry: 49*9880d681SAndroid Build Coastguard Worker %b = add <16 x i8> %a, <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 2, i8 13, i8 14, i8 15, i8 16> 50*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %b 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_ld_from_poll_v8i16(<8 x i16> %a) { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v8i16: 55*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 56*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker %b = add <8 x i16> %a, <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8> 59*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %b 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_ld_from_poll_v4i32(<4 x i32> %a) { 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v4i32: 64*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 65*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 66*9880d681SAndroid Build Coastguard Workerentry: 67*9880d681SAndroid Build Coastguard Worker %b = add <4 x i32> %a, <i32 1, i32 2, i32 3, i32 4> 68*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %b 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_ld_from_poll_v2i64(<2 x i64> %a) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v2i64: 73*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 74*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 75*9880d681SAndroid Build Coastguard Workerentry: 76*9880d681SAndroid Build Coastguard Worker %b = add <2 x i64> %a, <i64 1, i64 2> 77*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %b 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_ld_from_poll_v4f32(<4 x float> %a) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v4f32: 82*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 83*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 84*9880d681SAndroid Build Coastguard Workerentry: 85*9880d681SAndroid Build Coastguard Worker %b = fadd <4 x float> %a, <float 1.0, float 2.0, float 3.0, float 4.0> 86*9880d681SAndroid Build Coastguard Worker ret <4 x float> %b 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_ld_from_poll_v2f64(<2 x double> %a) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v2f64: 91*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 92*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 93*9880d681SAndroid Build Coastguard Workerentry: 94*9880d681SAndroid Build Coastguard Worker %b = fadd <2 x double> %a, <double 1.0, double 2.0> 95*9880d681SAndroid Build Coastguard Worker ret <2 x double> %b 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_ld_from_poll_v8i8(<8 x i8> %a) { 99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v8i8: 100*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 101*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 102*9880d681SAndroid Build Coastguard Workerentry: 103*9880d681SAndroid Build Coastguard Worker %b = add <8 x i8> %a, <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8> 104*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %b 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_ld_from_poll_v4i16(<4 x i16> %a) { 108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v4i16: 109*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 110*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 111*9880d681SAndroid Build Coastguard Workerentry: 112*9880d681SAndroid Build Coastguard Worker %b = add <4 x i16> %a, <i16 1, i16 2, i16 3, i16 4> 113*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %b 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_ld_from_poll_v2i32(<2 x i32> %a) { 117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v2i32: 118*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}} 119*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}] 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker %b = add <2 x i32> %a, <i32 1, i32 2> 122*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %b 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vld1q_dup_s8(i8* %a) { 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_s8: 127*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.16b ?}}}, [x0] 128*9880d681SAndroid Build Coastguard Workerentry: 129*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %a, align 1 130*9880d681SAndroid Build Coastguard Worker %1 = insertelement <16 x i8> undef, i8 %0, i32 0 131*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <16 x i8> %1, <16 x i8> undef, <16 x i32> zeroinitializer 132*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %lane 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vld1q_dup_s16(i16* %a) { 136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_s16: 137*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.8h ?}}}, [x0] 138*9880d681SAndroid Build Coastguard Workerentry: 139*9880d681SAndroid Build Coastguard Worker %0 = load i16, i16* %a, align 2 140*9880d681SAndroid Build Coastguard Worker %1 = insertelement <8 x i16> undef, i16 %0, i32 0 141*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> zeroinitializer 142*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %lane 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vld1q_dup_s32(i32* %a) { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_s32: 147*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.4s ?}}}, [x0] 148*9880d681SAndroid Build Coastguard Workerentry: 149*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %a, align 4 150*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i32> undef, i32 %0, i32 0 151*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> zeroinitializer 152*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %lane 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vld1q_dup_s64(i64* %a) { 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_s64: 157*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.2d ?}}}, [x0] 158*9880d681SAndroid Build Coastguard Workerentry: 159*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* %a, align 8 160*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i64> undef, i64 %0, i32 0 161*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> zeroinitializer 162*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %lane 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_vld1q_dup_f32(float* %a) { 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_f32: 167*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.4s ?}}}, [x0] 168*9880d681SAndroid Build Coastguard Workerentry: 169*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %a, align 4 170*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x float> undef, float %0, i32 0 171*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> zeroinitializer 172*9880d681SAndroid Build Coastguard Worker ret <4 x float> %lane 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_vld1q_dup_f64(double* %a) { 176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_f64: 177*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.2d ?}}}, [x0] 178*9880d681SAndroid Build Coastguard Workerentry: 179*9880d681SAndroid Build Coastguard Worker %0 = load double, double* %a, align 8 180*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x double> undef, double %0, i32 0 181*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <2 x double> %1, <2 x double> undef, <2 x i32> zeroinitializer 182*9880d681SAndroid Build Coastguard Worker ret <2 x double> %lane 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vld1_dup_s8(i8* %a) { 186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_s8: 187*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.8b ?}}}, [x0] 188*9880d681SAndroid Build Coastguard Workerentry: 189*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %a, align 1 190*9880d681SAndroid Build Coastguard Worker %1 = insertelement <8 x i8> undef, i8 %0, i32 0 191*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <8 x i8> %1, <8 x i8> undef, <8 x i32> zeroinitializer 192*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %lane 193*9880d681SAndroid Build Coastguard Worker} 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vld1_dup_s16(i16* %a) { 196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_s16: 197*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.4h ?}}}, [x0] 198*9880d681SAndroid Build Coastguard Workerentry: 199*9880d681SAndroid Build Coastguard Worker %0 = load i16, i16* %a, align 2 200*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x i16> undef, i16 %0, i32 0 201*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <4 x i16> %1, <4 x i16> undef, <4 x i32> zeroinitializer 202*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %lane 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vld1_dup_s32(i32* %a) { 206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_s32: 207*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.2s ?}}}, [x0] 208*9880d681SAndroid Build Coastguard Workerentry: 209*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %a, align 4 210*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x i32> undef, i32 %0, i32 0 211*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <2 x i32> %1, <2 x i32> undef, <2 x i32> zeroinitializer 212*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %lane 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @test_vld1_dup_s64(i64* %a) { 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_s64: 217*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [x0] 218*9880d681SAndroid Build Coastguard Workerentry: 219*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* %a, align 8 220*9880d681SAndroid Build Coastguard Worker %1 = insertelement <1 x i64> undef, i64 %0, i32 0 221*9880d681SAndroid Build Coastguard Worker ret <1 x i64> %1 222*9880d681SAndroid Build Coastguard Worker} 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_vld1_dup_f32(float* %a) { 225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_f32: 226*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.2s ?}}}, [x0] 227*9880d681SAndroid Build Coastguard Workerentry: 228*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %a, align 4 229*9880d681SAndroid Build Coastguard Worker %1 = insertelement <2 x float> undef, float %0, i32 0 230*9880d681SAndroid Build Coastguard Worker %lane = shufflevector <2 x float> %1, <2 x float> undef, <2 x i32> zeroinitializer 231*9880d681SAndroid Build Coastguard Worker ret <2 x float> %lane 232*9880d681SAndroid Build Coastguard Worker} 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_vld1_dup_f64(double* %a) { 235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_f64: 236*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [x0] 237*9880d681SAndroid Build Coastguard Workerentry: 238*9880d681SAndroid Build Coastguard Worker %0 = load double, double* %a, align 8 239*9880d681SAndroid Build Coastguard Worker %1 = insertelement <1 x double> undef, double %0, i32 0 240*9880d681SAndroid Build Coastguard Worker ret <1 x double> %1 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @testDUP.v1i64(i64* %a, i64* %b) #0 { 244*9880d681SAndroid Build Coastguard Worker; As there is a store operation depending on %1, LD1R pattern can't be selected. 245*9880d681SAndroid Build Coastguard Worker; So LDR and FMOV should be emitted. 246*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testDUP.v1i64: 247*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}] 248*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov {{d[0-9]+}}, {{x[0-9]+}} 249*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: str {{x[0-9]+}}, [{{x[0-9]+}}] 250*9880d681SAndroid Build Coastguard Worker %1 = load i64, i64* %a, align 8 251*9880d681SAndroid Build Coastguard Worker store i64 %1, i64* %b, align 8 252*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <1 x i64> undef, i64 %1, i32 0 253*9880d681SAndroid Build Coastguard Worker ret <1 x i64> %vecinit.i 254*9880d681SAndroid Build Coastguard Worker} 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @testDUP.v1f64(double* %a, double* %b) #0 { 257*9880d681SAndroid Build Coastguard Worker; As there is a store operation depending on %1, LD1R pattern can't be selected. 258*9880d681SAndroid Build Coastguard Worker; So LDR and FMOV should be emitted. 259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testDUP.v1f64: 260*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}] 261*9880d681SAndroid Build Coastguard Worker; CHECK: str {{d[0-9]+}}, [{{x[0-9]+}}] 262*9880d681SAndroid Build Coastguard Worker %1 = load double, double* %a, align 8 263*9880d681SAndroid Build Coastguard Worker store double %1, double* %b, align 8 264*9880d681SAndroid Build Coastguard Worker %vecinit.i = insertelement <1 x double> undef, double %1, i32 0 265*9880d681SAndroid Build Coastguard Worker ret <1 x double> %vecinit.i 266*9880d681SAndroid Build Coastguard Worker} 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vld1q_lane_s8(i8* %a, <16 x i8> %b) { 269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_s8: 270*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.b }[{{[0-9]+}}], [x0] 271*9880d681SAndroid Build Coastguard Workerentry: 272*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %a, align 1 273*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <16 x i8> %b, i8 %0, i32 15 274*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %vld1_lane 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vld1q_lane_s16(i16* %a, <8 x i16> %b) { 278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_s16: 279*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.h }[{{[0-9]+}}], [x0] 280*9880d681SAndroid Build Coastguard Workerentry: 281*9880d681SAndroid Build Coastguard Worker %0 = load i16, i16* %a, align 2 282*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <8 x i16> %b, i16 %0, i32 7 283*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %vld1_lane 284*9880d681SAndroid Build Coastguard Worker} 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vld1q_lane_s32(i32* %a, <4 x i32> %b) { 287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_s32: 288*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0] 289*9880d681SAndroid Build Coastguard Workerentry: 290*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %a, align 4 291*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <4 x i32> %b, i32 %0, i32 3 292*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %vld1_lane 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vld1q_lane_s64(i64* %a, <2 x i64> %b) { 296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_s64: 297*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0] 298*9880d681SAndroid Build Coastguard Workerentry: 299*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* %a, align 8 300*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <2 x i64> %b, i64 %0, i32 1 301*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %vld1_lane 302*9880d681SAndroid Build Coastguard Worker} 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_vld1q_lane_f32(float* %a, <4 x float> %b) { 305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_f32: 306*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0] 307*9880d681SAndroid Build Coastguard Workerentry: 308*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %a, align 4 309*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <4 x float> %b, float %0, i32 3 310*9880d681SAndroid Build Coastguard Worker ret <4 x float> %vld1_lane 311*9880d681SAndroid Build Coastguard Worker} 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_vld1q_lane_f64(double* %a, <2 x double> %b) { 314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_f64: 315*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0] 316*9880d681SAndroid Build Coastguard Workerentry: 317*9880d681SAndroid Build Coastguard Worker %0 = load double, double* %a, align 8 318*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <2 x double> %b, double %0, i32 1 319*9880d681SAndroid Build Coastguard Worker ret <2 x double> %vld1_lane 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vld1_lane_s8(i8* %a, <8 x i8> %b) { 323*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_s8: 324*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.b }[{{[0-9]+}}], [x0] 325*9880d681SAndroid Build Coastguard Workerentry: 326*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %a, align 1 327*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <8 x i8> %b, i8 %0, i32 7 328*9880d681SAndroid Build Coastguard Worker ret <8 x i8> %vld1_lane 329*9880d681SAndroid Build Coastguard Worker} 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vld1_lane_s16(i16* %a, <4 x i16> %b) { 332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_s16: 333*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.h }[{{[0-9]+}}], [x0] 334*9880d681SAndroid Build Coastguard Workerentry: 335*9880d681SAndroid Build Coastguard Worker %0 = load i16, i16* %a, align 2 336*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <4 x i16> %b, i16 %0, i32 3 337*9880d681SAndroid Build Coastguard Worker ret <4 x i16> %vld1_lane 338*9880d681SAndroid Build Coastguard Worker} 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vld1_lane_s32(i32* %a, <2 x i32> %b) { 341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_s32: 342*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0] 343*9880d681SAndroid Build Coastguard Workerentry: 344*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %a, align 4 345*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <2 x i32> %b, i32 %0, i32 1 346*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %vld1_lane 347*9880d681SAndroid Build Coastguard Worker} 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @test_vld1_lane_s64(i64* %a, <1 x i64> %b) { 350*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_s64: 351*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [x0] 352*9880d681SAndroid Build Coastguard Workerentry: 353*9880d681SAndroid Build Coastguard Worker %0 = load i64, i64* %a, align 8 354*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <1 x i64> undef, i64 %0, i32 0 355*9880d681SAndroid Build Coastguard Worker ret <1 x i64> %vld1_lane 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_vld1_lane_f32(float* %a, <2 x float> %b) { 359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_f32: 360*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0] 361*9880d681SAndroid Build Coastguard Workerentry: 362*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %a, align 4 363*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <2 x float> %b, float %0, i32 1 364*9880d681SAndroid Build Coastguard Worker ret <2 x float> %vld1_lane 365*9880d681SAndroid Build Coastguard Worker} 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_vld1_lane_f64(double* %a, <1 x double> %b) { 368*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_f64: 369*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [x0] 370*9880d681SAndroid Build Coastguard Workerentry: 371*9880d681SAndroid Build Coastguard Worker %0 = load double, double* %a, align 8 372*9880d681SAndroid Build Coastguard Worker %vld1_lane = insertelement <1 x double> undef, double %0, i32 0 373*9880d681SAndroid Build Coastguard Worker ret <1 x double> %vld1_lane 374*9880d681SAndroid Build Coastguard Worker} 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_s8(i8* %a, <16 x i8> %b) { 377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_s8: 378*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.b }[{{[0-9]+}}], [x0] 379*9880d681SAndroid Build Coastguard Workerentry: 380*9880d681SAndroid Build Coastguard Worker %0 = extractelement <16 x i8> %b, i32 15 381*9880d681SAndroid Build Coastguard Worker store i8 %0, i8* %a, align 1 382*9880d681SAndroid Build Coastguard Worker ret void 383*9880d681SAndroid Build Coastguard Worker} 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_s16(i16* %a, <8 x i16> %b) { 386*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_s16: 387*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.h }[{{[0-9]+}}], [x0] 388*9880d681SAndroid Build Coastguard Workerentry: 389*9880d681SAndroid Build Coastguard Worker %0 = extractelement <8 x i16> %b, i32 7 390*9880d681SAndroid Build Coastguard Worker store i16 %0, i16* %a, align 2 391*9880d681SAndroid Build Coastguard Worker ret void 392*9880d681SAndroid Build Coastguard Worker} 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_s32(i32* %a, <4 x i32> %b) { 395*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_s32: 396*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0] 397*9880d681SAndroid Build Coastguard Workerentry: 398*9880d681SAndroid Build Coastguard Worker %0 = extractelement <4 x i32> %b, i32 3 399*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %a, align 4 400*9880d681SAndroid Build Coastguard Worker ret void 401*9880d681SAndroid Build Coastguard Worker} 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_s64(i64* %a, <2 x i64> %b) { 404*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_s64: 405*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0] 406*9880d681SAndroid Build Coastguard Workerentry: 407*9880d681SAndroid Build Coastguard Worker %0 = extractelement <2 x i64> %b, i32 1 408*9880d681SAndroid Build Coastguard Worker store i64 %0, i64* %a, align 8 409*9880d681SAndroid Build Coastguard Worker ret void 410*9880d681SAndroid Build Coastguard Worker} 411*9880d681SAndroid Build Coastguard Worker 412*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_f32(float* %a, <4 x float> %b) { 413*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_f32: 414*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0] 415*9880d681SAndroid Build Coastguard Workerentry: 416*9880d681SAndroid Build Coastguard Worker %0 = extractelement <4 x float> %b, i32 3 417*9880d681SAndroid Build Coastguard Worker store float %0, float* %a, align 4 418*9880d681SAndroid Build Coastguard Worker ret void 419*9880d681SAndroid Build Coastguard Worker} 420*9880d681SAndroid Build Coastguard Worker 421*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_f64(double* %a, <2 x double> %b) { 422*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_f64: 423*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0] 424*9880d681SAndroid Build Coastguard Workerentry: 425*9880d681SAndroid Build Coastguard Worker %0 = extractelement <2 x double> %b, i32 1 426*9880d681SAndroid Build Coastguard Worker store double %0, double* %a, align 8 427*9880d681SAndroid Build Coastguard Worker ret void 428*9880d681SAndroid Build Coastguard Worker} 429*9880d681SAndroid Build Coastguard Worker 430*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_s8(i8* %a, <8 x i8> %b) { 431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_s8: 432*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.b }[{{[0-9]+}}], [x0] 433*9880d681SAndroid Build Coastguard Workerentry: 434*9880d681SAndroid Build Coastguard Worker %0 = extractelement <8 x i8> %b, i32 7 435*9880d681SAndroid Build Coastguard Worker store i8 %0, i8* %a, align 1 436*9880d681SAndroid Build Coastguard Worker ret void 437*9880d681SAndroid Build Coastguard Worker} 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_s16(i16* %a, <4 x i16> %b) { 440*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_s16: 441*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.h }[{{[0-9]+}}], [x0] 442*9880d681SAndroid Build Coastguard Workerentry: 443*9880d681SAndroid Build Coastguard Worker %0 = extractelement <4 x i16> %b, i32 3 444*9880d681SAndroid Build Coastguard Worker store i16 %0, i16* %a, align 2 445*9880d681SAndroid Build Coastguard Worker ret void 446*9880d681SAndroid Build Coastguard Worker} 447*9880d681SAndroid Build Coastguard Worker 448*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_s32(i32* %a, <2 x i32> %b) { 449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_s32: 450*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0] 451*9880d681SAndroid Build Coastguard Workerentry: 452*9880d681SAndroid Build Coastguard Worker %0 = extractelement <2 x i32> %b, i32 1 453*9880d681SAndroid Build Coastguard Worker store i32 %0, i32* %a, align 4 454*9880d681SAndroid Build Coastguard Worker ret void 455*9880d681SAndroid Build Coastguard Worker} 456*9880d681SAndroid Build Coastguard Worker 457*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_s64(i64* %a, <1 x i64> %b) { 458*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_s64: 459*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0] 460*9880d681SAndroid Build Coastguard Workerentry: 461*9880d681SAndroid Build Coastguard Worker %0 = extractelement <1 x i64> %b, i32 0 462*9880d681SAndroid Build Coastguard Worker store i64 %0, i64* %a, align 8 463*9880d681SAndroid Build Coastguard Worker ret void 464*9880d681SAndroid Build Coastguard Worker} 465*9880d681SAndroid Build Coastguard Worker 466*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_f32(float* %a, <2 x float> %b) { 467*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_f32: 468*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0] 469*9880d681SAndroid Build Coastguard Workerentry: 470*9880d681SAndroid Build Coastguard Worker %0 = extractelement <2 x float> %b, i32 1 471*9880d681SAndroid Build Coastguard Worker store float %0, float* %a, align 4 472*9880d681SAndroid Build Coastguard Worker ret void 473*9880d681SAndroid Build Coastguard Worker} 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_f64(double* %a, <1 x double> %b) { 476*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_f64: 477*9880d681SAndroid Build Coastguard Worker; CHECK: str {{d[0-9]+}}, [x0] 478*9880d681SAndroid Build Coastguard Workerentry: 479*9880d681SAndroid Build Coastguard Worker %0 = extractelement <1 x double> %b, i32 0 480*9880d681SAndroid Build Coastguard Worker store double %0, double* %a, align 8 481*9880d681SAndroid Build Coastguard Worker ret void 482*9880d681SAndroid Build Coastguard Worker} 483