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