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