2014-03-05 19:46:15 +08:00
|
|
|
@c Copyright (C) 2009-2014 Free Software Foundation, Inc.
|
2012-08-13 22:52:54 +08:00
|
|
|
@c Contributed by ARM Ltd.
|
|
|
|
@c This is part of the GAS manual.
|
|
|
|
@c For copying conditions, see the file as.texinfo.
|
|
|
|
@c man end
|
|
|
|
|
|
|
|
@ifset GENERIC
|
|
|
|
@page
|
|
|
|
@node AArch64-Dependent
|
|
|
|
@chapter AArch64 Dependent Features
|
|
|
|
@end ifset
|
|
|
|
|
|
|
|
@ifclear GENERIC
|
|
|
|
@node Machine Dependencies
|
|
|
|
@chapter AArch64 Dependent Features
|
|
|
|
@end ifclear
|
|
|
|
|
|
|
|
@cindex AArch64 support
|
|
|
|
@menu
|
|
|
|
* AArch64 Options:: Options
|
2014-03-14 01:10:04 +08:00
|
|
|
* AArch64 Extensions:: Extensions
|
2012-08-13 22:52:54 +08:00
|
|
|
* AArch64 Syntax:: Syntax
|
|
|
|
* AArch64 Floating Point:: Floating Point
|
|
|
|
* AArch64 Directives:: AArch64 Machine Directives
|
|
|
|
* AArch64 Opcodes:: Opcodes
|
|
|
|
* AArch64 Mapping Symbols:: Mapping Symbols
|
|
|
|
@end menu
|
|
|
|
|
|
|
|
@node AArch64 Options
|
|
|
|
@section Options
|
|
|
|
@cindex AArch64 options (none)
|
|
|
|
@cindex options for AArch64 (none)
|
|
|
|
|
|
|
|
@c man begin OPTIONS
|
|
|
|
@table @gcctabopt
|
|
|
|
|
2014-03-14 01:10:04 +08:00
|
|
|
@cindex @option{-EB} command line option, AArch64
|
2012-08-13 22:52:54 +08:00
|
|
|
@item -EB
|
|
|
|
This option specifies that the output generated by the assembler should
|
|
|
|
be marked as being encoded for a big-endian processor.
|
|
|
|
|
2014-03-14 01:10:04 +08:00
|
|
|
@cindex @option{-EL} command line option, AArch64
|
2012-08-13 22:52:54 +08:00
|
|
|
@item -EL
|
|
|
|
This option specifies that the output generated by the assembler should
|
|
|
|
be marked as being encoded for a little-endian processor.
|
|
|
|
|
2014-03-14 01:10:04 +08:00
|
|
|
@cindex @option{-mabi=} command line option, AArch64
|
2013-07-20 00:25:54 +08:00
|
|
|
@item -mabi=@var{abi}
|
|
|
|
Specify which ABI the source code uses. The recognized arguments
|
|
|
|
are: @code{ilp32} and @code{lp64}, which decides the generated object
|
|
|
|
file in ELF32 and ELF64 format respectively. The default is @code{lp64}.
|
|
|
|
|
2014-03-14 01:10:04 +08:00
|
|
|
@cindex @option{-mcpu=} command line option, AArch64
|
|
|
|
@item -mcpu=@var{processor}[+@var{extension}@dots{}]
|
|
|
|
This option specifies the target processor. The assembler will issue an error
|
|
|
|
message if an attempt is made to assemble an instruction which will not execute
|
|
|
|
on the target processor. The following processor names are recognized:
|
|
|
|
@code{cortex-a53},
|
|
|
|
@code{cortex-a57},
|
|
|
|
and
|
|
|
|
@code{xgene-1}.
|
|
|
|
The special name @code{all} may be used to allow the assembler to accept
|
|
|
|
instructions valid for any supported processor, including all optional
|
|
|
|
extensions.
|
|
|
|
|
|
|
|
In addition to the basic instruction set, the assembler can be told to
|
|
|
|
accept, or restrict, various extension mnemonics that extend the
|
|
|
|
processor. @xref{AArch64 Extensions}.
|
|
|
|
|
|
|
|
If some implementations of a particular processor can have an
|
|
|
|
extension, then then those extensions are automatically enabled.
|
|
|
|
Consequently, you will not normally have to specify any additional
|
|
|
|
extensions.
|
|
|
|
|
|
|
|
@cindex @option{-march=} command line option, AArch64
|
|
|
|
@item -march=@var{architecture}[+@var{extension}@dots{}]
|
|
|
|
This option specifies the target architecture. The assembler will
|
|
|
|
issue an error message if an attempt is made to assemble an
|
|
|
|
instruction which will not execute on the target architecture. The
|
|
|
|
only value for @var{architecture} is @code{armv8-a}.
|
|
|
|
|
|
|
|
If both @option{-mcpu} and @option{-march} are specified, the
|
|
|
|
assembler will use the setting for @option{-mcpu}. If neither are
|
|
|
|
specified, the assembler will default to @option{-mcpu=all}.
|
|
|
|
|
|
|
|
The architecture option can be extended with the same instruction set
|
|
|
|
extension options as the @option{-mcpu} option. Unlike
|
|
|
|
@option{-mcpu}, extensions are not always enabled by default,
|
|
|
|
@xref{AArch64 Extensions}.
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
@end table
|
|
|
|
@c man end
|
|
|
|
|
2014-03-14 01:10:04 +08:00
|
|
|
@node AArch64 Extensions
|
|
|
|
@section Architecture Extensions
|
|
|
|
|
|
|
|
The table below lists the permitted architecture extensions that are
|
|
|
|
supported by the assembler and the conditions under which they are
|
|
|
|
automatically enabled.
|
|
|
|
|
|
|
|
Multiple extensions may be specified, separated by a @code{+}.
|
|
|
|
Extension mnemonics may also be removed from those the assembler
|
|
|
|
accepts. This is done by prepending @code{no} to the option that adds
|
|
|
|
the extension. Extensions that are removed must be listed after all
|
|
|
|
extensions that have been added.
|
|
|
|
|
|
|
|
Enabling an extension that requires other extensions will
|
|
|
|
automatically cause those extensions to be enabled. Similarly,
|
|
|
|
disabling an extension that is required by other extensions will
|
|
|
|
automatically cause those extensions to be disabled.
|
|
|
|
|
|
|
|
@multitable @columnfractions .12 .17 .17 .54
|
|
|
|
@headitem Extension @tab Minimum Architecture @tab Enabled by default
|
|
|
|
@tab Description
|
|
|
|
@item @code{crc} @tab ARMv8-A @tab No
|
|
|
|
@tab Enable CRC instructions.
|
|
|
|
@item @code{crypto} @tab ARMv8-A @tab No
|
|
|
|
@tab Enable cryptographic extensions. This implies @code{fp} and @code{simd}.
|
|
|
|
@item @code{fp} @tab ARMv8-A @tab ARMv8-A or later
|
|
|
|
@tab Enable floating-point extensions.
|
|
|
|
@item @code{simd} @tab ARMv8-A @tab ARMv8-A or later
|
|
|
|
@tab Enable Advanced SIMD extensions. This implies @code{fp}.
|
|
|
|
@end multitable
|
|
|
|
|
2012-08-13 22:52:54 +08:00
|
|
|
@node AArch64 Syntax
|
|
|
|
@section Syntax
|
|
|
|
@menu
|
|
|
|
* AArch64-Chars:: Special Characters
|
|
|
|
* AArch64-Regs:: Register Names
|
|
|
|
* AArch64-Relocations:: Relocations
|
|
|
|
@end menu
|
|
|
|
|
|
|
|
@node AArch64-Chars
|
|
|
|
@subsection Special Characters
|
|
|
|
|
|
|
|
@cindex line comment character, AArch64
|
|
|
|
@cindex AArch64 line comment character
|
|
|
|
The presence of a @samp{//} on a line indicates the start of a comment
|
|
|
|
that extends to the end of the current line. If a @samp{#} appears as
|
|
|
|
the first character of a line, the whole line is treated as a comment.
|
|
|
|
|
|
|
|
@cindex line separator, AArch64
|
|
|
|
@cindex statement separator, AArch64
|
|
|
|
@cindex AArch64 line separator
|
|
|
|
The @samp{;} character can be used instead of a newline to separate
|
|
|
|
statements.
|
|
|
|
|
|
|
|
@cindex immediate character, AArch64
|
|
|
|
@cindex AArch64 immediate character
|
|
|
|
The @samp{#} can be optionally used to indicate immediate operands.
|
|
|
|
|
|
|
|
@node AArch64-Regs
|
|
|
|
@subsection Register Names
|
|
|
|
|
|
|
|
@cindex AArch64 register names
|
|
|
|
@cindex register names, AArch64
|
|
|
|
Please refer to the section @samp{4.4 Register Names} of
|
|
|
|
@samp{ARMv8 Instruction Set Overview}, which is available at
|
|
|
|
@uref{http://infocenter.arm.com}.
|
|
|
|
|
|
|
|
@node AArch64-Relocations
|
|
|
|
@subsection Relocations
|
|
|
|
|
|
|
|
@cindex relocations, AArch64
|
|
|
|
@cindex AArch64 relocations
|
|
|
|
@cindex MOVN, MOVZ and MOVK group relocations, AArch64
|
|
|
|
Relocations for @samp{MOVZ} and @samp{MOVK} instructions can be generated
|
|
|
|
by prefixing the label with @samp{#:abs_g2:} etc.
|
|
|
|
For example to load the 48-bit absolute address of @var{foo} into x0:
|
|
|
|
|
|
|
|
@smallexample
|
|
|
|
movz x0, #:abs_g2:foo // bits 32-47, overflow check
|
|
|
|
movk x0, #:abs_g1_nc:foo // bits 16-31, no overflow check
|
|
|
|
movk x0, #:abs_g0_nc:foo // bits 0-15, no overflow check
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
@cindex ADRP, ADD, LDR/STR group relocations, AArch64
|
|
|
|
Relocations for @samp{ADRP}, and @samp{ADD}, @samp{LDR} or @samp{STR}
|
|
|
|
instructions can be generated by prefixing the label with
|
|
|
|
@samp{#:pg_hi21:} and @samp{#:lo12:} respectively.
|
|
|
|
|
2013-01-11 03:51:55 +08:00
|
|
|
For example to use 33-bit (+/-4GB) pc-relative addressing to
|
2012-08-13 22:52:54 +08:00
|
|
|
load the address of @var{foo} into x0:
|
|
|
|
|
|
|
|
@smallexample
|
|
|
|
adrp x0, #:pg_hi21:foo
|
|
|
|
add x0, x0, #:lo12:foo
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
Or to load the value of @var{foo} into x0:
|
|
|
|
|
|
|
|
@smallexample
|
|
|
|
adrp x0, #:pg_hi21:foo
|
|
|
|
ldr x0, [x0, #:lo12:foo]
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
Note that @samp{#:pg_hi21:} is optional.
|
|
|
|
|
|
|
|
@smallexample
|
|
|
|
adrp x0, foo
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
is equivalent to
|
|
|
|
|
|
|
|
@smallexample
|
|
|
|
adrp x0, #:pg_hi21:foo
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
@node AArch64 Floating Point
|
|
|
|
@section Floating Point
|
|
|
|
|
|
|
|
@cindex floating point, AArch64 (@sc{ieee})
|
|
|
|
@cindex AArch64 floating point (@sc{ieee})
|
|
|
|
The AArch64 architecture uses @sc{ieee} floating-point numbers.
|
|
|
|
|
|
|
|
@node AArch64 Directives
|
|
|
|
@section AArch64 Machine Directives
|
|
|
|
|
|
|
|
@cindex machine directives, AArch64
|
|
|
|
@cindex AArch64 machine directives
|
|
|
|
@table @code
|
|
|
|
|
|
|
|
@c AAAAAAAAAAAAAAAAAAAAAAAAA
|
|
|
|
@c BBBBBBBBBBBBBBBBBBBBBBBBBB
|
|
|
|
|
|
|
|
@cindex @code{.bss} directive, AArch64
|
|
|
|
@item .bss
|
|
|
|
This directive switches to the @code{.bss} section.
|
|
|
|
|
|
|
|
@c CCCCCCCCCCCCCCCCCCCCCCCCCC
|
|
|
|
@c DDDDDDDDDDDDDDDDDDDDDDDDDD
|
|
|
|
@c EEEEEEEEEEEEEEEEEEEEEEEEEE
|
|
|
|
@c FFFFFFFFFFFFFFFFFFFFFFFFFF
|
|
|
|
@c GGGGGGGGGGGGGGGGGGGGGGGGGG
|
|
|
|
@c HHHHHHHHHHHHHHHHHHHHHHHHHH
|
|
|
|
@c IIIIIIIIIIIIIIIIIIIIIIIIII
|
|
|
|
@c JJJJJJJJJJJJJJJJJJJJJJJJJJ
|
|
|
|
@c KKKKKKKKKKKKKKKKKKKKKKKKKK
|
|
|
|
@c LLLLLLLLLLLLLLLLLLLLLLLLLL
|
|
|
|
|
|
|
|
@cindex @code{.ltorg} directive, AArch64
|
|
|
|
@item .ltorg
|
|
|
|
This directive causes the current contents of the literal pool to be
|
|
|
|
dumped into the current section (which is assumed to be the .text
|
|
|
|
section) at the current location (aligned to a word boundary).
|
2014-03-14 01:10:04 +08:00
|
|
|
GAS maintains a separate literal pool for each section and each
|
2012-08-13 22:52:54 +08:00
|
|
|
sub-section. The @code{.ltorg} directive will only affect the literal
|
|
|
|
pool of the current section and sub-section. At the end of assembly
|
|
|
|
all remaining, un-empty literal pools will automatically be dumped.
|
|
|
|
|
2014-03-14 01:10:04 +08:00
|
|
|
Note - older versions of GAS would dump the current literal
|
2012-08-13 22:52:54 +08:00
|
|
|
pool any time a section change occurred. This is no longer done, since
|
|
|
|
it prevents accurate control of the placement of literal pools.
|
|
|
|
|
|
|
|
@c MMMMMMMMMMMMMMMMMMMMMMMMMM
|
|
|
|
|
|
|
|
@c NNNNNNNNNNNNNNNNNNNNNNNNNN
|
|
|
|
@c OOOOOOOOOOOOOOOOOOOOOOOOOO
|
|
|
|
|
|
|
|
@c PPPPPPPPPPPPPPPPPPPPPPPPPP
|
|
|
|
|
|
|
|
@cindex @code{.pool} directive, AArch64
|
|
|
|
@item .pool
|
|
|
|
This is a synonym for .ltorg.
|
|
|
|
|
|
|
|
@c QQQQQQQQQQQQQQQQQQQQQQQQQQ
|
|
|
|
@c RRRRRRRRRRRRRRRRRRRRRRRRRR
|
|
|
|
|
|
|
|
@cindex @code{.req} directive, AArch64
|
|
|
|
@item @var{name} .req @var{register name}
|
|
|
|
This creates an alias for @var{register name} called @var{name}. For
|
|
|
|
example:
|
|
|
|
|
|
|
|
@smallexample
|
|
|
|
foo .req w0
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
@c SSSSSSSSSSSSSSSSSSSSSSSSSS
|
|
|
|
|
|
|
|
@c TTTTTTTTTTTTTTTTTTTTTTTTTT
|
|
|
|
|
|
|
|
@c UUUUUUUUUUUUUUUUUUUUUUUUUU
|
|
|
|
|
|
|
|
@cindex @code{.unreq} directive, AArch64
|
|
|
|
@item .unreq @var{alias-name}
|
|
|
|
This undefines a register alias which was previously defined using the
|
|
|
|
@code{req} directive. For example:
|
|
|
|
|
|
|
|
@smallexample
|
|
|
|
foo .req w0
|
|
|
|
.unreq foo
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
An error occurs if the name is undefined. Note - this pseudo op can
|
|
|
|
be used to delete builtin in register name aliases (eg 'w0'). This
|
|
|
|
should only be done if it is really necessary.
|
|
|
|
|
|
|
|
@c VVVVVVVVVVVVVVVVVVVVVVVVVV
|
|
|
|
|
|
|
|
@c WWWWWWWWWWWWWWWWWWWWWWWWWW
|
|
|
|
@c XXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
|
|
@c YYYYYYYYYYYYYYYYYYYYYYYYYY
|
|
|
|
@c ZZZZZZZZZZZZZZZZZZZZZZZZZZ
|
|
|
|
|
|
|
|
@end table
|
|
|
|
|
|
|
|
@node AArch64 Opcodes
|
|
|
|
@section Opcodes
|
|
|
|
|
|
|
|
@cindex AArch64 opcodes
|
|
|
|
@cindex opcodes for AArch64
|
2014-03-14 01:10:04 +08:00
|
|
|
GAS implements all the standard AArch64 opcodes. It also
|
2012-08-13 22:52:54 +08:00
|
|
|
implements several pseudo opcodes, including several synthetic load
|
2013-01-11 03:51:55 +08:00
|
|
|
instructions.
|
2012-08-13 22:52:54 +08:00
|
|
|
|
|
|
|
@table @code
|
|
|
|
|
|
|
|
@cindex @code{LDR reg,=<expr>} pseudo op, AArch64
|
|
|
|
@item LDR =
|
|
|
|
@smallexample
|
|
|
|
ldr <register> , =<expression>
|
|
|
|
@end smallexample
|
|
|
|
|
|
|
|
The constant expression will be placed into the nearest literal pool (if it not
|
|
|
|
already there) and a PC-relative LDR instruction will be generated.
|
|
|
|
|
|
|
|
@end table
|
|
|
|
|
|
|
|
For more information on the AArch64 instruction set and assembly language
|
|
|
|
notation, see @samp{ARMv8 Instruction Set Overview} available at
|
|
|
|
@uref{http://infocenter.arm.com}.
|
|
|
|
|
|
|
|
|
|
|
|
@node AArch64 Mapping Symbols
|
|
|
|
@section Mapping Symbols
|
|
|
|
|
|
|
|
The AArch64 ELF specification requires that special symbols be inserted
|
|
|
|
into object files to mark certain features:
|
|
|
|
|
|
|
|
@table @code
|
|
|
|
|
|
|
|
@cindex @code{$x}
|
|
|
|
@item $x
|
|
|
|
At the start of a region of code containing AArch64 instructions.
|
|
|
|
|
|
|
|
@cindex @code{$d}
|
|
|
|
@item $d
|
|
|
|
At the start of a region of data.
|
|
|
|
|
|
|
|
@end table
|