* dwarf.c (display_gdb_index): Handle index version 6.
[deliverable/binutils-gdb.git] / gas / doc / c-arm.texi
CommitLineData
aa820537 1@c Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
7c31ae13 2@c 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
252b5132
RH
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
6057a28f 25* ARM Mapping Symbols:: Mapping Symbols
7da4f750 26* ARM Unwinding Tutorial:: Unwinding
252b5132
RH
27@end menu
28
29@node ARM Options
30@section Options
31@cindex ARM options (none)
32@cindex options for ARM (none)
adcf07e6 33
252b5132 34@table @code
adcf07e6 35
03b1477f 36@cindex @code{-mcpu=} command line option, ARM
92081f48 37@item -mcpu=@var{processor}[+@var{extension}@dots{}]
252b5132
RH
38This option specifies the target processor. The assembler will issue an
39error message if an attempt is made to assemble an instruction which
03b1477f
RE
40will not execute on the target processor. The following processor names are
41recognized:
42@code{arm1},
43@code{arm2},
44@code{arm250},
45@code{arm3},
46@code{arm6},
47@code{arm60},
48@code{arm600},
49@code{arm610},
50@code{arm620},
51@code{arm7},
52@code{arm7m},
53@code{arm7d},
54@code{arm7dm},
55@code{arm7di},
56@code{arm7dmi},
57@code{arm70},
58@code{arm700},
59@code{arm700i},
60@code{arm710},
61@code{arm710t},
62@code{arm720},
63@code{arm720t},
64@code{arm740t},
65@code{arm710c},
66@code{arm7100},
67@code{arm7500},
68@code{arm7500fe},
69@code{arm7t},
70@code{arm7tdmi},
1ff4677c 71@code{arm7tdmi-s},
03b1477f
RE
72@code{arm8},
73@code{arm810},
74@code{strongarm},
75@code{strongarm1},
76@code{strongarm110},
77@code{strongarm1100},
78@code{strongarm1110},
79@code{arm9},
80@code{arm920},
81@code{arm920t},
82@code{arm922t},
83@code{arm940t},
84@code{arm9tdmi},
7fac0536
NC
85@code{fa526} (Faraday FA526 processor),
86@code{fa626} (Faraday FA626 processor),
03b1477f 87@code{arm9e},
7de9afa2 88@code{arm926e},
1ff4677c 89@code{arm926ej-s},
03b1477f
RE
90@code{arm946e-r0},
91@code{arm946e},
db8ac8f9 92@code{arm946e-s},
03b1477f
RE
93@code{arm966e-r0},
94@code{arm966e},
db8ac8f9
PB
95@code{arm966e-s},
96@code{arm968e-s},
03b1477f 97@code{arm10t},
db8ac8f9 98@code{arm10tdmi},
03b1477f
RE
99@code{arm10e},
100@code{arm1020},
101@code{arm1020t},
7de9afa2 102@code{arm1020e},
db8ac8f9 103@code{arm1022e},
1ff4677c 104@code{arm1026ej-s},
4a58c4bd
NC
105@code{fa606te} (Faraday FA606TE processor),
106@code{fa616te} (Faraday FA616TE processor),
7fac0536 107@code{fa626te} (Faraday FA626TE processor),
4a58c4bd 108@code{fmp626} (Faraday FMP626 processor),
7fac0536 109@code{fa726te} (Faraday FA726TE processor),
1ff4677c
RE
110@code{arm1136j-s},
111@code{arm1136jf-s},
db8ac8f9
PB
112@code{arm1156t2-s},
113@code{arm1156t2f-s},
0dd132b6
NC
114@code{arm1176jz-s},
115@code{arm1176jzf-s},
116@code{mpcore},
117@code{mpcorenovfp},
b38f9f31 118@code{cortex-a5},
c90460e4 119@code{cortex-a7},
62b3e311 120@code{cortex-a8},
15290f0a 121@code{cortex-a9},
dbb1f804 122@code{cortex-a15},
62b3e311 123@code{cortex-r4},
307c948d 124@code{cortex-r4f},
7ef07ba0 125@code{cortex-m4},
62b3e311 126@code{cortex-m3},
5b19eaba
NC
127@code{cortex-m1},
128@code{cortex-m0},
03b1477f
RE
129@code{ep9312} (ARM920 with Cirrus Maverick coprocessor),
130@code{i80200} (Intel XScale processor)
e16bb312 131@code{iwmmxt} (Intel(r) XScale processor with Wireless MMX(tm) technology coprocessor)
03b1477f
RE
132and
133@code{xscale}.
134The special name @code{all} may be used to allow the
135assembler to accept instructions valid for any ARM processor.
136
137In addition to the basic instruction set, the assembler can be told to
138accept various extension mnemonics that extend the processor using the
139co-processor instruction space. For example, @code{-mcpu=arm920+maverick}
69133863
MGD
140is equivalent to specifying @code{-mcpu=ep9312}.
141
142Multiple extensions may be specified, separated by a @code{+}. The
143extensions should be specified in ascending alphabetical order.
144
60e5ef9f
MGD
145Some extensions may be restricted to particular architectures; this is
146documented in the list of extensions below.
147
69133863
MGD
148Extension mnemonics may also be removed from those the assembler accepts.
149This is done be prepending @code{no} to the option that adds the extension.
150Extensions that are removed should be listed after all extensions which have
151been added, again in ascending alphabetical order. For example,
152@code{-mcpu=ep9312+nomaverick} is equivalent to specifying @code{-mcpu=arm920}.
153
154
eea54501 155The following extensions are currently supported:
3b2f0793 156@code{idiv}, (Integer Divide Extensions for v7-A and v7-R architectures),
69133863
MGD
157@code{iwmmxt},
158@code{iwmmxt2},
159@code{maverick},
60e5ef9f 160@code{mp} (Multiprocessing Extensions for v7-A and v7-R architectures),
b2a5fbdc 161@code{os} (Operating System for v6M architecture),
f4c65163 162@code{sec} (Security Extensions for v6K and v7-A architectures),
90ec0d68
MGD
163@code{virt} (Virtualization Extensions for v7-A architecture, implies
164@code{idiv}),
03b1477f 165and
69133863 166@code{xscale}.
03b1477f
RE
167
168@cindex @code{-march=} command line option, ARM
92081f48 169@item -march=@var{architecture}[+@var{extension}@dots{}]
252b5132
RH
170This option specifies the target architecture. The assembler will issue
171an error message if an attempt is made to assemble an instruction which
03b1477f
RE
172will not execute on the target architecture. The following architecture
173names are recognized:
174@code{armv1},
175@code{armv2},
176@code{armv2a},
177@code{armv2s},
178@code{armv3},
179@code{armv3m},
180@code{armv4},
181@code{armv4xm},
182@code{armv4t},
183@code{armv4txm},
184@code{armv5},
185@code{armv5t},
186@code{armv5txm},
187@code{armv5te},
09d92015 188@code{armv5texp},
c5f98204 189@code{armv6},
1ddd7f43 190@code{armv6j},
0dd132b6
NC
191@code{armv6k},
192@code{armv6z},
193@code{armv6zk},
b2a5fbdc
MGD
194@code{armv6-m},
195@code{armv6s-m},
62b3e311 196@code{armv7},
c450d570
PB
197@code{armv7-a},
198@code{armv7-r},
199@code{armv7-m},
9e3c6df6 200@code{armv7e-m},
e16bb312 201@code{iwmmxt}
03b1477f
RE
202and
203@code{xscale}.
204If both @code{-mcpu} and
205@code{-march} are specified, the assembler will use
206the setting for @code{-mcpu}.
207
208The architecture option can be extended with the same instruction set
209extension options as the @code{-mcpu} option.
210
211@cindex @code{-mfpu=} command line option, ARM
212@item -mfpu=@var{floating-point-format}
213
214This option specifies the floating point format to assemble for. The
215assembler will issue an error message if an attempt is made to assemble
216an instruction which will not execute on the target floating point unit.
217The following format options are recognized:
218@code{softfpa},
219@code{fpe},
bc89618b
RE
220@code{fpe2},
221@code{fpe3},
03b1477f
RE
222@code{fpa},
223@code{fpa10},
224@code{fpa11},
225@code{arm7500fe},
226@code{softvfp},
227@code{softvfp+vfp},
228@code{vfp},
229@code{vfp10},
230@code{vfp10-r0},
231@code{vfp9},
232@code{vfpxd},
62f3b8c8
PB
233@code{vfpv2},
234@code{vfpv3},
235@code{vfpv3-fp16},
236@code{vfpv3-d16},
237@code{vfpv3-d16-fp16},
238@code{vfpv3xd},
239@code{vfpv3xd-d16},
240@code{vfpv4},
241@code{vfpv4-d16},
f0cd0667 242@code{fpv4-sp-d16},
09d92015
MM
243@code{arm1020t},
244@code{arm1020e},
b1cc4aeb 245@code{arm1136jf-s},
62f3b8c8
PB
246@code{maverick},
247@code{neon},
03b1477f 248and
62f3b8c8 249@code{neon-vfpv4}.
03b1477f
RE
250
251In addition to determining which instructions are assembled, this option
252also affects the way in which the @code{.double} assembler directive behaves
253when assembling little-endian code.
254
255The default is dependent on the processor selected. For Architecture 5 or
256later, the default is to assembler for VFP instructions; for earlier
257architectures the default is to assemble for FPA instructions.
adcf07e6 258
252b5132
RH
259@cindex @code{-mthumb} command line option, ARM
260@item -mthumb
03b1477f
RE
261This option specifies that the assembler should start assembling Thumb
262instructions; that is, it should behave as though the file starts with a
263@code{.code 16} directive.
adcf07e6 264
252b5132
RH
265@cindex @code{-mthumb-interwork} command line option, ARM
266@item -mthumb-interwork
267This option specifies that the output generated by the assembler should
268be marked as supporting interworking.
adcf07e6 269
52970753
NC
270@cindex @code{-mimplicit-it} command line option, ARM
271@item -mimplicit-it=never
272@itemx -mimplicit-it=always
273@itemx -mimplicit-it=arm
274@itemx -mimplicit-it=thumb
275The @code{-mimplicit-it} option controls the behavior of the assembler when
276conditional instructions are not enclosed in IT blocks.
277There are four possible behaviors.
278If @code{never} is specified, such constructs cause a warning in ARM
279code and an error in Thumb-2 code.
280If @code{always} is specified, such constructs are accepted in both
281ARM and Thumb-2 code, where the IT instruction is added implicitly.
282If @code{arm} is specified, such constructs are accepted in ARM code
283and cause an error in Thumb-2 code.
284If @code{thumb} is specified, such constructs cause a warning in ARM
285code and are accepted in Thumb-2 code. If you omit this option, the
286behavior is equivalent to @code{-mimplicit-it=arm}.
e07e6e58 287
5a5829dd
NS
288@cindex @code{-mapcs-26} command line option, ARM
289@cindex @code{-mapcs-32} command line option, ARM
290@item -mapcs-26
291@itemx -mapcs-32
292These options specify that the output generated by the assembler should
252b5132
RH
293be marked as supporting the indicated version of the Arm Procedure.
294Calling Standard.
adcf07e6 295
077b8428
NC
296@cindex @code{-matpcs} command line option, ARM
297@item -matpcs
298This option specifies that the output generated by the assembler should
299be marked as supporting the Arm/Thumb Procedure Calling Standard. If
300enabled this option will cause the assembler to create an empty
301debugging section in the object file called .arm.atpcs. Debuggers can
302use this to determine the ABI being used by.
303
adcf07e6 304@cindex @code{-mapcs-float} command line option, ARM
252b5132 305@item -mapcs-float
1be59579 306This indicates the floating point variant of the APCS should be
252b5132 307used. In this variant floating point arguments are passed in FP
550262c4 308registers rather than integer registers.
adcf07e6
NC
309
310@cindex @code{-mapcs-reentrant} command line option, ARM
252b5132
RH
311@item -mapcs-reentrant
312This indicates that the reentrant variant of the APCS should be used.
313This variant supports position independent code.
adcf07e6 314
33a392fb
PB
315@cindex @code{-mfloat-abi=} command line option, ARM
316@item -mfloat-abi=@var{abi}
317This option specifies that the output generated by the assembler should be
318marked as using specified floating point ABI.
319The following values are recognized:
320@code{soft},
321@code{softfp}
322and
323@code{hard}.
324
d507cf36
PB
325@cindex @code{-eabi=} command line option, ARM
326@item -meabi=@var{ver}
327This option specifies which EABI version the produced object files should
328conform to.
b45619c0 329The following values are recognized:
3a4a14e9
PB
330@code{gnu},
331@code{4}
d507cf36 332and
3a4a14e9 333@code{5}.
d507cf36 334
252b5132
RH
335@cindex @code{-EB} command line option, ARM
336@item -EB
337This option specifies that the output generated by the assembler should
338be marked as being encoded for a big-endian processor.
adcf07e6 339
252b5132
RH
340@cindex @code{-EL} command line option, ARM
341@item -EL
342This option specifies that the output generated by the assembler should
343be marked as being encoded for a little-endian processor.
adcf07e6 344
252b5132
RH
345@cindex @code{-k} command line option, ARM
346@cindex PIC code generation for ARM
347@item -k
a349d9dd
PB
348This option specifies that the output of the assembler should be marked
349as position-independent code (PIC).
adcf07e6 350
845b51d6
PB
351@cindex @code{--fix-v4bx} command line option, ARM
352@item --fix-v4bx
353Allow @code{BX} instructions in ARMv4 code. This is intended for use with
354the linker option of the same name.
355
278df34e
NS
356@cindex @code{-mwarn-deprecated} command line option, ARM
357@item -mwarn-deprecated
358@itemx -mno-warn-deprecated
359Enable or disable warnings about using deprecated options or
360features. The default is to warn.
361
252b5132
RH
362@end table
363
364
365@node ARM Syntax
366@section Syntax
367@menu
cab7e4d9 368* ARM-Instruction-Set:: Instruction Set
252b5132
RH
369* ARM-Chars:: Special Characters
370* ARM-Regs:: Register Names
b6895b4f 371* ARM-Relocations:: Relocations
99f1a7a7 372* ARM-Neon-Alignment:: NEON Alignment Specifiers
252b5132
RH
373@end menu
374
cab7e4d9
NC
375@node ARM-Instruction-Set
376@subsection Instruction Set Syntax
377Two slightly different syntaxes are support for ARM and THUMB
378instructions. The default, @code{divided}, uses the old style where
379ARM and THUMB instructions had their own, separate syntaxes. The new,
380@code{unified} syntax, which can be selected via the @code{.syntax}
381directive, and has the following main features:
382
383@table @bullet
384@item
385Immediate operands do not require a @code{#} prefix.
386
387@item
388The @code{IT} instruction may appear, and if it does it is validated
389against subsequent conditional affixes. In ARM mode it does not
390generate machine code, in THUMB mode it does.
391
392@item
393For ARM instructions the conditional affixes always appear at the end
394of the instruction. For THUMB instructions conditional affixes can be
395used, but only inside the scope of an @code{IT} instruction.
396
397@item
398All of the instructions new to the V6T2 architecture (and later) are
399available. (Only a few such instructions can be written in the
400@code{divided} syntax).
401
402@item
403The @code{.N} and @code{.W} suffixes are recognized and honored.
404
405@item
406All instructions set the flags if and only if they have an @code{s}
407affix.
408@end table
409
252b5132
RH
410@node ARM-Chars
411@subsection Special Characters
412
413@cindex line comment character, ARM
414@cindex ARM line comment character
7c31ae13
NC
415The presence of a @samp{@@} anywhere on a line indicates the start of
416a comment that extends to the end of that line.
417
418If a @samp{#} appears as the first character of a line then the whole
419line is treated as a comment, but in this case the line could also be
420a logical line number directive (@pxref{Comments}) or a preprocessor
421control command (@pxref{Preprocessing}).
550262c4
NC
422
423@cindex line separator, ARM
424@cindex statement separator, ARM
425@cindex ARM line separator
a349d9dd
PB
426The @samp{;} character can be used instead of a newline to separate
427statements.
550262c4
NC
428
429@cindex immediate character, ARM
430@cindex ARM immediate character
431Either @samp{#} or @samp{$} can be used to indicate immediate operands.
252b5132
RH
432
433@cindex identifiers, ARM
434@cindex ARM identifiers
435*TODO* Explain about /data modifier on symbols.
436
437@node ARM-Regs
438@subsection Register Names
439
440@cindex ARM register names
441@cindex register names, ARM
442*TODO* Explain about ARM register naming, and the predefined names.
443
99f1a7a7
DG
444@node ARM-Neon-Alignment
445@subsection NEON Alignment Specifiers
446
447@cindex alignment for NEON instructions
448Some NEON load/store instructions allow an optional address
449alignment qualifier.
450The ARM documentation specifies that this is indicated by
451@samp{@@ @var{align}}. However GAS already interprets
452the @samp{@@} character as a "line comment" start,
453so @samp{: @var{align}} is used instead. For example:
454
455@smallexample
456 vld1.8 @{q0@}, [r0, :128]
457@end smallexample
458
252b5132
RH
459@node ARM Floating Point
460@section Floating Point
461
462@cindex floating point, ARM (@sc{ieee})
463@cindex ARM floating point (@sc{ieee})
464The ARM family uses @sc{ieee} floating-point numbers.
465
b6895b4f
PB
466@node ARM-Relocations
467@subsection ARM relocation generation
468
469@cindex data relocations, ARM
470@cindex ARM data relocations
471Specific data relocations can be generated by putting the relocation name
472in parentheses after the symbol name. For example:
473
474@smallexample
475 .word foo(TARGET1)
476@end smallexample
477
478This will generate an @samp{R_ARM_TARGET1} relocation against the symbol
479@var{foo}.
480The following relocations are supported:
481@code{GOT},
482@code{GOTOFF},
483@code{TARGET1},
484@code{TARGET2},
485@code{SBREL},
486@code{TLSGD},
487@code{TLSLDM},
488@code{TLSLDO},
0855e32b
NS
489@code{TLSDESC},
490@code{TLSCALL},
b43420e6
NC
491@code{GOTTPOFF},
492@code{GOT_PREL}
b6895b4f
PB
493and
494@code{TPOFF}.
495
496For compatibility with older toolchains the assembler also accepts
3da1d841
NC
497@code{(PLT)} after branch targets. On legacy targets this will
498generate the deprecated @samp{R_ARM_PLT32} relocation. On EABI
499targets it will encode either the @samp{R_ARM_CALL} or
500@samp{R_ARM_JUMP24} relocation, as appropriate.
b6895b4f
PB
501
502@cindex MOVW and MOVT relocations, ARM
503Relocations for @samp{MOVW} and @samp{MOVT} instructions can be generated
504by prefixing the value with @samp{#:lower16:} and @samp{#:upper16}
b45619c0 505respectively. For example to load the 32-bit address of foo into r0:
252b5132 506
b6895b4f
PB
507@smallexample
508 MOVW r0, #:lower16:foo
509 MOVT r0, #:upper16:foo
510@end smallexample
252b5132
RH
511
512@node ARM Directives
513@section ARM Machine Directives
514
515@cindex machine directives, ARM
516@cindex ARM machine directives
517@table @code
518
4a6bc624
NS
519@c AAAAAAAAAAAAAAAAAAAAAAAAA
520
521@cindex @code{.2byte} directive, ARM
522@cindex @code{.4byte} directive, ARM
523@cindex @code{.8byte} directive, ARM
524@item .2byte @var{expression} [, @var{expression}]*
525@itemx .4byte @var{expression} [, @var{expression}]*
526@itemx .8byte @var{expression} [, @var{expression}]*
527These directives write 2, 4 or 8 byte values to the output section.
528
529@cindex @code{.align} directive, ARM
adcf07e6
NC
530@item .align @var{expression} [, @var{expression}]
531This is the generic @var{.align} directive. For the ARM however if the
532first argument is zero (ie no alignment is needed) the assembler will
533behave as if the argument had been 2 (ie pad to the next four byte
062b7c0c 534boundary). This is for compatibility with ARM's own assembler.
adcf07e6 535
4a6bc624
NS
536@cindex @code{.arch} directive, ARM
537@item .arch @var{name}
538Select the target architecture. Valid values for @var{name} are the same as
539for the @option{-march} commandline option.
252b5132 540
69133863
MGD
541Specifying @code{.arch} clears any previously selected architecture
542extensions.
543
544@cindex @code{.arch_extension} directive, ARM
545@item .arch_extension @var{name}
546Add or remove an architecture extension to the target architecture. Valid
547values for @var{name} are the same as those accepted as architectural
548extensions by the @option{-mcpu} commandline option.
549
550@code{.arch_extension} may be used multiple times to add or remove extensions
551incrementally to the architecture being compiled for.
552
4a6bc624
NS
553@cindex @code{.arm} directive, ARM
554@item .arm
555This performs the same action as @var{.code 32}.
252b5132 556
4a6bc624
NS
557@anchor{arm_pad}
558@cindex @code{.pad} directive, ARM
559@item .pad #@var{count}
560Generate unwinder annotations for a stack adjustment of @var{count} bytes.
561A positive value indicates the function prologue allocated stack space by
562decrementing the stack pointer.
0bbf2aa4 563
4a6bc624 564@c BBBBBBBBBBBBBBBBBBBBBBBBBB
0bbf2aa4 565
4a6bc624
NS
566@cindex @code{.bss} directive, ARM
567@item .bss
568This directive switches to the @code{.bss} section.
0bbf2aa4 569
4a6bc624
NS
570@c CCCCCCCCCCCCCCCCCCCCCCCCCC
571
572@cindex @code{.cantunwind} directive, ARM
573@item .cantunwind
574Prevents unwinding through the current function. No personality routine
575or exception table data is required or permitted.
576
577@cindex @code{.code} directive, ARM
578@item .code @code{[16|32]}
579This directive selects the instruction set being generated. The value 16
580selects Thumb, with the value 32 selecting ARM.
581
582@cindex @code{.cpu} directive, ARM
583@item .cpu @var{name}
584Select the target processor. Valid values for @var{name} are the same as
585for the @option{-mcpu} commandline option.
586
69133863
MGD
587Specifying @code{.cpu} clears any previously selected architecture
588extensions.
589
4a6bc624
NS
590@c DDDDDDDDDDDDDDDDDDDDDDDDDD
591
592@cindex @code{.dn} and @code{.qn} directives, ARM
f467aa98 593@item @var{name} .dn @var{register name} [@var{.type}] [[@var{index}]]
1f9bb1ca 594@itemx @var{name} .qn @var{register name} [@var{.type}] [[@var{index}]]
23753660
JB
595
596The @code{dn} and @code{qn} directives are used to create typed
597and/or indexed register aliases for use in Advanced SIMD Extension
598(Neon) instructions. The former should be used to create aliases
599of double-precision registers, and the latter to create aliases of
600quad-precision registers.
601
602If these directives are used to create typed aliases, those aliases can
603be used in Neon instructions instead of writing types after the mnemonic
604or after each operand. For example:
605
606@smallexample
607 x .dn d2.f32
608 y .dn d3.f32
609 z .dn d4.f32[1]
610 vmul x,y,z
611@end smallexample
612
613This is equivalent to writing the following:
614
615@smallexample
616 vmul.f32 d2,d3,d4[1]
617@end smallexample
618
619Aliases created using @code{dn} or @code{qn} can be destroyed using
620@code{unreq}.
621
4a6bc624 622@c EEEEEEEEEEEEEEEEEEEEEEEEEE
252b5132 623
4a6bc624
NS
624@cindex @code{.eabi_attribute} directive, ARM
625@item .eabi_attribute @var{tag}, @var{value}
626Set the EABI object attribute @var{tag} to @var{value}.
252b5132 627
4a6bc624
NS
628The @var{tag} is either an attribute number, or one of the following:
629@code{Tag_CPU_raw_name}, @code{Tag_CPU_name}, @code{Tag_CPU_arch},
630@code{Tag_CPU_arch_profile}, @code{Tag_ARM_ISA_use},
75375b3e 631@code{Tag_THUMB_ISA_use}, @code{Tag_FP_arch}, @code{Tag_WMMX_arch},
4a6bc624
NS
632@code{Tag_Advanced_SIMD_arch}, @code{Tag_PCS_config},
633@code{Tag_ABI_PCS_R9_use}, @code{Tag_ABI_PCS_RW_data},
634@code{Tag_ABI_PCS_RO_data}, @code{Tag_ABI_PCS_GOT_use},
635@code{Tag_ABI_PCS_wchar_t}, @code{Tag_ABI_FP_rounding},
636@code{Tag_ABI_FP_denormal}, @code{Tag_ABI_FP_exceptions},
637@code{Tag_ABI_FP_user_exceptions}, @code{Tag_ABI_FP_number_model},
75375b3e 638@code{Tag_ABI_align_needed}, @code{Tag_ABI_align_preserved},
4a6bc624
NS
639@code{Tag_ABI_enum_size}, @code{Tag_ABI_HardFP_use},
640@code{Tag_ABI_VFP_args}, @code{Tag_ABI_WMMX_args},
641@code{Tag_ABI_optimization_goals}, @code{Tag_ABI_FP_optimization_goals},
642@code{Tag_compatibility}, @code{Tag_CPU_unaligned_access},
75375b3e 643@code{Tag_FP_HP_extension}, @code{Tag_ABI_FP_16bit_format},
cd21e546 644@code{Tag_MPextension_use}, @code{Tag_DIV_use},
4a6bc624
NS
645@code{Tag_nodefaults}, @code{Tag_also_compatible_with},
646@code{Tag_conformance}, @code{Tag_T2EE_use},
cd21e546 647@code{Tag_Virtualization_use}
4a6bc624
NS
648
649The @var{value} is either a @code{number}, @code{"string"}, or
650@code{number, "string"} depending on the tag.
651
75375b3e
MGD
652Note - the following legacy values are also accepted by @var{tag}:
653@code{Tag_VFP_arch}, @code{Tag_ABI_align8_needed},
654@code{Tag_ABI_align8_preserved}, @code{Tag_VFP_HP_extension},
655
4a6bc624
NS
656@cindex @code{.even} directive, ARM
657@item .even
658This directive aligns to an even-numbered address.
659
660@cindex @code{.extend} directive, ARM
661@cindex @code{.ldouble} directive, ARM
662@item .extend @var{expression} [, @var{expression}]*
663@itemx .ldouble @var{expression} [, @var{expression}]*
664These directives write 12byte long double floating-point values to the
665output section. These are not compatible with current ARM processors
666or ABIs.
667
668@c FFFFFFFFFFFFFFFFFFFFFFFFFF
669
670@anchor{arm_fnend}
671@cindex @code{.fnend} directive, ARM
672@item .fnend
673Marks the end of a function with an unwind table entry. The unwind index
674table entry is created when this directive is processed.
252b5132 675
4a6bc624
NS
676If no personality routine has been specified then standard personality
677routine 0 or 1 will be used, depending on the number of unwind opcodes
678required.
679
680@anchor{arm_fnstart}
681@cindex @code{.fnstart} directive, ARM
682@item .fnstart
683Marks the start of a function with an unwind table entry.
684
685@cindex @code{.force_thumb} directive, ARM
252b5132
RH
686@item .force_thumb
687This directive forces the selection of Thumb instructions, even if the
688target processor does not support those instructions
689
4a6bc624
NS
690@cindex @code{.fpu} directive, ARM
691@item .fpu @var{name}
692Select the floating-point unit to assemble for. Valid values for @var{name}
693are the same as for the @option{-mfpu} commandline option.
252b5132 694
4a6bc624
NS
695@c GGGGGGGGGGGGGGGGGGGGGGGGGG
696@c HHHHHHHHHHHHHHHHHHHHHHHHHH
e1da3f5b 697
4a6bc624
NS
698@cindex @code{.handlerdata} directive, ARM
699@item .handlerdata
700Marks the end of the current function, and the start of the exception table
701entry for that function. Anything between this directive and the
702@code{.fnend} directive will be added to the exception table entry.
703
704Must be preceded by a @code{.personality} or @code{.personalityindex}
705directive.
706
707@c IIIIIIIIIIIIIIIIIIIIIIIIII
c921be7d
NC
708
709@cindex @code{.inst} directive, ARM
710@item .inst @var{opcode} [ , @dots{} ]
1f9bb1ca
AS
711@itemx .inst.n @var{opcode} [ , @dots{} ]
712@itemx .inst.w @var{opcode} [ , @dots{} ]
c921be7d
NC
713Generates the instruction corresponding to the numerical value @var{opcode}.
714@code{.inst.n} and @code{.inst.w} allow the Thumb instruction size to be
715specified explicitly, overriding the normal encoding rules.
716
4a6bc624
NS
717@c JJJJJJJJJJJJJJJJJJJJJJJJJJ
718@c KKKKKKKKKKKKKKKKKKKKKKKKKK
719@c LLLLLLLLLLLLLLLLLLLLLLLLLL
720
721@item .ldouble @var{expression} [, @var{expression}]*
722See @code{.extend}.
5395a469 723
252b5132
RH
724@cindex @code{.ltorg} directive, ARM
725@item .ltorg
726This directive causes the current contents of the literal pool to be
727dumped into the current section (which is assumed to be the .text
728section) at the current location (aligned to a word boundary).
3d0c9500
NC
729@code{GAS} maintains a separate literal pool for each section and each
730sub-section. The @code{.ltorg} directive will only affect the literal
731pool of the current section and sub-section. At the end of assembly
732all remaining, un-empty literal pools will automatically be dumped.
733
734Note - older versions of @code{GAS} would dump the current literal
735pool any time a section change occurred. This is no longer done, since
736it prevents accurate control of the placement of literal pools.
252b5132 737
4a6bc624 738@c MMMMMMMMMMMMMMMMMMMMMMMMMM
252b5132 739
4a6bc624
NS
740@cindex @code{.movsp} directive, ARM
741@item .movsp @var{reg} [, #@var{offset}]
742Tell the unwinder that @var{reg} contains an offset from the current
743stack pointer. If @var{offset} is not specified then it is assumed to be
744zero.
7ed4c4c5 745
4a6bc624
NS
746@c NNNNNNNNNNNNNNNNNNNNNNNNNN
747@c OOOOOOOOOOOOOOOOOOOOOOOOOO
7ed4c4c5 748
4a6bc624
NS
749@cindex @code{.object_arch} directive, ARM
750@item .object_arch @var{name}
751Override the architecture recorded in the EABI object attribute section.
752Valid values for @var{name} are the same as for the @code{.arch} directive.
753Typically this is useful when code uses runtime detection of CPU features.
7ed4c4c5 754
4a6bc624
NS
755@c PPPPPPPPPPPPPPPPPPPPPPPPPP
756
757@cindex @code{.packed} directive, ARM
758@item .packed @var{expression} [, @var{expression}]*
759This directive writes 12-byte packed floating-point values to the
760output section. These are not compatible with current ARM processors
761or ABIs.
762
763@cindex @code{.pad} directive, ARM
764@item .pad #@var{count}
765Generate unwinder annotations for a stack adjustment of @var{count} bytes.
766A positive value indicates the function prologue allocated stack space by
767decrementing the stack pointer.
7ed4c4c5
NC
768
769@cindex @code{.personality} directive, ARM
770@item .personality @var{name}
771Sets the personality routine for the current function to @var{name}.
772
773@cindex @code{.personalityindex} directive, ARM
774@item .personalityindex @var{index}
775Sets the personality routine for the current function to the EABI standard
776routine number @var{index}
777
4a6bc624
NS
778@cindex @code{.pool} directive, ARM
779@item .pool
780This is a synonym for .ltorg.
7ed4c4c5 781
4a6bc624
NS
782@c QQQQQQQQQQQQQQQQQQQQQQQQQQ
783@c RRRRRRRRRRRRRRRRRRRRRRRRRR
784
785@cindex @code{.req} directive, ARM
786@item @var{name} .req @var{register name}
787This creates an alias for @var{register name} called @var{name}. For
788example:
789
790@smallexample
791 foo .req r0
792@end smallexample
793
794@c SSSSSSSSSSSSSSSSSSSSSSSSSS
7ed4c4c5 795
7da4f750 796@anchor{arm_save}
7ed4c4c5
NC
797@cindex @code{.save} directive, ARM
798@item .save @var{reglist}
799Generate unwinder annotations to restore the registers in @var{reglist}.
800The format of @var{reglist} is the same as the corresponding store-multiple
801instruction.
802
803@smallexample
804@exdent @emph{core registers}
805 .save @{r4, r5, r6, lr@}
806 stmfd sp!, @{r4, r5, r6, lr@}
807@exdent @emph{FPA registers}
808 .save f4, 2
809 sfmfd f4, 2, [sp]!
810@exdent @emph{VFP registers}
811 .save @{d8, d9, d10@}
fa073d69 812 fstmdx sp!, @{d8, d9, d10@}
7ed4c4c5
NC
813@exdent @emph{iWMMXt registers}
814 .save @{wr10, wr11@}
815 wstrd wr11, [sp, #-8]!
816 wstrd wr10, [sp, #-8]!
817or
818 .save wr11
819 wstrd wr11, [sp, #-8]!
820 .save wr10
821 wstrd wr10, [sp, #-8]!
822@end smallexample
823
7da4f750 824@anchor{arm_setfp}
7ed4c4c5
NC
825@cindex @code{.setfp} directive, ARM
826@item .setfp @var{fpreg}, @var{spreg} [, #@var{offset}]
4a6bc624 827Make all unwinder annotations relative to a frame pointer. Without this
7ed4c4c5
NC
828the unwinder will use offsets from the stack pointer.
829
a5b82cbe 830The syntax of this directive is the same as the @code{add} or @code{mov}
7ed4c4c5
NC
831instruction used to set the frame pointer. @var{spreg} must be either
832@code{sp} or mentioned in a previous @code{.movsp} directive.
833
834@smallexample
835.movsp ip
836mov ip, sp
837@dots{}
838.setfp fp, ip, #4
a5b82cbe 839add fp, ip, #4
7ed4c4c5
NC
840@end smallexample
841
4a6bc624
NS
842@cindex @code{.secrel32} directive, ARM
843@item .secrel32 @var{expression} [, @var{expression}]*
844This directive emits relocations that evaluate to the section-relative
845offset of each expression's symbol. This directive is only supported
846for PE targets.
847
cab7e4d9
NC
848@cindex @code{.syntax} directive, ARM
849@item .syntax [@code{unified} | @code{divided}]
850This directive sets the Instruction Set Syntax as described in the
851@ref{ARM-Instruction-Set} section.
852
4a6bc624
NS
853@c TTTTTTTTTTTTTTTTTTTTTTTTTT
854
855@cindex @code{.thumb} directive, ARM
856@item .thumb
857This performs the same action as @var{.code 16}.
858
859@cindex @code{.thumb_func} directive, ARM
860@item .thumb_func
861This directive specifies that the following symbol is the name of a
862Thumb encoded function. This information is necessary in order to allow
863the assembler and linker to generate correct code for interworking
864between Arm and Thumb instructions and should be used even if
865interworking is not going to be performed. The presence of this
866directive also implies @code{.thumb}
867
868This directive is not neccessary when generating EABI objects. On these
869targets the encoding is implicit when generating Thumb code.
870
871@cindex @code{.thumb_set} directive, ARM
872@item .thumb_set
873This performs the equivalent of a @code{.set} directive in that it
874creates a symbol which is an alias for another symbol (possibly not yet
875defined). This directive also has the added property in that it marks
876the aliased symbol as being a thumb function entry point, in the same
877way that the @code{.thumb_func} directive does.
878
0855e32b
NS
879@cindex @code{.tlsdescseq} directive, ARM
880@item .tlsdescseq @var{tls-variable}
881This directive is used to annotate parts of an inlined TLS descriptor
882trampoline. Normally the trampoline is provided by the linker, and
883this directive is not needed.
884
4a6bc624
NS
885@c UUUUUUUUUUUUUUUUUUUUUUUUUU
886
887@cindex @code{.unreq} directive, ARM
888@item .unreq @var{alias-name}
889This undefines a register alias which was previously defined using the
890@code{req}, @code{dn} or @code{qn} directives. For example:
891
892@smallexample
893 foo .req r0
894 .unreq foo
895@end smallexample
896
897An error occurs if the name is undefined. Note - this pseudo op can
898be used to delete builtin in register name aliases (eg 'r0'). This
899should only be done if it is really necessary.
900
7ed4c4c5 901@cindex @code{.unwind_raw} directive, ARM
4a6bc624 902@item .unwind_raw @var{offset}, @var{byte1}, @dots{}
7ed4c4c5
NC
903Insert one of more arbitary unwind opcode bytes, which are known to adjust
904the stack pointer by @var{offset} bytes.
905
906For example @code{.unwind_raw 4, 0xb1, 0x01} is equivalent to
907@code{.save @{r0@}}
908
4a6bc624 909@c VVVVVVVVVVVVVVVVVVVVVVVVVV
ee065d83 910
4a6bc624
NS
911@cindex @code{.vsave} directive, ARM
912@item .vsave @var{vfp-reglist}
913Generate unwinder annotations to restore the VFP registers in @var{vfp-reglist}
914using FLDMD. Also works for VFPv3 registers
915that are to be restored using VLDM.
916The format of @var{vfp-reglist} is the same as the corresponding store-multiple
917instruction.
ee065d83 918
4a6bc624
NS
919@smallexample
920@exdent @emph{VFP registers}
921 .vsave @{d8, d9, d10@}
922 fstmdd sp!, @{d8, d9, d10@}
923@exdent @emph{VFPv3 registers}
924 .vsave @{d15, d16, d17@}
925 vstm sp!, @{d15, d16, d17@}
926@end smallexample
e04befd0 927
4a6bc624
NS
928Since FLDMX and FSTMX are now deprecated, this directive should be
929used in favour of @code{.save} for saving VFP registers for ARMv6 and above.
e04befd0 930
4a6bc624
NS
931@c WWWWWWWWWWWWWWWWWWWWWWWWWW
932@c XXXXXXXXXXXXXXXXXXXXXXXXXX
933@c YYYYYYYYYYYYYYYYYYYYYYYYYY
934@c ZZZZZZZZZZZZZZZZZZZZZZZZZZ
ee065d83 935
252b5132
RH
936@end table
937
938@node ARM Opcodes
939@section Opcodes
940
941@cindex ARM opcodes
942@cindex opcodes for ARM
49a5575c
NC
943@code{@value{AS}} implements all the standard ARM opcodes. It also
944implements several pseudo opcodes, including several synthetic load
945instructions.
252b5132 946
49a5575c
NC
947@table @code
948
949@cindex @code{NOP} pseudo op, ARM
950@item NOP
951@smallexample
952 nop
953@end smallexample
252b5132 954
49a5575c
NC
955This pseudo op will always evaluate to a legal ARM instruction that does
956nothing. Currently it will evaluate to MOV r0, r0.
252b5132 957
49a5575c
NC
958@cindex @code{LDR reg,=<label>} pseudo op, ARM
959@item LDR
252b5132
RH
960@smallexample
961 ldr <register> , = <expression>
962@end smallexample
963
964If expression evaluates to a numeric constant then a MOV or MVN
965instruction will be used in place of the LDR instruction, if the
966constant can be generated by either of these instructions. Otherwise
967the constant will be placed into the nearest literal pool (if it not
968already there) and a PC relative LDR instruction will be generated.
969
49a5575c
NC
970@cindex @code{ADR reg,<label>} pseudo op, ARM
971@item ADR
972@smallexample
973 adr <register> <label>
974@end smallexample
975
976This instruction will load the address of @var{label} into the indicated
977register. The instruction will evaluate to a PC relative ADD or SUB
978instruction depending upon where the label is located. If the label is
979out of range, or if it is not defined in the same file (and section) as
980the ADR instruction, then an error will be generated. This instruction
981will not make use of the literal pool.
982
983@cindex @code{ADRL reg,<label>} pseudo op, ARM
984@item ADRL
985@smallexample
986 adrl <register> <label>
987@end smallexample
988
989This instruction will load the address of @var{label} into the indicated
a349d9dd 990register. The instruction will evaluate to one or two PC relative ADD
49a5575c
NC
991or SUB instructions depending upon where the label is located. If a
992second instruction is not needed a NOP instruction will be generated in
993its place, so that this instruction is always 8 bytes long.
994
995If the label is out of range, or if it is not defined in the same file
996(and section) as the ADRL instruction, then an error will be generated.
997This instruction will not make use of the literal pool.
998
999@end table
1000
252b5132
RH
1001For information on the ARM or Thumb instruction sets, see @cite{ARM
1002Software Development Toolkit Reference Manual}, Advanced RISC Machines
1003Ltd.
1004
6057a28f
NC
1005@node ARM Mapping Symbols
1006@section Mapping Symbols
1007
1008The ARM ELF specification requires that special symbols be inserted
1009into object files to mark certain features:
1010
1011@table @code
1012
1013@cindex @code{$a}
1014@item $a
1015At the start of a region of code containing ARM instructions.
1016
1017@cindex @code{$t}
1018@item $t
1019At the start of a region of code containing THUMB instructions.
1020
1021@cindex @code{$d}
1022@item $d
1023At the start of a region of data.
1024
1025@end table
1026
1027The assembler will automatically insert these symbols for you - there
1028is no need to code them yourself. Support for tagging symbols ($b,
1029$f, $p and $m) which is also mentioned in the current ARM ELF
1030specification is not implemented. This is because they have been
1031dropped from the new EABI and so tools cannot rely upon their
1032presence.
1033
7da4f750
MM
1034@node ARM Unwinding Tutorial
1035@section Unwinding
1036
1037The ABI for the ARM Architecture specifies a standard format for
1038exception unwind information. This information is used when an
1039exception is thrown to determine where control should be transferred.
1040In particular, the unwind information is used to determine which
1041function called the function that threw the exception, and which
1042function called that one, and so forth. This information is also used
1043to restore the values of callee-saved registers in the function
1044catching the exception.
1045
1046If you are writing functions in assembly code, and those functions
1047call other functions that throw exceptions, you must use assembly
1048pseudo ops to ensure that appropriate exception unwind information is
1049generated. Otherwise, if one of the functions called by your assembly
1050code throws an exception, the run-time library will be unable to
1051unwind the stack through your assembly code and your program will not
1052behave correctly.
1053
1054To illustrate the use of these pseudo ops, we will examine the code
1055that G++ generates for the following C++ input:
1056
1057@verbatim
1058void callee (int *);
1059
1060int
1061caller ()
1062{
1063 int i;
1064 callee (&i);
1065 return i;
1066}
1067@end verbatim
1068
1069This example does not show how to throw or catch an exception from
1070assembly code. That is a much more complex operation and should
1071always be done in a high-level language, such as C++, that directly
1072supports exceptions.
1073
1074The code generated by one particular version of G++ when compiling the
1075example above is:
1076
1077@verbatim
1078_Z6callerv:
1079 .fnstart
1080.LFB2:
1081 @ Function supports interworking.
1082 @ args = 0, pretend = 0, frame = 8
1083 @ frame_needed = 1, uses_anonymous_args = 0
1084 stmfd sp!, {fp, lr}
1085 .save {fp, lr}
1086.LCFI0:
1087 .setfp fp, sp, #4
1088 add fp, sp, #4
1089.LCFI1:
1090 .pad #8
1091 sub sp, sp, #8
1092.LCFI2:
1093 sub r3, fp, #8
1094 mov r0, r3
1095 bl _Z6calleePi
1096 ldr r3, [fp, #-8]
1097 mov r0, r3
1098 sub sp, fp, #4
1099 ldmfd sp!, {fp, lr}
1100 bx lr
1101.LFE2:
1102 .fnend
1103@end verbatim
1104
1105Of course, the sequence of instructions varies based on the options
1106you pass to GCC and on the version of GCC in use. The exact
1107instructions are not important since we are focusing on the pseudo ops
1108that are used to generate unwind information.
1109
1110An important assumption made by the unwinder is that the stack frame
1111does not change during the body of the function. In particular, since
1112we assume that the assembly code does not itself throw an exception,
1113the only point where an exception can be thrown is from a call, such
1114as the @code{bl} instruction above. At each call site, the same saved
1115registers (including @code{lr}, which indicates the return address)
1116must be located in the same locations relative to the frame pointer.
1117
1118The @code{.fnstart} (@pxref{arm_fnstart,,.fnstart pseudo op}) pseudo
1119op appears immediately before the first instruction of the function
1120while the @code{.fnend} (@pxref{arm_fnend,,.fnend pseudo op}) pseudo
1121op appears immediately after the last instruction of the function.
1122These pseudo ops specify the range of the function.
1123
1124Only the order of the other pseudos ops (e.g., @code{.setfp} or
1125@code{.pad}) matters; their exact locations are irrelevant. In the
1126example above, the compiler emits the pseudo ops with particular
1127instructions. That makes it easier to understand the code, but it is
1128not required for correctness. It would work just as well to emit all
1129of the pseudo ops other than @code{.fnend} in the same order, but
1130immediately after @code{.fnstart}.
1131
1132The @code{.save} (@pxref{arm_save,,.save pseudo op}) pseudo op
1133indicates registers that have been saved to the stack so that they can
1134be restored before the function returns. The argument to the
1135@code{.save} pseudo op is a list of registers to save. If a register
1136is ``callee-saved'' (as specified by the ABI) and is modified by the
1137function you are writing, then your code must save the value before it
1138is modified and restore the original value before the function
1139returns. If an exception is thrown, the run-time library restores the
1140values of these registers from their locations on the stack before
1141returning control to the exception handler. (Of course, if an
1142exception is not thrown, the function that contains the @code{.save}
1143pseudo op restores these registers in the function epilogue, as is
1144done with the @code{ldmfd} instruction above.)
1145
1146You do not have to save callee-saved registers at the very beginning
1147of the function and you do not need to use the @code{.save} pseudo op
1148immediately following the point at which the registers are saved.
1149However, if you modify a callee-saved register, you must save it on
1150the stack before modifying it and before calling any functions which
1151might throw an exception. And, you must use the @code{.save} pseudo
1152op to indicate that you have done so.
1153
1154The @code{.pad} (@pxref{arm_pad,,.pad}) pseudo op indicates a
1155modification of the stack pointer that does not save any registers.
1156The argument is the number of bytes (in decimal) that are subtracted
1157from the stack pointer. (On ARM CPUs, the stack grows downwards, so
1158subtracting from the stack pointer increases the size of the stack.)
1159
1160The @code{.setfp} (@pxref{arm_setfp,,.setfp pseudo op}) pseudo op
1161indicates the register that contains the frame pointer. The first
1162argument is the register that is set, which is typically @code{fp}.
1163The second argument indicates the register from which the frame
1164pointer takes its value. The third argument, if present, is the value
1165(in decimal) added to the register specified by the second argument to
1166compute the value of the frame pointer. You should not modify the
1167frame pointer in the body of the function.
1168
1169If you do not use a frame pointer, then you should not use the
1170@code{.setfp} pseudo op. If you do not use a frame pointer, then you
1171should avoid modifying the stack pointer outside of the function
1172prologue. Otherwise, the run-time library will be unable to find
1173saved registers when it is unwinding the stack.
1174
1175The pseudo ops described above are sufficient for writing assembly
1176code that calls functions which may throw exceptions. If you need to
1177know more about the object-file format used to represent unwind
1178information, you may consult the @cite{Exception Handling ABI for the
1179ARM Architecture} available from @uref{http://infocenter.arm.com}.
This page took 0.661704 seconds and 4 git commands to generate.