1@c Copyright (C) 1996-2018 Free Software Foundation, Inc. 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 24* ARM Mapping Symbols:: Mapping Symbols 25* ARM Unwinding Tutorial:: Unwinding 26@end menu 27 28@node ARM Options 29@section Options 30@cindex ARM options (none) 31@cindex options for ARM (none) 32 33@table @code 34 35@cindex @code{-mcpu=} command line option, ARM 36@item -mcpu=@var{processor}[+@var{extension}@dots{}] 37This option specifies the target processor. The assembler will issue an 38error message if an attempt is made to assemble an instruction which 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{arm7tdmi-s}, 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}, 84@code{fa526} (Faraday FA526 processor), 85@code{fa626} (Faraday FA626 processor), 86@code{arm9e}, 87@code{arm926e}, 88@code{arm926ej-s}, 89@code{arm946e-r0}, 90@code{arm946e}, 91@code{arm946e-s}, 92@code{arm966e-r0}, 93@code{arm966e}, 94@code{arm966e-s}, 95@code{arm968e-s}, 96@code{arm10t}, 97@code{arm10tdmi}, 98@code{arm10e}, 99@code{arm1020}, 100@code{arm1020t}, 101@code{arm1020e}, 102@code{arm1022e}, 103@code{arm1026ej-s}, 104@code{fa606te} (Faraday FA606TE processor), 105@code{fa616te} (Faraday FA616TE processor), 106@code{fa626te} (Faraday FA626TE processor), 107@code{fmp626} (Faraday FMP626 processor), 108@code{fa726te} (Faraday FA726TE processor), 109@code{arm1136j-s}, 110@code{arm1136jf-s}, 111@code{arm1156t2-s}, 112@code{arm1156t2f-s}, 113@code{arm1176jz-s}, 114@code{arm1176jzf-s}, 115@code{mpcore}, 116@code{mpcorenovfp}, 117@code{cortex-a5}, 118@code{cortex-a7}, 119@code{cortex-a8}, 120@code{cortex-a9}, 121@code{cortex-a15}, 122@code{cortex-a17}, 123@code{cortex-a32}, 124@code{cortex-a35}, 125@code{cortex-a53}, 126@code{cortex-a55}, 127@code{cortex-a57}, 128@code{cortex-a72}, 129@code{cortex-a73}, 130@code{cortex-a75}, 131@code{cortex-r4}, 132@code{cortex-r4f}, 133@code{cortex-r5}, 134@code{cortex-r7}, 135@code{cortex-r8}, 136@code{cortex-r52}, 137@code{cortex-m33}, 138@code{cortex-m23}, 139@code{cortex-m7}, 140@code{cortex-m4}, 141@code{cortex-m3}, 142@code{cortex-m1}, 143@code{cortex-m0}, 144@code{cortex-m0plus}, 145@code{exynos-m1}, 146@code{marvell-pj4}, 147@code{marvell-whitney}, 148@code{xgene1}, 149@code{xgene2}, 150@code{ep9312} (ARM920 with Cirrus Maverick coprocessor), 151@code{i80200} (Intel XScale processor) 152@code{iwmmxt} (Intel(r) XScale processor with Wireless MMX(tm) technology coprocessor) 153and 154@code{xscale}. 155The special name @code{all} may be used to allow the 156assembler to accept instructions valid for any ARM processor. 157 158In addition to the basic instruction set, the assembler can be told to 159accept various extension mnemonics that extend the processor using the 160co-processor instruction space. For example, @code{-mcpu=arm920+maverick} 161is equivalent to specifying @code{-mcpu=ep9312}. 162 163Multiple extensions may be specified, separated by a @code{+}. The 164extensions should be specified in ascending alphabetical order. 165 166Some extensions may be restricted to particular architectures; this is 167documented in the list of extensions below. 168 169Extension mnemonics may also be removed from those the assembler accepts. 170This is done be prepending @code{no} to the option that adds the extension. 171Extensions that are removed should be listed after all extensions which have 172been added, again in ascending alphabetical order. For example, 173@code{-mcpu=ep9312+nomaverick} is equivalent to specifying @code{-mcpu=arm920}. 174 175 176The following extensions are currently supported: 177@code{crc} 178@code{crypto} (Cryptography Extensions for v8-A architecture, implies @code{fp+simd}), 179@code{dotprod} (Dot Product Extensions for v8.2-A architecture, implies @code{fp+simd}), 180@code{fp} (Floating Point Extensions for v8-A architecture), 181@code{fp16} (FP16 Extensions for v8.2-A architecture, implies @code{fp}), 182@code{fp16fml} (FP16 Floating Point Multiplication Variant Extensions for v8.2-A architecture, implies @code{fp16}), 183@code{idiv} (Integer Divide Extensions for v7-A and v7-R architectures), 184@code{iwmmxt}, 185@code{iwmmxt2}, 186@code{xscale}, 187@code{maverick}, 188@code{mp} (Multiprocessing Extensions for v7-A and v7-R 189architectures), 190@code{os} (Operating System for v6M architecture), 191@code{sec} (Security Extensions for v6K and v7-A architectures), 192@code{simd} (Advanced SIMD Extensions for v8-A architecture, implies @code{fp}), 193@code{virt} (Virtualization Extensions for v7-A architecture, implies 194@code{idiv}), 195@code{pan} (Privileged Access Never Extensions for v8-A architecture), 196@code{ras} (Reliability, Availability and Serviceability extensions 197for v8-A architecture), 198@code{rdma} (ARMv8.1 Advanced SIMD extensions for v8-A architecture, implies 199@code{simd}) 200and 201@code{xscale}. 202 203@cindex @code{-march=} command line option, ARM 204@item -march=@var{architecture}[+@var{extension}@dots{}] 205This option specifies the target architecture. The assembler will issue 206an error message if an attempt is made to assemble an instruction which 207will not execute on the target architecture. The following architecture 208names are recognized: 209@code{armv1}, 210@code{armv2}, 211@code{armv2a}, 212@code{armv2s}, 213@code{armv3}, 214@code{armv3m}, 215@code{armv4}, 216@code{armv4xm}, 217@code{armv4t}, 218@code{armv4txm}, 219@code{armv5}, 220@code{armv5t}, 221@code{armv5txm}, 222@code{armv5te}, 223@code{armv5texp}, 224@code{armv6}, 225@code{armv6j}, 226@code{armv6k}, 227@code{armv6z}, 228@code{armv6kz}, 229@code{armv6-m}, 230@code{armv6s-m}, 231@code{armv7}, 232@code{armv7-a}, 233@code{armv7ve}, 234@code{armv7-r}, 235@code{armv7-m}, 236@code{armv7e-m}, 237@code{armv8-a}, 238@code{armv8.1-a}, 239@code{armv8.2-a}, 240@code{armv8.3-a}, 241@code{armv8-r}, 242@code{armv8.4-a}, 243@code{iwmmxt} 244@code{iwmmxt2} 245and 246@code{xscale}. 247If both @code{-mcpu} and 248@code{-march} are specified, the assembler will use 249the setting for @code{-mcpu}. 250 251The architecture option can be extended with the same instruction set 252extension options as the @code{-mcpu} option. 253 254@cindex @code{-mfpu=} command line option, ARM 255@item -mfpu=@var{floating-point-format} 256 257This option specifies the floating point format to assemble for. The 258assembler will issue an error message if an attempt is made to assemble 259an instruction which will not execute on the target floating point unit. 260The following format options are recognized: 261@code{softfpa}, 262@code{fpe}, 263@code{fpe2}, 264@code{fpe3}, 265@code{fpa}, 266@code{fpa10}, 267@code{fpa11}, 268@code{arm7500fe}, 269@code{softvfp}, 270@code{softvfp+vfp}, 271@code{vfp}, 272@code{vfp10}, 273@code{vfp10-r0}, 274@code{vfp9}, 275@code{vfpxd}, 276@code{vfpv2}, 277@code{vfpv3}, 278@code{vfpv3-fp16}, 279@code{vfpv3-d16}, 280@code{vfpv3-d16-fp16}, 281@code{vfpv3xd}, 282@code{vfpv3xd-d16}, 283@code{vfpv4}, 284@code{vfpv4-d16}, 285@code{fpv4-sp-d16}, 286@code{fpv5-sp-d16}, 287@code{fpv5-d16}, 288@code{fp-armv8}, 289@code{arm1020t}, 290@code{arm1020e}, 291@code{arm1136jf-s}, 292@code{maverick}, 293@code{neon}, 294@code{neon-vfpv3}, 295@code{neon-fp16}, 296@code{neon-vfpv4}, 297@code{neon-fp-armv8}, 298@code{crypto-neon-fp-armv8}, 299@code{neon-fp-armv8.1} 300and 301@code{crypto-neon-fp-armv8.1}. 302 303In addition to determining which instructions are assembled, this option 304also affects the way in which the @code{.double} assembler directive behaves 305when assembling little-endian code. 306 307The default is dependent on the processor selected. For Architecture 5 or 308later, the default is to assemble for VFP instructions; for earlier 309architectures the default is to assemble for FPA instructions. 310 311@cindex @code{-mthumb} command line option, ARM 312@item -mthumb 313This option specifies that the assembler should start assembling Thumb 314instructions; that is, it should behave as though the file starts with a 315@code{.code 16} directive. 316 317@cindex @code{-mthumb-interwork} command line option, ARM 318@item -mthumb-interwork 319This option specifies that the output generated by the assembler should 320be marked as supporting interworking. 321 322@cindex @code{-mimplicit-it} command line option, ARM 323@item -mimplicit-it=never 324@itemx -mimplicit-it=always 325@itemx -mimplicit-it=arm 326@itemx -mimplicit-it=thumb 327The @code{-mimplicit-it} option controls the behavior of the assembler when 328conditional instructions are not enclosed in IT blocks. 329There are four possible behaviors. 330If @code{never} is specified, such constructs cause a warning in ARM 331code and an error in Thumb-2 code. 332If @code{always} is specified, such constructs are accepted in both 333ARM and Thumb-2 code, where the IT instruction is added implicitly. 334If @code{arm} is specified, such constructs are accepted in ARM code 335and cause an error in Thumb-2 code. 336If @code{thumb} is specified, such constructs cause a warning in ARM 337code and are accepted in Thumb-2 code. If you omit this option, the 338behavior is equivalent to @code{-mimplicit-it=arm}. 339 340@cindex @code{-mapcs-26} command line option, ARM 341@cindex @code{-mapcs-32} command line option, ARM 342@item -mapcs-26 343@itemx -mapcs-32 344These options specify that the output generated by the assembler should 345be marked as supporting the indicated version of the Arm Procedure. 346Calling Standard. 347 348@cindex @code{-matpcs} command line option, ARM 349@item -matpcs 350This option specifies that the output generated by the assembler should 351be marked as supporting the Arm/Thumb Procedure Calling Standard. If 352enabled this option will cause the assembler to create an empty 353debugging section in the object file called .arm.atpcs. Debuggers can 354use this to determine the ABI being used by. 355 356@cindex @code{-mapcs-float} command line option, ARM 357@item -mapcs-float 358This indicates the floating point variant of the APCS should be 359used. In this variant floating point arguments are passed in FP 360registers rather than integer registers. 361 362@cindex @code{-mapcs-reentrant} command line option, ARM 363@item -mapcs-reentrant 364This indicates that the reentrant variant of the APCS should be used. 365This variant supports position independent code. 366 367@cindex @code{-mfloat-abi=} command line option, ARM 368@item -mfloat-abi=@var{abi} 369This option specifies that the output generated by the assembler should be 370marked as using specified floating point ABI. 371The following values are recognized: 372@code{soft}, 373@code{softfp} 374and 375@code{hard}. 376 377@cindex @code{-eabi=} command line option, ARM 378@item -meabi=@var{ver} 379This option specifies which EABI version the produced object files should 380conform to. 381The following values are recognized: 382@code{gnu}, 383@code{4} 384and 385@code{5}. 386 387@cindex @code{-EB} command line option, ARM 388@item -EB 389This option specifies that the output generated by the assembler should 390be marked as being encoded for a big-endian processor. 391 392Note: If a program is being built for a system with big-endian data 393and little-endian instructions then it should be assembled with the 394@option{-EB} option, (all of it, code and data) and then linked with 395the @option{--be8} option. This will reverse the endianness of the 396instructions back to little-endian, but leave the data as big-endian. 397 398@cindex @code{-EL} command line option, ARM 399@item -EL 400This option specifies that the output generated by the assembler should 401be marked as being encoded for a little-endian processor. 402 403@cindex @code{-k} command line option, ARM 404@cindex PIC code generation for ARM 405@item -k 406This option specifies that the output of the assembler should be marked 407as position-independent code (PIC). 408 409@cindex @code{--fix-v4bx} command line option, ARM 410@item --fix-v4bx 411Allow @code{BX} instructions in ARMv4 code. This is intended for use with 412the linker option of the same name. 413 414@cindex @code{-mwarn-deprecated} command line option, ARM 415@item -mwarn-deprecated 416@itemx -mno-warn-deprecated 417Enable or disable warnings about using deprecated options or 418features. The default is to warn. 419 420@cindex @code{-mccs} command line option, ARM 421@item -mccs 422Turns on CodeComposer Studio assembly syntax compatibility mode. 423 424@cindex @code{-mwarn-syms} command line option, ARM 425@item -mwarn-syms 426@itemx -mno-warn-syms 427Enable or disable warnings about symbols that match the names of ARM 428instructions. The default is to warn. 429 430@end table 431 432 433@node ARM Syntax 434@section Syntax 435@menu 436* ARM-Instruction-Set:: Instruction Set 437* ARM-Chars:: Special Characters 438* ARM-Regs:: Register Names 439* ARM-Relocations:: Relocations 440* ARM-Neon-Alignment:: NEON Alignment Specifiers 441@end menu 442 443@node ARM-Instruction-Set 444@subsection Instruction Set Syntax 445Two slightly different syntaxes are support for ARM and THUMB 446instructions. The default, @code{divided}, uses the old style where 447ARM and THUMB instructions had their own, separate syntaxes. The new, 448@code{unified} syntax, which can be selected via the @code{.syntax} 449directive, and has the following main features: 450 451@itemize @bullet 452@item 453Immediate operands do not require a @code{#} prefix. 454 455@item 456The @code{IT} instruction may appear, and if it does it is validated 457against subsequent conditional affixes. In ARM mode it does not 458generate machine code, in THUMB mode it does. 459 460@item 461For ARM instructions the conditional affixes always appear at the end 462of the instruction. For THUMB instructions conditional affixes can be 463used, but only inside the scope of an @code{IT} instruction. 464 465@item 466All of the instructions new to the V6T2 architecture (and later) are 467available. (Only a few such instructions can be written in the 468@code{divided} syntax). 469 470@item 471The @code{.N} and @code{.W} suffixes are recognized and honored. 472 473@item 474All instructions set the flags if and only if they have an @code{s} 475affix. 476@end itemize 477 478@node ARM-Chars 479@subsection Special Characters 480 481@cindex line comment character, ARM 482@cindex ARM line comment character 483The presence of a @samp{@@} anywhere on a line indicates the start of 484a comment that extends to the end of that line. 485 486If a @samp{#} appears as the first character of a line then the whole 487line is treated as a comment, but in this case the line could also be 488a logical line number directive (@pxref{Comments}) or a preprocessor 489control command (@pxref{Preprocessing}). 490 491@cindex line separator, ARM 492@cindex statement separator, ARM 493@cindex ARM line separator 494The @samp{;} character can be used instead of a newline to separate 495statements. 496 497@cindex immediate character, ARM 498@cindex ARM immediate character 499Either @samp{#} or @samp{$} can be used to indicate immediate operands. 500 501@cindex identifiers, ARM 502@cindex ARM identifiers 503*TODO* Explain about /data modifier on symbols. 504 505@node ARM-Regs 506@subsection Register Names 507 508@cindex ARM register names 509@cindex register names, ARM 510*TODO* Explain about ARM register naming, and the predefined names. 511 512@node ARM-Relocations 513@subsection ARM relocation generation 514 515@cindex data relocations, ARM 516@cindex ARM data relocations 517Specific data relocations can be generated by putting the relocation name 518in parentheses after the symbol name. For example: 519 520@smallexample 521 .word foo(TARGET1) 522@end smallexample 523 524This will generate an @samp{R_ARM_TARGET1} relocation against the symbol 525@var{foo}. 526The following relocations are supported: 527@code{GOT}, 528@code{GOTOFF}, 529@code{TARGET1}, 530@code{TARGET2}, 531@code{SBREL}, 532@code{TLSGD}, 533@code{TLSLDM}, 534@code{TLSLDO}, 535@code{TLSDESC}, 536@code{TLSCALL}, 537@code{GOTTPOFF}, 538@code{GOT_PREL} 539and 540@code{TPOFF}. 541 542For compatibility with older toolchains the assembler also accepts 543@code{(PLT)} after branch targets. On legacy targets this will 544generate the deprecated @samp{R_ARM_PLT32} relocation. On EABI 545targets it will encode either the @samp{R_ARM_CALL} or 546@samp{R_ARM_JUMP24} relocation, as appropriate. 547 548@cindex MOVW and MOVT relocations, ARM 549Relocations for @samp{MOVW} and @samp{MOVT} instructions can be generated 550by prefixing the value with @samp{#:lower16:} and @samp{#:upper16} 551respectively. For example to load the 32-bit address of foo into r0: 552 553@smallexample 554 MOVW r0, #:lower16:foo 555 MOVT r0, #:upper16:foo 556@end smallexample 557 558Relocations @samp{R_ARM_THM_ALU_ABS_G0_NC}, @samp{R_ARM_THM_ALU_ABS_G1_NC}, 559@samp{R_ARM_THM_ALU_ABS_G2_NC} and @samp{R_ARM_THM_ALU_ABS_G3_NC} can be 560generated by prefixing the value with @samp{#:lower0_7:#}, 561@samp{#:lower8_15:#}, @samp{#:upper0_7:#} and @samp{#:upper8_15:#} 562respectively. For example to load the 32-bit address of foo into r0: 563 564@smallexample 565 MOVS r0, #:upper8_15:#foo 566 LSLS r0, r0, #8 567 ADDS r0, #:upper0_7:#foo 568 LSLS r0, r0, #8 569 ADDS r0, #:lower8_15:#foo 570 LSLS r0, r0, #8 571 ADDS r0, #:lower0_7:#foo 572@end smallexample 573 574@node ARM-Neon-Alignment 575@subsection NEON Alignment Specifiers 576 577@cindex alignment for NEON instructions 578Some NEON load/store instructions allow an optional address 579alignment qualifier. 580The ARM documentation specifies that this is indicated by 581@samp{@@ @var{align}}. However GAS already interprets 582the @samp{@@} character as a "line comment" start, 583so @samp{: @var{align}} is used instead. For example: 584 585@smallexample 586 vld1.8 @{q0@}, [r0, :128] 587@end smallexample 588 589@node ARM Floating Point 590@section Floating Point 591 592@cindex floating point, ARM (@sc{ieee}) 593@cindex ARM floating point (@sc{ieee}) 594The ARM family uses @sc{ieee} floating-point numbers. 595 596@node ARM Directives 597@section ARM Machine Directives 598 599@cindex machine directives, ARM 600@cindex ARM machine directives 601@table @code 602 603@c AAAAAAAAAAAAAAAAAAAAAAAAA 604 605@ifclear ELF 606@cindex @code{.2byte} directive, ARM 607@cindex @code{.4byte} directive, ARM 608@cindex @code{.8byte} directive, ARM 609@item .2byte @var{expression} [, @var{expression}]* 610@itemx .4byte @var{expression} [, @var{expression}]* 611@itemx .8byte @var{expression} [, @var{expression}]* 612These directives write 2, 4 or 8 byte values to the output section. 613@end ifclear 614 615@cindex @code{.align} directive, ARM 616@item .align @var{expression} [, @var{expression}] 617This is the generic @var{.align} directive. For the ARM however if the 618first argument is zero (ie no alignment is needed) the assembler will 619behave as if the argument had been 2 (ie pad to the next four byte 620boundary). This is for compatibility with ARM's own assembler. 621 622@cindex @code{.arch} directive, ARM 623@item .arch @var{name} 624Select the target architecture. Valid values for @var{name} are the same as 625for the @option{-march} commandline option. 626 627Specifying @code{.arch} clears any previously selected architecture 628extensions. 629 630@cindex @code{.arch_extension} directive, ARM 631@item .arch_extension @var{name} 632Add or remove an architecture extension to the target architecture. Valid 633values for @var{name} are the same as those accepted as architectural 634extensions by the @option{-mcpu} commandline option. 635 636@code{.arch_extension} may be used multiple times to add or remove extensions 637incrementally to the architecture being compiled for. 638 639@cindex @code{.arm} directive, ARM 640@item .arm 641This performs the same action as @var{.code 32}. 642 643@c BBBBBBBBBBBBBBBBBBBBBBBBBB 644 645@cindex @code{.bss} directive, ARM 646@item .bss 647This directive switches to the @code{.bss} section. 648 649@c CCCCCCCCCCCCCCCCCCCCCCCCCC 650 651@cindex @code{.cantunwind} directive, ARM 652@item .cantunwind 653Prevents unwinding through the current function. No personality routine 654or exception table data is required or permitted. 655 656@cindex @code{.code} directive, ARM 657@item .code @code{[16|32]} 658This directive selects the instruction set being generated. The value 16 659selects Thumb, with the value 32 selecting ARM. 660 661@cindex @code{.cpu} directive, ARM 662@item .cpu @var{name} 663Select the target processor. Valid values for @var{name} are the same as 664for the @option{-mcpu} commandline option. 665 666Specifying @code{.cpu} clears any previously selected architecture 667extensions. 668 669@c DDDDDDDDDDDDDDDDDDDDDDDDDD 670 671@cindex @code{.dn} and @code{.qn} directives, ARM 672@item @var{name} .dn @var{register name} [@var{.type}] [[@var{index}]] 673@itemx @var{name} .qn @var{register name} [@var{.type}] [[@var{index}]] 674 675The @code{dn} and @code{qn} directives are used to create typed 676and/or indexed register aliases for use in Advanced SIMD Extension 677(Neon) instructions. The former should be used to create aliases 678of double-precision registers, and the latter to create aliases of 679quad-precision registers. 680 681If these directives are used to create typed aliases, those aliases can 682be used in Neon instructions instead of writing types after the mnemonic 683or after each operand. For example: 684 685@smallexample 686 x .dn d2.f32 687 y .dn d3.f32 688 z .dn d4.f32[1] 689 vmul x,y,z 690@end smallexample 691 692This is equivalent to writing the following: 693 694@smallexample 695 vmul.f32 d2,d3,d4[1] 696@end smallexample 697 698Aliases created using @code{dn} or @code{qn} can be destroyed using 699@code{unreq}. 700 701@c EEEEEEEEEEEEEEEEEEEEEEEEEE 702 703@cindex @code{.eabi_attribute} directive, ARM 704@item .eabi_attribute @var{tag}, @var{value} 705Set the EABI object attribute @var{tag} to @var{value}. 706 707The @var{tag} is either an attribute number, or one of the following: 708@code{Tag_CPU_raw_name}, @code{Tag_CPU_name}, @code{Tag_CPU_arch}, 709@code{Tag_CPU_arch_profile}, @code{Tag_ARM_ISA_use}, 710@code{Tag_THUMB_ISA_use}, @code{Tag_FP_arch}, @code{Tag_WMMX_arch}, 711@code{Tag_Advanced_SIMD_arch}, @code{Tag_PCS_config}, 712@code{Tag_ABI_PCS_R9_use}, @code{Tag_ABI_PCS_RW_data}, 713@code{Tag_ABI_PCS_RO_data}, @code{Tag_ABI_PCS_GOT_use}, 714@code{Tag_ABI_PCS_wchar_t}, @code{Tag_ABI_FP_rounding}, 715@code{Tag_ABI_FP_denormal}, @code{Tag_ABI_FP_exceptions}, 716@code{Tag_ABI_FP_user_exceptions}, @code{Tag_ABI_FP_number_model}, 717@code{Tag_ABI_align_needed}, @code{Tag_ABI_align_preserved}, 718@code{Tag_ABI_enum_size}, @code{Tag_ABI_HardFP_use}, 719@code{Tag_ABI_VFP_args}, @code{Tag_ABI_WMMX_args}, 720@code{Tag_ABI_optimization_goals}, @code{Tag_ABI_FP_optimization_goals}, 721@code{Tag_compatibility}, @code{Tag_CPU_unaligned_access}, 722@code{Tag_FP_HP_extension}, @code{Tag_ABI_FP_16bit_format}, 723@code{Tag_MPextension_use}, @code{Tag_DIV_use}, 724@code{Tag_nodefaults}, @code{Tag_also_compatible_with}, 725@code{Tag_conformance}, @code{Tag_T2EE_use}, 726@code{Tag_Virtualization_use} 727 728The @var{value} is either a @code{number}, @code{"string"}, or 729@code{number, "string"} depending on the tag. 730 731Note - the following legacy values are also accepted by @var{tag}: 732@code{Tag_VFP_arch}, @code{Tag_ABI_align8_needed}, 733@code{Tag_ABI_align8_preserved}, @code{Tag_VFP_HP_extension}, 734 735@cindex @code{.even} directive, ARM 736@item .even 737This directive aligns to an even-numbered address. 738 739@cindex @code{.extend} directive, ARM 740@cindex @code{.ldouble} directive, ARM 741@item .extend @var{expression} [, @var{expression}]* 742@itemx .ldouble @var{expression} [, @var{expression}]* 743These directives write 12byte long double floating-point values to the 744output section. These are not compatible with current ARM processors 745or ABIs. 746 747@c FFFFFFFFFFFFFFFFFFFFFFFFFF 748 749@anchor{arm_fnend} 750@cindex @code{.fnend} directive, ARM 751@item .fnend 752Marks the end of a function with an unwind table entry. The unwind index 753table entry is created when this directive is processed. 754 755If no personality routine has been specified then standard personality 756routine 0 or 1 will be used, depending on the number of unwind opcodes 757required. 758 759@anchor{arm_fnstart} 760@cindex @code{.fnstart} directive, ARM 761@item .fnstart 762Marks the start of a function with an unwind table entry. 763 764@cindex @code{.force_thumb} directive, ARM 765@item .force_thumb 766This directive forces the selection of Thumb instructions, even if the 767target processor does not support those instructions 768 769@cindex @code{.fpu} directive, ARM 770@item .fpu @var{name} 771Select the floating-point unit to assemble for. Valid values for @var{name} 772are the same as for the @option{-mfpu} commandline option. 773 774@c GGGGGGGGGGGGGGGGGGGGGGGGGG 775@c HHHHHHHHHHHHHHHHHHHHHHHHHH 776 777@cindex @code{.handlerdata} directive, ARM 778@item .handlerdata 779Marks the end of the current function, and the start of the exception table 780entry for that function. Anything between this directive and the 781@code{.fnend} directive will be added to the exception table entry. 782 783Must be preceded by a @code{.personality} or @code{.personalityindex} 784directive. 785 786@c IIIIIIIIIIIIIIIIIIIIIIIIII 787 788@cindex @code{.inst} directive, ARM 789@item .inst @var{opcode} [ , @dots{} ] 790@itemx .inst.n @var{opcode} [ , @dots{} ] 791@itemx .inst.w @var{opcode} [ , @dots{} ] 792Generates the instruction corresponding to the numerical value @var{opcode}. 793@code{.inst.n} and @code{.inst.w} allow the Thumb instruction size to be 794specified explicitly, overriding the normal encoding rules. 795 796@c JJJJJJJJJJJJJJJJJJJJJJJJJJ 797@c KKKKKKKKKKKKKKKKKKKKKKKKKK 798@c LLLLLLLLLLLLLLLLLLLLLLLLLL 799 800@item .ldouble @var{expression} [, @var{expression}]* 801See @code{.extend}. 802 803@cindex @code{.ltorg} directive, ARM 804@item .ltorg 805This directive causes the current contents of the literal pool to be 806dumped into the current section (which is assumed to be the .text 807section) at the current location (aligned to a word boundary). 808@code{GAS} maintains a separate literal pool for each section and each 809sub-section. The @code{.ltorg} directive will only affect the literal 810pool of the current section and sub-section. At the end of assembly 811all remaining, un-empty literal pools will automatically be dumped. 812 813Note - older versions of @code{GAS} would dump the current literal 814pool any time a section change occurred. This is no longer done, since 815it prevents accurate control of the placement of literal pools. 816 817@c MMMMMMMMMMMMMMMMMMMMMMMMMM 818 819@cindex @code{.movsp} directive, ARM 820@item .movsp @var{reg} [, #@var{offset}] 821Tell the unwinder that @var{reg} contains an offset from the current 822stack pointer. If @var{offset} is not specified then it is assumed to be 823zero. 824 825@c NNNNNNNNNNNNNNNNNNNNNNNNNN 826@c OOOOOOOOOOOOOOOOOOOOOOOOOO 827 828@cindex @code{.object_arch} directive, ARM 829@item .object_arch @var{name} 830Override the architecture recorded in the EABI object attribute section. 831Valid values for @var{name} are the same as for the @code{.arch} directive. 832Typically this is useful when code uses runtime detection of CPU features. 833 834@c PPPPPPPPPPPPPPPPPPPPPPPPPP 835 836@cindex @code{.packed} directive, ARM 837@item .packed @var{expression} [, @var{expression}]* 838This directive writes 12-byte packed floating-point values to the 839output section. These are not compatible with current ARM processors 840or ABIs. 841 842@anchor{arm_pad} 843@cindex @code{.pad} directive, ARM 844@item .pad #@var{count} 845Generate unwinder annotations for a stack adjustment of @var{count} bytes. 846A positive value indicates the function prologue allocated stack space by 847decrementing the stack pointer. 848 849@cindex @code{.personality} directive, ARM 850@item .personality @var{name} 851Sets the personality routine for the current function to @var{name}. 852 853@cindex @code{.personalityindex} directive, ARM 854@item .personalityindex @var{index} 855Sets the personality routine for the current function to the EABI standard 856routine number @var{index} 857 858@cindex @code{.pool} directive, ARM 859@item .pool 860This is a synonym for .ltorg. 861 862@c QQQQQQQQQQQQQQQQQQQQQQQQQQ 863@c RRRRRRRRRRRRRRRRRRRRRRRRRR 864 865@cindex @code{.req} directive, ARM 866@item @var{name} .req @var{register name} 867This creates an alias for @var{register name} called @var{name}. For 868example: 869 870@smallexample 871 foo .req r0 872@end smallexample 873 874@c SSSSSSSSSSSSSSSSSSSSSSSSSS 875 876@anchor{arm_save} 877@cindex @code{.save} directive, ARM 878@item .save @var{reglist} 879Generate unwinder annotations to restore the registers in @var{reglist}. 880The format of @var{reglist} is the same as the corresponding store-multiple 881instruction. 882 883@smallexample 884@exdent @emph{core registers} 885 .save @{r4, r5, r6, lr@} 886 stmfd sp!, @{r4, r5, r6, lr@} 887@exdent @emph{FPA registers} 888 .save f4, 2 889 sfmfd f4, 2, [sp]! 890@exdent @emph{VFP registers} 891 .save @{d8, d9, d10@} 892 fstmdx sp!, @{d8, d9, d10@} 893@exdent @emph{iWMMXt registers} 894 .save @{wr10, wr11@} 895 wstrd wr11, [sp, #-8]! 896 wstrd wr10, [sp, #-8]! 897or 898 .save wr11 899 wstrd wr11, [sp, #-8]! 900 .save wr10 901 wstrd wr10, [sp, #-8]! 902@end smallexample 903 904@anchor{arm_setfp} 905@cindex @code{.setfp} directive, ARM 906@item .setfp @var{fpreg}, @var{spreg} [, #@var{offset}] 907Make all unwinder annotations relative to a frame pointer. Without this 908the unwinder will use offsets from the stack pointer. 909 910The syntax of this directive is the same as the @code{add} or @code{mov} 911instruction used to set the frame pointer. @var{spreg} must be either 912@code{sp} or mentioned in a previous @code{.movsp} directive. 913 914@smallexample 915.movsp ip 916mov ip, sp 917@dots{} 918.setfp fp, ip, #4 919add fp, ip, #4 920@end smallexample 921 922@cindex @code{.secrel32} directive, ARM 923@item .secrel32 @var{expression} [, @var{expression}]* 924This directive emits relocations that evaluate to the section-relative 925offset of each expression's symbol. This directive is only supported 926for PE targets. 927 928@cindex @code{.syntax} directive, ARM 929@item .syntax [@code{unified} | @code{divided}] 930This directive sets the Instruction Set Syntax as described in the 931@ref{ARM-Instruction-Set} section. 932 933@c TTTTTTTTTTTTTTTTTTTTTTTTTT 934 935@cindex @code{.thumb} directive, ARM 936@item .thumb 937This performs the same action as @var{.code 16}. 938 939@cindex @code{.thumb_func} directive, ARM 940@item .thumb_func 941This directive specifies that the following symbol is the name of a 942Thumb encoded function. This information is necessary in order to allow 943the assembler and linker to generate correct code for interworking 944between Arm and Thumb instructions and should be used even if 945interworking is not going to be performed. The presence of this 946directive also implies @code{.thumb} 947 948This directive is not necessary when generating EABI objects. On these 949targets the encoding is implicit when generating Thumb code. 950 951@cindex @code{.thumb_set} directive, ARM 952@item .thumb_set 953This performs the equivalent of a @code{.set} directive in that it 954creates a symbol which is an alias for another symbol (possibly not yet 955defined). This directive also has the added property in that it marks 956the aliased symbol as being a thumb function entry point, in the same 957way that the @code{.thumb_func} directive does. 958 959@cindex @code{.tlsdescseq} directive, ARM 960@item .tlsdescseq @var{tls-variable} 961This directive is used to annotate parts of an inlined TLS descriptor 962trampoline. Normally the trampoline is provided by the linker, and 963this directive is not needed. 964 965@c UUUUUUUUUUUUUUUUUUUUUUUUUU 966 967@cindex @code{.unreq} directive, ARM 968@item .unreq @var{alias-name} 969This undefines a register alias which was previously defined using the 970@code{req}, @code{dn} or @code{qn} directives. For example: 971 972@smallexample 973 foo .req r0 974 .unreq foo 975@end smallexample 976 977An error occurs if the name is undefined. Note - this pseudo op can 978be used to delete builtin in register name aliases (eg 'r0'). This 979should only be done if it is really necessary. 980 981@cindex @code{.unwind_raw} directive, ARM 982@item .unwind_raw @var{offset}, @var{byte1}, @dots{} 983Insert one of more arbitrary unwind opcode bytes, which are known to adjust 984the stack pointer by @var{offset} bytes. 985 986For example @code{.unwind_raw 4, 0xb1, 0x01} is equivalent to 987@code{.save @{r0@}} 988 989@c VVVVVVVVVVVVVVVVVVVVVVVVVV 990 991@cindex @code{.vsave} directive, ARM 992@item .vsave @var{vfp-reglist} 993Generate unwinder annotations to restore the VFP registers in @var{vfp-reglist} 994using FLDMD. Also works for VFPv3 registers 995that are to be restored using VLDM. 996The format of @var{vfp-reglist} is the same as the corresponding store-multiple 997instruction. 998 999@smallexample 1000@exdent @emph{VFP registers} 1001 .vsave @{d8, d9, d10@} 1002 fstmdd sp!, @{d8, d9, d10@} 1003@exdent @emph{VFPv3 registers} 1004 .vsave @{d15, d16, d17@} 1005 vstm sp!, @{d15, d16, d17@} 1006@end smallexample 1007 1008Since FLDMX and FSTMX are now deprecated, this directive should be 1009used in favour of @code{.save} for saving VFP registers for ARMv6 and above. 1010 1011@c WWWWWWWWWWWWWWWWWWWWWWWWWW 1012@c XXXXXXXXXXXXXXXXXXXXXXXXXX 1013@c YYYYYYYYYYYYYYYYYYYYYYYYYY 1014@c ZZZZZZZZZZZZZZZZZZZZZZZZZZ 1015 1016@end table 1017 1018@node ARM Opcodes 1019@section Opcodes 1020 1021@cindex ARM opcodes 1022@cindex opcodes for ARM 1023@code{@value{AS}} implements all the standard ARM opcodes. It also 1024implements several pseudo opcodes, including several synthetic load 1025instructions. 1026 1027@table @code 1028 1029@cindex @code{NOP} pseudo op, ARM 1030@item NOP 1031@smallexample 1032 nop 1033@end smallexample 1034 1035This pseudo op will always evaluate to a legal ARM instruction that does 1036nothing. Currently it will evaluate to MOV r0, r0. 1037 1038@cindex @code{LDR reg,=<label>} pseudo op, ARM 1039@item LDR 1040@smallexample 1041 ldr <register> , = <expression> 1042@end smallexample 1043 1044If expression evaluates to a numeric constant then a MOV or MVN 1045instruction will be used in place of the LDR instruction, if the 1046constant can be generated by either of these instructions. Otherwise 1047the constant will be placed into the nearest literal pool (if it not 1048already there) and a PC relative LDR instruction will be generated. 1049 1050@cindex @code{ADR reg,<label>} pseudo op, ARM 1051@item ADR 1052@smallexample 1053 adr <register> <label> 1054@end smallexample 1055 1056This instruction will load the address of @var{label} into the indicated 1057register. The instruction will evaluate to a PC relative ADD or SUB 1058instruction depending upon where the label is located. If the label is 1059out of range, or if it is not defined in the same file (and section) as 1060the ADR instruction, then an error will be generated. This instruction 1061will not make use of the literal pool. 1062 1063@cindex @code{ADRL reg,<label>} pseudo op, ARM 1064@item ADRL 1065@smallexample 1066 adrl <register> <label> 1067@end smallexample 1068 1069This instruction will load the address of @var{label} into the indicated 1070register. The instruction will evaluate to one or two PC relative ADD 1071or SUB instructions depending upon where the label is located. If a 1072second instruction is not needed a NOP instruction will be generated in 1073its place, so that this instruction is always 8 bytes long. 1074 1075If the label is out of range, or if it is not defined in the same file 1076(and section) as the ADRL instruction, then an error will be generated. 1077This instruction will not make use of the literal pool. 1078 1079@end table 1080 1081For information on the ARM or Thumb instruction sets, see @cite{ARM 1082Software Development Toolkit Reference Manual}, Advanced RISC Machines 1083Ltd. 1084 1085@node ARM Mapping Symbols 1086@section Mapping Symbols 1087 1088The ARM ELF specification requires that special symbols be inserted 1089into object files to mark certain features: 1090 1091@table @code 1092 1093@cindex @code{$a} 1094@item $a 1095At the start of a region of code containing ARM instructions. 1096 1097@cindex @code{$t} 1098@item $t 1099At the start of a region of code containing THUMB instructions. 1100 1101@cindex @code{$d} 1102@item $d 1103At the start of a region of data. 1104 1105@end table 1106 1107The assembler will automatically insert these symbols for you - there 1108is no need to code them yourself. Support for tagging symbols ($b, 1109$f, $p and $m) which is also mentioned in the current ARM ELF 1110specification is not implemented. This is because they have been 1111dropped from the new EABI and so tools cannot rely upon their 1112presence. 1113 1114@node ARM Unwinding Tutorial 1115@section Unwinding 1116 1117The ABI for the ARM Architecture specifies a standard format for 1118exception unwind information. This information is used when an 1119exception is thrown to determine where control should be transferred. 1120In particular, the unwind information is used to determine which 1121function called the function that threw the exception, and which 1122function called that one, and so forth. This information is also used 1123to restore the values of callee-saved registers in the function 1124catching the exception. 1125 1126If you are writing functions in assembly code, and those functions 1127call other functions that throw exceptions, you must use assembly 1128pseudo ops to ensure that appropriate exception unwind information is 1129generated. Otherwise, if one of the functions called by your assembly 1130code throws an exception, the run-time library will be unable to 1131unwind the stack through your assembly code and your program will not 1132behave correctly. 1133 1134To illustrate the use of these pseudo ops, we will examine the code 1135that G++ generates for the following C++ input: 1136 1137@verbatim 1138void callee (int *); 1139 1140int 1141caller () 1142{ 1143 int i; 1144 callee (&i); 1145 return i; 1146} 1147@end verbatim 1148 1149This example does not show how to throw or catch an exception from 1150assembly code. That is a much more complex operation and should 1151always be done in a high-level language, such as C++, that directly 1152supports exceptions. 1153 1154The code generated by one particular version of G++ when compiling the 1155example above is: 1156 1157@verbatim 1158_Z6callerv: 1159 .fnstart 1160.LFB2: 1161 @ Function supports interworking. 1162 @ args = 0, pretend = 0, frame = 8 1163 @ frame_needed = 1, uses_anonymous_args = 0 1164 stmfd sp!, {fp, lr} 1165 .save {fp, lr} 1166.LCFI0: 1167 .setfp fp, sp, #4 1168 add fp, sp, #4 1169.LCFI1: 1170 .pad #8 1171 sub sp, sp, #8 1172.LCFI2: 1173 sub r3, fp, #8 1174 mov r0, r3 1175 bl _Z6calleePi 1176 ldr r3, [fp, #-8] 1177 mov r0, r3 1178 sub sp, fp, #4 1179 ldmfd sp!, {fp, lr} 1180 bx lr 1181.LFE2: 1182 .fnend 1183@end verbatim 1184 1185Of course, the sequence of instructions varies based on the options 1186you pass to GCC and on the version of GCC in use. The exact 1187instructions are not important since we are focusing on the pseudo ops 1188that are used to generate unwind information. 1189 1190An important assumption made by the unwinder is that the stack frame 1191does not change during the body of the function. In particular, since 1192we assume that the assembly code does not itself throw an exception, 1193the only point where an exception can be thrown is from a call, such 1194as the @code{bl} instruction above. At each call site, the same saved 1195registers (including @code{lr}, which indicates the return address) 1196must be located in the same locations relative to the frame pointer. 1197 1198The @code{.fnstart} (@pxref{arm_fnstart,,.fnstart pseudo op}) pseudo 1199op appears immediately before the first instruction of the function 1200while the @code{.fnend} (@pxref{arm_fnend,,.fnend pseudo op}) pseudo 1201op appears immediately after the last instruction of the function. 1202These pseudo ops specify the range of the function. 1203 1204Only the order of the other pseudos ops (e.g., @code{.setfp} or 1205@code{.pad}) matters; their exact locations are irrelevant. In the 1206example above, the compiler emits the pseudo ops with particular 1207instructions. That makes it easier to understand the code, but it is 1208not required for correctness. It would work just as well to emit all 1209of the pseudo ops other than @code{.fnend} in the same order, but 1210immediately after @code{.fnstart}. 1211 1212The @code{.save} (@pxref{arm_save,,.save pseudo op}) pseudo op 1213indicates registers that have been saved to the stack so that they can 1214be restored before the function returns. The argument to the 1215@code{.save} pseudo op is a list of registers to save. If a register 1216is ``callee-saved'' (as specified by the ABI) and is modified by the 1217function you are writing, then your code must save the value before it 1218is modified and restore the original value before the function 1219returns. If an exception is thrown, the run-time library restores the 1220values of these registers from their locations on the stack before 1221returning control to the exception handler. (Of course, if an 1222exception is not thrown, the function that contains the @code{.save} 1223pseudo op restores these registers in the function epilogue, as is 1224done with the @code{ldmfd} instruction above.) 1225 1226You do not have to save callee-saved registers at the very beginning 1227of the function and you do not need to use the @code{.save} pseudo op 1228immediately following the point at which the registers are saved. 1229However, if you modify a callee-saved register, you must save it on 1230the stack before modifying it and before calling any functions which 1231might throw an exception. And, you must use the @code{.save} pseudo 1232op to indicate that you have done so. 1233 1234The @code{.pad} (@pxref{arm_pad,,.pad}) pseudo op indicates a 1235modification of the stack pointer that does not save any registers. 1236The argument is the number of bytes (in decimal) that are subtracted 1237from the stack pointer. (On ARM CPUs, the stack grows downwards, so 1238subtracting from the stack pointer increases the size of the stack.) 1239 1240The @code{.setfp} (@pxref{arm_setfp,,.setfp pseudo op}) pseudo op 1241indicates the register that contains the frame pointer. The first 1242argument is the register that is set, which is typically @code{fp}. 1243The second argument indicates the register from which the frame 1244pointer takes its value. The third argument, if present, is the value 1245(in decimal) added to the register specified by the second argument to 1246compute the value of the frame pointer. You should not modify the 1247frame pointer in the body of the function. 1248 1249If you do not use a frame pointer, then you should not use the 1250@code{.setfp} pseudo op. If you do not use a frame pointer, then you 1251should avoid modifying the stack pointer outside of the function 1252prologue. Otherwise, the run-time library will be unable to find 1253saved registers when it is unwinding the stack. 1254 1255The pseudo ops described above are sufficient for writing assembly 1256code that calls functions which may throw exceptions. If you need to 1257know more about the object-file format used to represent unwind 1258information, you may consult the @cite{Exception Handling ABI for the 1259ARM Architecture} available from @uref{http://infocenter.arm.com}. 1260 1261