1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-linux-gnu -o - %s -mcpu=cyclone | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-linux-gnu -o - %s -O0 -mcpu=cyclone | FileCheck %s --check-prefix=CHECK-FAST 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-linux-gnu -relocation-model=pic -o - %s -mcpu=cyclone | FileCheck %s --check-prefix=CHECK-PIC 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-linux-gnu -O0 -relocation-model=pic -o - %s -mcpu=cyclone | FileCheck %s --check-prefix=CHECK-FAST-PIC 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker@var8 = external global i8, align 1 7*9880d681SAndroid Build Coastguard Worker@var16 = external global i16, align 2 8*9880d681SAndroid Build Coastguard Worker@var32 = external global i32, align 4 9*9880d681SAndroid Build Coastguard Worker@var64 = external global i64, align 8 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine i8 @test_i8(i8 %new) { 12*9880d681SAndroid Build Coastguard Worker %val = load i8, i8* @var8, align 1 13*9880d681SAndroid Build Coastguard Worker store i8 %new, i8* @var8 14*9880d681SAndroid Build Coastguard Worker ret i8 %val 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i8: 16*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[HIREG:[0-9]+]], var8 17*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb {{w[0-9]+}}, [x[[HIREG]], :lo12:var8] 18*9880d681SAndroid Build Coastguard Worker; CHECK: strb {{w[0-9]+}}, [x[[HIREG]], :lo12:var8] 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker; CHECK-PIC-LABEL: test_i8: 21*9880d681SAndroid Build Coastguard Worker; CHECK-PIC: adrp x[[HIREG:[0-9]+]], :got:var8 22*9880d681SAndroid Build Coastguard Worker; CHECK-PIC: ldr x[[VAR_ADDR:[0-9]+]], [x[[HIREG]], :got_lo12:var8] 23*9880d681SAndroid Build Coastguard Worker; CHECK-PIC: ldrb {{w[0-9]+}}, [x[[VAR_ADDR]]] 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: adrp x[[HIREG:[0-9]+]], var8 26*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: ldrb {{w[0-9]+}}, [x[[HIREG]], :lo12:var8] 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; CHECK-FAST-PIC: adrp x[[HIREG:[0-9]+]], :got:var8 29*9880d681SAndroid Build Coastguard Worker; CHECK-FAST-PIC: ldr x[[VARADDR:[0-9]+]], [x[[HIREG]], :got_lo12:var8] 30*9880d681SAndroid Build Coastguard Worker; CHECK-FAST-PIC: ldr {{w[0-9]+}}, [x[[VARADDR]]] 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine i16 @test_i16(i16 %new) { 34*9880d681SAndroid Build Coastguard Worker %val = load i16, i16* @var16, align 2 35*9880d681SAndroid Build Coastguard Worker store i16 %new, i16* @var16 36*9880d681SAndroid Build Coastguard Worker ret i16 %val 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i16: 38*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[HIREG:[0-9]+]], var16 39*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh {{w[0-9]+}}, [x[[HIREG]], :lo12:var16] 40*9880d681SAndroid Build Coastguard Worker; CHECK: strh {{w[0-9]+}}, [x[[HIREG]], :lo12:var16] 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: adrp x[[HIREG:[0-9]+]], var16 43*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: ldrh {{w[0-9]+}}, [x[[HIREG]], :lo12:var16] 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i32 @test_i32(i32 %new) { 47*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* @var32, align 4 48*9880d681SAndroid Build Coastguard Worker store i32 %new, i32* @var32 49*9880d681SAndroid Build Coastguard Worker ret i32 %val 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i32: 51*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[HIREG:[0-9]+]], var32 52*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{w[0-9]+}}, [x[[HIREG]], :lo12:var32] 53*9880d681SAndroid Build Coastguard Worker; CHECK: str {{w[0-9]+}}, [x[[HIREG]], :lo12:var32] 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: adrp x[[HIREG:[0-9]+]], var32 56*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: add {{x[0-9]+}}, x[[HIREG]], :lo12:var32 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerdefine i64 @test_i64(i64 %new) { 60*9880d681SAndroid Build Coastguard Worker %val = load i64, i64* @var64, align 8 61*9880d681SAndroid Build Coastguard Worker store i64 %new, i64* @var64 62*9880d681SAndroid Build Coastguard Worker ret i64 %val 63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_i64: 64*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[HIREG:[0-9]+]], var64 65*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [x[[HIREG]], :lo12:var64] 66*9880d681SAndroid Build Coastguard Worker; CHECK: str {{x[0-9]+}}, [x[[HIREG]], :lo12:var64] 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: adrp x[[HIREG:[0-9]+]], var64 69*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: add {{x[0-9]+}}, x[[HIREG]], :lo12:var64 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine i64* @test_addr() { 73*9880d681SAndroid Build Coastguard Worker ret i64* @var64 74*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_addr: 75*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[HIREG:x[0-9]+]], var64 76*9880d681SAndroid Build Coastguard Worker; CHECK: add x0, [[HIREG]], :lo12:var64 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: adrp [[HIREG:x[0-9]+]], var64 79*9880d681SAndroid Build Coastguard Worker; CHECK-FAST: add x0, [[HIREG]], :lo12:var64 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker@hiddenvar = hidden global i32 0, align 4 83*9880d681SAndroid Build Coastguard Worker@protectedvar = protected global i32 0, align 4 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine i32 @test_vis() { 86*9880d681SAndroid Build Coastguard Worker %lhs = load i32, i32* @hiddenvar, align 4 87*9880d681SAndroid Build Coastguard Worker %rhs = load i32, i32* @protectedvar, align 4 88*9880d681SAndroid Build Coastguard Worker %ret = add i32 %lhs, %rhs 89*9880d681SAndroid Build Coastguard Worker ret i32 %ret 90*9880d681SAndroid Build Coastguard Worker; CHECK-PIC: adrp {{x[0-9]+}}, hiddenvar 91*9880d681SAndroid Build Coastguard Worker; CHECK-PIC: ldr {{w[0-9]+}}, [{{x[0-9]+}}, :lo12:hiddenvar] 92*9880d681SAndroid Build Coastguard Worker; CHECK-PIC: adrp {{x[0-9]+}}, protectedvar 93*9880d681SAndroid Build Coastguard Worker; CHECK-PIC: ldr {{w[0-9]+}}, [{{x[0-9]+}}, :lo12:protectedvar] 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker@var_default = external global [2 x i32] 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerdefine i32 @test_default_align() { 99*9880d681SAndroid Build Coastguard Worker %addr = getelementptr [2 x i32], [2 x i32]* @var_default, i32 0, i32 0 100*9880d681SAndroid Build Coastguard Worker %val = load i32, i32* %addr 101*9880d681SAndroid Build Coastguard Worker ret i32 %val 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_default_align: 103*9880d681SAndroid Build Coastguard Worker; CHECK: adrp x[[HIREG:[0-9]+]], var_default 104*9880d681SAndroid Build Coastguard Worker; CHECK: ldr w0, [x[[HIREG]], :lo12:var_default] 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine i64 @test_default_unaligned() { 108*9880d681SAndroid Build Coastguard Worker %addr = bitcast [2 x i32]* @var_default to i64* 109*9880d681SAndroid Build Coastguard Worker %val = load i64, i64* %addr 110*9880d681SAndroid Build Coastguard Worker ret i64 %val 111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_default_unaligned: 112*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[HIREG:x[0-9]+]], var_default 113*9880d681SAndroid Build Coastguard Worker; CHECK: add x[[ADDR:[0-9]+]], [[HIREG]], :lo12:var_default 114*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x[[ADDR]]] 115*9880d681SAndroid Build Coastguard Worker} 116