1@c Copyright (C) 1991-2016 Free Software Foundation, Inc. 2@c This is part of the GAS manual. 3@c For copying conditions, see the file as.texinfo. 4@ifset GENERIC 5@page 6@node MIPS-Dependent 7@chapter MIPS Dependent Features 8@end ifset 9@ifclear GENERIC 10@node Machine Dependencies 11@chapter MIPS Dependent Features 12@end ifclear 13 14@cindex MIPS processor 15@sc{gnu} @code{@value{AS}} for MIPS architectures supports several 16different MIPS processors, and MIPS ISA levels I through V, MIPS32, 17and MIPS64. For information about the MIPS instruction set, see 18@cite{MIPS RISC Architecture}, by Kane and Heindrich (Prentice-Hall). 19For an overview of MIPS assembly conventions, see ``Appendix D: 20Assembly Language Programming'' in the same work. 21 22@menu 23* MIPS Options:: Assembler options 24* MIPS Macros:: High-level assembly macros 25* MIPS Symbol Sizes:: Directives to override the size of symbols 26* MIPS Small Data:: Controlling the use of small data accesses 27* MIPS ISA:: Directives to override the ISA level 28* MIPS assembly options:: Directives to control code generation 29* MIPS autoextend:: Directives for extending MIPS 16 bit instructions 30* MIPS insn:: Directive to mark data as an instruction 31* MIPS FP ABIs:: Marking which FP ABI is in use 32* MIPS NaN Encodings:: Directives to record which NaN encoding is being used 33* MIPS Option Stack:: Directives to save and restore options 34* MIPS ASE Instruction Generation Overrides:: Directives to control 35 generation of MIPS ASE instructions 36* MIPS Floating-Point:: Directives to override floating-point options 37* MIPS Syntax:: MIPS specific syntactical considerations 38@end menu 39 40@node MIPS Options 41@section Assembler options 42 43The MIPS configurations of @sc{gnu} @code{@value{AS}} support these 44special options: 45 46@table @code 47@cindex @code{-G} option (MIPS) 48@item -G @var{num} 49Set the ``small data'' limit to @var{n} bytes. The default limit is 8 bytes. 50@xref{MIPS Small Data,, Controlling the use of small data accesses}. 51 52@cindex @code{-EB} option (MIPS) 53@cindex @code{-EL} option (MIPS) 54@cindex MIPS big-endian output 55@cindex MIPS little-endian output 56@cindex big-endian output, MIPS 57@cindex little-endian output, MIPS 58@item -EB 59@itemx -EL 60Any MIPS configuration of @code{@value{AS}} can select big-endian or 61little-endian output at run time (unlike the other @sc{gnu} development 62tools, which must be configured for one or the other). Use @samp{-EB} 63to select big-endian output, and @samp{-EL} for little-endian. 64 65@item -KPIC 66@cindex PIC selection, MIPS 67@cindex @option{-KPIC} option, MIPS 68Generate SVR4-style PIC. This option tells the assembler to generate 69SVR4-style position-independent macro expansions. It also tells the 70assembler to mark the output file as PIC. 71 72@item -mvxworks-pic 73@cindex @option{-mvxworks-pic} option, MIPS 74Generate VxWorks PIC. This option tells the assembler to generate 75VxWorks-style position-independent macro expansions. 76 77@cindex MIPS architecture options 78@item -mips1 79@itemx -mips2 80@itemx -mips3 81@itemx -mips4 82@itemx -mips5 83@itemx -mips32 84@itemx -mips32r2 85@itemx -mips32r3 86@itemx -mips32r5 87@itemx -mips32r6 88@itemx -mips64 89@itemx -mips64r2 90@itemx -mips64r3 91@itemx -mips64r5 92@itemx -mips64r6 93Generate code for a particular MIPS Instruction Set Architecture level. 94@samp{-mips1} corresponds to the R2000 and R3000 processors, 95@samp{-mips2} to the R6000 processor, @samp{-mips3} to the 96R4000 processor, and @samp{-mips4} to the R8000 and R10000 processors. 97@samp{-mips5}, @samp{-mips32}, @samp{-mips32r2}, @samp{-mips32r3}, 98@samp{-mips32r5}, @samp{-mips32r6}, @samp{-mips64}, @samp{-mips64r2}, 99@samp{-mips64r3}, @samp{-mips64r5}, and @samp{-mips64r6} correspond to 100generic MIPS V, MIPS32, MIPS32 Release 2, MIPS32 Release 3, MIPS32 101Release 5, MIPS32 Release 6, MIPS64, and MIPS64 Release 2, MIPS64 102Release 3, MIPS64 Release 5, and MIPS64 Release 6 ISA processors, 103respectively. You can also switch instruction sets during the assembly; 104see @ref{MIPS ISA, Directives to override the ISA level}. 105 106@item -mgp32 107@itemx -mfp32 108Some macros have different expansions for 32-bit and 64-bit registers. 109The register sizes are normally inferred from the ISA and ABI, but these 110flags force a certain group of registers to be treated as 32 bits wide at 111all times. @samp{-mgp32} controls the size of general-purpose registers 112and @samp{-mfp32} controls the size of floating-point registers. 113 114The @code{.set gp=32} and @code{.set fp=32} directives allow the size 115of registers to be changed for parts of an object. The default value is 116restored by @code{.set gp=default} and @code{.set fp=default}. 117 118On some MIPS variants there is a 32-bit mode flag; when this flag is 119set, 64-bit instructions generate a trap. Also, some 32-bit OSes only 120save the 32-bit registers on a context switch, so it is essential never 121to use the 64-bit registers. 122 123@item -mgp64 124@itemx -mfp64 125Assume that 64-bit registers are available. This is provided in the 126interests of symmetry with @samp{-mgp32} and @samp{-mfp32}. 127 128The @code{.set gp=64} and @code{.set fp=64} directives allow the size 129of registers to be changed for parts of an object. The default value is 130restored by @code{.set gp=default} and @code{.set fp=default}. 131 132@item -mfpxx 133Make no assumptions about whether 32-bit or 64-bit floating-point 134registers are available. This is provided to support having modules 135compatible with either @samp{-mfp32} or @samp{-mfp64}. This option can 136only be used with MIPS II and above. 137 138The @code{.set fp=xx} directive allows a part of an object to be marked 139as not making assumptions about 32-bit or 64-bit FP registers. The 140default value is restored by @code{.set fp=default}. 141 142@item -modd-spreg 143@itemx -mno-odd-spreg 144Enable use of floating-point operations on odd-numbered single-precision 145registers when supported by the ISA. @samp{-mfpxx} implies 146@samp{-mno-odd-spreg}, otherwise the default is @samp{-modd-spreg} 147 148@item -mips16 149@itemx -no-mips16 150Generate code for the MIPS 16 processor. This is equivalent to putting 151@code{.set mips16} at the start of the assembly file. @samp{-no-mips16} 152turns off this option. 153 154@item -mmicromips 155@itemx -mno-micromips 156Generate code for the microMIPS processor. This is equivalent to putting 157@code{.set micromips} at the start of the assembly file. @samp{-mno-micromips} 158turns off this option. This is equivalent to putting @code{.set nomicromips} 159at the start of the assembly file. 160 161@item -msmartmips 162@itemx -mno-smartmips 163Enables the SmartMIPS extensions to the MIPS32 instruction set, which 164provides a number of new instructions which target smartcard and 165cryptographic applications. This is equivalent to putting 166@code{.set smartmips} at the start of the assembly file. 167@samp{-mno-smartmips} turns off this option. 168 169@item -mips3d 170@itemx -no-mips3d 171Generate code for the MIPS-3D Application Specific Extension. 172This tells the assembler to accept MIPS-3D instructions. 173@samp{-no-mips3d} turns off this option. 174 175@item -mdmx 176@itemx -no-mdmx 177Generate code for the MDMX Application Specific Extension. 178This tells the assembler to accept MDMX instructions. 179@samp{-no-mdmx} turns off this option. 180 181@item -mdsp 182@itemx -mno-dsp 183Generate code for the DSP Release 1 Application Specific Extension. 184This tells the assembler to accept DSP Release 1 instructions. 185@samp{-mno-dsp} turns off this option. 186 187@item -mdspr2 188@itemx -mno-dspr2 189Generate code for the DSP Release 2 Application Specific Extension. 190This option implies @samp{-mdsp}. 191This tells the assembler to accept DSP Release 2 instructions. 192@samp{-mno-dspr2} turns off this option. 193 194@item -mdspr3 195@itemx -mno-dspr3 196Generate code for the DSP Release 3 Application Specific Extension. 197This option implies @samp{-mdsp} and @samp{-mdspr2}. 198This tells the assembler to accept DSP Release 3 instructions. 199@samp{-mno-dspr3} turns off this option. 200 201@item -mmt 202@itemx -mno-mt 203Generate code for the MT Application Specific Extension. 204This tells the assembler to accept MT instructions. 205@samp{-mno-mt} turns off this option. 206 207@item -mmcu 208@itemx -mno-mcu 209Generate code for the MCU Application Specific Extension. 210This tells the assembler to accept MCU instructions. 211@samp{-mno-mcu} turns off this option. 212 213@item -mmsa 214@itemx -mno-msa 215Generate code for the MIPS SIMD Architecture Extension. 216This tells the assembler to accept MSA instructions. 217@samp{-mno-msa} turns off this option. 218 219@item -mxpa 220@itemx -mno-xpa 221Generate code for the MIPS eXtended Physical Address (XPA) Extension. 222This tells the assembler to accept XPA instructions. 223@samp{-mno-xpa} turns off this option. 224 225@item -mvirt 226@itemx -mno-virt 227Generate code for the Virtualization Application Specific Extension. 228This tells the assembler to accept Virtualization instructions. 229@samp{-mno-virt} turns off this option. 230 231@item -minsn32 232@itemx -mno-insn32 233Only use 32-bit instruction encodings when generating code for the 234microMIPS processor. This option inhibits the use of any 16-bit 235instructions. This is equivalent to putting @code{.set insn32} at 236the start of the assembly file. @samp{-mno-insn32} turns off this 237option. This is equivalent to putting @code{.set noinsn32} at the 238start of the assembly file. By default @samp{-mno-insn32} is 239selected, allowing all instructions to be used. 240 241@item -mfix7000 242@itemx -mno-fix7000 243Cause nops to be inserted if the read of the destination register 244of an mfhi or mflo instruction occurs in the following two instructions. 245 246@item -mfix-rm7000 247@itemx -mno-fix-rm7000 248Cause nops to be inserted if a dmult or dmultu instruction is 249followed by a load instruction. 250 251@item -mfix-loongson2f-jump 252@itemx -mno-fix-loongson2f-jump 253Eliminate instruction fetch from outside 256M region to work around the 254Loongson2F @samp{jump} instructions. Without it, under extreme cases, 255the kernel may crash. The issue has been solved in latest processor 256batches, but this fix has no side effect to them. 257 258@item -mfix-loongson2f-nop 259@itemx -mno-fix-loongson2f-nop 260Replace nops by @code{or at,at,zero} to work around the Loongson2F 261@samp{nop} errata. Without it, under extreme cases, the CPU might 262deadlock. The issue has been solved in later Loongson2F batches, but 263this fix has no side effect to them. 264 265@item -mfix-vr4120 266@itemx -mno-fix-vr4120 267Insert nops to work around certain VR4120 errata. This option is 268intended to be used on GCC-generated code: it is not designed to catch 269all problems in hand-written assembler code. 270 271@item -mfix-vr4130 272@itemx -mno-fix-vr4130 273Insert nops to work around the VR4130 @samp{mflo}/@samp{mfhi} errata. 274 275@item -mfix-loongson2f-btb 276@itemx -mno-fix-loongson2f-btb 277Clear the Branch Target Buffer before any jump through a register. This 278option is intended to be used on kernel code for the Loongson 2F processor 279only; userland code compiled with this option will fault, and kernel code 280compiled with this option run on another processor than Loongson 2F will 281yield unpredictable results. 282 283@item -mfix-24k 284@itemx -mno-fix-24k 285Insert nops to work around the 24K @samp{eret}/@samp{deret} errata. 286 287@item -mfix-cn63xxp1 288@itemx -mno-fix-cn63xxp1 289Replace @code{pref} hints 0 - 4 and 6 - 24 with hint 28 to work around 290certain CN63XXP1 errata. 291 292@item -m4010 293@itemx -no-m4010 294Generate code for the LSI R4010 chip. This tells the assembler to 295accept the R4010-specific instructions (@samp{addciu}, @samp{ffc}, 296etc.), and to not schedule @samp{nop} instructions around accesses to 297the @samp{HI} and @samp{LO} registers. @samp{-no-m4010} turns off this 298option. 299 300@item -m4650 301@itemx -no-m4650 302Generate code for the MIPS R4650 chip. This tells the assembler to accept 303the @samp{mad} and @samp{madu} instruction, and to not schedule @samp{nop} 304instructions around accesses to the @samp{HI} and @samp{LO} registers. 305@samp{-no-m4650} turns off this option. 306 307@item -m3900 308@itemx -no-m3900 309@itemx -m4100 310@itemx -no-m4100 311For each option @samp{-m@var{nnnn}}, generate code for the MIPS 312R@var{nnnn} chip. This tells the assembler to accept instructions 313specific to that chip, and to schedule for that chip's hazards. 314 315@item -march=@var{cpu} 316Generate code for a particular MIPS CPU. It is exactly equivalent to 317@samp{-m@var{cpu}}, except that there are more value of @var{cpu} 318understood. Valid @var{cpu} value are: 319 320@quotation 3212000, 3223000, 3233900, 3244000, 3254010, 3264100, 3274111, 328vr4120, 329vr4130, 330vr4181, 3314300, 3324400, 3334600, 3344650, 3355000, 336rm5200, 337rm5230, 338rm5231, 339rm5261, 340rm5721, 341vr5400, 342vr5500, 3436000, 344rm7000, 3458000, 346rm9000, 34710000, 34812000, 34914000, 35016000, 3514kc, 3524km, 3534kp, 3544ksc, 3554kec, 3564kem, 3574kep, 3584ksd, 359m4k, 360m4kp, 361m14k, 362m14kc, 363m14ke, 364m14kec, 36524kc, 36624kf2_1, 36724kf, 36824kf1_1, 36924kec, 37024kef2_1, 37124kef, 37224kef1_1, 37334kc, 37434kf2_1, 37534kf, 37634kf1_1, 37734kn, 37874kc, 37974kf2_1, 38074kf, 38174kf1_1, 38274kf3_2, 3831004kc, 3841004kf2_1, 3851004kf, 3861004kf1_1, 387interaptiv, 388m5100, 389m5101, 390p5600, 3915kc, 3925kf, 39320kc, 39425kf, 395sb1, 396sb1a, 397i6400, 398p6600, 399loongson2e, 400loongson2f, 401loongson3a, 402octeon, 403octeon+, 404octeon2, 405octeon3, 406xlr, 407xlp 408@end quotation 409 410For compatibility reasons, @samp{@var{n}x} and @samp{@var{b}fx} are 411accepted as synonyms for @samp{@var{n}f1_1}. These values are 412deprecated. 413 414@item -mtune=@var{cpu} 415Schedule and tune for a particular MIPS CPU. Valid @var{cpu} values are 416identical to @samp{-march=@var{cpu}}. 417 418@item -mabi=@var{abi} 419Record which ABI the source code uses. The recognized arguments 420are: @samp{32}, @samp{n32}, @samp{o64}, @samp{64} and @samp{eabi}. 421 422@item -msym32 423@itemx -mno-sym32 424@cindex -msym32 425@cindex -mno-sym32 426Equivalent to adding @code{.set sym32} or @code{.set nosym32} to 427the beginning of the assembler input. @xref{MIPS Symbol Sizes}. 428 429@cindex @code{-nocpp} ignored (MIPS) 430@item -nocpp 431This option is ignored. It is accepted for command-line compatibility with 432other assemblers, which use it to turn off C style preprocessing. With 433@sc{gnu} @code{@value{AS}}, there is no need for @samp{-nocpp}, because the 434@sc{gnu} assembler itself never runs the C preprocessor. 435 436@item -msoft-float 437@itemx -mhard-float 438Disable or enable floating-point instructions. Note that by default 439floating-point instructions are always allowed even with CPU targets 440that don't have support for these instructions. 441 442@item -msingle-float 443@itemx -mdouble-float 444Disable or enable double-precision floating-point operations. Note 445that by default double-precision floating-point operations are always 446allowed even with CPU targets that don't have support for these 447operations. 448 449@item --construct-floats 450@itemx --no-construct-floats 451The @code{--no-construct-floats} option disables the construction of 452double width floating point constants by loading the two halves of the 453value into the two single width floating point registers that make up 454the double width register. This feature is useful if the processor 455support the FR bit in its status register, and this bit is known (by 456the programmer) to be set. This bit prevents the aliasing of the double 457width register by the single width registers. 458 459By default @code{--construct-floats} is selected, allowing construction 460of these floating point constants. 461 462@item --relax-branch 463@itemx --no-relax-branch 464The @samp{--relax-branch} option enables the relaxation of out-of-range 465branches. Any branches whose target cannot be reached directly are 466converted to a small instruction sequence including an inverse-condition 467branch to the physically next instruction, and a jump to the original 468target is inserted between the two instructions. In PIC code the jump 469will involve further instructions for address calculation. 470 471The @code{BC1ANY2F}, @code{BC1ANY2T}, @code{BC1ANY4F}, @code{BC1ANY4T}, 472@code{BPOSGE32} and @code{BPOSGE64} instructions are excluded from 473relaxation, because they have no complementing counterparts. They could 474be relaxed with the use of a longer sequence involving another branch, 475however this has not been implemented and if their target turns out of 476reach, they produce an error even if branch relaxation is enabled. 477 478Also no MIPS16 branches are ever relaxed. 479 480By default @samp{--no-relax-branch} is selected, causing any out-of-range 481branches to produce an error. 482 483@cindex @option{-mnan=} command line option, MIPS 484@item -mnan=@var{encoding} 485This option indicates whether the source code uses the IEEE 2008 486NaN encoding (@option{-mnan=2008}) or the original MIPS encoding 487(@option{-mnan=legacy}). It is equivalent to adding a @code{.nan} 488directive to the beginning of the source file. @xref{MIPS NaN Encodings}. 489 490@option{-mnan=legacy} is the default if no @option{-mnan} option or 491@code{.nan} directive is used. 492 493@item --trap 494@itemx --no-break 495@c FIXME! (1) reflect these options (next item too) in option summaries; 496@c (2) stop teasing, say _which_ instructions expanded _how_. 497@code{@value{AS}} automatically macro expands certain division and 498multiplication instructions to check for overflow and division by zero. This 499option causes @code{@value{AS}} to generate code to take a trap exception 500rather than a break exception when an error is detected. The trap instructions 501are only supported at Instruction Set Architecture level 2 and higher. 502 503@item --break 504@itemx --no-trap 505Generate code to take a break exception rather than a trap exception when an 506error is detected. This is the default. 507 508@item -mpdr 509@itemx -mno-pdr 510Control generation of @code{.pdr} sections. Off by default on IRIX, on 511elsewhere. 512 513@item -mshared 514@itemx -mno-shared 515When generating code using the Unix calling conventions (selected by 516@samp{-KPIC} or @samp{-mcall_shared}), gas will normally generate code 517which can go into a shared library. The @samp{-mno-shared} option 518tells gas to generate code which uses the calling convention, but can 519not go into a shared library. The resulting code is slightly more 520efficient. This option only affects the handling of the 521@samp{.cpload} and @samp{.cpsetup} pseudo-ops. 522@end table 523 524@node MIPS Macros 525@section High-level assembly macros 526 527MIPS assemblers have traditionally provided a wider range of 528instructions than the MIPS architecture itself. These extra 529instructions are usually referred to as ``macro'' instructions 530@footnote{The term ``macro'' is somewhat overloaded here, since 531these macros have no relation to those defined by @code{.macro}, 532@pxref{Macro,, @code{.macro}}.}. 533 534Some MIPS macro instructions extend an underlying architectural instruction 535while others are entirely new. An example of the former type is @code{and}, 536which allows the third operand to be either a register or an arbitrary 537immediate value. Examples of the latter type include @code{bgt}, which 538branches to the third operand when the first operand is greater than 539the second operand, and @code{ulh}, which implements an unaligned 5402-byte load. 541 542One of the most common extensions provided by macros is to expand 543memory offsets to the full address range (32 or 64 bits) and to allow 544symbolic offsets such as @samp{my_data + 4} to be used in place of 545integer constants. For example, the architectural instruction 546@code{lbu} allows only a signed 16-bit offset, whereas the macro 547@code{lbu} allows code such as @samp{lbu $4,array+32769($5)}. 548The implementation of these symbolic offsets depends on several factors, 549such as whether the assembler is generating SVR4-style PIC (selected by 550@option{-KPIC}, @pxref{MIPS Options,, Assembler options}), the size of symbols 551(@pxref{MIPS Symbol Sizes,, Directives to override the size of symbols}), 552and the small data limit (@pxref{MIPS Small Data,, Controlling the use 553of small data accesses}). 554 555@kindex @code{.set macro} 556@kindex @code{.set nomacro} 557Sometimes it is undesirable to have one assembly instruction expand 558to several machine instructions. The directive @code{.set nomacro} 559tells the assembler to warn when this happens. @code{.set macro} 560restores the default behavior. 561 562@cindex @code{at} register, MIPS 563@kindex @code{.set at=@var{reg}} 564Some macro instructions need a temporary register to store intermediate 565results. This register is usually @code{$1}, also known as @code{$at}, 566but it can be changed to any core register @var{reg} using 567@code{.set at=@var{reg}}. Note that @code{$at} always refers 568to @code{$1} regardless of which register is being used as the 569temporary register. 570 571@kindex @code{.set at} 572@kindex @code{.set noat} 573Implicit uses of the temporary register in macros could interfere with 574explicit uses in the assembly code. The assembler therefore warns 575whenever it sees an explicit use of the temporary register. The directive 576@code{.set noat} silences this warning while @code{.set at} restores 577the default behavior. It is safe to use @code{.set noat} while 578@code{.set nomacro} is in effect since single-instruction macros 579never need a temporary register. 580 581Note that while the @sc{gnu} assembler provides these macros for compatibility, 582it does not make any attempt to optimize them with the surrounding code. 583 584@node MIPS Symbol Sizes 585@section Directives to override the size of symbols 586 587@kindex @code{.set sym32} 588@kindex @code{.set nosym32} 589The n64 ABI allows symbols to have any 64-bit value. Although this 590provides a great deal of flexibility, it means that some macros have 591much longer expansions than their 32-bit counterparts. For example, 592the non-PIC expansion of @samp{dla $4,sym} is usually: 593 594@smallexample 595lui $4,%highest(sym) 596lui $1,%hi(sym) 597daddiu $4,$4,%higher(sym) 598daddiu $1,$1,%lo(sym) 599dsll32 $4,$4,0 600daddu $4,$4,$1 601@end smallexample 602 603whereas the 32-bit expansion is simply: 604 605@smallexample 606lui $4,%hi(sym) 607daddiu $4,$4,%lo(sym) 608@end smallexample 609 610n64 code is sometimes constructed in such a way that all symbolic 611constants are known to have 32-bit values, and in such cases, it's 612preferable to use the 32-bit expansion instead of the 64-bit 613expansion. 614 615You can use the @code{.set sym32} directive to tell the assembler 616that, from this point on, all expressions of the form 617@samp{@var{symbol}} or @samp{@var{symbol} + @var{offset}} 618have 32-bit values. For example: 619 620@smallexample 621.set sym32 622dla $4,sym 623lw $4,sym+16 624sw $4,sym+0x8000($4) 625@end smallexample 626 627will cause the assembler to treat @samp{sym}, @code{sym+16} and 628@code{sym+0x8000} as 32-bit values. The handling of non-symbolic 629addresses is not affected. 630 631The directive @code{.set nosym32} ends a @code{.set sym32} block and 632reverts to the normal behavior. It is also possible to change the 633symbol size using the command-line options @option{-msym32} and 634@option{-mno-sym32}. 635 636These options and directives are always accepted, but at present, 637they have no effect for anything other than n64. 638 639@node MIPS Small Data 640@section Controlling the use of small data accesses 641 642@c This section deliberately glosses over the possibility of using -G 643@c in SVR4-style PIC, as could be done on IRIX. We don't support that. 644@cindex small data, MIPS 645@cindex @code{gp} register, MIPS 646It often takes several instructions to load the address of a symbol. 647For example, when @samp{addr} is a 32-bit symbol, the non-PIC expansion 648of @samp{dla $4,addr} is usually: 649 650@smallexample 651lui $4,%hi(addr) 652daddiu $4,$4,%lo(addr) 653@end smallexample 654 655The sequence is much longer when @samp{addr} is a 64-bit symbol. 656@xref{MIPS Symbol Sizes,, Directives to override the size of symbols}. 657 658In order to cut down on this overhead, most embedded MIPS systems 659set aside a 64-kilobyte ``small data'' area and guarantee that all 660data of size @var{n} and smaller will be placed in that area. 661The limit @var{n} is passed to both the assembler and the linker 662using the command-line option @option{-G @var{n}}, @pxref{MIPS Options,, 663Assembler options}. Note that the same value of @var{n} must be used 664when linking and when assembling all input files to the link; any 665inconsistency could cause a relocation overflow error. 666 667The size of an object in the @code{.bss} section is set by the 668@code{.comm} or @code{.lcomm} directive that defines it. The size of 669an external object may be set with the @code{.extern} directive. For 670example, @samp{.extern sym,4} declares that the object at @code{sym} 671is 4 bytes in length, while leaving @code{sym} otherwise undefined. 672 673When no @option{-G} option is given, the default limit is 8 bytes. 674The option @option{-G 0} prevents any data from being automatically 675classified as small. 676 677It is also possible to mark specific objects as small by putting them 678in the special sections @code{.sdata} and @code{.sbss}, which are 679``small'' counterparts of @code{.data} and @code{.bss} respectively. 680The toolchain will treat such data as small regardless of the 681@option{-G} setting. 682 683On startup, systems that support a small data area are expected to 684initialize register @code{$28}, also known as @code{$gp}, in such a 685way that small data can be accessed using a 16-bit offset from that 686register. For example, when @samp{addr} is small data, 687the @samp{dla $4,addr} instruction above is equivalent to: 688 689@smallexample 690daddiu $4,$28,%gp_rel(addr) 691@end smallexample 692 693Small data is not supported for SVR4-style PIC. 694 695@node MIPS ISA 696@section Directives to override the ISA level 697 698@cindex MIPS ISA override 699@kindex @code{.set mips@var{n}} 700@sc{gnu} @code{@value{AS}} supports an additional directive to change 701the MIPS Instruction Set Architecture level on the fly: @code{.set 702mips@var{n}}. @var{n} should be a number from 0 to 5, or 32, 32r2, 32r3, 70332r5, 32r6, 64, 64r2, 64r3, 64r5 or 64r6. 704The values other than 0 make the assembler accept instructions 705for the corresponding ISA level, from that point on in the 706assembly. @code{.set mips@var{n}} affects not only which instructions 707are permitted, but also how certain macros are expanded. @code{.set 708mips0} restores the ISA level to its original level: either the 709level you selected with command line options, or the default for your 710configuration. You can use this feature to permit specific MIPS III 711instructions while assembling in 32 bit mode. Use this directive with 712care! 713 714@cindex MIPS CPU override 715@kindex @code{.set arch=@var{cpu}} 716The @code{.set arch=@var{cpu}} directive provides even finer control. 717It changes the effective CPU target and allows the assembler to use 718instructions specific to a particular CPU. All CPUs supported by the 719@samp{-march} command line option are also selectable by this directive. 720The original value is restored by @code{.set arch=default}. 721 722The directive @code{.set mips16} puts the assembler into MIPS 16 mode, 723in which it will assemble instructions for the MIPS 16 processor. Use 724@code{.set nomips16} to return to normal 32 bit mode. 725 726Traditional MIPS assemblers do not support this directive. 727 728The directive @code{.set micromips} puts the assembler into microMIPS mode, 729in which it will assemble instructions for the microMIPS processor. Use 730@code{.set nomicromips} to return to normal 32 bit mode. 731 732Traditional MIPS assemblers do not support this directive. 733 734@node MIPS assembly options 735@section Directives to control code generation 736 737@cindex MIPS directives to override command line options 738@kindex @code{.module} 739The @code{.module} directive allows command line options to be set directly 740from assembly. The format of the directive matches the @code{.set} 741directive but only those options which are relevant to a whole module are 742supported. The effect of a @code{.module} directive is the same as the 743corresponding command line option. Where @code{.set} directives support 744returning to a default then the @code{.module} directives do not as they 745define the defaults. 746 747These module-level directives must appear first in assembly. 748 749Traditional MIPS assemblers do not support this directive. 750 751@cindex MIPS 32-bit microMIPS instruction generation override 752@kindex @code{.set insn32} 753@kindex @code{.set noinsn32} 754The directive @code{.set insn32} makes the assembler only use 32-bit 755instruction encodings when generating code for the microMIPS processor. 756This directive inhibits the use of any 16-bit instructions from that 757point on in the assembly. The @code{.set noinsn32} directive allows 75816-bit instructions to be accepted. 759 760Traditional MIPS assemblers do not support this directive. 761 762@node MIPS autoextend 763@section Directives for extending MIPS 16 bit instructions 764 765@kindex @code{.set autoextend} 766@kindex @code{.set noautoextend} 767By default, MIPS 16 instructions are automatically extended to 32 bits 768when necessary. The directive @code{.set noautoextend} will turn this 769off. When @code{.set noautoextend} is in effect, any 32 bit instruction 770must be explicitly extended with the @code{.e} modifier (e.g., 771@code{li.e $4,1000}). The directive @code{.set autoextend} may be used 772to once again automatically extend instructions when necessary. 773 774This directive is only meaningful when in MIPS 16 mode. Traditional 775MIPS assemblers do not support this directive. 776 777@node MIPS insn 778@section Directive to mark data as an instruction 779 780@kindex @code{.insn} 781The @code{.insn} directive tells @code{@value{AS}} that the following 782data is actually instructions. This makes a difference in MIPS 16 and 783microMIPS modes: when loading the address of a label which precedes 784instructions, @code{@value{AS}} automatically adds 1 to the value, so 785that jumping to the loaded address will do the right thing. 786 787@kindex @code{.global} 788The @code{.global} and @code{.globl} directives supported by 789@code{@value{AS}} will by default mark the symbol as pointing to a 790region of data not code. This means that, for example, any 791instructions following such a symbol will not be disassembled by 792@code{objdump} as it will regard them as data. To change this 793behavior an optional section name can be placed after the symbol name 794in the @code{.global} directive. If this section exists and is known 795to be a code section, then the symbol will be marked as pointing at 796code not data. Ie the syntax for the directive is: 797 798 @code{.global @var{symbol}[ @var{section}][, @var{symbol}[ @var{section}]] ...}, 799 800Here is a short example: 801 802@example 803 .global foo .text, bar, baz .data 804foo: 805 nop 806bar: 807 .word 0x0 808baz: 809 .word 0x1 810 811@end example 812 813@node MIPS FP ABIs 814@section Directives to control the FP ABI 815@menu 816* MIPS FP ABI History:: History of FP ABIs 817* MIPS FP ABI Variants:: Supported FP ABIs 818* MIPS FP ABI Selection:: Automatic selection of FP ABI 819* MIPS FP ABI Compatibility:: Linking different FP ABI variants 820@end menu 821 822@node MIPS FP ABI History 823@subsection History of FP ABIs 824@cindex @code{.gnu_attribute 4, @var{n}} directive, MIPS 825@cindex @code{.gnu_attribute Tag_GNU_MIPS_ABI_FP, @var{n}} directive, MIPS 826The MIPS ABIs support a variety of different floating-point extensions 827where calling-convention and register sizes vary for floating-point data. 828The extensions exist to support a wide variety of optional architecture 829features. The resulting ABI variants are generally incompatible with each 830other and must be tracked carefully. 831 832Traditionally the use of an explicit @code{.gnu_attribute 4, @var{n}} 833directive is used to indicate which ABI is in use by a specific module. 834It was then left to the user to ensure that command line options and the 835selected ABI were compatible with some potential for inconsistencies. 836 837@node MIPS FP ABI Variants 838@subsection Supported FP ABIs 839The supported floating-point ABI variants are: 840 841@table @code 842@item 0 - No floating-point 843This variant is used to indicate that floating-point is not used within 844the module at all and therefore has no impact on the ABI. This is the 845default. 846 847@item 1 - Double-precision 848This variant indicates that double-precision support is used. For 64-bit 849ABIs this means that 64-bit wide floating-point registers are required. 850For 32-bit ABIs this means that 32-bit wide floating-point registers are 851required and double-precision operations use pairs of registers. 852 853@item 2 - Single-precision 854This variant indicates that single-precision support is used. Double 855precision operations will be supported via soft-float routines. 856 857@item 3 - Soft-float 858This variant indicates that although floating-point support is used all 859operations are emulated in software. This means the ABI is modified to 860pass all floating-point data in general-purpose registers. 861 862@item 4 - Deprecated 863This variant existed as an initial attempt at supporting 64-bit wide 864floating-point registers for O32 ABI on a MIPS32r2 CPU. This has been 865superseded by 5, 6 and 7. 866 867@item 5 - Double-precision 32-bit CPU, 32-bit or 64-bit FPU 868This variant is used by 32-bit ABIs to indicate that the floating-point 869code in the module has been designed to operate correctly with either 87032-bit wide or 64-bit wide floating-point registers. Double-precision 871support is used. Only O32 currently supports this variant and requires 872a minimum architecture of MIPS II. 873 874@item 6 - Double-precision 32-bit FPU, 64-bit FPU 875This variant is used by 32-bit ABIs to indicate that the floating-point 876code in the module requires 64-bit wide floating-point registers. 877Double-precision support is used. Only O32 currently supports this 878variant and requires a minimum architecture of MIPS32r2. 879 880@item 7 - Double-precision compat 32-bit FPU, 64-bit FPU 881This variant is used by 32-bit ABIs to indicate that the floating-point 882code in the module requires 64-bit wide floating-point registers. 883Double-precision support is used. This differs from the previous ABI 884as it restricts use of odd-numbered single-precision registers. Only 885O32 currently supports this variant and requires a minimum architecture 886of MIPS32r2. 887@end table 888 889@node MIPS FP ABI Selection 890@subsection Automatic selection of FP ABI 891@cindex @code{.module fp=@var{nn}} directive, MIPS 892In order to simplify and add safety to the process of selecting the 893correct floating-point ABI, the assembler will automatically infer the 894correct @code{.gnu_attribute 4, @var{n}} directive based on command line 895options and @code{.module} overrides. Where an explicit 896@code{.gnu_attribute 4, @var{n}} directive has been seen then a warning 897will be raised if it does not match an inferred setting. 898 899The floating-point ABI is inferred as follows. If @samp{-msoft-float} 900has been used the module will be marked as soft-float. If 901@samp{-msingle-float} has been used then the module will be marked as 902single-precision. The remaining ABIs are then selected based 903on the FP register width. Double-precision is selected if the width 904of GP and FP registers match and the special double-precision variants 905for 32-bit ABIs are then selected depending on @samp{-mfpxx}, 906@samp{-mfp64} and @samp{-mno-odd-spreg}. 907 908@node MIPS FP ABI Compatibility 909@subsection Linking different FP ABI variants 910Modules using the default FP ABI (no floating-point) can be linked with 911any other (singular) FP ABI variant. 912 913Special compatibility support exists for O32 with the four 914double-precision FP ABI variants. The @samp{-mfpxx} FP ABI is specifically 915designed to be compatible with the standard double-precision ABI and the 916@samp{-mfp64} FP ABIs. This makes it desirable for O32 modules to be 917built as @samp{-mfpxx} to ensure the maximum compatibility with other 918modules produced for more specific needs. The only FP ABIs which cannot 919be linked together are the standard double-precision ABI and the full 920@samp{-mfp64} ABI with @samp{-modd-spreg}. 921 922@node MIPS NaN Encodings 923@section Directives to record which NaN encoding is being used 924 925@cindex MIPS IEEE 754 NaN data encoding selection 926@cindex @code{.nan} directive, MIPS 927The IEEE 754 floating-point standard defines two types of not-a-number 928(NaN) data: ``signalling'' NaNs and ``quiet'' NaNs. The original version 929of the standard did not specify how these two types should be 930distinguished. Most implementations followed the i387 model, in which 931the first bit of the significand is set for quiet NaNs and clear for 932signalling NaNs. However, the original MIPS implementation assigned the 933opposite meaning to the bit, so that it was set for signalling NaNs and 934clear for quiet NaNs. 935 936The 2008 revision of the standard formally suggested the i387 choice 937and as from Sep 2012 the current release of the MIPS architecture 938therefore optionally supports that form. Code that uses one NaN encoding 939would usually be incompatible with code that uses the other NaN encoding, 940so MIPS ELF objects have a flag (@code{EF_MIPS_NAN2008}) to record which 941encoding is being used. 942 943Assembly files can use the @code{.nan} directive to select between the 944two encodings. @samp{.nan 2008} says that the assembly file uses the 945IEEE 754-2008 encoding while @samp{.nan legacy} says that the file uses 946the original MIPS encoding. If several @code{.nan} directives are given, 947the final setting is the one that is used. 948 949The command-line options @option{-mnan=legacy} and @option{-mnan=2008} 950can be used instead of @samp{.nan legacy} and @samp{.nan 2008} 951respectively. However, any @code{.nan} directive overrides the 952command-line setting. 953 954@samp{.nan legacy} is the default if no @code{.nan} directive or 955@option{-mnan} option is given. 956 957Note that @sc{gnu} @code{@value{AS}} does not produce NaNs itself and 958therefore these directives do not affect code generation. They simply 959control the setting of the @code{EF_MIPS_NAN2008} flag. 960 961Traditional MIPS assemblers do not support these directives. 962 963@node MIPS Option Stack 964@section Directives to save and restore options 965 966@cindex MIPS option stack 967@kindex @code{.set push} 968@kindex @code{.set pop} 969The directives @code{.set push} and @code{.set pop} may be used to save 970and restore the current settings for all the options which are 971controlled by @code{.set}. The @code{.set push} directive saves the 972current settings on a stack. The @code{.set pop} directive pops the 973stack and restores the settings. 974 975These directives can be useful inside an macro which must change an 976option such as the ISA level or instruction reordering but does not want 977to change the state of the code which invoked the macro. 978 979Traditional MIPS assemblers do not support these directives. 980 981@node MIPS ASE Instruction Generation Overrides 982@section Directives to control generation of MIPS ASE instructions 983 984@cindex MIPS MIPS-3D instruction generation override 985@kindex @code{.set mips3d} 986@kindex @code{.set nomips3d} 987The directive @code{.set mips3d} makes the assembler accept instructions 988from the MIPS-3D Application Specific Extension from that point on 989in the assembly. The @code{.set nomips3d} directive prevents MIPS-3D 990instructions from being accepted. 991 992@cindex SmartMIPS instruction generation override 993@kindex @code{.set smartmips} 994@kindex @code{.set nosmartmips} 995The directive @code{.set smartmips} makes the assembler accept 996instructions from the SmartMIPS Application Specific Extension to the 997MIPS32 ISA from that point on in the assembly. The 998@code{.set nosmartmips} directive prevents SmartMIPS instructions from 999being accepted. 1000 1001@cindex MIPS MDMX instruction generation override 1002@kindex @code{.set mdmx} 1003@kindex @code{.set nomdmx} 1004The directive @code{.set mdmx} makes the assembler accept instructions 1005from the MDMX Application Specific Extension from that point on 1006in the assembly. The @code{.set nomdmx} directive prevents MDMX 1007instructions from being accepted. 1008 1009@cindex MIPS DSP Release 1 instruction generation override 1010@kindex @code{.set dsp} 1011@kindex @code{.set nodsp} 1012The directive @code{.set dsp} makes the assembler accept instructions 1013from the DSP Release 1 Application Specific Extension from that point 1014on in the assembly. The @code{.set nodsp} directive prevents DSP 1015Release 1 instructions from being accepted. 1016 1017@cindex MIPS DSP Release 2 instruction generation override 1018@kindex @code{.set dspr2} 1019@kindex @code{.set nodspr2} 1020The directive @code{.set dspr2} makes the assembler accept instructions 1021from the DSP Release 2 Application Specific Extension from that point 1022on in the assembly. This directive implies @code{.set dsp}. The 1023@code{.set nodspr2} directive prevents DSP Release 2 instructions from 1024being accepted. 1025 1026@cindex MIPS DSP Release 3 instruction generation override 1027@kindex @code{.set dspr3} 1028@kindex @code{.set nodspr3} 1029The directive @code{.set dspr3} makes the assembler accept instructions 1030from the DSP Release 3 Application Specific Extension from that point 1031on in the assembly. This directive implies @code{.set dsp} and 1032@code{.set dspr2}. The @code{.set nodspr3} directive prevents DSP 1033Release 3 instructions from being accepted. 1034 1035@cindex MIPS MT instruction generation override 1036@kindex @code{.set mt} 1037@kindex @code{.set nomt} 1038The directive @code{.set mt} makes the assembler accept instructions 1039from the MT Application Specific Extension from that point on 1040in the assembly. The @code{.set nomt} directive prevents MT 1041instructions from being accepted. 1042 1043@cindex MIPS MCU instruction generation override 1044@kindex @code{.set mcu} 1045@kindex @code{.set nomcu} 1046The directive @code{.set mcu} makes the assembler accept instructions 1047from the MCU Application Specific Extension from that point on 1048in the assembly. The @code{.set nomcu} directive prevents MCU 1049instructions from being accepted. 1050 1051@cindex MIPS SIMD Architecture instruction generation override 1052@kindex @code{.set msa} 1053@kindex @code{.set nomsa} 1054The directive @code{.set msa} makes the assembler accept instructions 1055from the MIPS SIMD Architecture Extension from that point on 1056in the assembly. The @code{.set nomsa} directive prevents MSA 1057instructions from being accepted. 1058 1059@cindex Virtualization instruction generation override 1060@kindex @code{.set virt} 1061@kindex @code{.set novirt} 1062The directive @code{.set virt} makes the assembler accept instructions 1063from the Virtualization Application Specific Extension from that point 1064on in the assembly. The @code{.set novirt} directive prevents Virtualization 1065instructions from being accepted. 1066 1067@cindex MIPS eXtended Physical Address (XPA) instruction generation override 1068@kindex @code{.set xpa} 1069@kindex @code{.set noxpa} 1070The directive @code{.set xpa} makes the assembler accept instructions 1071from the XPA Extension from that point on in the assembly. The 1072@code{.set noxpa} directive prevents XPA instructions from being accepted. 1073 1074Traditional MIPS assemblers do not support these directives. 1075 1076@node MIPS Floating-Point 1077@section Directives to override floating-point options 1078 1079@cindex Disable floating-point instructions 1080@kindex @code{.set softfloat} 1081@kindex @code{.set hardfloat} 1082The directives @code{.set softfloat} and @code{.set hardfloat} provide 1083finer control of disabling and enabling float-point instructions. 1084These directives always override the default (that hard-float 1085instructions are accepted) or the command-line options 1086(@samp{-msoft-float} and @samp{-mhard-float}). 1087 1088@cindex Disable single-precision floating-point operations 1089@kindex @code{.set singlefloat} 1090@kindex @code{.set doublefloat} 1091The directives @code{.set singlefloat} and @code{.set doublefloat} 1092provide finer control of disabling and enabling double-precision 1093float-point operations. These directives always override the default 1094(that double-precision operations are accepted) or the command-line 1095options (@samp{-msingle-float} and @samp{-mdouble-float}). 1096 1097Traditional MIPS assemblers do not support these directives. 1098 1099@node MIPS Syntax 1100@section Syntactical considerations for the MIPS assembler 1101@menu 1102* MIPS-Chars:: Special Characters 1103@end menu 1104 1105@node MIPS-Chars 1106@subsection Special Characters 1107 1108@cindex line comment character, MIPS 1109@cindex MIPS line comment character 1110The presence of a @samp{#} on a line indicates the start of a comment 1111that extends to the end of the current line. 1112 1113If a @samp{#} appears as the first character of a line, the whole line 1114is treated as a comment, but in this case the line can also be a 1115logical line number directive (@pxref{Comments}) or a 1116preprocessor control command (@pxref{Preprocessing}). 1117 1118@cindex line separator, MIPS 1119@cindex statement separator, MIPS 1120@cindex MIPS line separator 1121The @samp{;} character can be used to separate statements on the same 1122line. 1123