gas/
[binutils-gdb.git] / gas / doc / c-arm.texi
1 @c Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2008
2 @c Free Software Foundation, Inc.
3 @c This is part of the GAS manual.
4 @c For copying conditions, see the file as.texinfo.
5
6 @ifset GENERIC
7 @page
8 @node ARM-Dependent
9 @chapter ARM Dependent Features
10 @end ifset
11
12 @ifclear GENERIC
13 @node Machine Dependencies
14 @chapter ARM Dependent Features
15 @end ifclear
16
17 @cindex ARM support
18 @cindex Thumb support
19 @menu
20 * ARM Options:: Options
21 * ARM Syntax:: Syntax
22 * ARM Floating Point:: Floating Point
23 * ARM Directives:: ARM Machine Directives
24 * ARM Opcodes:: Opcodes
25 * ARM Mapping Symbols:: Mapping Symbols
26 @end menu
27
28 @node ARM Options
29 @section Options
30 @cindex ARM options (none)
31 @cindex options for ARM (none)
32
33 @table @code
34
35 @cindex @code{-mcpu=} command line option, ARM
36 @item -mcpu=@var{processor}[+@var{extension}@dots{}]
37 This option specifies the target processor. The assembler will issue an
38 error message if an attempt is made to assemble an instruction which
39 will not execute on the target processor. The following processor names are
40 recognized:
41 @code{arm1},
42 @code{arm2},
43 @code{arm250},
44 @code{arm3},
45 @code{arm6},
46 @code{arm60},
47 @code{arm600},
48 @code{arm610},
49 @code{arm620},
50 @code{arm7},
51 @code{arm7m},
52 @code{arm7d},
53 @code{arm7dm},
54 @code{arm7di},
55 @code{arm7dmi},
56 @code{arm70},
57 @code{arm700},
58 @code{arm700i},
59 @code{arm710},
60 @code{arm710t},
61 @code{arm720},
62 @code{arm720t},
63 @code{arm740t},
64 @code{arm710c},
65 @code{arm7100},
66 @code{arm7500},
67 @code{arm7500fe},
68 @code{arm7t},
69 @code{arm7tdmi},
70 @code{arm7tdmi-s},
71 @code{arm8},
72 @code{arm810},
73 @code{strongarm},
74 @code{strongarm1},
75 @code{strongarm110},
76 @code{strongarm1100},
77 @code{strongarm1110},
78 @code{arm9},
79 @code{arm920},
80 @code{arm920t},
81 @code{arm922t},
82 @code{arm940t},
83 @code{arm9tdmi},
84 @code{fa526} (Faraday FA526 processor),
85 @code{fa626} (Faraday FA626 processor),
86 @code{arm9e},
87 @code{arm926e},
88 @code{arm926ej-s},
89 @code{arm946e-r0},
90 @code{arm946e},
91 @code{arm946e-s},
92 @code{arm966e-r0},
93 @code{arm966e},
94 @code{arm966e-s},
95 @code{arm968e-s},
96 @code{arm10t},
97 @code{arm10tdmi},
98 @code{arm10e},
99 @code{arm1020},
100 @code{arm1020t},
101 @code{arm1020e},
102 @code{arm1022e},
103 @code{arm1026ej-s},
104 @code{fa626te} (Faraday FA626TE processor),
105 @code{fa726te} (Faraday FA726TE processor),
106 @code{arm1136j-s},
107 @code{arm1136jf-s},
108 @code{arm1156t2-s},
109 @code{arm1156t2f-s},
110 @code{arm1176jz-s},
111 @code{arm1176jzf-s},
112 @code{mpcore},
113 @code{mpcorenovfp},
114 @code{cortex-a8},
115 @code{cortex-a9},
116 @code{cortex-r4},
117 @code{cortex-m3},
118 @code{ep9312} (ARM920 with Cirrus Maverick coprocessor),
119 @code{i80200} (Intel XScale processor)
120 @code{iwmmxt} (Intel(r) XScale processor with Wireless MMX(tm) technology coprocessor)
121 and
122 @code{xscale}.
123 The special name @code{all} may be used to allow the
124 assembler to accept instructions valid for any ARM processor.
125
126 In addition to the basic instruction set, the assembler can be told to
127 accept various extension mnemonics that extend the processor using the
128 co-processor instruction space. For example, @code{-mcpu=arm920+maverick}
129 is equivalent to specifying @code{-mcpu=ep9312}. The following extensions
130 are currently supported:
131 @code{+maverick}
132 @code{+iwmmxt}
133 and
134 @code{+xscale}.
135
136 @cindex @code{-march=} command line option, ARM
137 @item -march=@var{architecture}[+@var{extension}@dots{}]
138 This option specifies the target architecture. The assembler will issue
139 an error message if an attempt is made to assemble an instruction which
140 will not execute on the target architecture. The following architecture
141 names are recognized:
142 @code{armv1},
143 @code{armv2},
144 @code{armv2a},
145 @code{armv2s},
146 @code{armv3},
147 @code{armv3m},
148 @code{armv4},
149 @code{armv4xm},
150 @code{armv4t},
151 @code{armv4txm},
152 @code{armv5},
153 @code{armv5t},
154 @code{armv5txm},
155 @code{armv5te},
156 @code{armv5texp},
157 @code{armv6},
158 @code{armv6j},
159 @code{armv6k},
160 @code{armv6z},
161 @code{armv6zk},
162 @code{armv7},
163 @code{armv7-a},
164 @code{armv7-r},
165 @code{armv7-m},
166 @code{iwmmxt}
167 and
168 @code{xscale}.
169 If both @code{-mcpu} and
170 @code{-march} are specified, the assembler will use
171 the setting for @code{-mcpu}.
172
173 The architecture option can be extended with the same instruction set
174 extension options as the @code{-mcpu} option.
175
176 @cindex @code{-mfpu=} command line option, ARM
177 @item -mfpu=@var{floating-point-format}
178
179 This option specifies the floating point format to assemble for. The
180 assembler will issue an error message if an attempt is made to assemble
181 an instruction which will not execute on the target floating point unit.
182 The following format options are recognized:
183 @code{softfpa},
184 @code{fpe},
185 @code{fpe2},
186 @code{fpe3},
187 @code{fpa},
188 @code{fpa10},
189 @code{fpa11},
190 @code{arm7500fe},
191 @code{softvfp},
192 @code{softvfp+vfp},
193 @code{vfp},
194 @code{vfp10},
195 @code{vfp10-r0},
196 @code{vfp9},
197 @code{vfpxd},
198 @code{vfpv2}
199 @code{vfpv3}
200 @code{vfpv3-d16}
201 @code{arm1020t},
202 @code{arm1020e},
203 @code{arm1136jf-s},
204 @code{maverick}
205 and
206 @code{neon}.
207
208 In addition to determining which instructions are assembled, this option
209 also affects the way in which the @code{.double} assembler directive behaves
210 when assembling little-endian code.
211
212 The default is dependent on the processor selected. For Architecture 5 or
213 later, the default is to assembler for VFP instructions; for earlier
214 architectures the default is to assemble for FPA instructions.
215
216 @cindex @code{-mthumb} command line option, ARM
217 @item -mthumb
218 This option specifies that the assembler should start assembling Thumb
219 instructions; that is, it should behave as though the file starts with a
220 @code{.code 16} directive.
221
222 @cindex @code{-mthumb-interwork} command line option, ARM
223 @item -mthumb-interwork
224 This option specifies that the output generated by the assembler should
225 be marked as supporting interworking.
226
227 @cindex @code{-mapcs} command line option, ARM
228 @item -mapcs @code{[26|32]}
229 This option specifies that the output generated by the assembler should
230 be marked as supporting the indicated version of the Arm Procedure.
231 Calling Standard.
232
233 @cindex @code{-matpcs} command line option, ARM
234 @item -matpcs
235 This option specifies that the output generated by the assembler should
236 be marked as supporting the Arm/Thumb Procedure Calling Standard. If
237 enabled this option will cause the assembler to create an empty
238 debugging section in the object file called .arm.atpcs. Debuggers can
239 use this to determine the ABI being used by.
240
241 @cindex @code{-mapcs-float} command line option, ARM
242 @item -mapcs-float
243 This indicates the floating point variant of the APCS should be
244 used. In this variant floating point arguments are passed in FP
245 registers rather than integer registers.
246
247 @cindex @code{-mapcs-reentrant} command line option, ARM
248 @item -mapcs-reentrant
249 This indicates that the reentrant variant of the APCS should be used.
250 This variant supports position independent code.
251
252 @cindex @code{-mfloat-abi=} command line option, ARM
253 @item -mfloat-abi=@var{abi}
254 This option specifies that the output generated by the assembler should be
255 marked as using specified floating point ABI.
256 The following values are recognized:
257 @code{soft},
258 @code{softfp}
259 and
260 @code{hard}.
261
262 @cindex @code{-eabi=} command line option, ARM
263 @item -meabi=@var{ver}
264 This option specifies which EABI version the produced object files should
265 conform to.
266 The following values are recognized:
267 @code{gnu},
268 @code{4}
269 and
270 @code{5}.
271
272 @cindex @code{-EB} command line option, ARM
273 @item -EB
274 This option specifies that the output generated by the assembler should
275 be marked as being encoded for a big-endian processor.
276
277 @cindex @code{-EL} command line option, ARM
278 @item -EL
279 This option specifies that the output generated by the assembler should
280 be marked as being encoded for a little-endian processor.
281
282 @cindex @code{-k} command line option, ARM
283 @cindex PIC code generation for ARM
284 @item -k
285 This option specifies that the output of the assembler should be marked
286 as position-independent code (PIC).
287
288 @cindex @code{--fix-v4bx} command line option, ARM
289 @item --fix-v4bx
290 Allow @code{BX} instructions in ARMv4 code. This is intended for use with
291 the linker option of the same name.
292
293 @end table
294
295
296 @node ARM Syntax
297 @section Syntax
298 @menu
299 * ARM-Chars:: Special Characters
300 * ARM-Regs:: Register Names
301 * ARM-Relocations:: Relocations
302 @end menu
303
304 @node ARM-Chars
305 @subsection Special Characters
306
307 @cindex line comment character, ARM
308 @cindex ARM line comment character
309 The presence of a @samp{@@} on a line indicates the start of a comment
310 that extends to the end of the current line. If a @samp{#} appears as
311 the first character of a line, the whole line is treated as a comment.
312
313 @cindex line separator, ARM
314 @cindex statement separator, ARM
315 @cindex ARM line separator
316 The @samp{;} character can be used instead of a newline to separate
317 statements.
318
319 @cindex immediate character, ARM
320 @cindex ARM immediate character
321 Either @samp{#} or @samp{$} can be used to indicate immediate operands.
322
323 @cindex identifiers, ARM
324 @cindex ARM identifiers
325 *TODO* Explain about /data modifier on symbols.
326
327 @node ARM-Regs
328 @subsection Register Names
329
330 @cindex ARM register names
331 @cindex register names, ARM
332 *TODO* Explain about ARM register naming, and the predefined names.
333
334 @node ARM Floating Point
335 @section Floating Point
336
337 @cindex floating point, ARM (@sc{ieee})
338 @cindex ARM floating point (@sc{ieee})
339 The ARM family uses @sc{ieee} floating-point numbers.
340
341 @node ARM-Relocations
342 @subsection ARM relocation generation
343
344 @cindex data relocations, ARM
345 @cindex ARM data relocations
346 Specific data relocations can be generated by putting the relocation name
347 in parentheses after the symbol name. For example:
348
349 @smallexample
350 .word foo(TARGET1)
351 @end smallexample
352
353 This will generate an @samp{R_ARM_TARGET1} relocation against the symbol
354 @var{foo}.
355 The following relocations are supported:
356 @code{GOT},
357 @code{GOTOFF},
358 @code{TARGET1},
359 @code{TARGET2},
360 @code{SBREL},
361 @code{TLSGD},
362 @code{TLSLDM},
363 @code{TLSLDO},
364 @code{GOTTPOFF}
365 and
366 @code{TPOFF}.
367
368 For compatibility with older toolchains the assembler also accepts
369 @code{(PLT)} after branch targets. This will generate the deprecated
370 @samp{R_ARM_PLT32} relocation.
371
372 @cindex MOVW and MOVT relocations, ARM
373 Relocations for @samp{MOVW} and @samp{MOVT} instructions can be generated
374 by prefixing the value with @samp{#:lower16:} and @samp{#:upper16}
375 respectively. For example to load the 32-bit address of foo into r0:
376
377 @smallexample
378 MOVW r0, #:lower16:foo
379 MOVT r0, #:upper16:foo
380 @end smallexample
381
382 @node ARM Directives
383 @section ARM Machine Directives
384
385 @cindex machine directives, ARM
386 @cindex ARM machine directives
387 @table @code
388
389 @cindex @code{align} directive, ARM
390 @item .align @var{expression} [, @var{expression}]
391 This is the generic @var{.align} directive. For the ARM however if the
392 first argument is zero (ie no alignment is needed) the assembler will
393 behave as if the argument had been 2 (ie pad to the next four byte
394 boundary). This is for compatibility with ARM's own assembler.
395
396 @cindex @code{req} directive, ARM
397 @item @var{name} .req @var{register name}
398 This creates an alias for @var{register name} called @var{name}. For
399 example:
400
401 @smallexample
402 foo .req r0
403 @end smallexample
404
405 @cindex @code{unreq} directive, ARM
406 @item .unreq @var{alias-name}
407 This undefines a register alias which was previously defined using the
408 @code{req}, @code{dn} or @code{qn} directives. For example:
409
410 @smallexample
411 foo .req r0
412 .unreq foo
413 @end smallexample
414
415 An error occurs if the name is undefined. Note - this pseudo op can
416 be used to delete builtin in register name aliases (eg 'r0'). This
417 should only be done if it is really necessary.
418
419 @cindex @code{dn} and @code{qn} directives, ARM
420 @item @var{name} .dn @var{register name} [@var{.type}] [[@var{index}]]
421 @item @var{name} .qn @var{register name} [@var{.type}] [[@var{index}]]
422
423 The @code{dn} and @code{qn} directives are used to create typed
424 and/or indexed register aliases for use in Advanced SIMD Extension
425 (Neon) instructions. The former should be used to create aliases
426 of double-precision registers, and the latter to create aliases of
427 quad-precision registers.
428
429 If these directives are used to create typed aliases, those aliases can
430 be used in Neon instructions instead of writing types after the mnemonic
431 or after each operand. For example:
432
433 @smallexample
434 x .dn d2.f32
435 y .dn d3.f32
436 z .dn d4.f32[1]
437 vmul x,y,z
438 @end smallexample
439
440 This is equivalent to writing the following:
441
442 @smallexample
443 vmul.f32 d2,d3,d4[1]
444 @end smallexample
445
446 Aliases created using @code{dn} or @code{qn} can be destroyed using
447 @code{unreq}.
448
449 @cindex @code{code} directive, ARM
450 @item .code @code{[16|32]}
451 This directive selects the instruction set being generated. The value 16
452 selects Thumb, with the value 32 selecting ARM.
453
454 @cindex @code{thumb} directive, ARM
455 @item .thumb
456 This performs the same action as @var{.code 16}.
457
458 @cindex @code{arm} directive, ARM
459 @item .arm
460 This performs the same action as @var{.code 32}.
461
462 @cindex @code{force_thumb} directive, ARM
463 @item .force_thumb
464 This directive forces the selection of Thumb instructions, even if the
465 target processor does not support those instructions
466
467 @cindex @code{thumb_func} directive, ARM
468 @item .thumb_func
469 This directive specifies that the following symbol is the name of a
470 Thumb encoded function. This information is necessary in order to allow
471 the assembler and linker to generate correct code for interworking
472 between Arm and Thumb instructions and should be used even if
473 interworking is not going to be performed. The presence of this
474 directive also implies @code{.thumb}
475
476 This directive is not neccessary when generating EABI objects. On these
477 targets the encoding is implicit when generating Thumb code.
478
479 @cindex @code{thumb_set} directive, ARM
480 @item .thumb_set
481 This performs the equivalent of a @code{.set} directive in that it
482 creates a symbol which is an alias for another symbol (possibly not yet
483 defined). This directive also has the added property in that it marks
484 the aliased symbol as being a thumb function entry point, in the same
485 way that the @code{.thumb_func} directive does.
486
487 @cindex @code{.ltorg} directive, ARM
488 @item .ltorg
489 This directive causes the current contents of the literal pool to be
490 dumped into the current section (which is assumed to be the .text
491 section) at the current location (aligned to a word boundary).
492 @code{GAS} maintains a separate literal pool for each section and each
493 sub-section. The @code{.ltorg} directive will only affect the literal
494 pool of the current section and sub-section. At the end of assembly
495 all remaining, un-empty literal pools will automatically be dumped.
496
497 Note - older versions of @code{GAS} would dump the current literal
498 pool any time a section change occurred. This is no longer done, since
499 it prevents accurate control of the placement of literal pools.
500
501 @cindex @code{.pool} directive, ARM
502 @item .pool
503 This is a synonym for .ltorg.
504
505 @cindex @code{.fnstart} directive, ARM
506 @item .fnstart
507 Marks the start of a function with an unwind table entry.
508
509 @cindex @code{.fnend} directive, ARM
510 @item .fnend
511 Marks the end of a function with an unwind table entry. The unwind index
512 table entry is created when this directive is processed.
513
514 If no personality routine has been specified then standard personality
515 routine 0 or 1 will be used, depending on the number of unwind opcodes
516 required.
517
518 @cindex @code{.cantunwind} directive, ARM
519 @item .cantunwind
520 Prevents unwinding through the current function. No personality routine
521 or exception table data is required or permitted.
522
523 @cindex @code{.personality} directive, ARM
524 @item .personality @var{name}
525 Sets the personality routine for the current function to @var{name}.
526
527 @cindex @code{.personalityindex} directive, ARM
528 @item .personalityindex @var{index}
529 Sets the personality routine for the current function to the EABI standard
530 routine number @var{index}
531
532 @cindex @code{.handlerdata} directive, ARM
533 @item .handlerdata
534 Marks the end of the current function, and the start of the exception table
535 entry for that function. Anything between this directive and the
536 @code{.fnend} directive will be added to the exception table entry.
537
538 Must be preceded by a @code{.personality} or @code{.personalityindex}
539 directive.
540
541 @cindex @code{.save} directive, ARM
542 @item .save @var{reglist}
543 Generate unwinder annotations to restore the registers in @var{reglist}.
544 The format of @var{reglist} is the same as the corresponding store-multiple
545 instruction.
546
547 @smallexample
548 @exdent @emph{core registers}
549 .save @{r4, r5, r6, lr@}
550 stmfd sp!, @{r4, r5, r6, lr@}
551 @exdent @emph{FPA registers}
552 .save f4, 2
553 sfmfd f4, 2, [sp]!
554 @exdent @emph{VFP registers}
555 .save @{d8, d9, d10@}
556 fstmdx sp!, @{d8, d9, d10@}
557 @exdent @emph{iWMMXt registers}
558 .save @{wr10, wr11@}
559 wstrd wr11, [sp, #-8]!
560 wstrd wr10, [sp, #-8]!
561 or
562 .save wr11
563 wstrd wr11, [sp, #-8]!
564 .save wr10
565 wstrd wr10, [sp, #-8]!
566 @end smallexample
567
568 @cindex @code{.vsave} directive, ARM
569 @item .vsave @var{vfp-reglist}
570 Generate unwinder annotations to restore the VFP registers in @var{vfp-reglist}
571 using FLDMD. Also works for VFPv3 registers
572 that are to be restored using VLDM.
573 The format of @var{vfp-reglist} is the same as the corresponding store-multiple
574 instruction.
575
576 @smallexample
577 @exdent @emph{VFP registers}
578 .vsave @{d8, d9, d10@}
579 fstmdd sp!, @{d8, d9, d10@}
580 @exdent @emph{VFPv3 registers}
581 .vsave @{d15, d16, d17@}
582 vstm sp!, @{d15, d16, d17@}
583 @end smallexample
584
585 Since FLDMX and FSTMX are now deprecated, this directive should be
586 used in favour of @code{.save} for saving VFP registers for ARMv6 and above.
587
588 @cindex @code{.pad} directive, ARM
589 @item .pad #@var{count}
590 Generate unwinder annotations for a stack adjustment of @var{count} bytes.
591 A positive value indicates the function prologue allocated stack space by
592 decrementing the stack pointer.
593
594 @cindex @code{.movsp} directive, ARM
595 @item .movsp @var{reg} [, #@var{offset}]
596 Tell the unwinder that @var{reg} contains an offset from the current
597 stack pointer. If @var{offset} is not specified then it is assumed to be
598 zero.
599
600 @cindex @code{.setfp} directive, ARM
601 @item .setfp @var{fpreg}, @var{spreg} [, #@var{offset}]
602 Make all unwinder annotations relaive to a frame pointer. Without this
603 the unwinder will use offsets from the stack pointer.
604
605 The syntax of this directive is the same as the @code{sub} or @code{mov}
606 instruction used to set the frame pointer. @var{spreg} must be either
607 @code{sp} or mentioned in a previous @code{.movsp} directive.
608
609 @smallexample
610 .movsp ip
611 mov ip, sp
612 @dots{}
613 .setfp fp, ip, #4
614 sub fp, ip, #4
615 @end smallexample
616
617 @cindex @code{.unwind_raw} directive, ARM
618 @item .raw @var{offset}, @var{byte1}, @dots{}
619 Insert one of more arbitary unwind opcode bytes, which are known to adjust
620 the stack pointer by @var{offset} bytes.
621
622 For example @code{.unwind_raw 4, 0xb1, 0x01} is equivalent to
623 @code{.save @{r0@}}
624
625 @cindex @code{.cpu} directive, ARM
626 @item .cpu @var{name}
627 Select the target processor. Valid values for @var{name} are the same as
628 for the @option{-mcpu} commandline option.
629
630 @cindex @code{.arch} directive, ARM
631 @item .arch @var{name}
632 Select the target architecture. Valid values for @var{name} are the same as
633 for the @option{-march} commandline option.
634
635 @cindex @code{.object_arch} directive, ARM
636 @item .object_arch @var{name}
637 Override the architecture recorded in the EABI object attribute section.
638 Valid values for @var{name} are the same as for the @code{.arch} directive.
639 Typically this is useful when code uses runtime detection of CPU features.
640
641 @cindex @code{.fpu} directive, ARM
642 @item .fpu @var{name}
643 Select the floating point unit to assemble for. Valid values for @var{name}
644 are the same as for the @option{-mfpu} commandline option.
645
646 @cindex @code{.eabi_attribute} directive, ARM
647 @item .eabi_attribute @var{tag}, @var{value}
648 Set the EABI object attribute number @var{tag} to @var{value}. The value
649 is either a @code{number}, @code{"string"}, or @code{number, "string"}
650 depending on the tag.
651
652 @end table
653
654 @node ARM Opcodes
655 @section Opcodes
656
657 @cindex ARM opcodes
658 @cindex opcodes for ARM
659 @code{@value{AS}} implements all the standard ARM opcodes. It also
660 implements several pseudo opcodes, including several synthetic load
661 instructions.
662
663 @table @code
664
665 @cindex @code{NOP} pseudo op, ARM
666 @item NOP
667 @smallexample
668 nop
669 @end smallexample
670
671 This pseudo op will always evaluate to a legal ARM instruction that does
672 nothing. Currently it will evaluate to MOV r0, r0.
673
674 @cindex @code{LDR reg,=<label>} pseudo op, ARM
675 @item LDR
676 @smallexample
677 ldr <register> , = <expression>
678 @end smallexample
679
680 If expression evaluates to a numeric constant then a MOV or MVN
681 instruction will be used in place of the LDR instruction, if the
682 constant can be generated by either of these instructions. Otherwise
683 the constant will be placed into the nearest literal pool (if it not
684 already there) and a PC relative LDR instruction will be generated.
685
686 @cindex @code{ADR reg,<label>} pseudo op, ARM
687 @item ADR
688 @smallexample
689 adr <register> <label>
690 @end smallexample
691
692 This instruction will load the address of @var{label} into the indicated
693 register. The instruction will evaluate to a PC relative ADD or SUB
694 instruction depending upon where the label is located. If the label is
695 out of range, or if it is not defined in the same file (and section) as
696 the ADR instruction, then an error will be generated. This instruction
697 will not make use of the literal pool.
698
699 @cindex @code{ADRL reg,<label>} pseudo op, ARM
700 @item ADRL
701 @smallexample
702 adrl <register> <label>
703 @end smallexample
704
705 This instruction will load the address of @var{label} into the indicated
706 register. The instruction will evaluate to one or two PC relative ADD
707 or SUB instructions depending upon where the label is located. If a
708 second instruction is not needed a NOP instruction will be generated in
709 its place, so that this instruction is always 8 bytes long.
710
711 If the label is out of range, or if it is not defined in the same file
712 (and section) as the ADRL instruction, then an error will be generated.
713 This instruction will not make use of the literal pool.
714
715 @end table
716
717 For information on the ARM or Thumb instruction sets, see @cite{ARM
718 Software Development Toolkit Reference Manual}, Advanced RISC Machines
719 Ltd.
720
721 @node ARM Mapping Symbols
722 @section Mapping Symbols
723
724 The ARM ELF specification requires that special symbols be inserted
725 into object files to mark certain features:
726
727 @table @code
728
729 @cindex @code{$a}
730 @item $a
731 At the start of a region of code containing ARM instructions.
732
733 @cindex @code{$t}
734 @item $t
735 At the start of a region of code containing THUMB instructions.
736
737 @cindex @code{$d}
738 @item $d
739 At the start of a region of data.
740
741 @end table
742
743 The assembler will automatically insert these symbols for you - there
744 is no need to code them yourself. Support for tagging symbols ($b,
745 $f, $p and $m) which is also mentioned in the current ARM ELF
746 specification is not implemented. This is because they have been
747 dropped from the new EABI and so tools cannot rely upon their
748 presence.
749