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