]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/doc/c-arm.texi
Remove redundant returns in void functions.
[thirdparty/binutils-gdb.git] / gas / doc / c-arm.texi
CommitLineData
0bbf2aa4 1@c Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003
f7e42eb4 2@c Free Software Foundation, Inc.
252b5132
RH
3@c This is part of the GAS manual.
4@c For copying conditions, see the file as.texinfo.
5
6@ifset GENERIC
7@page
8@node ARM-Dependent
9@chapter ARM Dependent Features
10@end ifset
11
12@ifclear GENERIC
13@node Machine Dependencies
14@chapter ARM Dependent Features
15@end ifclear
16
17@cindex ARM support
18@cindex Thumb support
19@menu
20* ARM Options:: Options
21* ARM Syntax:: Syntax
22* ARM Floating Point:: Floating Point
23* ARM Directives:: ARM Machine Directives
24* ARM Opcodes:: Opcodes
6057a28f 25* ARM Mapping Symbols:: Mapping Symbols
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
RE
39will not execute on the target processor. The following processor names are
40recognized:
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},
70@code{arm8},
71@code{arm810},
72@code{strongarm},
73@code{strongarm1},
74@code{strongarm110},
75@code{strongarm1100},
76@code{strongarm1110},
77@code{arm9},
78@code{arm920},
79@code{arm920t},
80@code{arm922t},
81@code{arm940t},
82@code{arm9tdmi},
83@code{arm9e},
84@code{arm946e-r0},
85@code{arm946e},
86@code{arm966e-r0},
87@code{arm966e},
88@code{arm10t},
89@code{arm10e},
90@code{arm1020},
91@code{arm1020t},
92@code{arm1020e},
09d92015
MM
93@code{arm1136js},
94@code{arm1136jfs},
03b1477f
RE
95@code{ep9312} (ARM920 with Cirrus Maverick coprocessor),
96@code{i80200} (Intel XScale processor)
e16bb312 97@code{iwmmxt} (Intel(r) XScale processor with Wireless MMX(tm) technology coprocessor)
03b1477f
RE
98and
99@code{xscale}.
100The special name @code{all} may be used to allow the
101assembler to accept instructions valid for any ARM processor.
102
103In addition to the basic instruction set, the assembler can be told to
104accept various extension mnemonics that extend the processor using the
105co-processor instruction space. For example, @code{-mcpu=arm920+maverick}
106is equivalent to specifying @code{-mcpu=ep9312}. The following extensions
107are currently supported:
108@code{+maverick}
e16bb312 109@code{+iwmmxt}
03b1477f
RE
110and
111@code{+xscale}.
112
113@cindex @code{-march=} command line option, ARM
92081f48 114@item -march=@var{architecture}[+@var{extension}@dots{}]
252b5132
RH
115This option specifies the target architecture. The assembler will issue
116an error message if an attempt is made to assemble an instruction which
03b1477f
RE
117will not execute on the target architecture. The following architecture
118names are recognized:
119@code{armv1},
120@code{armv2},
121@code{armv2a},
122@code{armv2s},
123@code{armv3},
124@code{armv3m},
125@code{armv4},
126@code{armv4xm},
127@code{armv4t},
128@code{armv4txm},
129@code{armv5},
130@code{armv5t},
131@code{armv5txm},
132@code{armv5te},
09d92015
MM
133@code{armv5texp},
134@code{armv6},
e16bb312 135@code{iwmmxt}
03b1477f
RE
136and
137@code{xscale}.
138If both @code{-mcpu} and
139@code{-march} are specified, the assembler will use
140the setting for @code{-mcpu}.
141
142The architecture option can be extended with the same instruction set
143extension options as the @code{-mcpu} option.
144
145@cindex @code{-mfpu=} command line option, ARM
146@item -mfpu=@var{floating-point-format}
147
148This option specifies the floating point format to assemble for. The
149assembler will issue an error message if an attempt is made to assemble
150an instruction which will not execute on the target floating point unit.
151The following format options are recognized:
152@code{softfpa},
153@code{fpe},
bc89618b
RE
154@code{fpe2},
155@code{fpe3},
03b1477f
RE
156@code{fpa},
157@code{fpa10},
158@code{fpa11},
159@code{arm7500fe},
160@code{softvfp},
161@code{softvfp+vfp},
162@code{vfp},
163@code{vfp10},
164@code{vfp10-r0},
165@code{vfp9},
166@code{vfpxd},
09d92015
MM
167@code{arm1020t},
168@code{arm1020e},
03b1477f 169and
09d92015 170@code{arm1136jfs}.
03b1477f
RE
171
172In addition to determining which instructions are assembled, this option
173also affects the way in which the @code{.double} assembler directive behaves
174when assembling little-endian code.
175
176The default is dependent on the processor selected. For Architecture 5 or
177later, the default is to assembler for VFP instructions; for earlier
178architectures the default is to assemble for FPA instructions.
adcf07e6 179
252b5132
RH
180@cindex @code{-mthumb} command line option, ARM
181@item -mthumb
03b1477f
RE
182This option specifies that the assembler should start assembling Thumb
183instructions; that is, it should behave as though the file starts with a
184@code{.code 16} directive.
adcf07e6 185
252b5132
RH
186@cindex @code{-mthumb-interwork} command line option, ARM
187@item -mthumb-interwork
188This option specifies that the output generated by the assembler should
189be marked as supporting interworking.
adcf07e6 190
252b5132 191@cindex @code{-mapcs} command line option, ARM
0ac658b8 192@item -mapcs @code{[26|32]}
252b5132
RH
193This option specifies that the output generated by the assembler should
194be marked as supporting the indicated version of the Arm Procedure.
195Calling Standard.
adcf07e6 196
077b8428
NC
197@cindex @code{-matpcs} command line option, ARM
198@item -matpcs
199This option specifies that the output generated by the assembler should
200be marked as supporting the Arm/Thumb Procedure Calling Standard. If
201enabled this option will cause the assembler to create an empty
202debugging section in the object file called .arm.atpcs. Debuggers can
203use this to determine the ABI being used by.
204
adcf07e6 205@cindex @code{-mapcs-float} command line option, ARM
252b5132 206@item -mapcs-float
1be59579 207This indicates the floating point variant of the APCS should be
252b5132 208used. In this variant floating point arguments are passed in FP
550262c4 209registers rather than integer registers.
adcf07e6
NC
210
211@cindex @code{-mapcs-reentrant} command line option, ARM
252b5132
RH
212@item -mapcs-reentrant
213This indicates that the reentrant variant of the APCS should be used.
214This variant supports position independent code.
adcf07e6 215
252b5132
RH
216@cindex @code{-EB} command line option, ARM
217@item -EB
218This option specifies that the output generated by the assembler should
219be marked as being encoded for a big-endian processor.
adcf07e6 220
252b5132
RH
221@cindex @code{-EL} command line option, ARM
222@item -EL
223This option specifies that the output generated by the assembler should
224be marked as being encoded for a little-endian processor.
adcf07e6 225
252b5132
RH
226@cindex @code{-k} command line option, ARM
227@cindex PIC code generation for ARM
228@item -k
a349d9dd
PB
229This option specifies that the output of the assembler should be marked
230as position-independent code (PIC).
adcf07e6
NC
231
232@cindex @code{-moabi} command line option, ARM
252b5132
RH
233@item -moabi
234This indicates that the code should be assembled using the old ARM ELF
235conventions, based on a beta release release of the ARM-ELF
236specifications, rather than the default conventions which are based on
237the final release of the ARM-ELF specifications.
adcf07e6 238
252b5132
RH
239@end table
240
241
242@node ARM Syntax
243@section Syntax
244@menu
245* ARM-Chars:: Special Characters
246* ARM-Regs:: Register Names
247@end menu
248
249@node ARM-Chars
250@subsection Special Characters
251
252@cindex line comment character, ARM
253@cindex ARM line comment character
550262c4
NC
254The presence of a @samp{@@} on a line indicates the start of a comment
255that extends to the end of the current line. If a @samp{#} appears as
256the first character of a line, the whole line is treated as a comment.
257
258@cindex line separator, ARM
259@cindex statement separator, ARM
260@cindex ARM line separator
a349d9dd
PB
261The @samp{;} character can be used instead of a newline to separate
262statements.
550262c4
NC
263
264@cindex immediate character, ARM
265@cindex ARM immediate character
266Either @samp{#} or @samp{$} can be used to indicate immediate operands.
252b5132
RH
267
268@cindex identifiers, ARM
269@cindex ARM identifiers
270*TODO* Explain about /data modifier on symbols.
271
272@node ARM-Regs
273@subsection Register Names
274
275@cindex ARM register names
276@cindex register names, ARM
277*TODO* Explain about ARM register naming, and the predefined names.
278
279@node ARM Floating Point
280@section Floating Point
281
282@cindex floating point, ARM (@sc{ieee})
283@cindex ARM floating point (@sc{ieee})
284The ARM family uses @sc{ieee} floating-point numbers.
285
286
287
288@node ARM Directives
289@section ARM Machine Directives
290
291@cindex machine directives, ARM
292@cindex ARM machine directives
293@table @code
294
adcf07e6
NC
295@cindex @code{align} directive, ARM
296@item .align @var{expression} [, @var{expression}]
297This is the generic @var{.align} directive. For the ARM however if the
298first argument is zero (ie no alignment is needed) the assembler will
299behave as if the argument had been 2 (ie pad to the next four byte
062b7c0c 300boundary). This is for compatibility with ARM's own assembler.
adcf07e6 301
252b5132
RH
302@cindex @code{req} directive, ARM
303@item @var{name} .req @var{register name}
304This creates an alias for @var{register name} called @var{name}. For
305example:
306
307@smallexample
308 foo .req r0
309@end smallexample
310
0bbf2aa4
NC
311@cindex @code{unreq} directive, ARM
312@item .unreq @var{alias-name}
313This undefines a register alias which was previously defined using the
314@code{req} directive. For example:
315
316@smallexample
317 foo .req r0
318 .unreq foo
319@end smallexample
320
321An error occurs if the name is undefined. Note - this pseudo op can
322be used to delete builtin in register name aliases (eg 'r0'). This
323should only be done if it is really necessary.
324
252b5132 325@cindex @code{code} directive, ARM
0ac658b8 326@item .code @code{[16|32]}
252b5132
RH
327This directive selects the instruction set being generated. The value 16
328selects Thumb, with the value 32 selecting ARM.
329
330@cindex @code{thumb} directive, ARM
331@item .thumb
332This performs the same action as @var{.code 16}.
333
334@cindex @code{arm} directive, ARM
335@item .arm
336This performs the same action as @var{.code 32}.
337
338@cindex @code{force_thumb} directive, ARM
339@item .force_thumb
340This directive forces the selection of Thumb instructions, even if the
341target processor does not support those instructions
342
343@cindex @code{thumb_func} directive, ARM
344@item .thumb_func
345This directive specifies that the following symbol is the name of a
346Thumb encoded function. This information is necessary in order to allow
347the assembler and linker to generate correct code for interworking
348between Arm and Thumb instructions and should be used even if
1994a7c7
NC
349interworking is not going to be performed. The presence of this
350directive also implies @code{.thumb}
252b5132 351
5395a469
NC
352@cindex @code{thumb_set} directive, ARM
353@item .thumb_set
354This performs the equivalent of a @code{.set} directive in that it
355creates a symbol which is an alias for another symbol (possibly not yet
356defined). This directive also has the added property in that it marks
357the aliased symbol as being a thumb function entry point, in the same
358way that the @code{.thumb_func} directive does.
359
252b5132
RH
360@cindex @code{.ltorg} directive, ARM
361@item .ltorg
362This directive causes the current contents of the literal pool to be
363dumped into the current section (which is assumed to be the .text
364section) at the current location (aligned to a word boundary).
3d0c9500
NC
365@code{GAS} maintains a separate literal pool for each section and each
366sub-section. The @code{.ltorg} directive will only affect the literal
367pool of the current section and sub-section. At the end of assembly
368all remaining, un-empty literal pools will automatically be dumped.
369
370Note - older versions of @code{GAS} would dump the current literal
371pool any time a section change occurred. This is no longer done, since
372it prevents accurate control of the placement of literal pools.
252b5132
RH
373
374@cindex @code{.pool} directive, ARM
375@item .pool
376This is a synonym for .ltorg.
377
378@end table
379
380@node ARM Opcodes
381@section Opcodes
382
383@cindex ARM opcodes
384@cindex opcodes for ARM
49a5575c
NC
385@code{@value{AS}} implements all the standard ARM opcodes. It also
386implements several pseudo opcodes, including several synthetic load
387instructions.
252b5132 388
49a5575c
NC
389@table @code
390
391@cindex @code{NOP} pseudo op, ARM
392@item NOP
393@smallexample
394 nop
395@end smallexample
252b5132 396
49a5575c
NC
397This pseudo op will always evaluate to a legal ARM instruction that does
398nothing. Currently it will evaluate to MOV r0, r0.
252b5132 399
49a5575c
NC
400@cindex @code{LDR reg,=<label>} pseudo op, ARM
401@item LDR
252b5132
RH
402@smallexample
403 ldr <register> , = <expression>
404@end smallexample
405
406If expression evaluates to a numeric constant then a MOV or MVN
407instruction will be used in place of the LDR instruction, if the
408constant can be generated by either of these instructions. Otherwise
409the constant will be placed into the nearest literal pool (if it not
410already there) and a PC relative LDR instruction will be generated.
411
49a5575c
NC
412@cindex @code{ADR reg,<label>} pseudo op, ARM
413@item ADR
414@smallexample
415 adr <register> <label>
416@end smallexample
417
418This instruction will load the address of @var{label} into the indicated
419register. The instruction will evaluate to a PC relative ADD or SUB
420instruction depending upon where the label is located. If the label is
421out of range, or if it is not defined in the same file (and section) as
422the ADR instruction, then an error will be generated. This instruction
423will not make use of the literal pool.
424
425@cindex @code{ADRL reg,<label>} pseudo op, ARM
426@item ADRL
427@smallexample
428 adrl <register> <label>
429@end smallexample
430
431This instruction will load the address of @var{label} into the indicated
a349d9dd 432register. The instruction will evaluate to one or two PC relative ADD
49a5575c
NC
433or SUB instructions depending upon where the label is located. If a
434second instruction is not needed a NOP instruction will be generated in
435its place, so that this instruction is always 8 bytes long.
436
437If the label is out of range, or if it is not defined in the same file
438(and section) as the ADRL instruction, then an error will be generated.
439This instruction will not make use of the literal pool.
440
441@end table
442
252b5132
RH
443For information on the ARM or Thumb instruction sets, see @cite{ARM
444Software Development Toolkit Reference Manual}, Advanced RISC Machines
445Ltd.
446
6057a28f
NC
447@node ARM Mapping Symbols
448@section Mapping Symbols
449
450The ARM ELF specification requires that special symbols be inserted
451into object files to mark certain features:
452
453@table @code
454
455@cindex @code{$a}
456@item $a
457At the start of a region of code containing ARM instructions.
458
459@cindex @code{$t}
460@item $t
461At the start of a region of code containing THUMB instructions.
462
463@cindex @code{$d}
464@item $d
465At the start of a region of data.
466
467@end table
468
469The assembler will automatically insert these symbols for you - there
470is no need to code them yourself. Support for tagging symbols ($b,
471$f, $p and $m) which is also mentioned in the current ARM ELF
472specification is not implemented. This is because they have been
473dropped from the new EABI and so tools cannot rely upon their
474presence.
475