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