Add support for 64-bit ARM architecture: AArch64
[external/binutils.git] / gas / testsuite / gas / aarch64 / reloc-insn.s
1 // Test file for AArch64 GAS -- instructions with relocation operators.
2
3 func:
4         // BFD_RELOC_AARCH64_MOVW_G0
5         // immediate
6         movz    x0,#:abs_g0:u12
7
8         // BFD_RELOC_AARCH64_MOVW_G0_S
9         // immediate
10         movz    x0,#:abs_g0_s:s12
11         
12         // BFD_RELOC_AARCH64_MOVW_G1
13         // immediate
14         movz    x1,#:abs_g1:u32
15         movk    x1,#:abs_g0_nc:u32
16         
17         // BFD_RELOC_AARCH64_MOVW_G1_S
18         // immediate
19         movz    x1,#:abs_g1_s:s12
20         movk    x1,#:abs_g0_nc:s12
21         
22         // BFD_RELOC_AARCH64_MOVW_G2
23         // immediate
24         movz    x1,#:abs_g2:u48
25         movk    x1,#:abs_g1_nc:u48
26         movk    x1,#:abs_g0_nc:u48
27         
28         // local data (section relative)
29         movz    x1,#:abs_g2:ldata
30         movk    x1,#:abs_g1_nc:ldata
31         movk    x1,#:abs_g0_nc:ldata
32         
33         // external data
34         movz    x1,#:abs_g2:xdata
35         movk    x1,#:abs_g1_nc:xdata
36         movk    x1,#:abs_g0_nc:xdata
37         
38         // BFD_RELOC_AARCH64_MOVW_G2_S
39         // immediate
40         movz    x1,#:abs_g2_s:s12
41         movk    x1,#:abs_g1_nc:s12
42         movk    x1,#:abs_g0_nc:s12
43
44         // BFD_RELOC_AARCH64_MOVW_G3
45         // immediate
46         movz    x1,#:abs_g3:s12
47         movk    x1,#:abs_g2_nc:s12
48         movk    x1,#:abs_g1_nc:s12
49         movk    x1,#:abs_g0_nc:s12
50         
51         movz    x1,#:abs_g3:u64
52         movk    x1,#:abs_g2_nc:u64
53         movk    x1,#:abs_g1_nc:u64
54         movk    x1,#:abs_g0_nc:u64
55         
56         // BFD_RELOC_AARCH64_LD_LO19_PCREL
57         ldr     x0,llit
58         ldr     x1,ldata
59         ldr     x2,xdata+12
60
61         // BFD_RELOC_AARCH64_ADR_LO21_PCREL
62         //  AARCH64 ADR instruction, holding a simple 21 bit pc-relative byte offset.
63         adr     x0,llit
64         adr     x1,ldata
65         adr     x2,ldata+4088
66         adr     x3,xlit
67         adr     x4,xdata+16
68         adr     x5,xdata+4088
69         
70         // BFD_RELOC_AARCH64_ADR_HI21_PCREL
71         adrp    x0,llit
72         adrp    x1,ldata
73         adrp    x2,ldata+4088
74         adrp    x3,xlit
75         adrp    x4,xdata+16
76         adrp    x5,xdata+4088
77         
78         // BFD_RELOC_AARCH64_ADR_HI21_PCREL
79         adrp    x0,:pg_hi21:llit
80         adrp    x1,:pg_hi21:ldata
81         adrp    x2,:pg_hi21:ldata+4088
82         adrp    x3,:pg_hi21:xlit
83         adrp    x4,:pg_hi21:xdata+16
84         adrp    x5,:pg_hi21:xdata+4088
85
86         // BFD_RELOC_AARCH64_ADD_LO12
87         add     x0,x0,#:lo12:llit
88         add     x1,x1,#:lo12:ldata
89         add     x2,x2,#:lo12:ldata+4088
90         add     x3,x3,#:lo12:xlit
91         add     x4,x4,#:lo12:xdata+16
92         add     x5,x5,#:lo12:xdata+4088
93         add     x6,x6,u12
94         
95         // BFD_RELOC_AARCH64_LDST8_LO12
96         ldrb    w0, [x0, #:lo12:llit]
97         ldrb    w1, [x1, #:lo12:ldata]
98         ldrb    w2, [x2, #:lo12:ldata+4088]
99         ldrb    w3, [x3, #:lo12:xlit]
100         ldrb    w4, [x4, #:lo12:xdata+16]
101         ldrb    w5, [x5, #:lo12:xdata+4088]
102         ldrb    w6, [x6, u12]
103
104         // BFD_RELOC_AARCH64_TSTBR14
105         tbz     x0,#0,lab
106         tbz     x1,#63,xlab
107         tbnz    x2,#8,lab
108         tbnz    x2,#47,xlab
109         
110         // BFD_RELOC_AARCH64_BRANCH19
111         b.eq    lab
112         b.eq    xlab
113
114         // BFD_RELOC_AARCH64_COMPARE19
115         cbz     x0,lab
116         cbnz    x30,xlab
117
118         // BFD_RELOC_AARCH64_JUMP26
119         b       lab
120         b       xlab
121
122         // BFD_RELOC_AARCH64_CALL26
123         bl      lab
124         bl      xlab
125         
126         // BFD_RELOC_AARCH64_MOVW_IMM
127         movz    x0, #0x1234, lsl #48
128         movk    x0, #0x5678, lsl #32
129         movk    x0, #0x9abc, lsl #16
130         movk    x0, #0xdef0, lsl #0
131
132         movz    x0, (u64>>48)&0xffff, lsl #48
133         movk    x0, (u64>>32)&0xffff, lsl #32
134         movk    x0, (u64>>16)&0xffff, lsl #16
135         movk    x0, (u64>>0)&0xffff, lsl #0
136         
137         // BFD_RELOC_AARCH64_BIT_IMM
138         orr     x0,x0,bit1
139         and     x0,x0,bit2
140         and     w0,w0,bit2
141         
142         // BFD_RELOC_AARCH64_ADD_U12
143         add     x0,x0,s12
144         add     x0,x0,u12
145         sub     x0,x0,s12
146         sub     x0,x0,u12
147
148         // BFD_RELOC_AARCH64_EXC_U16
149         svc     u16
150
151         // BFD_RELOC_AARCH64_LDST_I9
152         //  Signed 9-bit byte offset for load/store single item with writeback options.
153         //  Used internally by the AARCH64 assembler and not (currently)
154         //  written to any object files.
155         ldr     x0,[x1],#s9
156         ldr     x0,[x1,#s9]!
157
158         // No writeback, but a negative offset should cause this
159         // to be converted to a LDST_I9 relocation
160         ldr     x0,[x1,#s9]
161
162         // BFD_RELOC_AARCH64_LDST_U12
163         //  Unsigned 12-bit byte offset for load/store single item without options.
164         //  Used internally by the AARCH64 assembler and not (currently)
165         //  written to any object files.
166         ldr     x0,[x1,#(u12*8)]
167
168         // BFD_RELOC_AARCH64_LDST16_LO12
169         ldrh    w0, [x0, #:lo12:llit]
170         // BFD_RELOC_AARCH64_LDST32_LO12
171         ldr     w1, [x1, #:lo12:ldata]
172         // BFD_RELOC_AARCH64_LDST64_LO12
173         ldr     x2, [x2, #:lo12:ldata+4088]
174         // BFD_RELOC_AARCH64_LDST128_LO12
175         ldr     q3, [x3, #:lo12:xlit]
176
177         // BFD_RELOC_AARCH64_LDST64_LO12
178         prfm    pstl1keep, [x7, #:lo12:ldata+4100]
179         
180         ret
181         
182 llit:   .word   0xdeadf00d
183         
184 lab:    
185                 
186         .data
187         .align 8
188         
189 dummy:  .xword  0
190         
191 ldata:  .xword  0x1122334455667788
192         .space  8184
193         
194 .set u8, 248
195 .set s9, -256
196 .set s12, -2048 
197 .set u12, 4095
198 .set u16, 65535
199 .set u32, 0x12345678
200 .set u48, 0xaabbccddeeff
201 .set u64, 0xfedcba9876543210
202 .set bit1,0xf000000000000000
203 .set bit2,~0xf