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