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