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