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