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