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