1//RUN: llvm-mc  -triple=aarch64-linux-gnu %s | FileCheck %s
2
3//
4// Check that large constants are converted to ldr from constant pool
5//
6// simple test
7.section a, "ax", @progbits
8// CHECK-LABEL: f1:
9f1:
10  ldr x0, =0x1234
11// CHECK: movz    x0, #0x1234
12  ldr w1, =0x4567
13// CHECK:  movz    w1, #0x4567
14  ldr x0, =0x12340000
15// CHECK:  movz    x0, #0x1234, lsl #16
16  ldr w1, =0x45670000
17// CHECK: movz    w1, #0x4567, lsl #16
18  ldr x0, =0xabc00000000
19// CHECK: movz    x0, #0xabc, lsl #32
20  ldr x0, =0xbeef000000000000
21// CHECK: movz    x0, #0xbeef, lsl #48
22
23.section b,"ax",@progbits
24// CHECK-LABEL: f3:
25f3:
26  ldr x0, =0x10001
27// CHECK: ldr x0, .Ltmp[[TMP0:[0-9]+]]
28
29// loading multiple constants
30.section c,"ax",@progbits
31// CHECK-LABEL: f4:
32f4:
33  ldr x0, =0x10002
34// CHECK: ldr x0, .Ltmp[[TMP1:[0-9]+]]
35  adds x0, x0, #1
36  adds x0, x0, #1
37  adds x0, x0, #1
38  adds x0, x0, #1
39  ldr x0, =0x10003
40// CHECK: ldr x0, .Ltmp[[TMP2:[0-9]+]]
41  adds x0, x0, #1
42  adds x0, x0, #1
43
44// TODO: the same constants should have the same constant pool location
45.section d,"ax",@progbits
46// CHECK-LABEL: f5:
47f5:
48  ldr x0, =0x10004
49// CHECK: ldr x0, .Ltmp[[TMP3:[0-9]+]]
50  adds x0, x0, #1
51  adds x0, x0, #1
52  adds x0, x0, #1
53  adds x0, x0, #1
54  adds x0, x0, #1
55  adds x0, x0, #1
56  adds x0, x0, #1
57  ldr x0, =0x10004
58// CHECK: ldr x0, .Ltmp[[TMP4:[0-9]+]]
59  adds x0, x0, #1
60  adds x0, x0, #1
61  adds x0, x0, #1
62  adds x0, x0, #1
63  adds x0, x0, #1
64  adds x0, x0, #1
65
66// a section defined in multiple pieces should be merged and use a single constant pool
67.section e,"ax",@progbits
68// CHECK-LABEL: f6:
69f6:
70  ldr x0, =0x10006
71// CHECK: ldr x0, .Ltmp[[TMP5:[0-9]+]]
72  adds x0, x0, #1
73  adds x0, x0, #1
74  adds x0, x0, #1
75
76.section f, "ax", @progbits
77// CHECK-LABEL: f7:
78f7:
79  adds x0, x0, #1
80  adds x0, x0, #1
81  adds x0, x0, #1
82
83.section e, "ax", @progbits
84// CHECK-LABEL: f8:
85f8:
86  adds x0, x0, #1
87  ldr x0, =0x10007
88// CHECK: ldr x0, .Ltmp[[TMP6:[0-9]+]]
89  adds x0, x0, #1
90  adds x0, x0, #1
91
92//
93// Check that symbols can be loaded using ldr pseudo
94//
95
96// load an undefined symbol
97.section g,"ax",@progbits
98// CHECK-LABEL: f9:
99f9:
100  ldr x0, =foo
101// CHECK: ldr x0, .Ltmp[[TMP7:[0-9]+]]
102
103// load a symbol from another section
104.section h,"ax",@progbits
105// CHECK-LABEL: f10:
106f10:
107  ldr x0, =f5
108// CHECK: ldr x0, .Ltmp[[TMP8:[0-9]+]]
109
110// load a symbol from the same section
111.section i,"ax",@progbits
112// CHECK-LABEL: f11:
113f11:
114  ldr x0, =f12
115// CHECK: ldr x0, .Ltmp[[TMP9:[0-9]+]]
116  ldr w0,=0x3C000
117// CHECK: ldr     w0, .Ltmp[[TMP10:[0-9]+]]
118
119// CHECK-LABEL: f12:
120f12:
121  adds x0, x0, #1
122  adds x0, x0, #1
123
124.section j,"ax",@progbits
125// mix of symbols and constants
126// CHECK-LABEL: f13:
127f13:
128  adds x0, x0, #1
129  adds x0, x0, #1
130  ldr x0, =0x101
131// CHECK: movz x0, #0x101
132  adds x0, x0, #1
133  adds x0, x0, #1
134  ldr x0, =bar
135// CHECK: ldr x0, .Ltmp[[TMP11:[0-9]+]]
136  adds x0, x0, #1
137  adds x0, x0, #1
138//
139// Check for correct usage in other contexts
140//
141
142// usage in macro
143.macro useit_in_a_macro
144  ldr x0, =0x10008
145  ldr x0, =baz
146.endm
147.section k,"ax",@progbits
148// CHECK-LABEL: f14:
149f14:
150  useit_in_a_macro
151// CHECK: ldr x0, .Ltmp[[TMP12:[0-9]+]]
152// CHECK: ldr x0, .Ltmp[[TMP13:[0-9]+]]
153
154// usage with expressions
155.section l, "ax", @progbits
156// CHECK-LABEL: f15:
157f15:
158  ldr x0, =0x10001+8
159// CHECK: ldr x0, .Ltmp[[TMP14:[0-9]+]]
160  adds x0, x0, #1
161  ldr x0, =bar+4
162// CHECK: ldr x0, .Ltmp[[TMP15:[0-9]+]]
163  adds x0, x0, #1
164
165//
166// Constant Pools
167//
168// CHECK: .section b,"ax",@progbits
169// CHECK: .align 2
170// CHECK: .Ltmp[[TMP0]]
171// CHECK: .word 65537
172
173// CHECK: .section c,"ax",@progbits
174// CHECK: .align 2
175// CHECK: .Ltmp[[TMP1]]
176// CHECK: .word 65538
177// CHECK: .Ltmp[[TMP2]]
178// CHECK: .word 65539
179
180// CHECK: .section d,"ax",@progbits
181// CHECK: .align 2
182// CHECK: .Ltmp[[TMP3]]
183// CHECK: .word 65540
184// CHECK: .Ltmp[[TMP4]]
185// CHECK: .word 65540
186
187// CHECK: .section e,"ax",@progbits
188// CHECK: .align 2
189// CHECK: .Ltmp[[TMP5]]
190// CHECK: .word 65542
191// CHECK: .Ltmp[[TMP6]]
192// CHECK: .word 65543
193
194// Should not switch to section because it has no constant pool
195// CHECK-NOT: .section f,"ax",@progbits
196
197// CHECK: .section g,"ax",@progbits
198// CHECK: .align 2
199// CHECK: .Ltmp[[TMP7]]
200// CHECK: .word foo
201
202// CHECK: .section h,"ax",@progbits
203// CHECK: .align 2
204// CHECK: .Ltmp[[TMP8]]
205// CHECK: .word f5
206
207// CHECK: .section i,"ax",@progbits
208// CHECK: .align 2
209// CHECK: .Ltmp[[TMP9]]
210// CHECK: .word f12
211// CHECK: .Ltmp[[TMP10]]
212// CHECK: .word 245760
213
214// CHECK: .section j,"ax",@progbits
215// CHECK: .align 2
216// CHECK: .Ltmp[[TMP11]]
217// CHECK: .word bar
218
219// CHECK: .section k,"ax",@progbits
220// CHECK: .align 2
221// CHECK: .Ltmp[[TMP12]]
222// CHECK: .word 65544
223// CHECK: .Ltmp[[TMP13]]
224// CHECK: .word baz
225
226// CHECK: .section l,"ax",@progbits
227// CHECK: .align 2
228// CHECK: .Ltmp[[TMP14]]
229// CHECK: .word 65545
230// CHECK: .Ltmp[[TMP15]]
231// CHECK: .word bar+4
232