1 ; RUN: llc -mtriple=aarch64-linux-gnu -code-model=large -o - %s | FileCheck %s 2 3 @var8 = global i8 0 4 @var16 = global i16 0 5 @var32 = global i32 0 6 @var64 = global i64 0 7 8 define i8* @global_addr() { 9 ; CHECK-LABEL: global_addr: 10 ret i8* @var8 11 ; The movz/movk calculation should end up returned directly in x0. 12 ; CHECK: movz x0, #:abs_g3:var8 13 ; CHECK: movk x0, #:abs_g2_nc:var8 14 ; CHECK: movk x0, #:abs_g1_nc:var8 15 ; CHECK: movk x0, #:abs_g0_nc:var8 16 ; CHECK-NEXT: ret 17 } 18 19 define i8 @global_i8() { 20 ; CHECK-LABEL: global_i8: 21 %val = load i8, i8* @var8 22 ret i8 %val 23 ; CHECK: movz x[[ADDR_REG:[0-9]+]], #:abs_g3:var8 24 ; CHECK: movk x[[ADDR_REG]], #:abs_g2_nc:var8 25 ; CHECK: movk x[[ADDR_REG]], #:abs_g1_nc:var8 26 ; CHECK: movk x[[ADDR_REG]], #:abs_g0_nc:var8 27 ; CHECK: ldrb w0, [x[[ADDR_REG]]] 28 } 29 30 define i16 @global_i16() { 31 ; CHECK-LABEL: global_i16: 32 %val = load i16, i16* @var16 33 ret i16 %val 34 ; CHECK: movz x[[ADDR_REG:[0-9]+]], #:abs_g3:var16 35 ; CHECK: movk x[[ADDR_REG]], #:abs_g2_nc:var16 36 ; CHECK: movk x[[ADDR_REG]], #:abs_g1_nc:var16 37 ; CHECK: movk x[[ADDR_REG]], #:abs_g0_nc:var16 38 ; CHECK: ldrh w0, [x[[ADDR_REG]]] 39 } 40 41 define i32 @global_i32() { 42 ; CHECK-LABEL: global_i32: 43 %val = load i32, i32* @var32 44 ret i32 %val 45 ; CHECK: movz x[[ADDR_REG:[0-9]+]], #:abs_g3:var32 46 ; CHECK: movk x[[ADDR_REG]], #:abs_g2_nc:var32 47 ; CHECK: movk x[[ADDR_REG]], #:abs_g1_nc:var32 48 ; CHECK: movk x[[ADDR_REG]], #:abs_g0_nc:var32 49 ; CHECK: ldr w0, [x[[ADDR_REG]]] 50 } 51 52 define i64 @global_i64() { 53 ; CHECK-LABEL: global_i64: 54 %val = load i64, i64* @var64 55 ret i64 %val 56 ; CHECK: movz x[[ADDR_REG:[0-9]+]], #:abs_g3:var64 57 ; CHECK: movk x[[ADDR_REG]], #:abs_g2_nc:var64 58 ; CHECK: movk x[[ADDR_REG]], #:abs_g1_nc:var64 59 ; CHECK: movk x[[ADDR_REG]], #:abs_g0_nc:var64 60 ; CHECK: ldr x0, [x[[ADDR_REG]]] 61 } 62