1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic < %s | FileCheck %s
3 @var_simple = hidden global i32 0
4 @var_got = global i32 0
5 @var_tlsgd = thread_local global i32 0
6 @var_tlsld = thread_local(localdynamic) global i32 0
7 @var_tlsie = thread_local(initialexec) global i32 0
8 @var_tlsle = thread_local(localexec) global i32 0
10 define void @test_inline_modifier_L() nounwind {
11 ; CHECK-LABEL: test_inline_modifier_L:
12 call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_simple)
13 call void asm sideeffect "ldr x0, [x0, ${0:L}]", "S,~{x0}"(i32* @var_got)
14 call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsgd)
15 call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsld)
16 call void asm sideeffect "ldr x0, [x0, ${0:L}]", "S,~{x0}"(i32* @var_tlsie)
17 call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsle)
18 ; CHECK: add x0, x0, #:lo12:var_simple
19 ; CHECK: ldr x0, [x0, #:got_lo12:var_got]
20 ; CHECK: add x0, x0, #:tlsdesc_lo12:var_tlsgd
21 ; CHECK: add x0, x0, #:dtprel_lo12:var_tlsld
22 ; CHECK: ldr x0, [x0, #:gottprel_lo12:var_tlsie]
23 ; CHECK: add x0, x0, #:tprel_lo12:var_tlsle
28 define void @test_inline_modifier_G() nounwind {
29 ; CHECK-LABEL: test_inline_modifier_G:
30 call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsld)
31 call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsle)
32 ; CHECK: add x0, x0, #:dtprel_hi12:var_tlsld, lsl #12
33 ; CHECK: add x0, x0, #:tprel_hi12:var_tlsle, lsl #12
38 define void @test_inline_modifier_A() nounwind {
39 ; CHECK-LABEL: test_inline_modifier_A:
40 call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_simple)
41 call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_got)
42 call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsgd)
43 call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsie)
44 ; N.b. All tprel and dtprel relocs are modified: lo12 or granules.
45 ; CHECK: adrp x0, var_simple
46 ; CHECK: adrp x0, :got:var_got
47 ; CHECK: adrp x0, :tlsdesc:var_tlsgd
48 ; CHECK: adrp x0, :gottprel:var_tlsie
53 define void @test_inline_modifier_wx(i32 %small, i64 %big) nounwind {
54 ; CHECK-LABEL: test_inline_modifier_wx:
55 call i32 asm sideeffect "add $0, $0, $0", "=r,0"(i32 %small)
56 call i32 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i32 %small)
57 call i32 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i32 %small)
59 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
60 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
61 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
63 call i64 asm sideeffect "add $0, $0, $0", "=r,0"(i64 %big)
64 call i64 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i64 %big)
65 call i64 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i64 %big)
66 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
67 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
68 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
70 call i32 asm sideeffect "add ${0:w}, ${1:w}, ${1:w}", "=r,r"(i32 0)
71 call i32 asm sideeffect "add ${0:x}, ${1:x}, ${1:x}", "=r,r"(i32 0)
72 ; CHECK: add {{w[0-9]+}}, wzr, wzr
73 ; CHECK: add {{x[0-9]+}}, xzr, xzr
77 define void @test_inline_modifier_bhsdq() nounwind {
78 ; CHECK-LABEL: test_inline_modifier_bhsdq:
79 call float asm sideeffect "ldr ${0:b}, [sp]", "=w"()
80 call float asm sideeffect "ldr ${0:h}, [sp]", "=w"()
81 call float asm sideeffect "ldr ${0:s}, [sp]", "=w"()
82 call float asm sideeffect "ldr ${0:d}, [sp]", "=w"()
83 call float asm sideeffect "ldr ${0:q}, [sp]", "=w"()
90 call double asm sideeffect "ldr ${0:b}, [sp]", "=w"()
91 call double asm sideeffect "ldr ${0:h}, [sp]", "=w"()
92 call double asm sideeffect "ldr ${0:s}, [sp]", "=w"()
93 call double asm sideeffect "ldr ${0:d}, [sp]", "=w"()
94 call double asm sideeffect "ldr ${0:q}, [sp]", "=w"()
103 define void @test_inline_modifier_c() nounwind {
104 ; CHECK-LABEL: test_inline_modifier_c:
105 call void asm sideeffect "adr x0, ${0:c}", "i"(i32 3)
111 define void @test_inline_modifier_a() nounwind {
112 ; CHECK-LABEL: test_inline_modifier_a:
113 call void asm sideeffect "prfm pldl1keep, ${0:a}", "r"(i32* @var_simple)
114 ; CHECK: adrp [[VARHI:x[0-9]+]], var_simple
115 ; CHECK: add x[[VARADDR:[0-9]+]], [[VARHI]], #:lo12:var_simple
116 ; CHECK: prfm pldl1keep, [x[[VARADDR]]]