1@c Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1999, 2000, 2001, 2@c 2002, 2003, 2004 3@c Free Software Foundation, Inc. 4@c This is part of the GAS manual. 5@c For copying conditions, see the file as.texinfo. 6@ifset GENERIC 7@page 8@node MIPS-Dependent 9@chapter MIPS Dependent Features 10@end ifset 11@ifclear GENERIC 12@node Machine Dependencies 13@chapter MIPS Dependent Features 14@end ifclear 15 16@cindex MIPS processor 17@sc{gnu} @code{@value{AS}} for @sc{mips} architectures supports several 18different @sc{mips} processors, and MIPS ISA levels I through V, MIPS32, 19and MIPS64. For information about the @sc{mips} instruction set, see 20@cite{MIPS RISC Architecture}, by Kane and Heindrich (Prentice-Hall). 21For an overview of @sc{mips} assembly conventions, see ``Appendix D: 22Assembly Language Programming'' in the same work. 23 24@menu 25* MIPS Opts:: Assembler options 26* MIPS Object:: ECOFF object code 27* MIPS Stabs:: Directives for debugging information 28* MIPS ISA:: Directives to override the ISA level 29* MIPS symbol sizes:: Directives to override the size of symbols 30* MIPS autoextend:: Directives for extending MIPS 16 bit instructions 31* MIPS insn:: Directive to mark data as an instruction 32* MIPS option stack:: Directives to save and restore options 33* MIPS ASE instruction generation overrides:: Directives to control 34 generation of MIPS ASE instructions 35@end menu 36 37@node MIPS Opts 38@section Assembler options 39 40The @sc{mips} configurations of @sc{gnu} @code{@value{AS}} support these 41special options: 42 43@table @code 44@cindex @code{-G} option (MIPS) 45@item -G @var{num} 46This option sets the largest size of an object that can be referenced 47implicitly with the @code{gp} register. It is only accepted for targets 48that use @sc{ecoff} format. The default value is 8. 49 50@cindex @code{-EB} option (MIPS) 51@cindex @code{-EL} option (MIPS) 52@cindex MIPS big-endian output 53@cindex MIPS little-endian output 54@cindex big-endian output, MIPS 55@cindex little-endian output, MIPS 56@item -EB 57@itemx -EL 58Any @sc{mips} configuration of @code{@value{AS}} can select big-endian or 59little-endian output at run time (unlike the other @sc{gnu} development 60tools, which must be configured for one or the other). Use @samp{-EB} 61to select big-endian output, and @samp{-EL} for little-endian. 62 63@cindex MIPS architecture options 64@item -mips1 65@itemx -mips2 66@itemx -mips3 67@itemx -mips4 68@itemx -mips5 69@itemx -mips32 70@itemx -mips32r2 71@itemx -mips64 72@itemx -mips64r2 73Generate code for a particular MIPS Instruction Set Architecture level. 74@samp{-mips1} corresponds to the @sc{r2000} and @sc{r3000} processors, 75@samp{-mips2} to the @sc{r6000} processor, @samp{-mips3} to the 76@sc{r4000} processor, and @samp{-mips4} to the @sc{r8000} and 77@sc{r10000} processors. @samp{-mips5}, @samp{-mips32}, @samp{-mips32r2}, 78@samp{-mips64}, and @samp{-mips64r2} 79correspond to generic 80@sc{MIPS V}, @sc{MIPS32}, @sc{MIPS32 Release 2}, @sc{MIPS64}, 81and @sc{MIPS64 Release 2} 82ISA processors, respectively. You can also switch 83instruction sets during the assembly; see @ref{MIPS ISA, Directives to 84override the ISA level}. 85 86@item -mgp32 87@itemx -mfp32 88Some macros have different expansions for 32-bit and 64-bit registers. 89The register sizes are normally inferred from the ISA and ABI, but these 90flags force a certain group of registers to be treated as 32 bits wide at 91all times. @samp{-mgp32} controls the size of general-purpose registers 92and @samp{-mfp32} controls the size of floating-point registers. 93 94On some MIPS variants there is a 32-bit mode flag; when this flag is 95set, 64-bit instructions generate a trap. Also, some 32-bit OSes only 96save the 32-bit registers on a context switch, so it is essential never 97to use the 64-bit registers. 98 99@item -mgp64 100Assume that 64-bit general purpose registers are available. This is 101provided in the interests of symmetry with -gp32. 102 103@item -mips16 104@itemx -no-mips16 105Generate code for the MIPS 16 processor. This is equivalent to putting 106@samp{.set mips16} at the start of the assembly file. @samp{-no-mips16} 107turns off this option. 108 109@item -mips3d 110@itemx -no-mips3d 111Generate code for the MIPS-3D Application Specific Extension. 112This tells the assembler to accept MIPS-3D instructions. 113@samp{-no-mips3d} turns off this option. 114 115@item -mdmx 116@itemx -no-mdmx 117Generate code for the MDMX Application Specific Extension. 118This tells the assembler to accept MDMX instructions. 119@samp{-no-mdmx} turns off this option. 120 121@item -mdsp 122@itemx -mno-dsp 123Generate code for the DSP Application Specific Extension. 124This tells the assembler to accept DSP instructions. 125@samp{-mno-dsp} turns off this option. 126 127@item -mmt 128@itemx -mno-mt 129Generate code for the MT Application Specific Extension. 130This tells the assembler to accept MT instructions. 131@samp{-mno-mt} turns off this option. 132 133@item -mfix7000 134@itemx -mno-fix7000 135Cause nops to be inserted if the read of the destination register 136of an mfhi or mflo instruction occurs in the following two instructions. 137 138@item -mfix-vr4120 139@itemx -no-mfix-vr4120 140Insert nops to work around certain VR4120 errata. This option is 141intended to be used on GCC-generated code: it is not designed to catch 142all problems in hand-written assembler code. 143 144@item -mfix-vr4130 145@itemx -no-mfix-vr4130 146Insert nops to work around the VR4130 @samp{mflo}/@samp{mfhi} errata. 147 148@item -mfix-loongson2f-btb 149@itemx -mno-fix-loongson2f-btb 150Clear the Branch Target Buffer before any jump through a register. This 151option is intended to be used on kernel code for the Loongson 2F processor 152only; userland code compiled with this option will fault, and kernel code 153compiled with this option run on another processor than Loongson 2E and 2F 154will yield unpredictable results. 155 156@item -m4010 157@itemx -no-m4010 158Generate code for the LSI @sc{r4010} chip. This tells the assembler to 159accept the @sc{r4010} specific instructions (@samp{addciu}, @samp{ffc}, 160etc.), and to not schedule @samp{nop} instructions around accesses to 161the @samp{HI} and @samp{LO} registers. @samp{-no-m4010} turns off this 162option. 163 164@item -m4650 165@itemx -no-m4650 166Generate code for the MIPS @sc{r4650} chip. This tells the assembler to accept 167the @samp{mad} and @samp{madu} instruction, and to not schedule @samp{nop} 168instructions around accesses to the @samp{HI} and @samp{LO} registers. 169@samp{-no-m4650} turns off this option. 170 171@itemx -m3900 172@itemx -no-m3900 173@itemx -m4100 174@itemx -no-m4100 175For each option @samp{-m@var{nnnn}}, generate code for the MIPS 176@sc{r@var{nnnn}} chip. This tells the assembler to accept instructions 177specific to that chip, and to schedule for that chip's hazards. 178 179@item -march=@var{cpu} 180Generate code for a particular MIPS cpu. It is exactly equivalent to 181@samp{-m@var{cpu}}, except that there are more value of @var{cpu} 182understood. Valid @var{cpu} value are: 183 184@quotation 1852000, 1863000, 1873900, 1884000, 1894010, 1904100, 1914111, 192vr4120, 193vr4130, 194vr4181, 1954300, 1964400, 1974600, 1984650, 1995000, 200rm5200, 201rm5230, 202rm5231, 203rm5261, 204rm5721, 205vr5400, 206vr5500, 2076000, 208rm7000, 2098000, 210rm9000, 21110000, 21212000, 213mips32-4k, 214sb1 215@end quotation 216 217@item -mtune=@var{cpu} 218Schedule and tune for a particular MIPS cpu. Valid @var{cpu} values are 219identical to @samp{-march=@var{cpu}}. 220 221@item -mabi=@var{abi} 222Record which ABI the source code uses. The recognized arguments 223are: @samp{32}, @samp{n32}, @samp{o64}, @samp{64} and @samp{eabi}. 224 225@item -msym32 226@itemx -mno-sym32 227@cindex -msym32 228@cindex -mno-sym32 229Equivalent to adding @code{.set sym32} or @code{.set nosym32} to 230the beginning of the assembler input. @xref{MIPS symbol sizes}. 231 232@cindex @code{-nocpp} ignored (MIPS) 233@item -nocpp 234This option is ignored. It is accepted for command-line compatibility with 235other assemblers, which use it to turn off C style preprocessing. With 236@sc{gnu} @code{@value{AS}}, there is no need for @samp{-nocpp}, because the 237@sc{gnu} assembler itself never runs the C preprocessor. 238 239@item --construct-floats 240@itemx --no-construct-floats 241@cindex --construct-floats 242@cindex --no-construct-floats 243The @code{--no-construct-floats} option disables the construction of 244double width floating point constants by loading the two halves of the 245value into the two single width floating point registers that make up 246the double width register. This feature is useful if the processor 247support the FR bit in its status register, and this bit is known (by 248the programmer) to be set. This bit prevents the aliasing of the double 249width register by the single width registers. 250 251By default @code{--construct-floats} is selected, allowing construction 252of these floating point constants. 253 254@item --trap 255@itemx --no-break 256@c FIXME! (1) reflect these options (next item too) in option summaries; 257@c (2) stop teasing, say _which_ instructions expanded _how_. 258@code{@value{AS}} automatically macro expands certain division and 259multiplication instructions to check for overflow and division by zero. This 260option causes @code{@value{AS}} to generate code to take a trap exception 261rather than a break exception when an error is detected. The trap instructions 262are only supported at Instruction Set Architecture level 2 and higher. 263 264@item --break 265@itemx --no-trap 266Generate code to take a break exception rather than a trap exception when an 267error is detected. This is the default. 268 269@item -mpdr 270@itemx -mno-pdr 271Control generation of @code{.pdr} sections. Off by default on IRIX, on 272elsewhere. 273 274@item -mshared 275@itemx -mno-shared 276When generating code using the Unix calling conventions (selected by 277@samp{-KPIC} or @samp{-mcall_shared}), gas will normally generate code 278which can go into a shared library. The @samp{-mno-shared} option 279tells gas to generate code which uses the calling convention, but can 280not go into a shared library. The resulting code is slightly more 281efficient. This option only affects the handling of the 282@samp{.cpload} and @samp{.cpsetup} pseudo-ops. 283@end table 284 285@node MIPS Object 286@section MIPS ECOFF object code 287 288@cindex ECOFF sections 289@cindex MIPS ECOFF sections 290Assembling for a @sc{mips} @sc{ecoff} target supports some additional sections 291besides the usual @code{.text}, @code{.data} and @code{.bss}. The 292additional sections are @code{.rdata}, used for read-only data, 293@code{.sdata}, used for small data, and @code{.sbss}, used for small 294common objects. 295 296@cindex small objects, MIPS ECOFF 297@cindex @code{gp} register, MIPS 298When assembling for @sc{ecoff}, the assembler uses the @code{$gp} (@code{$28}) 299register to form the address of a ``small object''. Any object in the 300@code{.sdata} or @code{.sbss} sections is considered ``small'' in this sense. 301For external objects, or for objects in the @code{.bss} section, you can use 302the @code{@value{GCC}} @samp{-G} option to control the size of objects addressed via 303@code{$gp}; the default value is 8, meaning that a reference to any object 304eight bytes or smaller uses @code{$gp}. Passing @samp{-G 0} to 305@code{@value{AS}} prevents it from using the @code{$gp} register on the basis 306of object size (but the assembler uses @code{$gp} for objects in @code{.sdata} 307or @code{sbss} in any case). The size of an object in the @code{.bss} section 308is set by the @code{.comm} or @code{.lcomm} directive that defines it. The 309size of an external object may be set with the @code{.extern} directive. For 310example, @samp{.extern sym,4} declares that the object at @code{sym} is 4 bytes 311in length, whie leaving @code{sym} otherwise undefined. 312 313Using small @sc{ecoff} objects requires linker support, and assumes that the 314@code{$gp} register is correctly initialized (normally done automatically by 315the startup code). @sc{mips} @sc{ecoff} assembly code must not modify the 316@code{$gp} register. 317 318@node MIPS Stabs 319@section Directives for debugging information 320 321@cindex MIPS debugging directives 322@sc{mips} @sc{ecoff} @code{@value{AS}} supports several directives used for 323generating debugging information which are not support by traditional @sc{mips} 324assemblers. These are @code{.def}, @code{.endef}, @code{.dim}, @code{.file}, 325@code{.scl}, @code{.size}, @code{.tag}, @code{.type}, @code{.val}, 326@code{.stabd}, @code{.stabn}, and @code{.stabs}. The debugging information 327generated by the three @code{.stab} directives can only be read by @sc{gdb}, 328not by traditional @sc{mips} debuggers (this enhancement is required to fully 329support C++ debugging). These directives are primarily used by compilers, not 330assembly language programmers! 331 332@node MIPS symbol sizes 333@section Directives to override the size of symbols 334 335@cindex @code{.set sym32} 336@cindex @code{.set nosym32} 337The n64 ABI allows symbols to have any 64-bit value. Although this 338provides a great deal of flexibility, it means that some macros have 339much longer expansions than their 32-bit counterparts. For example, 340the non-PIC expansion of @samp{dla $4,sym} is usually: 341 342@smallexample 343lui $4,%highest(sym) 344lui $1,%hi(sym) 345daddiu $4,$4,%higher(sym) 346daddiu $1,$1,%lo(sym) 347dsll32 $4,$4,0 348daddu $4,$4,$1 349@end smallexample 350 351whereas the 32-bit expansion is simply: 352 353@smallexample 354lui $4,%hi(sym) 355daddiu $4,$4,%lo(sym) 356@end smallexample 357 358n64 code is sometimes constructed in such a way that all symbolic 359constants are known to have 32-bit values, and in such cases, it's 360preferable to use the 32-bit expansion instead of the 64-bit 361expansion. 362 363You can use the @code{.set sym32} directive to tell the assembler 364that, from this point on, all expressions of the form 365@samp{@var{symbol}} or @samp{@var{symbol} + @var{offset}} 366have 32-bit values. For example: 367 368@smallexample 369.set sym32 370dla $4,sym 371lw $4,sym+16 372sw $4,sym+0x8000($4) 373@end smallexample 374 375will cause the assembler to treat @samp{sym}, @code{sym+16} and 376@code{sym+0x8000} as 32-bit values. The handling of non-symbolic 377addresses is not affected. 378 379The directive @code{.set nosym32} ends a @code{.set sym32} block and 380reverts to the normal behavior. It is also possible to change the 381symbol size using the command-line options @option{-msym32} and 382@option{-mno-sym32}. 383 384These options and directives are always accepted, but at present, 385they have no effect for anything other than n64. 386 387@node MIPS ISA 388@section Directives to override the ISA level 389 390@cindex MIPS ISA override 391@kindex @code{.set mips@var{n}} 392@sc{gnu} @code{@value{AS}} supports an additional directive to change 393the @sc{mips} Instruction Set Architecture level on the fly: @code{.set 394mips@var{n}}. @var{n} should be a number from 0 to 5, or 32, 32r2, 64 395or 64r2. 396The values other than 0 make the assembler accept instructions 397for the corresponding @sc{isa} level, from that point on in the 398assembly. @code{.set mips@var{n}} affects not only which instructions 399are permitted, but also how certain macros are expanded. @code{.set 400mips0} restores the @sc{isa} level to its original level: either the 401level you selected with command line options, or the default for your 402configuration. You can use this feature to permit specific @sc{r4000} 403instructions while assembling in 32 bit mode. Use this directive with 404care! 405 406The directive @samp{.set mips16} puts the assembler into MIPS 16 mode, 407in which it will assemble instructions for the MIPS 16 processor. Use 408@samp{.set nomips16} to return to normal 32 bit mode. 409 410Traditional @sc{mips} assemblers do not support this directive. 411 412@node MIPS autoextend 413@section Directives for extending MIPS 16 bit instructions 414 415@kindex @code{.set autoextend} 416@kindex @code{.set noautoextend} 417By default, MIPS 16 instructions are automatically extended to 32 bits 418when necessary. The directive @samp{.set noautoextend} will turn this 419off. When @samp{.set noautoextend} is in effect, any 32 bit instruction 420must be explicitly extended with the @samp{.e} modifier (e.g., 421@samp{li.e $4,1000}). The directive @samp{.set autoextend} may be used 422to once again automatically extend instructions when necessary. 423 424This directive is only meaningful when in MIPS 16 mode. Traditional 425@sc{mips} assemblers do not support this directive. 426 427@node MIPS insn 428@section Directive to mark data as an instruction 429 430@kindex @code{.insn} 431The @code{.insn} directive tells @code{@value{AS}} that the following 432data is actually instructions. This makes a difference in MIPS 16 mode: 433when loading the address of a label which precedes instructions, 434@code{@value{AS}} automatically adds 1 to the value, so that jumping to 435the loaded address will do the right thing. 436 437@node MIPS option stack 438@section Directives to save and restore options 439 440@cindex MIPS option stack 441@kindex @code{.set push} 442@kindex @code{.set pop} 443The directives @code{.set push} and @code{.set pop} may be used to save 444and restore the current settings for all the options which are 445controlled by @code{.set}. The @code{.set push} directive saves the 446current settings on a stack. The @code{.set pop} directive pops the 447stack and restores the settings. 448 449These directives can be useful inside an macro which must change an 450option such as the ISA level or instruction reordering but does not want 451to change the state of the code which invoked the macro. 452 453Traditional @sc{mips} assemblers do not support these directives. 454 455@node MIPS ASE instruction generation overrides 456@section Directives to control generation of MIPS ASE instructions 457 458@cindex MIPS MIPS-3D instruction generation override 459@kindex @code{.set mips3d} 460@kindex @code{.set nomips3d} 461The directive @code{.set mips3d} makes the assembler accept instructions 462from the MIPS-3D Application Specific Extension from that point on 463in the assembly. The @code{.set nomips3d} directive prevents MIPS-3D 464instructions from being accepted. 465 466@cindex MIPS MDMX instruction generation override 467@kindex @code{.set mdmx} 468@kindex @code{.set nomdmx} 469The directive @code{.set mdmx} makes the assembler accept instructions 470from the MDMX Application Specific Extension from that point on 471in the assembly. The @code{.set nomdmx} directive prevents MDMX 472instructions from being accepted. 473 474@cindex MIPS DSP instruction generation override 475@kindex @code{.set dsp} 476@kindex @code{.set nodsp} 477The directive @code{.set dsp} makes the assembler accept instructions 478from the DSP Application Specific Extension from that point on 479in the assembly. The @code{.set nodsp} directive prevents DSP 480instructions from being accepted. 481 482@cindex MIPS MT instruction generation override 483@kindex @code{.set mt} 484@kindex @code{.set nomt} 485The directive @code{.set mt} makes the assembler accept instructions 486from the MT Application Specific Extension from that point on 487in the assembly. The @code{.set nomt} directive prevents MT 488instructions from being accepted. 489 490Traditional @sc{mips} assemblers do not support these directives. 491