d1b21f8c8b965b2981f8a7ea3d9b19dccfc4de75
[oota-llvm.git] / test / CodeGen / AArch64 / inline-asm-modifiers.ll
1 ; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic < %s | FileCheck %s
2 ; RUN: llc -mtriple=aarch64-none-linux-gnu -relocation-model=pic -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-ELF %s
3
4 @var_simple = hidden global i32 0
5 @var_got = global i32 0
6 @var_tlsgd = thread_local global i32 0
7 @var_tlsld = thread_local(localdynamic) global i32 0
8 @var_tlsie = thread_local(initialexec) global i32 0
9 @var_tlsle = thread_local(localexec) global i32 0
10
11 define void @test_inline_modifier_L() nounwind {
12 ; CHECK-LABEL: test_inline_modifier_L:
13   call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_simple)
14   call void asm sideeffect "ldr x0, [x0, ${0:L}]", "S,~{x0}"(i32* @var_got)
15   call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsgd)
16   call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsld)
17   call void asm sideeffect "ldr x0, [x0, ${0:L}]", "S,~{x0}"(i32* @var_tlsie)
18   call void asm sideeffect "add x0, x0, ${0:L}", "S,~{x0}"(i32* @var_tlsle)
19 ; CHECK: add x0, x0, #:lo12:var_simple
20 ; CHECK: ldr x0, [x0, #:got_lo12:var_got]
21 ; CHECK: add x0, x0, #:tlsdesc_lo12:var_tlsgd
22 ; CHECK: add x0, x0, #:dtprel_lo12:var_tlsld
23 ; CHECK: ldr x0, [x0, #:gottprel_lo12:var_tlsie]
24 ; CHECK: add x0, x0, #:tprel_lo12:var_tlsle
25
26 ; CHECK-ELF: R_AARCH64_ADD_ABS_LO12_NC var_simple
27 ; CHECK-ELF: R_AARCH64_LD64_GOT_LO12_NC var_got
28 ; CHECK-ELF: R_AARCH64_TLSDESC_ADD_LO12_NC var_tlsgd
29 ; CHECK-ELF: R_AARCH64_TLSLD_ADD_DTPREL_LO12 var_tlsld
30 ; CHECK-ELF: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC var_tlsie
31 ; CHECK-ELF: R_AARCH64_TLSLE_ADD_TPREL_LO12 var_tlsle
32
33   ret void
34 }
35
36 define void @test_inline_modifier_G() nounwind {
37 ; CHECK-LABEL: test_inline_modifier_G:
38   call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsld)
39   call void asm sideeffect "add x0, x0, ${0:G}, lsl #12", "S,~{x0}"(i32* @var_tlsle)
40 ; CHECK: add x0, x0, #:dtprel_hi12:var_tlsld, lsl #12
41 ; CHECK: add x0, x0, #:tprel_hi12:var_tlsle, lsl #12
42
43 ; CHECK-ELF: R_AARCH64_TLSLD_ADD_DTPREL_HI12 var_tlsld
44 ; CHECK-ELF: R_AARCH64_TLSLE_ADD_TPREL_HI12 var_tlsle
45
46   ret void
47 }
48
49 define void @test_inline_modifier_A() nounwind {
50 ; CHECK-LABEL: test_inline_modifier_A:
51   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_simple)
52   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_got)
53   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsgd)
54   call void asm sideeffect "adrp x0, ${0:A}", "S,~{x0}"(i32* @var_tlsie)
55   ; N.b. All tprel and dtprel relocs are modified: lo12 or granules.
56 ; CHECK: adrp x0, var_simple
57 ; CHECK: adrp x0, :got:var_got
58 ; CHECK: adrp x0, :tlsdesc:var_tlsgd
59 ; CHECK: adrp x0, :gottprel:var_tlsie
60
61 ; CHECK-ELF: R_AARCH64_ADR_PREL_PG_HI21 var_simple
62 ; CHECK-ELF: R_AARCH64_ADR_GOT_PAGE var_got
63 ; CHECK-ELF: R_AARCH64_TLSDESC_ADR_PAGE var_tlsgd
64 ; CHECK-ELF: R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 var_tlsie
65
66   ret void
67 }
68
69 define void @test_inline_modifier_wx(i32 %small, i64 %big) nounwind {
70 ; CHECK-LABEL: test_inline_modifier_wx:
71   call i32 asm sideeffect "add $0, $0, $0", "=r,0"(i32 %small)
72   call i32 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i32 %small)
73   call i32 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i32 %small)
74 ; CHECK: //APP
75 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
76 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
77 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
78
79   call i64 asm sideeffect "add $0, $0, $0", "=r,0"(i64 %big)
80   call i64 asm sideeffect "add ${0:w}, ${0:w}, ${0:w}", "=r,0"(i64 %big)
81   call i64 asm sideeffect "add ${0:x}, ${0:x}, ${0:x}", "=r,0"(i64 %big)
82 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
83 ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
84 ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
85
86   call i32 asm sideeffect "add ${0:w}, ${1:w}, ${1:w}", "=r,r"(i32 0)
87   call i32 asm sideeffect "add ${0:x}, ${1:x}, ${1:x}", "=r,r"(i32 0)
88 ; CHECK: add {{w[0-9]+}}, wzr, wzr
89 ; CHECK: add {{x[0-9]+}}, xzr, xzr
90   ret void
91 }
92
93 define void @test_inline_modifier_bhsdq() nounwind {
94 ; CHECK-LABEL: test_inline_modifier_bhsdq:
95   call float asm sideeffect "ldr ${0:b}, [sp]", "=w"()
96   call float asm sideeffect "ldr ${0:h}, [sp]", "=w"()
97   call float asm sideeffect "ldr ${0:s}, [sp]", "=w"()
98   call float asm sideeffect "ldr ${0:d}, [sp]", "=w"()
99   call float asm sideeffect "ldr ${0:q}, [sp]", "=w"()
100 ; CHECK: ldr b0, [sp]
101 ; CHECK: ldr h0, [sp]
102 ; CHECK: ldr s0, [sp]
103 ; CHECK: ldr d0, [sp]
104 ; CHECK: ldr q0, [sp]
105
106   call double asm sideeffect "ldr ${0:b}, [sp]", "=w"()
107   call double asm sideeffect "ldr ${0:h}, [sp]", "=w"()
108   call double asm sideeffect "ldr ${0:s}, [sp]", "=w"()
109   call double asm sideeffect "ldr ${0:d}, [sp]", "=w"()
110   call double asm sideeffect "ldr ${0:q}, [sp]", "=w"()
111 ; CHECK: ldr b0, [sp]
112 ; CHECK: ldr h0, [sp]
113 ; CHECK: ldr s0, [sp]
114 ; CHECK: ldr d0, [sp]
115 ; CHECK: ldr q0, [sp]
116   ret void
117 }
118
119 define void @test_inline_modifier_c() nounwind {
120 ; CHECK-LABEL: test_inline_modifier_c:
121   call void asm sideeffect "adr x0, ${0:c}", "i"(i32 3)
122 ; CHECK: adr x0, 3
123
124   ret void
125 }