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