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