123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- @c Copyright (C) 2009-2015 Free Software Foundation, Inc.
- @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
- * AArch64 Extensions:: Extensions
- * 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
- @cindex @option{-EB} command line option, AArch64
- @item -EB
- This option specifies that the output generated by the assembler should
- be marked as being encoded for a big-endian processor.
- @cindex @option{-EL} command line option, AArch64
- @item -EL
- This option specifies that the output generated by the assembler should
- be marked as being encoded for a little-endian processor.
- @cindex @option{-mabi=} command line option, AArch64
- @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}.
- @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},
- @code{cortex-a72},
- @code{exynos-m1},
- @code{thunderx},
- @code{xgene1}
- and
- @code{xgene2}.
- 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
- following architecture names are recognized: @code{armv8-a} and
- @code{armv8.1-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}.
- @cindex @code{-mverbose-error} command line option, AArch64
- @item -mverbose-error
- This option enables verbose error messages for AArch64 gas. This option
- is enabled by default.
- @cindex @code{-mno-verbose-error} command line option, AArch64
- @item -mno-verbose-error
- This option disables verbose error messages in AArch64 gas.
- @end table
- @c man end
- @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}.
- @item @code{pan} @tab ARMv8-A @tab ARMv8-A or later
- @tab Enable Privileged Access Never support.
- @item @code{lor} @tab ARMv8-A @tab ARMv8-A or later
- @tab Enable Limited Ordering Regions extensions.
- @item @code{rdma} @tab ARMv8-A @tab ARMv8-A or later
- @tab Enable ARMv8.1 Advanced SIMD extensions. This implies @code{simd}.
- @end multitable
- @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.
- For example to use 33-bit (+/-4GB) pc-relative addressing to
- 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
- @cindex @code{.arch} directive, AArch64
- @item .arch @var{name}
- Select the target architecture. Valid values for @var{name} are the same as
- for the @option{-march} commandline option.
- Specifying @code{.arch} clears any previously selected architecture
- extensions.
- @cindex @code{.arch_extension} directive, AArch64
- @item .arch_extension @var{name}
- Add or remove an architecture extension to the target architecture. Valid
- values for @var{name} are the same as those accepted as architectural
- extensions by the @option{-mcpu} commandline option.
- @code{.arch_extension} may be used multiple times to add or remove extensions
- incrementally to the architecture being compiled for.
- @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).
- GAS maintains a separate literal pool for each section and each
- 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.
- Note - older versions of GAS would dump the current literal
- 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
- @cindex @code{.xword} directive, AArch64
- @item .xword
- The @code{.xword} directive produces 64 bit values.
- @end table
- @node AArch64 Opcodes
- @section Opcodes
- @cindex AArch64 opcodes
- @cindex opcodes for AArch64
- GAS implements all the standard AArch64 opcodes. It also
- implements several pseudo opcodes, including several synthetic load
- instructions.
- @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
|