Home | History | Annotate | Download | only in doc
      1 @c Copyright (C) 2009-2014 Free Software Foundation, Inc.
      2 @c Contributed by ARM Ltd.
      3 @c This is part of the GAS manual.
      4 @c For copying conditions, see the file as.texinfo.
      5 @c man end
      6 
      7 @ifset GENERIC
      8 @page
      9 @node AArch64-Dependent
     10 @chapter AArch64 Dependent Features
     11 @end ifset
     12 
     13 @ifclear GENERIC
     14 @node Machine Dependencies
     15 @chapter AArch64 Dependent Features
     16 @end ifclear
     17 
     18 @cindex AArch64 support
     19 @menu
     20 * AArch64 Options::              Options
     21 * AArch64 Extensions::		 Extensions
     22 * AArch64 Syntax::               Syntax
     23 * AArch64 Floating Point::       Floating Point
     24 * AArch64 Directives::           AArch64 Machine Directives
     25 * AArch64 Opcodes::              Opcodes
     26 * AArch64 Mapping Symbols::      Mapping Symbols
     27 @end menu
     28 
     29 @node AArch64 Options
     30 @section Options
     31 @cindex AArch64 options (none)
     32 @cindex options for AArch64 (none)
     33 
     34 @c man begin OPTIONS
     35 @table @gcctabopt
     36 
     37 @cindex @option{-EB} command line option, AArch64
     38 @item -EB
     39 This option specifies that the output generated by the assembler should
     40 be marked as being encoded for a big-endian processor.
     41 
     42 @cindex @option{-EL} command line option, AArch64
     43 @item -EL
     44 This option specifies that the output generated by the assembler should
     45 be marked as being encoded for a little-endian processor.
     46 
     47 @cindex @option{-mabi=} command line option, AArch64
     48 @item -mabi=@var{abi}
     49 Specify which ABI the source code uses.  The recognized arguments
     50 are: @code{ilp32} and @code{lp64}, which decides the generated object
     51 file in ELF32 and ELF64 format respectively.  The default is @code{lp64}.
     52 
     53 @cindex @option{-mcpu=} command line option, AArch64
     54 @item -mcpu=@var{processor}[+@var{extension}@dots{}]
     55 This option specifies the target processor.  The assembler will issue an error
     56 message if an attempt is made to assemble an instruction which will not execute
     57 on the target processor.  The following processor names are recognized:
     58 @code{cortex-a53},
     59 @code{cortex-a57},
     60 @code{thunderx},
     61 and
     62 @code{xgene-1}.
     63 The special name @code{all} may be used to allow the assembler to accept
     64 instructions valid for any supported processor, including all optional
     65 extensions.
     66 
     67 In addition to the basic instruction set, the assembler can be told to
     68 accept, or restrict, various extension mnemonics that extend the
     69 processor.  @xref{AArch64 Extensions}.
     70 
     71 If some implementations of a particular processor can have an
     72 extension, then then those extensions are automatically enabled.
     73 Consequently, you will not normally have to specify any additional
     74 extensions.
     75 
     76 @cindex @option{-march=} command line option, AArch64
     77 @item -march=@var{architecture}[+@var{extension}@dots{}]
     78 This option specifies the target architecture.  The assembler will
     79 issue an error message if an attempt is made to assemble an
     80 instruction which will not execute on the target architecture.  The
     81 only value for @var{architecture} is @code{armv8-a}.
     82 
     83 If both @option{-mcpu} and @option{-march} are specified, the
     84 assembler will use the setting for @option{-mcpu}.  If neither are
     85 specified, the assembler will default to @option{-mcpu=all}.
     86 
     87 The architecture option can be extended with the same instruction set
     88 extension options as the @option{-mcpu} option.  Unlike
     89 @option{-mcpu}, extensions are not always enabled by default,
     90 @xref{AArch64 Extensions}.
     91 
     92 @cindex @code{-mverbose-error} command line option, AArch64
     93 @item -mverbose-error
     94 This option enables verbose error messages for AArch64 gas.  This option
     95 is enabled by default.
     96 
     97 @cindex @code{-mno-verbose-error} command line option, AArch64
     98 @item -mno-verbose-error
     99 This option disables verbose error messages in AArch64 gas.
    100 
    101 @end table
    102 @c man end
    103 
    104 @node AArch64 Extensions
    105 @section Architecture Extensions
    106 
    107 The table below lists the permitted architecture extensions that are
    108 supported by the assembler and the conditions under which they are
    109 automatically enabled.
    110 
    111 Multiple extensions may be specified, separated by a @code{+}.
    112 Extension mnemonics may also be removed from those the assembler
    113 accepts.  This is done by prepending @code{no} to the option that adds
    114 the extension.  Extensions that are removed must be listed after all
    115 extensions that have been added.
    116 
    117 Enabling an extension that requires other extensions will
    118 automatically cause those extensions to be enabled.  Similarly,
    119 disabling an extension that is required by other extensions will
    120 automatically cause those extensions to be disabled.
    121 
    122 @multitable @columnfractions .12 .17 .17 .54
    123 @headitem Extension @tab Minimum Architecture @tab Enabled by default
    124  @tab Description
    125 @item @code{crc} @tab ARMv8-A @tab No
    126  @tab Enable CRC instructions.
    127 @item @code{crypto} @tab ARMv8-A @tab No
    128  @tab Enable cryptographic extensions.  This implies @code{fp} and @code{simd}.
    129 @item @code{fp} @tab ARMv8-A @tab ARMv8-A or later
    130  @tab Enable floating-point extensions.
    131 @item @code{simd} @tab ARMv8-A @tab ARMv8-A or later
    132  @tab Enable Advanced SIMD extensions.  This implies @code{fp}.
    133 @end multitable
    134 
    135 @node AArch64 Syntax
    136 @section Syntax
    137 @menu
    138 * AArch64-Chars::                Special Characters
    139 * AArch64-Regs::                 Register Names
    140 * AArch64-Relocations::	     Relocations
    141 @end menu
    142 
    143 @node AArch64-Chars
    144 @subsection Special Characters
    145 
    146 @cindex line comment character, AArch64
    147 @cindex AArch64 line comment character
    148 The presence of a @samp{//} on a line indicates the start of a comment
    149 that extends to the end of the current line.  If a @samp{#} appears as
    150 the first character of a line, the whole line is treated as a comment.
    151 
    152 @cindex line separator, AArch64
    153 @cindex statement separator, AArch64
    154 @cindex AArch64 line separator
    155 The @samp{;} character can be used instead of a newline to separate
    156 statements.
    157 
    158 @cindex immediate character, AArch64
    159 @cindex AArch64 immediate character
    160 The @samp{#} can be optionally used to indicate immediate operands.
    161 
    162 @node AArch64-Regs
    163 @subsection Register Names
    164 
    165 @cindex AArch64 register names
    166 @cindex register names, AArch64
    167 Please refer to the section @samp{4.4 Register Names} of
    168 @samp{ARMv8 Instruction Set Overview}, which is available at
    169 @uref{http://infocenter.arm.com}.
    170 
    171 @node AArch64-Relocations
    172 @subsection Relocations
    173 
    174 @cindex relocations, AArch64
    175 @cindex AArch64 relocations
    176 @cindex MOVN, MOVZ and MOVK group relocations, AArch64
    177 Relocations for @samp{MOVZ} and @samp{MOVK} instructions can be generated
    178 by prefixing the label with @samp{#:abs_g2:} etc.
    179 For example to load the 48-bit absolute address of @var{foo} into x0:
    180 
    181 @smallexample
    182         movz x0, #:abs_g2:foo		// bits 32-47, overflow check
    183         movk x0, #:abs_g1_nc:foo	// bits 16-31, no overflow check
    184         movk x0, #:abs_g0_nc:foo	// bits  0-15, no overflow check
    185 @end smallexample
    186 
    187 @cindex ADRP, ADD, LDR/STR group relocations, AArch64
    188 Relocations for @samp{ADRP}, and @samp{ADD}, @samp{LDR} or @samp{STR}
    189 instructions can be generated by prefixing the label with
    190 @samp{:pg_hi21:} and @samp{#:lo12:} respectively.
    191 
    192 For example to use 33-bit (+/-4GB) pc-relative addressing to
    193 load the address of @var{foo} into x0:
    194 
    195 @smallexample
    196         adrp x0, :pg_hi21:foo
    197         add  x0, x0, #:lo12:foo
    198 @end smallexample
    199 
    200 Or to load the value of @var{foo} into x0:
    201 
    202 @smallexample
    203         adrp x0, :pg_hi21:foo
    204         ldr  x0, [x0, #:lo12:foo]
    205 @end smallexample
    206 
    207 Note that @samp{:pg_hi21:} is optional.
    208 
    209 @smallexample
    210         adrp x0, foo
    211 @end smallexample
    212 
    213 is equivalent to
    214 
    215 @smallexample
    216         adrp x0, :pg_hi21:foo
    217 @end smallexample
    218 
    219 @node AArch64 Floating Point
    220 @section Floating Point
    221 
    222 @cindex floating point, AArch64 (@sc{ieee})
    223 @cindex AArch64 floating point (@sc{ieee})
    224 The AArch64 architecture uses @sc{ieee} floating-point numbers.
    225 
    226 @node AArch64 Directives
    227 @section AArch64 Machine Directives
    228 
    229 @cindex machine directives, AArch64
    230 @cindex AArch64 machine directives
    231 @table @code
    232 
    233 @c AAAAAAAAAAAAAAAAAAAAAAAAA
    234 @c BBBBBBBBBBBBBBBBBBBBBBBBBB
    235 
    236 @cindex @code{.bss} directive, AArch64
    237 @item .bss
    238 This directive switches to the @code{.bss} section.
    239 
    240 @c CCCCCCCCCCCCCCCCCCCCCCCCCC
    241 @c DDDDDDDDDDDDDDDDDDDDDDDDDD
    242 @c EEEEEEEEEEEEEEEEEEEEEEEEEE
    243 @c FFFFFFFFFFFFFFFFFFFFFFFFFF
    244 @c GGGGGGGGGGGGGGGGGGGGGGGGGG
    245 @c HHHHHHHHHHHHHHHHHHHHHHHHHH
    246 @c IIIIIIIIIIIIIIIIIIIIIIIIII
    247 @c JJJJJJJJJJJJJJJJJJJJJJJJJJ
    248 @c KKKKKKKKKKKKKKKKKKKKKKKKKK
    249 @c LLLLLLLLLLLLLLLLLLLLLLLLLL
    250 
    251 @cindex @code{.ltorg} directive, AArch64
    252 @item .ltorg
    253 This directive causes the current contents of the literal pool to be
    254 dumped into the current section (which is assumed to be the .text
    255 section) at the current location (aligned to a word boundary).
    256 GAS maintains a separate literal pool for each section and each
    257 sub-section.  The @code{.ltorg} directive will only affect the literal
    258 pool of the current section and sub-section.  At the end of assembly
    259 all remaining, un-empty literal pools will automatically be dumped.
    260 
    261 Note - older versions of GAS would dump the current literal
    262 pool any time a section change occurred.  This is no longer done, since
    263 it prevents accurate control of the placement of literal pools.
    264 
    265 @c MMMMMMMMMMMMMMMMMMMMMMMMMM
    266 
    267 @c NNNNNNNNNNNNNNNNNNNNNNNNNN
    268 @c OOOOOOOOOOOOOOOOOOOOOOOOOO
    269 
    270 @c PPPPPPPPPPPPPPPPPPPPPPPPPP
    271 
    272 @cindex @code{.pool} directive, AArch64
    273 @item .pool
    274 This is a synonym for .ltorg.
    275 
    276 @c QQQQQQQQQQQQQQQQQQQQQQQQQQ
    277 @c RRRRRRRRRRRRRRRRRRRRRRRRRR
    278 
    279 @cindex @code{.req} directive, AArch64
    280 @item @var{name} .req @var{register name}
    281 This creates an alias for @var{register name} called @var{name}.  For
    282 example:
    283 
    284 @smallexample
    285         foo .req w0
    286 @end smallexample
    287 
    288 @c SSSSSSSSSSSSSSSSSSSSSSSSSS
    289 
    290 @c TTTTTTTTTTTTTTTTTTTTTTTTTT
    291 
    292 @c UUUUUUUUUUUUUUUUUUUUUUUUUU
    293 
    294 @cindex @code{.unreq} directive, AArch64
    295 @item .unreq @var{alias-name}
    296 This undefines a register alias which was previously defined using the
    297 @code{req} directive.  For example:
    298 
    299 @smallexample
    300         foo .req w0
    301         .unreq foo
    302 @end smallexample
    303 
    304 An error occurs if the name is undefined.  Note - this pseudo op can
    305 be used to delete builtin in register name aliases (eg 'w0').  This
    306 should only be done if it is really necessary.
    307 
    308 @c VVVVVVVVVVVVVVVVVVVVVVVVVV
    309 
    310 @c WWWWWWWWWWWWWWWWWWWWWWWWWW
    311 @c XXXXXXXXXXXXXXXXXXXXXXXXXX
    312 @c YYYYYYYYYYYYYYYYYYYYYYYYYY
    313 @c ZZZZZZZZZZZZZZZZZZZZZZZZZZ
    314 
    315 @end table
    316 
    317 @node AArch64 Opcodes
    318 @section Opcodes
    319 
    320 @cindex AArch64 opcodes
    321 @cindex opcodes for AArch64
    322 GAS implements all the standard AArch64 opcodes.  It also
    323 implements several pseudo opcodes, including several synthetic load
    324 instructions.
    325 
    326 @table @code
    327 
    328 @cindex @code{LDR reg,=<expr>} pseudo op, AArch64
    329 @item LDR =
    330 @smallexample
    331   ldr <register> , =<expression>
    332 @end smallexample
    333 
    334 The constant expression will be placed into the nearest literal pool (if it not
    335 already there) and a PC-relative LDR instruction will be generated.
    336 
    337 @end table
    338 
    339 For more information on the AArch64 instruction set and assembly language
    340 notation, see @samp{ARMv8 Instruction Set Overview} available at
    341 @uref{http://infocenter.arm.com}.
    342 
    343 
    344 @node AArch64 Mapping Symbols
    345 @section Mapping Symbols
    346 
    347 The AArch64 ELF specification requires that special symbols be inserted
    348 into object files to mark certain features:
    349 
    350 @table @code
    351 
    352 @cindex @code{$x}
    353 @item $x
    354 At the start of a region of code containing AArch64 instructions.
    355 
    356 @cindex @code{$d}
    357 @item $d
    358 At the start of a region of data.
    359 
    360 @end table
    361