1 /* Print mips instructions for GDB, the GNU debugger, or for objdump. 2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 3 2000, 2001, 2002, 2003 4 Free Software Foundation, Inc. 5 Contributed by Nobuyuki Hikichi(hikichi (at) sra.co.jp). 6 7 This file is part of GDB, GAS, and the GNU binutils. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 2 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, see <http://www.gnu.org/licenses/>. */ 21 22 #include "disas/bfd.h" 23 24 /* mips.h. Mips opcode list for GDB, the GNU debugger. 25 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 26 Free Software Foundation, Inc. 27 Contributed by Ralph Campbell and OSF 28 Commented and modified by Ian Lance Taylor, Cygnus Support 29 30 This file is part of GDB, GAS, and the GNU binutils. 31 32 GDB, GAS, and the GNU binutils are free software; you can redistribute 33 them and/or modify them under the terms of the GNU General Public 34 License as published by the Free Software Foundation; either version 35 1, or (at your option) any later version. 36 37 GDB, GAS, and the GNU binutils are distributed in the hope that they 38 will be useful, but WITHOUT ANY WARRANTY; without even the implied 39 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 40 the GNU General Public License for more details. 41 42 You should have received a copy of the GNU General Public License 43 along with this file; see the file COPYING. If not, 44 see <http://www.gnu.org/licenses/>. */ 45 46 /* These are bit masks and shift counts to use to access the various 47 fields of an instruction. To retrieve the X field of an 48 instruction, use the expression 49 (i >> OP_SH_X) & OP_MASK_X 50 To set the same field (to j), use 51 i = (i &~ (OP_MASK_X << OP_SH_X)) | (j << OP_SH_X) 52 53 Make sure you use fields that are appropriate for the instruction, 54 of course. 55 56 The 'i' format uses OP, RS, RT and IMMEDIATE. 57 58 The 'j' format uses OP and TARGET. 59 60 The 'r' format uses OP, RS, RT, RD, SHAMT and FUNCT. 61 62 The 'b' format uses OP, RS, RT and DELTA. 63 64 The floating point 'i' format uses OP, RS, RT and IMMEDIATE. 65 66 The floating point 'r' format uses OP, FMT, FT, FS, FD and FUNCT. 67 68 A breakpoint instruction uses OP, CODE and SPEC (10 bits of the 69 breakpoint instruction are not defined; Kane says the breakpoint 70 code field in BREAK is 20 bits; yet MIPS assemblers and debuggers 71 only use ten bits). An optional two-operand form of break/sdbbp 72 allows the lower ten bits to be set too, and MIPS32 and later 73 architectures allow 20 bits to be set with a signal operand 74 (using CODE20). 75 76 The syscall instruction uses CODE20. 77 78 The general coprocessor instructions use COPZ. */ 79 80 #define OP_MASK_OP 0x3f 81 #define OP_SH_OP 26 82 #define OP_MASK_RS 0x1f 83 #define OP_SH_RS 21 84 #define OP_MASK_FR 0x1f 85 #define OP_SH_FR 21 86 #define OP_MASK_FMT 0x1f 87 #define OP_SH_FMT 21 88 #define OP_MASK_BCC 0x7 89 #define OP_SH_BCC 18 90 #define OP_MASK_CODE 0x3ff 91 #define OP_SH_CODE 16 92 #define OP_MASK_CODE2 0x3ff 93 #define OP_SH_CODE2 6 94 #define OP_MASK_RT 0x1f 95 #define OP_SH_RT 16 96 #define OP_MASK_FT 0x1f 97 #define OP_SH_FT 16 98 #define OP_MASK_CACHE 0x1f 99 #define OP_SH_CACHE 16 100 #define OP_MASK_RD 0x1f 101 #define OP_SH_RD 11 102 #define OP_MASK_FS 0x1f 103 #define OP_SH_FS 11 104 #define OP_MASK_PREFX 0x1f 105 #define OP_SH_PREFX 11 106 #define OP_MASK_CCC 0x7 107 #define OP_SH_CCC 8 108 #define OP_MASK_CODE20 0xfffff /* 20 bit syscall/breakpoint code. */ 109 #define OP_SH_CODE20 6 110 #define OP_MASK_SHAMT 0x1f 111 #define OP_SH_SHAMT 6 112 #define OP_MASK_FD 0x1f 113 #define OP_SH_FD 6 114 #define OP_MASK_TARGET 0x3ffffff 115 #define OP_SH_TARGET 0 116 #define OP_MASK_COPZ 0x1ffffff 117 #define OP_SH_COPZ 0 118 #define OP_MASK_IMMEDIATE 0xffff 119 #define OP_SH_IMMEDIATE 0 120 #define OP_MASK_DELTA 0xffff 121 #define OP_SH_DELTA 0 122 #define OP_MASK_FUNCT 0x3f 123 #define OP_SH_FUNCT 0 124 #define OP_MASK_SPEC 0x3f 125 #define OP_SH_SPEC 0 126 #define OP_SH_LOCC 8 /* FP condition code. */ 127 #define OP_SH_HICC 18 /* FP condition code. */ 128 #define OP_MASK_CC 0x7 129 #define OP_SH_COP1NORM 25 /* Normal COP1 encoding. */ 130 #define OP_MASK_COP1NORM 0x1 /* a single bit. */ 131 #define OP_SH_COP1SPEC 21 /* COP1 encodings. */ 132 #define OP_MASK_COP1SPEC 0xf 133 #define OP_MASK_COP1SCLR 0x4 134 #define OP_MASK_COP1CMP 0x3 135 #define OP_SH_COP1CMP 4 136 #define OP_SH_FORMAT 21 /* FP short format field. */ 137 #define OP_MASK_FORMAT 0x7 138 #define OP_SH_TRUE 16 139 #define OP_MASK_TRUE 0x1 140 #define OP_SH_GE 17 141 #define OP_MASK_GE 0x01 142 #define OP_SH_UNSIGNED 16 143 #define OP_MASK_UNSIGNED 0x1 144 #define OP_SH_HINT 16 145 #define OP_MASK_HINT 0x1f 146 #define OP_SH_MMI 0 /* Multimedia (parallel) op. */ 147 #define OP_MASK_MMI 0x3f 148 #define OP_SH_MMISUB 6 149 #define OP_MASK_MMISUB 0x1f 150 #define OP_MASK_PERFREG 0x1f /* Performance monitoring. */ 151 #define OP_SH_PERFREG 1 152 #define OP_SH_SEL 0 /* Coprocessor select field. */ 153 #define OP_MASK_SEL 0x7 /* The sel field of mfcZ and mtcZ. */ 154 #define OP_SH_CODE19 6 /* 19 bit wait code. */ 155 #define OP_MASK_CODE19 0x7ffff 156 #define OP_SH_ALN 21 157 #define OP_MASK_ALN 0x7 158 #define OP_SH_VSEL 21 159 #define OP_MASK_VSEL 0x1f 160 #define OP_MASK_VECBYTE 0x7 /* Selector field is really 4 bits, 161 but 0x8-0xf don't select bytes. */ 162 #define OP_SH_VECBYTE 22 163 #define OP_MASK_VECALIGN 0x7 /* Vector byte-align (alni.ob) op. */ 164 #define OP_SH_VECALIGN 21 165 #define OP_MASK_INSMSB 0x1f /* "ins" MSB. */ 166 #define OP_SH_INSMSB 11 167 #define OP_MASK_EXTMSBD 0x1f /* "ext" MSBD. */ 168 #define OP_SH_EXTMSBD 11 169 170 #define OP_OP_COP0 0x10 171 #define OP_OP_COP1 0x11 172 #define OP_OP_COP2 0x12 173 #define OP_OP_COP3 0x13 174 #define OP_OP_LWC1 0x31 175 #define OP_OP_LWC2 0x32 176 #define OP_OP_LWC3 0x33 /* a.k.a. pref */ 177 #define OP_OP_LDC1 0x35 178 #define OP_OP_LDC2 0x36 179 #define OP_OP_LDC3 0x37 /* a.k.a. ld */ 180 #define OP_OP_SWC1 0x39 181 #define OP_OP_SWC2 0x3a 182 #define OP_OP_SWC3 0x3b 183 #define OP_OP_SDC1 0x3d 184 #define OP_OP_SDC2 0x3e 185 #define OP_OP_SDC3 0x3f /* a.k.a. sd */ 186 187 /* MIPS DSP ASE */ 188 #define OP_SH_DSPACC 11 189 #define OP_MASK_DSPACC 0x3 190 #define OP_SH_DSPACC_S 21 191 #define OP_MASK_DSPACC_S 0x3 192 #define OP_SH_DSPSFT 20 193 #define OP_MASK_DSPSFT 0x3f 194 #define OP_SH_DSPSFT_7 19 195 #define OP_MASK_DSPSFT_7 0x7f 196 #define OP_SH_SA3 21 197 #define OP_MASK_SA3 0x7 198 #define OP_SH_SA4 21 199 #define OP_MASK_SA4 0xf 200 #define OP_SH_IMM8 16 201 #define OP_MASK_IMM8 0xff 202 #define OP_SH_IMM10 16 203 #define OP_MASK_IMM10 0x3ff 204 #define OP_SH_WRDSP 11 205 #define OP_MASK_WRDSP 0x3f 206 #define OP_SH_RDDSP 16 207 #define OP_MASK_RDDSP 0x3f 208 #define OP_SH_BP 11 209 #define OP_MASK_BP 0x3 210 211 /* MIPS MT ASE */ 212 #define OP_SH_MT_U 5 213 #define OP_MASK_MT_U 0x1 214 #define OP_SH_MT_H 4 215 #define OP_MASK_MT_H 0x1 216 #define OP_SH_MTACC_T 18 217 #define OP_MASK_MTACC_T 0x3 218 #define OP_SH_MTACC_D 13 219 #define OP_MASK_MTACC_D 0x3 220 221 #define OP_OP_COP0 0x10 222 #define OP_OP_COP1 0x11 223 #define OP_OP_COP2 0x12 224 #define OP_OP_COP3 0x13 225 #define OP_OP_LWC1 0x31 226 #define OP_OP_LWC2 0x32 227 #define OP_OP_LWC3 0x33 /* a.k.a. pref */ 228 #define OP_OP_LDC1 0x35 229 #define OP_OP_LDC2 0x36 230 #define OP_OP_LDC3 0x37 /* a.k.a. ld */ 231 #define OP_OP_SWC1 0x39 232 #define OP_OP_SWC2 0x3a 233 #define OP_OP_SWC3 0x3b 234 #define OP_OP_SDC1 0x3d 235 #define OP_OP_SDC2 0x3e 236 #define OP_OP_SDC3 0x3f /* a.k.a. sd */ 237 238 /* Values in the 'VSEL' field. */ 239 #define MDMX_FMTSEL_IMM_QH 0x1d 240 #define MDMX_FMTSEL_IMM_OB 0x1e 241 #define MDMX_FMTSEL_VEC_QH 0x15 242 #define MDMX_FMTSEL_VEC_OB 0x16 243 244 /* UDI */ 245 #define OP_SH_UDI1 6 246 #define OP_MASK_UDI1 0x1f 247 #define OP_SH_UDI2 6 248 #define OP_MASK_UDI2 0x3ff 249 #define OP_SH_UDI3 6 250 #define OP_MASK_UDI3 0x7fff 251 #define OP_SH_UDI4 6 252 #define OP_MASK_UDI4 0xfffff 253 /* This structure holds information for a particular instruction. */ 254 255 struct mips_opcode 256 { 257 /* The name of the instruction. */ 258 const char *name; 259 /* A string describing the arguments for this instruction. */ 260 const char *args; 261 /* The basic opcode for the instruction. When assembling, this 262 opcode is modified by the arguments to produce the actual opcode 263 that is used. If pinfo is INSN_MACRO, then this is 0. */ 264 unsigned long match; 265 /* If pinfo is not INSN_MACRO, then this is a bit mask for the 266 relevant portions of the opcode when disassembling. If the 267 actual opcode anded with the match field equals the opcode field, 268 then we have found the correct instruction. If pinfo is 269 INSN_MACRO, then this field is the macro identifier. */ 270 unsigned long mask; 271 /* For a macro, this is INSN_MACRO. Otherwise, it is a collection 272 of bits describing the instruction, notably any relevant hazard 273 information. */ 274 unsigned long pinfo; 275 /* A collection of additional bits describing the instruction. */ 276 unsigned long pinfo2; 277 /* A collection of bits describing the instruction sets of which this 278 instruction or macro is a member. */ 279 unsigned long membership; 280 }; 281 282 /* These are the characters which may appear in the args field of an 283 instruction. They appear in the order in which the fields appear 284 when the instruction is used. Commas and parentheses in the args 285 string are ignored when assembling, and written into the output 286 when disassembling. 287 288 Each of these characters corresponds to a mask field defined above. 289 290 "<" 5 bit shift amount (OP_*_SHAMT) 291 ">" shift amount between 32 and 63, stored after subtracting 32 (OP_*_SHAMT) 292 "a" 26 bit target address (OP_*_TARGET) 293 "b" 5 bit base register (OP_*_RS) 294 "c" 10 bit breakpoint code (OP_*_CODE) 295 "d" 5 bit destination register specifier (OP_*_RD) 296 "h" 5 bit prefx hint (OP_*_PREFX) 297 "i" 16 bit unsigned immediate (OP_*_IMMEDIATE) 298 "j" 16 bit signed immediate (OP_*_DELTA) 299 "k" 5 bit cache opcode in target register position (OP_*_CACHE) 300 Also used for immediate operands in vr5400 vector insns. 301 "o" 16 bit signed offset (OP_*_DELTA) 302 "p" 16 bit PC relative branch target address (OP_*_DELTA) 303 "q" 10 bit extra breakpoint code (OP_*_CODE2) 304 "r" 5 bit same register used as both source and target (OP_*_RS) 305 "s" 5 bit source register specifier (OP_*_RS) 306 "t" 5 bit target register (OP_*_RT) 307 "u" 16 bit upper 16 bits of address (OP_*_IMMEDIATE) 308 "v" 5 bit same register used as both source and destination (OP_*_RS) 309 "w" 5 bit same register used as both target and destination (OP_*_RT) 310 "U" 5 bit same destination register in both OP_*_RD and OP_*_RT 311 (used by clo and clz) 312 "C" 25 bit coprocessor function code (OP_*_COPZ) 313 "B" 20 bit syscall/breakpoint function code (OP_*_CODE20) 314 "J" 19 bit wait function code (OP_*_CODE19) 315 "x" accept and ignore register name 316 "z" must be zero register 317 "K" 5 bit Hardware Register (rdhwr instruction) (OP_*_RD) 318 "+A" 5 bit ins/ext/dins/dext/dinsm/dextm position, which becomes 319 LSB (OP_*_SHAMT). 320 Enforces: 0 <= pos < 32. 321 "+B" 5 bit ins/dins size, which becomes MSB (OP_*_INSMSB). 322 Requires that "+A" or "+E" occur first to set position. 323 Enforces: 0 < (pos+size) <= 32. 324 "+C" 5 bit ext/dext size, which becomes MSBD (OP_*_EXTMSBD). 325 Requires that "+A" or "+E" occur first to set position. 326 Enforces: 0 < (pos+size) <= 32. 327 (Also used by "dext" w/ different limits, but limits for 328 that are checked by the M_DEXT macro.) 329 "+E" 5 bit dinsu/dextu position, which becomes LSB-32 (OP_*_SHAMT). 330 Enforces: 32 <= pos < 64. 331 "+F" 5 bit "dinsm/dinsu" size, which becomes MSB-32 (OP_*_INSMSB). 332 Requires that "+A" or "+E" occur first to set position. 333 Enforces: 32 < (pos+size) <= 64. 334 "+G" 5 bit "dextm" size, which becomes MSBD-32 (OP_*_EXTMSBD). 335 Requires that "+A" or "+E" occur first to set position. 336 Enforces: 32 < (pos+size) <= 64. 337 "+H" 5 bit "dextu" size, which becomes MSBD (OP_*_EXTMSBD). 338 Requires that "+A" or "+E" occur first to set position. 339 Enforces: 32 < (pos+size) <= 64. 340 341 Floating point instructions: 342 "D" 5 bit destination register (OP_*_FD) 343 "M" 3 bit compare condition code (OP_*_CCC) (only used for mips4 and up) 344 "N" 3 bit branch condition code (OP_*_BCC) (only used for mips4 and up) 345 "S" 5 bit fs source 1 register (OP_*_FS) 346 "T" 5 bit ft source 2 register (OP_*_FT) 347 "R" 5 bit fr source 3 register (OP_*_FR) 348 "V" 5 bit same register used as floating source and destination (OP_*_FS) 349 "W" 5 bit same register used as floating target and destination (OP_*_FT) 350 351 Coprocessor instructions: 352 "E" 5 bit target register (OP_*_RT) 353 "G" 5 bit destination register (OP_*_RD) 354 "H" 3 bit sel field for (d)mtc* and (d)mfc* (OP_*_SEL) 355 "P" 5 bit performance-monitor register (OP_*_PERFREG) 356 "e" 5 bit vector register byte specifier (OP_*_VECBYTE) 357 "%" 3 bit immediate vr5400 vector alignment operand (OP_*_VECALIGN) 358 see also "k" above 359 "+D" Combined destination register ("G") and sel ("H") for CP0 ops, 360 for pretty-printing in disassembly only. 361 362 Macro instructions: 363 "A" General 32 bit expression 364 "I" 32 bit immediate (value placed in imm_expr). 365 "+I" 32 bit immediate (value placed in imm2_expr). 366 "F" 64 bit floating point constant in .rdata 367 "L" 64 bit floating point constant in .lit8 368 "f" 32 bit floating point constant 369 "l" 32 bit floating point constant in .lit4 370 371 MDMX instruction operands (note that while these use the FP register 372 fields, they accept both $fN and $vN names for the registers): 373 "O" MDMX alignment offset (OP_*_ALN) 374 "Q" MDMX vector/scalar/immediate source (OP_*_VSEL and OP_*_FT) 375 "X" MDMX destination register (OP_*_FD) 376 "Y" MDMX source register (OP_*_FS) 377 "Z" MDMX source register (OP_*_FT) 378 379 DSP ASE usage: 380 "2" 2 bit unsigned immediate for byte align (OP_*_BP) 381 "3" 3 bit unsigned immediate (OP_*_SA3) 382 "4" 4 bit unsigned immediate (OP_*_SA4) 383 "5" 8 bit unsigned immediate (OP_*_IMM8) 384 "6" 5 bit unsigned immediate (OP_*_RS) 385 "7" 2 bit dsp accumulator register (OP_*_DSPACC) 386 "8" 6 bit unsigned immediate (OP_*_WRDSP) 387 "9" 2 bit dsp accumulator register (OP_*_DSPACC_S) 388 "0" 6 bit signed immediate (OP_*_DSPSFT) 389 ":" 7 bit signed immediate (OP_*_DSPSFT_7) 390 "'" 6 bit unsigned immediate (OP_*_RDDSP) 391 "@" 10 bit signed immediate (OP_*_IMM10) 392 393 MT ASE usage: 394 "!" 1 bit usermode flag (OP_*_MT_U) 395 "$" 1 bit load high flag (OP_*_MT_H) 396 "*" 2 bit dsp/smartmips accumulator register (OP_*_MTACC_T) 397 "&" 2 bit dsp/smartmips accumulator register (OP_*_MTACC_D) 398 "g" 5 bit coprocessor 1 and 2 destination register (OP_*_RD) 399 "+t" 5 bit coprocessor 0 destination register (OP_*_RT) 400 "+T" 5 bit coprocessor 0 destination register (OP_*_RT) - disassembly only 401 402 UDI immediates: 403 "+1" UDI immediate bits 6-10 404 "+2" UDI immediate bits 6-15 405 "+3" UDI immediate bits 6-20 406 "+4" UDI immediate bits 6-25 407 408 Other: 409 "()" parens surrounding optional value 410 "," separates operands 411 "[]" brackets around index for vector-op scalar operand specifier (vr5400) 412 "+" Start of extension sequence. 413 414 Characters used so far, for quick reference when adding more: 415 "234567890" 416 "%[]<>(),+:'@!$*&" 417 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 418 "abcdefghijklopqrstuvwxz" 419 420 Extension character sequences used so far ("+" followed by the 421 following), for quick reference when adding more: 422 "1234" 423 "ABCDEFGHIT" 424 "t" 425 */ 426 427 /* These are the bits which may be set in the pinfo field of an 428 instructions, if it is not equal to INSN_MACRO. */ 429 430 /* Modifies the general purpose register in OP_*_RD. */ 431 #define INSN_WRITE_GPR_D 0x00000001 432 /* Modifies the general purpose register in OP_*_RT. */ 433 #define INSN_WRITE_GPR_T 0x00000002 434 /* Modifies general purpose register 31. */ 435 #define INSN_WRITE_GPR_31 0x00000004 436 /* Modifies the floating point register in OP_*_FD. */ 437 #define INSN_WRITE_FPR_D 0x00000008 438 /* Modifies the floating point register in OP_*_FS. */ 439 #define INSN_WRITE_FPR_S 0x00000010 440 /* Modifies the floating point register in OP_*_FT. */ 441 #define INSN_WRITE_FPR_T 0x00000020 442 /* Reads the general purpose register in OP_*_RS. */ 443 #define INSN_READ_GPR_S 0x00000040 444 /* Reads the general purpose register in OP_*_RT. */ 445 #define INSN_READ_GPR_T 0x00000080 446 /* Reads the floating point register in OP_*_FS. */ 447 #define INSN_READ_FPR_S 0x00000100 448 /* Reads the floating point register in OP_*_FT. */ 449 #define INSN_READ_FPR_T 0x00000200 450 /* Reads the floating point register in OP_*_FR. */ 451 #define INSN_READ_FPR_R 0x00000400 452 /* Modifies coprocessor condition code. */ 453 #define INSN_WRITE_COND_CODE 0x00000800 454 /* Reads coprocessor condition code. */ 455 #define INSN_READ_COND_CODE 0x00001000 456 /* TLB operation. */ 457 #define INSN_TLB 0x00002000 458 /* Reads coprocessor register other than floating point register. */ 459 #define INSN_COP 0x00004000 460 /* Instruction loads value from memory, requiring delay. */ 461 #define INSN_LOAD_MEMORY_DELAY 0x00008000 462 /* Instruction loads value from coprocessor, requiring delay. */ 463 #define INSN_LOAD_COPROC_DELAY 0x00010000 464 /* Instruction has unconditional branch delay slot. */ 465 #define INSN_UNCOND_BRANCH_DELAY 0x00020000 466 /* Instruction has conditional branch delay slot. */ 467 #define INSN_COND_BRANCH_DELAY 0x00040000 468 /* Conditional branch likely: if branch not taken, insn nullified. */ 469 #define INSN_COND_BRANCH_LIKELY 0x00080000 470 /* Moves to coprocessor register, requiring delay. */ 471 #define INSN_COPROC_MOVE_DELAY 0x00100000 472 /* Loads coprocessor register from memory, requiring delay. */ 473 #define INSN_COPROC_MEMORY_DELAY 0x00200000 474 /* Reads the HI register. */ 475 #define INSN_READ_HI 0x00400000 476 /* Reads the LO register. */ 477 #define INSN_READ_LO 0x00800000 478 /* Modifies the HI register. */ 479 #define INSN_WRITE_HI 0x01000000 480 /* Modifies the LO register. */ 481 #define INSN_WRITE_LO 0x02000000 482 /* Takes a trap (easier to keep out of delay slot). */ 483 #define INSN_TRAP 0x04000000 484 /* Instruction stores value into memory. */ 485 #define INSN_STORE_MEMORY 0x08000000 486 /* Instruction uses single precision floating point. */ 487 #define FP_S 0x10000000 488 /* Instruction uses double precision floating point. */ 489 #define FP_D 0x20000000 490 /* Instruction is part of the tx39's integer multiply family. */ 491 #define INSN_MULT 0x40000000 492 /* Instruction synchronize shared memory. */ 493 #define INSN_SYNC 0x80000000 494 495 /* These are the bits which may be set in the pinfo2 field of an 496 instruction. */ 497 498 /* Instruction is a simple alias (I.E. "move" for daddu/addu/or) */ 499 #define INSN2_ALIAS 0x00000001 500 /* Instruction reads MDMX accumulator. */ 501 #define INSN2_READ_MDMX_ACC 0x00000002 502 /* Instruction writes MDMX accumulator. */ 503 #define INSN2_WRITE_MDMX_ACC 0x00000004 504 505 /* Instruction is actually a macro. It should be ignored by the 506 disassembler, and requires special treatment by the assembler. */ 507 #define INSN_MACRO 0xffffffff 508 509 /* Masks used to mark instructions to indicate which MIPS ISA level 510 they were introduced in. ISAs, as defined below, are logical 511 ORs of these bits, indicating that they support the instructions 512 defined at the given level. */ 513 514 #define INSN_ISA_MASK 0x00000fff 515 #define INSN_ISA1 0x00000001 516 #define INSN_ISA2 0x00000002 517 #define INSN_ISA3 0x00000004 518 #define INSN_ISA4 0x00000008 519 #define INSN_ISA5 0x00000010 520 #define INSN_ISA32 0x00000020 521 #define INSN_ISA64 0x00000040 522 #define INSN_ISA32R2 0x00000080 523 #define INSN_ISA64R2 0x00000100 524 525 /* Masks used for MIPS-defined ASEs. */ 526 #define INSN_ASE_MASK 0x0000f000 527 528 /* DSP ASE */ 529 #define INSN_DSP 0x00001000 530 #define INSN_DSP64 0x00002000 531 /* MIPS 16 ASE */ 532 #define INSN_MIPS16 0x00004000 533 /* MIPS-3D ASE */ 534 #define INSN_MIPS3D 0x00008000 535 536 /* Chip specific instructions. These are bitmasks. */ 537 538 /* MIPS R4650 instruction. */ 539 #define INSN_4650 0x00010000 540 /* LSI R4010 instruction. */ 541 #define INSN_4010 0x00020000 542 /* NEC VR4100 instruction. */ 543 #define INSN_4100 0x00040000 544 /* Toshiba R3900 instruction. */ 545 #define INSN_3900 0x00080000 546 /* MIPS R10000 instruction. */ 547 #define INSN_10000 0x00100000 548 /* Broadcom SB-1 instruction. */ 549 #define INSN_SB1 0x00200000 550 /* NEC VR4111/VR4181 instruction. */ 551 #define INSN_4111 0x00400000 552 /* NEC VR4120 instruction. */ 553 #define INSN_4120 0x00800000 554 /* NEC VR5400 instruction. */ 555 #define INSN_5400 0x01000000 556 /* NEC VR5500 instruction. */ 557 #define INSN_5500 0x02000000 558 559 /* MDMX ASE */ 560 #define INSN_MDMX 0x04000000 561 /* MT ASE */ 562 #define INSN_MT 0x08000000 563 /* SmartMIPS ASE */ 564 #define INSN_SMARTMIPS 0x10000000 565 /* DSP R2 ASE */ 566 #define INSN_DSPR2 0x20000000 567 568 /* ST Microelectronics Loongson 2E. */ 569 #define INSN_LOONGSON_2E 0x40000000 570 /* ST Microelectronics Loongson 2F. */ 571 #define INSN_LOONGSON_2F 0x80000000 572 573 /* MIPS ISA defines, use instead of hardcoding ISA level. */ 574 575 #ifndef ISA_MIPS1 576 #define ISA_UNKNOWN 0 /* Gas internal use. */ 577 #define ISA_MIPS1 (INSN_ISA1) 578 #define ISA_MIPS2 (ISA_MIPS1 | INSN_ISA2) 579 #define ISA_MIPS3 (ISA_MIPS2 | INSN_ISA3) 580 #define ISA_MIPS4 (ISA_MIPS3 | INSN_ISA4) 581 #define ISA_MIPS5 (ISA_MIPS4 | INSN_ISA5) 582 583 #define ISA_MIPS32 (ISA_MIPS2 | INSN_ISA32) 584 #define ISA_MIPS64 (ISA_MIPS5 | INSN_ISA32 | INSN_ISA64) 585 586 #define ISA_MIPS32R2 (ISA_MIPS32 | INSN_ISA32R2) 587 #define ISA_MIPS64R2 (ISA_MIPS64 | INSN_ISA32R2 | INSN_ISA64R2) 588 #endif // ISA_MIPS1 589 590 /* CPU defines, use instead of hardcoding processor number. Keep this 591 in sync with bfd/archures.c in order for machine selection to work. */ 592 #define CPU_UNKNOWN 0 /* Gas internal use. */ 593 #define CPU_R3000 3000 594 #define CPU_R3900 3900 595 #define CPU_R4000 4000 596 #define CPU_R4010 4010 597 #define CPU_VR4100 4100 598 #define CPU_R4111 4111 599 #define CPU_VR4120 4120 600 #define CPU_R4300 4300 601 #define CPU_R4400 4400 602 #define CPU_R4600 4600 603 #define CPU_R4650 4650 604 #define CPU_R5000 5000 605 #define CPU_VR5400 5400 606 #define CPU_VR5500 5500 607 #define CPU_R6000 6000 608 #define CPU_RM7000 7000 609 #define CPU_R8000 8000 610 #define CPU_R10000 10000 611 #define CPU_R12000 12000 612 613 #define CPU_MIPS16 16 614 #define CPU_SB1 12310201 /* octal 'SB', 01. */ 615 616 #ifndef CPU_MIPS32 617 #define CPU_MIPS32 32 618 #define CPU_MIPS32R2 33 619 #define CPU_MIPS5 5 620 #define CPU_MIPS64 64 621 #define CPU_MIPS64R2 65 622 #endif // !CPU_MIPS32 623 624 /* Test for membership in an ISA including chip specific ISAs. INSN 625 is pointer to an element of the opcode table; ISA is the specified 626 ISA/ASE bitmask to test against; and CPU is the CPU specific ISA to 627 test, or zero if no CPU specific ISA test is desired. */ 628 629 #if 0 630 #define OPCODE_IS_MEMBER(insn, isa, cpu) \ 631 (((insn)->membership & isa) != 0 \ 632 || (cpu == CPU_R4650 && ((insn)->membership & INSN_4650) != 0) \ 633 || (cpu == CPU_RM7000 && ((insn)->membership & INSN_4650) != 0) \ 634 || (cpu == CPU_RM9000 && ((insn)->membership & INSN_4650) != 0) \ 635 || (cpu == CPU_R4010 && ((insn)->membership & INSN_4010) != 0) \ 636 || (cpu == CPU_VR4100 && ((insn)->membership & INSN_4100) != 0) \ 637 || (cpu == CPU_R3900 && ((insn)->membership & INSN_3900) != 0) \ 638 || ((cpu == CPU_R10000 || cpu == CPU_R12000) \ 639 && ((insn)->membership & INSN_10000) != 0) \ 640 || (cpu == CPU_SB1 && ((insn)->membership & INSN_SB1) != 0) \ 641 || (cpu == CPU_R4111 && ((insn)->membership & INSN_4111) != 0) \ 642 || (cpu == CPU_VR4120 && ((insn)->membership & INSN_4120) != 0) \ 643 || (cpu == CPU_VR5400 && ((insn)->membership & INSN_5400) != 0) \ 644 || (cpu == CPU_VR5500 && ((insn)->membership & INSN_5500) != 0) \ 645 || 0) /* Please keep this term for easier source merging. */ 646 #else 647 #define OPCODE_IS_MEMBER(insn, isa, cpu) \ 648 (1 != 0) 649 #endif 650 651 /* This is a list of macro expanded instructions. 652 653 _I appended means immediate 654 _A appended means address 655 _AB appended means address with base register 656 _D appended means 64 bit floating point constant 657 _S appended means 32 bit floating point constant. */ 658 659 enum 660 { 661 M_ABS, 662 M_ADD_I, 663 M_ADDU_I, 664 M_AND_I, 665 M_BALIGN, 666 M_BEQ, 667 M_BEQ_I, 668 M_BEQL_I, 669 M_BGE, 670 M_BGEL, 671 M_BGE_I, 672 M_BGEL_I, 673 M_BGEU, 674 M_BGEUL, 675 M_BGEU_I, 676 M_BGEUL_I, 677 M_BGT, 678 M_BGTL, 679 M_BGT_I, 680 M_BGTL_I, 681 M_BGTU, 682 M_BGTUL, 683 M_BGTU_I, 684 M_BGTUL_I, 685 M_BLE, 686 M_BLEL, 687 M_BLE_I, 688 M_BLEL_I, 689 M_BLEU, 690 M_BLEUL, 691 M_BLEU_I, 692 M_BLEUL_I, 693 M_BLT, 694 M_BLTL, 695 M_BLT_I, 696 M_BLTL_I, 697 M_BLTU, 698 M_BLTUL, 699 M_BLTU_I, 700 M_BLTUL_I, 701 M_BNE, 702 M_BNE_I, 703 M_BNEL_I, 704 M_CACHE_AB, 705 M_DABS, 706 M_DADD_I, 707 M_DADDU_I, 708 M_DDIV_3, 709 M_DDIV_3I, 710 M_DDIVU_3, 711 M_DDIVU_3I, 712 M_DEXT, 713 M_DINS, 714 M_DIV_3, 715 M_DIV_3I, 716 M_DIVU_3, 717 M_DIVU_3I, 718 M_DLA_AB, 719 M_DLCA_AB, 720 M_DLI, 721 M_DMUL, 722 M_DMUL_I, 723 M_DMULO, 724 M_DMULO_I, 725 M_DMULOU, 726 M_DMULOU_I, 727 M_DREM_3, 728 M_DREM_3I, 729 M_DREMU_3, 730 M_DREMU_3I, 731 M_DSUB_I, 732 M_DSUBU_I, 733 M_DSUBU_I_2, 734 M_J_A, 735 M_JAL_1, 736 M_JAL_2, 737 M_JAL_A, 738 M_L_DOB, 739 M_L_DAB, 740 M_LA_AB, 741 M_LB_A, 742 M_LB_AB, 743 M_LBU_A, 744 M_LBU_AB, 745 M_LCA_AB, 746 M_LD_A, 747 M_LD_OB, 748 M_LD_AB, 749 M_LDC1_AB, 750 M_LDC2_AB, 751 M_LDC3_AB, 752 M_LDL_AB, 753 M_LDR_AB, 754 M_LH_A, 755 M_LH_AB, 756 M_LHU_A, 757 M_LHU_AB, 758 M_LI, 759 M_LI_D, 760 M_LI_DD, 761 M_LI_S, 762 M_LI_SS, 763 M_LL_AB, 764 M_LLD_AB, 765 M_LS_A, 766 M_LW_A, 767 M_LW_AB, 768 M_LWC0_A, 769 M_LWC0_AB, 770 M_LWC1_A, 771 M_LWC1_AB, 772 M_LWC2_A, 773 M_LWC2_AB, 774 M_LWC3_A, 775 M_LWC3_AB, 776 M_LWL_A, 777 M_LWL_AB, 778 M_LWR_A, 779 M_LWR_AB, 780 M_LWU_AB, 781 M_MOVE, 782 M_MUL, 783 M_MUL_I, 784 M_MULO, 785 M_MULO_I, 786 M_MULOU, 787 M_MULOU_I, 788 M_NOR_I, 789 M_OR_I, 790 M_REM_3, 791 M_REM_3I, 792 M_REMU_3, 793 M_REMU_3I, 794 M_DROL, 795 M_ROL, 796 M_DROL_I, 797 M_ROL_I, 798 M_DROR, 799 M_ROR, 800 M_DROR_I, 801 M_ROR_I, 802 M_S_DA, 803 M_S_DOB, 804 M_S_DAB, 805 M_S_S, 806 M_SC_AB, 807 M_SCD_AB, 808 M_SD_A, 809 M_SD_OB, 810 M_SD_AB, 811 M_SDC1_AB, 812 M_SDC2_AB, 813 M_SDC3_AB, 814 M_SDL_AB, 815 M_SDR_AB, 816 M_SEQ, 817 M_SEQ_I, 818 M_SGE, 819 M_SGE_I, 820 M_SGEU, 821 M_SGEU_I, 822 M_SGT, 823 M_SGT_I, 824 M_SGTU, 825 M_SGTU_I, 826 M_SLE, 827 M_SLE_I, 828 M_SLEU, 829 M_SLEU_I, 830 M_SLT_I, 831 M_SLTU_I, 832 M_SNE, 833 M_SNE_I, 834 M_SB_A, 835 M_SB_AB, 836 M_SH_A, 837 M_SH_AB, 838 M_SW_A, 839 M_SW_AB, 840 M_SWC0_A, 841 M_SWC0_AB, 842 M_SWC1_A, 843 M_SWC1_AB, 844 M_SWC2_A, 845 M_SWC2_AB, 846 M_SWC3_A, 847 M_SWC3_AB, 848 M_SWL_A, 849 M_SWL_AB, 850 M_SWR_A, 851 M_SWR_AB, 852 M_SUB_I, 853 M_SUBU_I, 854 M_SUBU_I_2, 855 M_TEQ_I, 856 M_TGE_I, 857 M_TGEU_I, 858 M_TLT_I, 859 M_TLTU_I, 860 M_TNE_I, 861 M_TRUNCWD, 862 M_TRUNCWS, 863 M_ULD, 864 M_ULD_A, 865 M_ULH, 866 M_ULH_A, 867 M_ULHU, 868 M_ULHU_A, 869 M_ULW, 870 M_ULW_A, 871 M_USH, 872 M_USH_A, 873 M_USW, 874 M_USW_A, 875 M_USD, 876 M_USD_A, 877 M_XOR_I, 878 M_COP0, 879 M_COP1, 880 M_COP2, 881 M_COP3, 882 M_NUM_MACROS 883 }; 884 885 886 /* The order of overloaded instructions matters. Label arguments and 887 register arguments look the same. Instructions that can have either 888 for arguments must apear in the correct order in this table for the 889 assembler to pick the right one. In other words, entries with 890 immediate operands must apear after the same instruction with 891 registers. 892 893 Many instructions are short hand for other instructions (i.e., The 894 jal <register> instruction is short for jalr <register>). */ 895 896 extern const struct mips_opcode mips_builtin_opcodes[]; 897 extern const int bfd_mips_num_builtin_opcodes; 898 extern struct mips_opcode *mips_opcodes; 899 extern int bfd_mips_num_opcodes; 900 #define NUMOPCODES bfd_mips_num_opcodes 901 902 903 /* The rest of this file adds definitions for the mips16 TinyRISC 905 processor. */ 906 907 /* These are the bitmasks and shift counts used for the different 908 fields in the instruction formats. Other than OP, no masks are 909 provided for the fixed portions of an instruction, since they are 910 not needed. 911 912 The I format uses IMM11. 913 914 The RI format uses RX and IMM8. 915 916 The RR format uses RX, and RY. 917 918 The RRI format uses RX, RY, and IMM5. 919 920 The RRR format uses RX, RY, and RZ. 921 922 The RRI_A format uses RX, RY, and IMM4. 923 924 The SHIFT format uses RX, RY, and SHAMT. 925 926 The I8 format uses IMM8. 927 928 The I8_MOVR32 format uses RY and REGR32. 929 930 The IR_MOV32R format uses REG32R and MOV32Z. 931 932 The I64 format uses IMM8. 933 934 The RI64 format uses RY and IMM5. 935 */ 936 937 #define MIPS16OP_MASK_OP 0x1f 938 #define MIPS16OP_SH_OP 11 939 #define MIPS16OP_MASK_IMM11 0x7ff 940 #define MIPS16OP_SH_IMM11 0 941 #define MIPS16OP_MASK_RX 0x7 942 #define MIPS16OP_SH_RX 8 943 #define MIPS16OP_MASK_IMM8 0xff 944 #define MIPS16OP_SH_IMM8 0 945 #define MIPS16OP_MASK_RY 0x7 946 #define MIPS16OP_SH_RY 5 947 #define MIPS16OP_MASK_IMM5 0x1f 948 #define MIPS16OP_SH_IMM5 0 949 #define MIPS16OP_MASK_RZ 0x7 950 #define MIPS16OP_SH_RZ 2 951 #define MIPS16OP_MASK_IMM4 0xf 952 #define MIPS16OP_SH_IMM4 0 953 #define MIPS16OP_MASK_REGR32 0x1f 954 #define MIPS16OP_SH_REGR32 0 955 #define MIPS16OP_MASK_REG32R 0x1f 956 #define MIPS16OP_SH_REG32R 3 957 #define MIPS16OP_EXTRACT_REG32R(i) ((((i) >> 5) & 7) | ((i) & 0x18)) 958 #define MIPS16OP_MASK_MOVE32Z 0x7 959 #define MIPS16OP_SH_MOVE32Z 0 960 #define MIPS16OP_MASK_IMM6 0x3f 961 #define MIPS16OP_SH_IMM6 5 962 963 /* These are the characters which may appears in the args field of an 964 instruction. They appear in the order in which the fields appear 965 when the instruction is used. Commas and parentheses in the args 966 string are ignored when assembling, and written into the output 967 when disassembling. 968 969 "y" 3 bit register (MIPS16OP_*_RY) 970 "x" 3 bit register (MIPS16OP_*_RX) 971 "z" 3 bit register (MIPS16OP_*_RZ) 972 "Z" 3 bit register (MIPS16OP_*_MOVE32Z) 973 "v" 3 bit same register as source and destination (MIPS16OP_*_RX) 974 "w" 3 bit same register as source and destination (MIPS16OP_*_RY) 975 "0" zero register ($0) 976 "S" stack pointer ($sp or $29) 977 "P" program counter 978 "R" return address register ($ra or $31) 979 "X" 5 bit MIPS register (MIPS16OP_*_REGR32) 980 "Y" 5 bit MIPS register (MIPS16OP_*_REG32R) 981 "6" 6 bit unsigned break code (MIPS16OP_*_IMM6) 982 "a" 26 bit jump address 983 "e" 11 bit extension value 984 "l" register list for entry instruction 985 "L" register list for exit instruction 986 987 The remaining codes may be extended. Except as otherwise noted, 988 the full extended operand is a 16 bit signed value. 989 "<" 3 bit unsigned shift count * 0 (MIPS16OP_*_RZ) (full 5 bit unsigned) 990 ">" 3 bit unsigned shift count * 0 (MIPS16OP_*_RX) (full 5 bit unsigned) 991 "[" 3 bit unsigned shift count * 0 (MIPS16OP_*_RZ) (full 6 bit unsigned) 992 "]" 3 bit unsigned shift count * 0 (MIPS16OP_*_RX) (full 6 bit unsigned) 993 "4" 4 bit signed immediate * 0 (MIPS16OP_*_IMM4) (full 15 bit signed) 994 "5" 5 bit unsigned immediate * 0 (MIPS16OP_*_IMM5) 995 "H" 5 bit unsigned immediate * 2 (MIPS16OP_*_IMM5) 996 "W" 5 bit unsigned immediate * 4 (MIPS16OP_*_IMM5) 997 "D" 5 bit unsigned immediate * 8 (MIPS16OP_*_IMM5) 998 "j" 5 bit signed immediate * 0 (MIPS16OP_*_IMM5) 999 "8" 8 bit unsigned immediate * 0 (MIPS16OP_*_IMM8) 1000 "V" 8 bit unsigned immediate * 4 (MIPS16OP_*_IMM8) 1001 "C" 8 bit unsigned immediate * 8 (MIPS16OP_*_IMM8) 1002 "U" 8 bit unsigned immediate * 0 (MIPS16OP_*_IMM8) (full 16 bit unsigned) 1003 "k" 8 bit signed immediate * 0 (MIPS16OP_*_IMM8) 1004 "K" 8 bit signed immediate * 8 (MIPS16OP_*_IMM8) 1005 "p" 8 bit conditional branch address (MIPS16OP_*_IMM8) 1006 "q" 11 bit branch address (MIPS16OP_*_IMM11) 1007 "A" 8 bit PC relative address * 4 (MIPS16OP_*_IMM8) 1008 "B" 5 bit PC relative address * 8 (MIPS16OP_*_IMM5) 1009 "E" 5 bit PC relative address * 4 (MIPS16OP_*_IMM5) 1010 */ 1011 1012 /* Save/restore encoding for the args field when all 4 registers are 1013 either saved as arguments or saved/restored as statics. */ 1014 #define MIPS16_ALL_ARGS 0xe 1015 #define MIPS16_ALL_STATICS 0xb 1016 1017 /* For the mips16, we use the same opcode table format and a few of 1018 the same flags. However, most of the flags are different. */ 1019 1020 /* Modifies the register in MIPS16OP_*_RX. */ 1021 #define MIPS16_INSN_WRITE_X 0x00000001 1022 /* Modifies the register in MIPS16OP_*_RY. */ 1023 #define MIPS16_INSN_WRITE_Y 0x00000002 1024 /* Modifies the register in MIPS16OP_*_RZ. */ 1025 #define MIPS16_INSN_WRITE_Z 0x00000004 1026 /* Modifies the T ($24) register. */ 1027 #define MIPS16_INSN_WRITE_T 0x00000008 1028 /* Modifies the SP ($29) register. */ 1029 #define MIPS16_INSN_WRITE_SP 0x00000010 1030 /* Modifies the RA ($31) register. */ 1031 #define MIPS16_INSN_WRITE_31 0x00000020 1032 /* Modifies the general purpose register in MIPS16OP_*_REG32R. */ 1033 #define MIPS16_INSN_WRITE_GPR_Y 0x00000040 1034 /* Reads the register in MIPS16OP_*_RX. */ 1035 #define MIPS16_INSN_READ_X 0x00000080 1036 /* Reads the register in MIPS16OP_*_RY. */ 1037 #define MIPS16_INSN_READ_Y 0x00000100 1038 /* Reads the register in MIPS16OP_*_MOVE32Z. */ 1039 #define MIPS16_INSN_READ_Z 0x00000200 1040 /* Reads the T ($24) register. */ 1041 #define MIPS16_INSN_READ_T 0x00000400 1042 /* Reads the SP ($29) register. */ 1043 #define MIPS16_INSN_READ_SP 0x00000800 1044 /* Reads the RA ($31) register. */ 1045 #define MIPS16_INSN_READ_31 0x00001000 1046 /* Reads the program counter. */ 1047 #define MIPS16_INSN_READ_PC 0x00002000 1048 /* Reads the general purpose register in MIPS16OP_*_REGR32. */ 1049 #define MIPS16_INSN_READ_GPR_X 0x00004000 1050 /* Is a branch insn. */ 1051 #define MIPS16_INSN_BRANCH 0x00010000 1052 1053 /* The following flags have the same value for the mips16 opcode 1054 table: 1055 INSN_UNCOND_BRANCH_DELAY 1056 INSN_COND_BRANCH_DELAY 1057 INSN_COND_BRANCH_LIKELY (never used) 1058 INSN_READ_HI 1059 INSN_READ_LO 1060 INSN_WRITE_HI 1061 INSN_WRITE_LO 1062 INSN_TRAP 1063 INSN_ISA3 1064 */ 1065 1066 extern const struct mips_opcode mips16_opcodes[]; 1067 extern const int bfd_mips16_num_opcodes; 1068 1069 /* Short hand so the lines aren't too long. */ 1070 1071 #define LDD INSN_LOAD_MEMORY_DELAY 1072 #define LCD INSN_LOAD_COPROC_DELAY 1073 #define UBD INSN_UNCOND_BRANCH_DELAY 1074 #define CBD INSN_COND_BRANCH_DELAY 1075 #define COD INSN_COPROC_MOVE_DELAY 1076 #define CLD INSN_COPROC_MEMORY_DELAY 1077 #define CBL INSN_COND_BRANCH_LIKELY 1078 #define TRAP INSN_TRAP 1079 #define SM INSN_STORE_MEMORY 1080 1081 #define WR_d INSN_WRITE_GPR_D 1082 #define WR_t INSN_WRITE_GPR_T 1083 #define WR_31 INSN_WRITE_GPR_31 1084 #define WR_D INSN_WRITE_FPR_D 1085 #define WR_T INSN_WRITE_FPR_T 1086 #define WR_S INSN_WRITE_FPR_S 1087 #define RD_s INSN_READ_GPR_S 1088 #define RD_b INSN_READ_GPR_S 1089 #define RD_t INSN_READ_GPR_T 1090 #define RD_S INSN_READ_FPR_S 1091 #define RD_T INSN_READ_FPR_T 1092 #define RD_R INSN_READ_FPR_R 1093 #define WR_CC INSN_WRITE_COND_CODE 1094 #define RD_CC INSN_READ_COND_CODE 1095 #define RD_C0 INSN_COP 1096 #define RD_C1 INSN_COP 1097 #define RD_C2 INSN_COP 1098 #define RD_C3 INSN_COP 1099 #define WR_C0 INSN_COP 1100 #define WR_C1 INSN_COP 1101 #define WR_C2 INSN_COP 1102 #define WR_C3 INSN_COP 1103 1104 #define WR_HI INSN_WRITE_HI 1105 #define RD_HI INSN_READ_HI 1106 #define MOD_HI WR_HI|RD_HI 1107 1108 #define WR_LO INSN_WRITE_LO 1109 #define RD_LO INSN_READ_LO 1110 #define MOD_LO WR_LO|RD_LO 1111 1112 #define WR_HILO WR_HI|WR_LO 1113 #define RD_HILO RD_HI|RD_LO 1114 #define MOD_HILO WR_HILO|RD_HILO 1115 1116 #define IS_M INSN_MULT 1117 1118 #define WR_MACC INSN2_WRITE_MDMX_ACC 1119 #define RD_MACC INSN2_READ_MDMX_ACC 1120 1121 #define I1 INSN_ISA1 1122 #define I2 INSN_ISA2 1123 #define I3 INSN_ISA3 1124 #define I4 INSN_ISA4 1125 #define I5 INSN_ISA5 1126 #define I32 INSN_ISA32 1127 #define I64 INSN_ISA64 1128 #define I33 INSN_ISA32R2 1129 #define I65 INSN_ISA64R2 1130 1131 /* MIPS64 MIPS-3D ASE support. */ 1132 #define I16 INSN_MIPS16 1133 1134 /* MIPS32 SmartMIPS ASE support. */ 1135 #define SMT INSN_SMARTMIPS 1136 1137 /* MIPS64 MIPS-3D ASE support. */ 1138 #define M3D INSN_MIPS3D 1139 1140 /* MIPS64 MDMX ASE support. */ 1141 #define MX INSN_MDMX 1142 1143 #define IL2E (INSN_LOONGSON_2E) 1144 #define IL2F (INSN_LOONGSON_2F) 1145 1146 #define P3 INSN_4650 1147 #define L1 INSN_4010 1148 #define V1 (INSN_4100 | INSN_4111 | INSN_4120) 1149 #define T3 INSN_3900 1150 #define M1 INSN_10000 1151 #define SB1 INSN_SB1 1152 #define N411 INSN_4111 1153 #define N412 INSN_4120 1154 #define N5 (INSN_5400 | INSN_5500) 1155 #define N54 INSN_5400 1156 #define N55 INSN_5500 1157 1158 #define G1 (T3 \ 1159 ) 1160 1161 #define G2 (T3 \ 1162 ) 1163 1164 #define G3 (I4 \ 1165 ) 1166 1167 /* MIPS DSP ASE support. 1168 NOTE: 1169 1. MIPS DSP ASE includes 4 accumulators ($ac0 - $ac3). $ac0 is the pair 1170 of original HI and LO. $ac1, $ac2 and $ac3 are new registers, and have 1171 the same structure as $ac0 (HI + LO). For DSP instructions that write or 1172 read accumulators (that may be $ac0), we add WR_a (WR_HILO) or RD_a 1173 (RD_HILO) attributes, such that HILO dependencies are maintained 1174 conservatively. 1175 1176 2. For some mul. instructions that use integer registers as destinations 1177 but destroy HI+LO as side-effect, we add WR_HILO to their attributes. 1178 1179 3. MIPS DSP ASE includes a new DSP control register, which has 6 fields 1180 (ccond, outflag, EFI, c, scount, pos). Many DSP instructions read or write 1181 certain fields of the DSP control register. For simplicity, we decide not 1182 to track dependencies of these fields. 1183 However, "bposge32" is a branch instruction that depends on the "pos" 1184 field. In order to make sure that GAS does not reorder DSP instructions 1185 that writes the "pos" field and "bposge32", we add DSP_VOLA (INSN_TRAP) 1186 attribute to those instructions that write the "pos" field. */ 1187 1188 #define WR_a WR_HILO /* Write dsp accumulators (reuse WR_HILO) */ 1189 #define RD_a RD_HILO /* Read dsp accumulators (reuse RD_HILO) */ 1190 #define MOD_a WR_a|RD_a 1191 #define DSP_VOLA INSN_TRAP 1192 #define D32 INSN_DSP 1193 #define D33 INSN_DSPR2 1194 #define D64 INSN_DSP64 1195 1196 /* MIPS MT ASE support. */ 1197 #define MT32 INSN_MT 1198 1199 /* The order of overloaded instructions matters. Label arguments and 1200 register arguments look the same. Instructions that can have either 1201 for arguments must apear in the correct order in this table for the 1202 assembler to pick the right one. In other words, entries with 1203 immediate operands must apear after the same instruction with 1204 registers. 1205 1206 Because of the lookup algorithm used, entries with the same opcode 1207 name must be contiguous. 1208 1209 Many instructions are short hand for other instructions (i.e., The 1210 jal <register> instruction is short for jalr <register>). */ 1211 1212 const struct mips_opcode mips_builtin_opcodes[] = 1213 { 1214 /* These instructions appear first so that the disassembler will find 1215 them first. The assemblers uses a hash table based on the 1216 instruction name anyhow. */ 1217 /* name, args, match, mask, pinfo, membership */ 1218 {"pref", "k,o(b)", 0xcc000000, 0xfc000000, RD_b, 0, I4|I32|G3 }, 1219 {"prefx", "h,t(b)", 0x4c00000f, 0xfc0007ff, RD_b|RD_t, 0, I4|I33 }, 1220 {"nop", "", 0x00000000, 0xffffffff, 0, INSN2_ALIAS, I1 }, /* sll */ 1221 {"ssnop", "", 0x00000040, 0xffffffff, 0, INSN2_ALIAS, I32|N55 }, /* sll */ 1222 {"ehb", "", 0x000000c0, 0xffffffff, 0, INSN2_ALIAS, I33 }, /* sll */ 1223 {"li", "t,j", 0x24000000, 0xffe00000, WR_t, INSN2_ALIAS, I1 }, /* addiu */ 1224 {"li", "t,i", 0x34000000, 0xffe00000, WR_t, INSN2_ALIAS, I1 }, /* ori */ 1225 {"li", "t,I", 0, (int) M_LI, INSN_MACRO, 0, I1 }, 1226 {"move", "d,s", 0, (int) M_MOVE, INSN_MACRO, 0, I1 }, 1227 {"move", "d,s", 0x0000002d, 0xfc1f07ff, WR_d|RD_s, INSN2_ALIAS, I3 },/* daddu */ 1228 {"move", "d,s", 0x00000021, 0xfc1f07ff, WR_d|RD_s, INSN2_ALIAS, I1 },/* addu */ 1229 {"move", "d,s", 0x00000025, 0xfc1f07ff, WR_d|RD_s, INSN2_ALIAS, I1 },/* or */ 1230 {"b", "p", 0x10000000, 0xffff0000, UBD, INSN2_ALIAS, I1 },/* beq 0,0 */ 1231 {"b", "p", 0x04010000, 0xffff0000, UBD, INSN2_ALIAS, I1 },/* bgez 0 */ 1232 {"bal", "p", 0x04110000, 0xffff0000, UBD|WR_31, INSN2_ALIAS, I1 },/* bgezal 0*/ 1233 1234 {"abs", "d,v", 0, (int) M_ABS, INSN_MACRO, 0, I1 }, 1235 {"abs.s", "D,V", 0x46000005, 0xffff003f, WR_D|RD_S|FP_S, 0, I1 }, 1236 {"abs.d", "D,V", 0x46200005, 0xffff003f, WR_D|RD_S|FP_D, 0, I1 }, 1237 {"abs.ps", "D,V", 0x46c00005, 0xffff003f, WR_D|RD_S|FP_D, 0, I5|I33 }, 1238 {"add", "d,v,t", 0x00000020, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 1239 {"add", "t,r,I", 0, (int) M_ADD_I, INSN_MACRO, 0, I1 }, 1240 {"add.s", "D,V,T", 0x46000000, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, 0, I1 }, 1241 {"add.d", "D,V,T", 0x46200000, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I1 }, 1242 {"add.ob", "X,Y,Q", 0x7800000b, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1243 {"add.ob", "D,S,T", 0x4ac0000b, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1244 {"add.ob", "D,S,T[e]", 0x4800000b, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 1245 {"add.ob", "D,S,k", 0x4bc0000b, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1246 {"add.ps", "D,V,T", 0x46c00000, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I5|I33 }, 1247 {"add.qh", "X,Y,Q", 0x7820000b, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 1248 {"adda.ob", "Y,Q", 0x78000037, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 1249 {"adda.qh", "Y,Q", 0x78200037, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 1250 {"addi", "t,r,j", 0x20000000, 0xfc000000, WR_t|RD_s, 0, I1 }, 1251 {"addiu", "t,r,j", 0x24000000, 0xfc000000, WR_t|RD_s, 0, I1 }, 1252 {"addl.ob", "Y,Q", 0x78000437, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 1253 {"addl.qh", "Y,Q", 0x78200437, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 1254 {"addr.ps", "D,S,T", 0x46c00018, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, M3D }, 1255 {"addu", "d,v,t", 0x00000021, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 1256 {"addu", "t,r,I", 0, (int) M_ADDU_I, INSN_MACRO, 0, I1 }, 1257 {"alni.ob", "X,Y,Z,O", 0x78000018, 0xff00003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1258 {"alni.ob", "D,S,T,%", 0x48000018, 0xff00003f, WR_D|RD_S|RD_T, 0, N54 }, 1259 {"alni.qh", "X,Y,Z,O", 0x7800001a, 0xff00003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 1260 {"alnv.ps", "D,V,T,s", 0x4c00001e, 0xfc00003f, WR_D|RD_S|RD_T|FP_D, 0, I5|I33 }, 1261 {"alnv.ob", "X,Y,Z,s", 0x78000019, 0xfc00003f, WR_D|RD_S|RD_T|RD_s|FP_D, 0, MX|SB1 }, 1262 {"alnv.qh", "X,Y,Z,s", 0x7800001b, 0xfc00003f, WR_D|RD_S|RD_T|RD_s|FP_D, 0, MX }, 1263 {"and", "d,v,t", 0x00000024, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 1264 {"and", "t,r,I", 0, (int) M_AND_I, INSN_MACRO, 0, I1 }, 1265 {"and.ob", "X,Y,Q", 0x7800000c, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1266 {"and.ob", "D,S,T", 0x4ac0000c, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1267 {"and.ob", "D,S,T[e]", 0x4800000c, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 1268 {"and.ob", "D,S,k", 0x4bc0000c, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1269 {"and.qh", "X,Y,Q", 0x7820000c, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 1270 {"andi", "t,r,i", 0x30000000, 0xfc000000, WR_t|RD_s, 0, I1 }, 1271 /* b is at the top of the table. */ 1272 /* bal is at the top of the table. */ 1273 /* bc0[tf]l? are at the bottom of the table. */ 1274 {"bc1any2f", "N,p", 0x45200000, 0xffe30000, CBD|RD_CC|FP_S, 0, M3D }, 1275 {"bc1any2t", "N,p", 0x45210000, 0xffe30000, CBD|RD_CC|FP_S, 0, M3D }, 1276 {"bc1any4f", "N,p", 0x45400000, 0xffe30000, CBD|RD_CC|FP_S, 0, M3D }, 1277 {"bc1any4t", "N,p", 0x45410000, 0xffe30000, CBD|RD_CC|FP_S, 0, M3D }, 1278 {"bc1f", "p", 0x45000000, 0xffff0000, CBD|RD_CC|FP_S, 0, I1 }, 1279 {"bc1f", "N,p", 0x45000000, 0xffe30000, CBD|RD_CC|FP_S, 0, I4|I32 }, 1280 {"bc1fl", "p", 0x45020000, 0xffff0000, CBL|RD_CC|FP_S, 0, I2|T3 }, 1281 {"bc1fl", "N,p", 0x45020000, 0xffe30000, CBL|RD_CC|FP_S, 0, I4|I32 }, 1282 {"bc1t", "p", 0x45010000, 0xffff0000, CBD|RD_CC|FP_S, 0, I1 }, 1283 {"bc1t", "N,p", 0x45010000, 0xffe30000, CBD|RD_CC|FP_S, 0, I4|I32 }, 1284 {"bc1tl", "p", 0x45030000, 0xffff0000, CBL|RD_CC|FP_S, 0, I2|T3 }, 1285 {"bc1tl", "N,p", 0x45030000, 0xffe30000, CBL|RD_CC|FP_S, 0, I4|I32 }, 1286 /* bc2* are at the bottom of the table. */ 1287 /* bc3* are at the bottom of the table. */ 1288 {"beqz", "s,p", 0x10000000, 0xfc1f0000, CBD|RD_s, 0, I1 }, 1289 {"beqzl", "s,p", 0x50000000, 0xfc1f0000, CBL|RD_s, 0, I2|T3 }, 1290 {"beq", "s,t,p", 0x10000000, 0xfc000000, CBD|RD_s|RD_t, 0, I1 }, 1291 {"beq", "s,I,p", 0, (int) M_BEQ_I, INSN_MACRO, 0, I1 }, 1292 {"beql", "s,t,p", 0x50000000, 0xfc000000, CBL|RD_s|RD_t, 0, I2|T3 }, 1293 {"beql", "s,I,p", 0, (int) M_BEQL_I, INSN_MACRO, 0, I2|T3 }, 1294 {"bge", "s,t,p", 0, (int) M_BGE, INSN_MACRO, 0, I1 }, 1295 {"bge", "s,I,p", 0, (int) M_BGE_I, INSN_MACRO, 0, I1 }, 1296 {"bgel", "s,t,p", 0, (int) M_BGEL, INSN_MACRO, 0, I2|T3 }, 1297 {"bgel", "s,I,p", 0, (int) M_BGEL_I, INSN_MACRO, 0, I2|T3 }, 1298 {"bgeu", "s,t,p", 0, (int) M_BGEU, INSN_MACRO, 0, I1 }, 1299 {"bgeu", "s,I,p", 0, (int) M_BGEU_I, INSN_MACRO, 0, I1 }, 1300 {"bgeul", "s,t,p", 0, (int) M_BGEUL, INSN_MACRO, 0, I2|T3 }, 1301 {"bgeul", "s,I,p", 0, (int) M_BGEUL_I, INSN_MACRO, 0, I2|T3 }, 1302 {"bgez", "s,p", 0x04010000, 0xfc1f0000, CBD|RD_s, 0, I1 }, 1303 {"bgezl", "s,p", 0x04030000, 0xfc1f0000, CBL|RD_s, 0, I2|T3 }, 1304 {"bgezal", "s,p", 0x04110000, 0xfc1f0000, CBD|RD_s|WR_31, 0, I1 }, 1305 {"bgezall", "s,p", 0x04130000, 0xfc1f0000, CBL|RD_s|WR_31, 0, I2|T3 }, 1306 {"bgt", "s,t,p", 0, (int) M_BGT, INSN_MACRO, 0, I1 }, 1307 {"bgt", "s,I,p", 0, (int) M_BGT_I, INSN_MACRO, 0, I1 }, 1308 {"bgtl", "s,t,p", 0, (int) M_BGTL, INSN_MACRO, 0, I2|T3 }, 1309 {"bgtl", "s,I,p", 0, (int) M_BGTL_I, INSN_MACRO, 0, I2|T3 }, 1310 {"bgtu", "s,t,p", 0, (int) M_BGTU, INSN_MACRO, 0, I1 }, 1311 {"bgtu", "s,I,p", 0, (int) M_BGTU_I, INSN_MACRO, 0, I1 }, 1312 {"bgtul", "s,t,p", 0, (int) M_BGTUL, INSN_MACRO, 0, I2|T3 }, 1313 {"bgtul", "s,I,p", 0, (int) M_BGTUL_I, INSN_MACRO, 0, I2|T3 }, 1314 {"bgtz", "s,p", 0x1c000000, 0xfc1f0000, CBD|RD_s, 0, I1 }, 1315 {"bgtzl", "s,p", 0x5c000000, 0xfc1f0000, CBL|RD_s, 0, I2|T3 }, 1316 {"ble", "s,t,p", 0, (int) M_BLE, INSN_MACRO, 0, I1 }, 1317 {"ble", "s,I,p", 0, (int) M_BLE_I, INSN_MACRO, 0, I1 }, 1318 {"blel", "s,t,p", 0, (int) M_BLEL, INSN_MACRO, 0, I2|T3 }, 1319 {"blel", "s,I,p", 0, (int) M_BLEL_I, INSN_MACRO, 0, I2|T3 }, 1320 {"bleu", "s,t,p", 0, (int) M_BLEU, INSN_MACRO, 0, I1 }, 1321 {"bleu", "s,I,p", 0, (int) M_BLEU_I, INSN_MACRO, 0, I1 }, 1322 {"bleul", "s,t,p", 0, (int) M_BLEUL, INSN_MACRO, 0, I2|T3 }, 1323 {"bleul", "s,I,p", 0, (int) M_BLEUL_I, INSN_MACRO, 0, I2|T3 }, 1324 {"blez", "s,p", 0x18000000, 0xfc1f0000, CBD|RD_s, 0, I1 }, 1325 {"blezl", "s,p", 0x58000000, 0xfc1f0000, CBL|RD_s, 0, I2|T3 }, 1326 {"blt", "s,t,p", 0, (int) M_BLT, INSN_MACRO, 0, I1 }, 1327 {"blt", "s,I,p", 0, (int) M_BLT_I, INSN_MACRO, 0, I1 }, 1328 {"bltl", "s,t,p", 0, (int) M_BLTL, INSN_MACRO, 0, I2|T3 }, 1329 {"bltl", "s,I,p", 0, (int) M_BLTL_I, INSN_MACRO, 0, I2|T3 }, 1330 {"bltu", "s,t,p", 0, (int) M_BLTU, INSN_MACRO, 0, I1 }, 1331 {"bltu", "s,I,p", 0, (int) M_BLTU_I, INSN_MACRO, 0, I1 }, 1332 {"bltul", "s,t,p", 0, (int) M_BLTUL, INSN_MACRO, 0, I2|T3 }, 1333 {"bltul", "s,I,p", 0, (int) M_BLTUL_I, INSN_MACRO, 0, I2|T3 }, 1334 {"bltz", "s,p", 0x04000000, 0xfc1f0000, CBD|RD_s, 0, I1 }, 1335 {"bltzl", "s,p", 0x04020000, 0xfc1f0000, CBL|RD_s, 0, I2|T3 }, 1336 {"bltzal", "s,p", 0x04100000, 0xfc1f0000, CBD|RD_s|WR_31, 0, I1 }, 1337 {"bltzall", "s,p", 0x04120000, 0xfc1f0000, CBL|RD_s|WR_31, 0, I2|T3 }, 1338 {"bnez", "s,p", 0x14000000, 0xfc1f0000, CBD|RD_s, 0, I1 }, 1339 {"bnezl", "s,p", 0x54000000, 0xfc1f0000, CBL|RD_s, 0, I2|T3 }, 1340 {"bne", "s,t,p", 0x14000000, 0xfc000000, CBD|RD_s|RD_t, 0, I1 }, 1341 {"bne", "s,I,p", 0, (int) M_BNE_I, INSN_MACRO, 0, I1 }, 1342 {"bnel", "s,t,p", 0x54000000, 0xfc000000, CBL|RD_s|RD_t, 0, I2|T3 }, 1343 {"bnel", "s,I,p", 0, (int) M_BNEL_I, INSN_MACRO, 0, I2|T3 }, 1344 {"break", "", 0x0000000d, 0xffffffff, TRAP, 0, I1 }, 1345 {"break", "c", 0x0000000d, 0xfc00ffff, TRAP, 0, I1 }, 1346 {"break", "c,q", 0x0000000d, 0xfc00003f, TRAP, 0, I1 }, 1347 {"c.f.d", "S,T", 0x46200030, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1348 {"c.f.d", "M,S,T", 0x46200030, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1349 {"c.f.s", "S,T", 0x46000030, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1350 {"c.f.s", "M,S,T", 0x46000030, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1351 {"c.f.ps", "S,T", 0x46c00030, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1352 {"c.f.ps", "M,S,T", 0x46c00030, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1353 {"c.un.d", "S,T", 0x46200031, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1354 {"c.un.d", "M,S,T", 0x46200031, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1355 {"c.un.s", "S,T", 0x46000031, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1356 {"c.un.s", "M,S,T", 0x46000031, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1357 {"c.un.ps", "S,T", 0x46c00031, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1358 {"c.un.ps", "M,S,T", 0x46c00031, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1359 {"c.eq.d", "S,T", 0x46200032, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1360 {"c.eq.d", "M,S,T", 0x46200032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1361 {"c.eq.s", "S,T", 0x46000032, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1362 {"c.eq.s", "M,S,T", 0x46000032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1363 {"c.eq.ob", "Y,Q", 0x78000001, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1364 {"c.eq.ob", "S,T", 0x4ac00001, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1365 {"c.eq.ob", "S,T[e]", 0x48000001, 0xfe2007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1366 {"c.eq.ob", "S,k", 0x4bc00001, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1367 {"c.eq.ps", "S,T", 0x46c00032, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1368 {"c.eq.ps", "M,S,T", 0x46c00032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1369 {"c.eq.qh", "Y,Q", 0x78200001, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, 0, MX }, 1370 {"c.ueq.d", "S,T", 0x46200033, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1371 {"c.ueq.d", "M,S,T", 0x46200033, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1372 {"c.ueq.s", "S,T", 0x46000033, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1373 {"c.ueq.s", "M,S,T", 0x46000033, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1374 {"c.ueq.ps","S,T", 0x46c00033, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1375 {"c.ueq.ps","M,S,T", 0x46c00033, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1376 {"c.olt.d", "S,T", 0x46200034, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1377 {"c.olt.d", "M,S,T", 0x46200034, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1378 {"c.olt.s", "S,T", 0x46000034, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1379 {"c.olt.s", "M,S,T", 0x46000034, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1380 {"c.olt.ps","S,T", 0x46c00034, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1381 {"c.olt.ps","M,S,T", 0x46c00034, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1382 {"c.ult.d", "S,T", 0x46200035, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1383 {"c.ult.d", "M,S,T", 0x46200035, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1384 {"c.ult.s", "S,T", 0x46000035, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1385 {"c.ult.s", "M,S,T", 0x46000035, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1386 {"c.ult.ps","S,T", 0x46c00035, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1387 {"c.ult.ps","M,S,T", 0x46c00035, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1388 {"c.ole.d", "S,T", 0x46200036, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1389 {"c.ole.d", "M,S,T", 0x46200036, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1390 {"c.ole.s", "S,T", 0x46000036, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1391 {"c.ole.s", "M,S,T", 0x46000036, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1392 {"c.ole.ps","S,T", 0x46c00036, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1393 {"c.ole.ps","M,S,T", 0x46c00036, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1394 {"c.ule.d", "S,T", 0x46200037, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1395 {"c.ule.d", "M,S,T", 0x46200037, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1396 {"c.ule.s", "S,T", 0x46000037, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1397 {"c.ule.s", "M,S,T", 0x46000037, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1398 {"c.ule.ps","S,T", 0x46c00037, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1399 {"c.ule.ps","M,S,T", 0x46c00037, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1400 {"c.sf.d", "S,T", 0x46200038, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1401 {"c.sf.d", "M,S,T", 0x46200038, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1402 {"c.sf.s", "S,T", 0x46000038, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1403 {"c.sf.s", "M,S,T", 0x46000038, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1404 {"c.sf.ps", "S,T", 0x46c00038, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1405 {"c.sf.ps", "M,S,T", 0x46c00038, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1406 {"c.ngle.d","S,T", 0x46200039, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1407 {"c.ngle.d","M,S,T", 0x46200039, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1408 {"c.ngle.s","S,T", 0x46000039, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1409 {"c.ngle.s","M,S,T", 0x46000039, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1410 {"c.ngle.ps","S,T", 0x46c00039, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1411 {"c.ngle.ps","M,S,T", 0x46c00039, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1412 {"c.seq.d", "S,T", 0x4620003a, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1413 {"c.seq.d", "M,S,T", 0x4620003a, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1414 {"c.seq.s", "S,T", 0x4600003a, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1415 {"c.seq.s", "M,S,T", 0x4600003a, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1416 {"c.seq.ps","S,T", 0x46c0003a, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1417 {"c.seq.ps","M,S,T", 0x46c0003a, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1418 {"c.ngl.d", "S,T", 0x4620003b, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1419 {"c.ngl.d", "M,S,T", 0x4620003b, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1420 {"c.ngl.s", "S,T", 0x4600003b, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1421 {"c.ngl.s", "M,S,T", 0x4600003b, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1422 {"c.ngl.ps","S,T", 0x46c0003b, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1423 {"c.ngl.ps","M,S,T", 0x46c0003b, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1424 {"c.lt.d", "S,T", 0x4620003c, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1425 {"c.lt.d", "M,S,T", 0x4620003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1426 {"c.lt.s", "S,T", 0x4600003c, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1427 {"c.lt.s", "M,S,T", 0x4600003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1428 {"c.lt.ob", "Y,Q", 0x78000004, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1429 {"c.lt.ob", "S,T", 0x4ac00004, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1430 {"c.lt.ob", "S,T[e]", 0x48000004, 0xfe2007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1431 {"c.lt.ob", "S,k", 0x4bc00004, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1432 {"c.lt.ps", "S,T", 0x46c0003c, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1433 {"c.lt.ps", "M,S,T", 0x46c0003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1434 {"c.lt.qh", "Y,Q", 0x78200004, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, 0, MX }, 1435 {"c.nge.d", "S,T", 0x4620003d, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1436 {"c.nge.d", "M,S,T", 0x4620003d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1437 {"c.nge.s", "S,T", 0x4600003d, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1438 {"c.nge.s", "M,S,T", 0x4600003d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1439 {"c.nge.ps","S,T", 0x46c0003d, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1440 {"c.nge.ps","M,S,T", 0x46c0003d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1441 {"c.le.d", "S,T", 0x4620003e, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1442 {"c.le.d", "M,S,T", 0x4620003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1443 {"c.le.s", "S,T", 0x4600003e, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1444 {"c.le.s", "M,S,T", 0x4600003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1445 {"c.le.ob", "Y,Q", 0x78000005, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1446 {"c.le.ob", "S,T", 0x4ac00005, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1447 {"c.le.ob", "S,T[e]", 0x48000005, 0xfe2007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1448 {"c.le.ob", "S,k", 0x4bc00005, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1449 {"c.le.ps", "S,T", 0x46c0003e, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1450 {"c.le.ps", "M,S,T", 0x46c0003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1451 {"c.le.qh", "Y,Q", 0x78200005, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, 0, MX }, 1452 {"c.ngt.d", "S,T", 0x4620003f, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, 1453 {"c.ngt.d", "M,S,T", 0x4620003f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I4|I32 }, 1454 {"c.ngt.s", "S,T", 0x4600003f, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, 0, I1 }, 1455 {"c.ngt.s", "M,S,T", 0x4600003f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, I4|I32 }, 1456 {"c.ngt.ps","S,T", 0x46c0003f, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1457 {"c.ngt.ps","M,S,T", 0x46c0003f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, I5|I33 }, 1458 {"cabs.eq.d", "M,S,T", 0x46200072, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1459 {"cabs.eq.ps", "M,S,T", 0x46c00072, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1460 {"cabs.eq.s", "M,S,T", 0x46000072, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1461 {"cabs.f.d", "M,S,T", 0x46200070, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1462 {"cabs.f.ps", "M,S,T", 0x46c00070, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1463 {"cabs.f.s", "M,S,T", 0x46000070, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1464 {"cabs.le.d", "M,S,T", 0x4620007e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1465 {"cabs.le.ps", "M,S,T", 0x46c0007e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1466 {"cabs.le.s", "M,S,T", 0x4600007e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1467 {"cabs.lt.d", "M,S,T", 0x4620007c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1468 {"cabs.lt.ps", "M,S,T", 0x46c0007c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1469 {"cabs.lt.s", "M,S,T", 0x4600007c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1470 {"cabs.nge.d", "M,S,T", 0x4620007d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1471 {"cabs.nge.ps","M,S,T", 0x46c0007d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1472 {"cabs.nge.s", "M,S,T", 0x4600007d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1473 {"cabs.ngl.d", "M,S,T", 0x4620007b, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1474 {"cabs.ngl.ps","M,S,T", 0x46c0007b, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1475 {"cabs.ngl.s", "M,S,T", 0x4600007b, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1476 {"cabs.ngle.d","M,S,T", 0x46200079, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1477 {"cabs.ngle.ps","M,S,T",0x46c00079, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1478 {"cabs.ngle.s","M,S,T", 0x46000079, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1479 {"cabs.ngt.d", "M,S,T", 0x4620007f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1480 {"cabs.ngt.ps","M,S,T", 0x46c0007f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1481 {"cabs.ngt.s", "M,S,T", 0x4600007f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1482 {"cabs.ole.d", "M,S,T", 0x46200076, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1483 {"cabs.ole.ps","M,S,T", 0x46c00076, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1484 {"cabs.ole.s", "M,S,T", 0x46000076, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1485 {"cabs.olt.d", "M,S,T", 0x46200074, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1486 {"cabs.olt.ps","M,S,T", 0x46c00074, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1487 {"cabs.olt.s", "M,S,T", 0x46000074, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1488 {"cabs.seq.d", "M,S,T", 0x4620007a, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1489 {"cabs.seq.ps","M,S,T", 0x46c0007a, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1490 {"cabs.seq.s", "M,S,T", 0x4600007a, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1491 {"cabs.sf.d", "M,S,T", 0x46200078, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1492 {"cabs.sf.ps", "M,S,T", 0x46c00078, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1493 {"cabs.sf.s", "M,S,T", 0x46000078, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1494 {"cabs.ueq.d", "M,S,T", 0x46200073, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1495 {"cabs.ueq.ps","M,S,T", 0x46c00073, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1496 {"cabs.ueq.s", "M,S,T", 0x46000073, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1497 {"cabs.ule.d", "M,S,T", 0x46200077, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1498 {"cabs.ule.ps","M,S,T", 0x46c00077, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1499 {"cabs.ule.s", "M,S,T", 0x46000077, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1500 {"cabs.ult.d", "M,S,T", 0x46200075, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1501 {"cabs.ult.ps","M,S,T", 0x46c00075, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1502 {"cabs.ult.s", "M,S,T", 0x46000075, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1503 {"cabs.un.d", "M,S,T", 0x46200071, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1504 {"cabs.un.ps", "M,S,T", 0x46c00071, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, 1505 {"cabs.un.s", "M,S,T", 0x46000071, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, 1506 /* CW4010 instructions which are aliases for the cache instruction. */ 1507 {"flushi", "", 0xbc010000, 0xffffffff, 0, 0, L1 }, 1508 {"flushd", "", 0xbc020000, 0xffffffff, 0, 0, L1 }, 1509 {"flushid", "", 0xbc030000, 0xffffffff, 0, 0, L1 }, 1510 {"wb", "o(b)", 0xbc040000, 0xfc1f0000, SM|RD_b, 0, L1 }, 1511 {"cache", "k,o(b)", 0xbc000000, 0xfc000000, RD_b, 0, I3|I32|T3}, 1512 {"cache", "k,A(b)", 0, (int) M_CACHE_AB, INSN_MACRO, 0, I3|I32|T3}, 1513 {"ceil.l.d", "D,S", 0x4620000a, 0xffff003f, WR_D|RD_S|FP_D, 0, I3|I33 }, 1514 {"ceil.l.s", "D,S", 0x4600000a, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I3|I33 }, 1515 {"ceil.w.d", "D,S", 0x4620000e, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I2 }, 1516 {"ceil.w.s", "D,S", 0x4600000e, 0xffff003f, WR_D|RD_S|FP_S, 0, I2 }, 1517 {"cfc0", "t,G", 0x40400000, 0xffe007ff, LCD|WR_t|RD_C0, 0, I1 }, 1518 {"cfc1", "t,G", 0x44400000, 0xffe007ff, LCD|WR_t|RD_C1|FP_S, 0, I1 }, 1519 {"cfc1", "t,S", 0x44400000, 0xffe007ff, LCD|WR_t|RD_C1|FP_S, 0, I1 }, 1520 /* cfc2 is at the bottom of the table. */ 1521 /* cfc3 is at the bottom of the table. */ 1522 {"cftc1", "d,E", 0x41000023, 0xffe007ff, TRAP|LCD|WR_d|RD_C1|FP_S, 0, MT32 }, 1523 {"cftc1", "d,T", 0x41000023, 0xffe007ff, TRAP|LCD|WR_d|RD_C1|FP_S, 0, MT32 }, 1524 {"cftc2", "d,E", 0x41000025, 0xffe007ff, TRAP|LCD|WR_d|RD_C2, 0, MT32 }, 1525 {"clo", "U,s", 0x70000021, 0xfc0007ff, WR_d|WR_t|RD_s, 0, I32|N55 }, 1526 {"clz", "U,s", 0x70000020, 0xfc0007ff, WR_d|WR_t|RD_s, 0, I32|N55 }, 1527 {"ctc0", "t,G", 0x40c00000, 0xffe007ff, COD|RD_t|WR_CC, 0, I1 }, 1528 {"ctc1", "t,G", 0x44c00000, 0xffe007ff, COD|RD_t|WR_CC|FP_S, 0, I1 }, 1529 {"ctc1", "t,S", 0x44c00000, 0xffe007ff, COD|RD_t|WR_CC|FP_S, 0, I1 }, 1530 /* ctc2 is at the bottom of the table. */ 1531 /* ctc3 is at the bottom of the table. */ 1532 {"cttc1", "t,g", 0x41800023, 0xffe007ff, TRAP|COD|RD_t|WR_CC|FP_S, 0, MT32 }, 1533 {"cttc1", "t,S", 0x41800023, 0xffe007ff, TRAP|COD|RD_t|WR_CC|FP_S, 0, MT32 }, 1534 {"cttc2", "t,g", 0x41800025, 0xffe007ff, TRAP|COD|RD_t|WR_CC, 0, MT32 }, 1535 {"cvt.d.l", "D,S", 0x46a00021, 0xffff003f, WR_D|RD_S|FP_D, 0, I3|I33 }, 1536 {"cvt.d.s", "D,S", 0x46000021, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I1 }, 1537 {"cvt.d.w", "D,S", 0x46800021, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I1 }, 1538 {"cvt.l.d", "D,S", 0x46200025, 0xffff003f, WR_D|RD_S|FP_D, 0, I3|I33 }, 1539 {"cvt.l.s", "D,S", 0x46000025, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I3|I33 }, 1540 {"cvt.s.l", "D,S", 0x46a00020, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I3|I33 }, 1541 {"cvt.s.d", "D,S", 0x46200020, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I1 }, 1542 {"cvt.s.w", "D,S", 0x46800020, 0xffff003f, WR_D|RD_S|FP_S, 0, I1 }, 1543 {"cvt.s.pl","D,S", 0x46c00028, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I5|I33 }, 1544 {"cvt.s.pu","D,S", 0x46c00020, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I5|I33 }, 1545 {"cvt.w.d", "D,S", 0x46200024, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I1 }, 1546 {"cvt.w.s", "D,S", 0x46000024, 0xffff003f, WR_D|RD_S|FP_S, 0, I1 }, 1547 {"cvt.ps.pw", "D,S", 0x46800026, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, M3D }, 1548 {"cvt.ps.s","D,V,T", 0x46000026, 0xffe0003f, WR_D|RD_S|RD_T|FP_S|FP_D, 0, I5|I33 }, 1549 {"cvt.pw.ps", "D,S", 0x46c00024, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, M3D }, 1550 {"dabs", "d,v", 0, (int) M_DABS, INSN_MACRO, 0, I3 }, 1551 {"dadd", "d,v,t", 0x0000002c, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I3 }, 1552 {"dadd", "t,r,I", 0, (int) M_DADD_I, INSN_MACRO, 0, I3 }, 1553 {"daddi", "t,r,j", 0x60000000, 0xfc000000, WR_t|RD_s, 0, I3 }, 1554 {"daddiu", "t,r,j", 0x64000000, 0xfc000000, WR_t|RD_s, 0, I3 }, 1555 {"daddu", "d,v,t", 0x0000002d, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I3 }, 1556 {"daddu", "t,r,I", 0, (int) M_DADDU_I, INSN_MACRO, 0, I3 }, 1557 {"dbreak", "", 0x7000003f, 0xffffffff, 0, 0, N5 }, 1558 {"dclo", "U,s", 0x70000025, 0xfc0007ff, RD_s|WR_d|WR_t, 0, I64|N55 }, 1559 {"dclz", "U,s", 0x70000024, 0xfc0007ff, RD_s|WR_d|WR_t, 0, I64|N55 }, 1560 /* dctr and dctw are used on the r5000. */ 1561 {"dctr", "o(b)", 0xbc050000, 0xfc1f0000, RD_b, 0, I3 }, 1562 {"dctw", "o(b)", 0xbc090000, 0xfc1f0000, RD_b, 0, I3 }, 1563 {"deret", "", 0x4200001f, 0xffffffff, 0, 0, I32|G2 }, 1564 {"dext", "t,r,I,+I", 0, (int) M_DEXT, INSN_MACRO, 0, I65 }, 1565 {"dext", "t,r,+A,+C", 0x7c000003, 0xfc00003f, WR_t|RD_s, 0, I65 }, 1566 {"dextm", "t,r,+A,+G", 0x7c000001, 0xfc00003f, WR_t|RD_s, 0, I65 }, 1567 {"dextu", "t,r,+E,+H", 0x7c000002, 0xfc00003f, WR_t|RD_s, 0, I65 }, 1568 /* For ddiv, see the comments about div. */ 1569 {"ddiv", "z,s,t", 0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I3 }, 1570 {"ddiv", "d,v,t", 0, (int) M_DDIV_3, INSN_MACRO, 0, I3 }, 1571 {"ddiv", "d,v,I", 0, (int) M_DDIV_3I, INSN_MACRO, 0, I3 }, 1572 /* For ddivu, see the comments about div. */ 1573 {"ddivu", "z,s,t", 0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I3 }, 1574 {"ddivu", "d,v,t", 0, (int) M_DDIVU_3, INSN_MACRO, 0, I3 }, 1575 {"ddivu", "d,v,I", 0, (int) M_DDIVU_3I, INSN_MACRO, 0, I3 }, 1576 {"di", "", 0x41606000, 0xffffffff, WR_t|WR_C0, 0, I33 }, 1577 {"di", "t", 0x41606000, 0xffe0ffff, WR_t|WR_C0, 0, I33 }, 1578 {"dins", "t,r,I,+I", 0, (int) M_DINS, INSN_MACRO, 0, I65 }, 1579 {"dins", "t,r,+A,+B", 0x7c000007, 0xfc00003f, WR_t|RD_s, 0, I65 }, 1580 {"dinsm", "t,r,+A,+F", 0x7c000005, 0xfc00003f, WR_t|RD_s, 0, I65 }, 1581 {"dinsu", "t,r,+E,+F", 0x7c000006, 0xfc00003f, WR_t|RD_s, 0, I65 }, 1582 /* The MIPS assembler treats the div opcode with two operands as 1583 though the first operand appeared twice (the first operand is both 1584 a source and a destination). To get the div machine instruction, 1585 you must use an explicit destination of $0. */ 1586 {"div", "z,s,t", 0x0000001a, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I1 }, 1587 {"div", "z,t", 0x0000001a, 0xffe0ffff, RD_s|RD_t|WR_HILO, 0, I1 }, 1588 {"div", "d,v,t", 0, (int) M_DIV_3, INSN_MACRO, 0, I1 }, 1589 {"div", "d,v,I", 0, (int) M_DIV_3I, INSN_MACRO, 0, I1 }, 1590 {"div.d", "D,V,T", 0x46200003, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I1 }, 1591 {"div.s", "D,V,T", 0x46000003, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, 0, I1 }, 1592 {"div.ps", "D,V,T", 0x46c00003, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, SB1 }, 1593 /* For divu, see the comments about div. */ 1594 {"divu", "z,s,t", 0x0000001b, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I1 }, 1595 {"divu", "z,t", 0x0000001b, 0xffe0ffff, RD_s|RD_t|WR_HILO, 0, I1 }, 1596 {"divu", "d,v,t", 0, (int) M_DIVU_3, INSN_MACRO, 0, I1 }, 1597 {"divu", "d,v,I", 0, (int) M_DIVU_3I, INSN_MACRO, 0, I1 }, 1598 {"dla", "t,A(b)", 0, (int) M_DLA_AB, INSN_MACRO, 0, I3 }, 1599 {"dlca", "t,A(b)", 0, (int) M_DLCA_AB, INSN_MACRO, 0, I3 }, 1600 {"dli", "t,j", 0x24000000, 0xffe00000, WR_t, 0, I3 }, /* addiu */ 1601 {"dli", "t,i", 0x34000000, 0xffe00000, WR_t, 0, I3 }, /* ori */ 1602 {"dli", "t,I", 0, (int) M_DLI, INSN_MACRO, 0, I3 }, 1603 {"dmacc", "d,s,t", 0x00000029, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d, 0, N412 }, 1604 {"dmacchi", "d,s,t", 0x00000229, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d, 0, N412 }, 1605 {"dmacchis", "d,s,t", 0x00000629, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d, 0, N412 }, 1606 {"dmacchiu", "d,s,t", 0x00000269, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d, 0, N412 }, 1607 {"dmacchius", "d,s,t", 0x00000669, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d, 0, N412 }, 1608 {"dmaccs", "d,s,t", 0x00000429, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d, 0, N412 }, 1609 {"dmaccu", "d,s,t", 0x00000069, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d, 0, N412 }, 1610 {"dmaccus", "d,s,t", 0x00000469, 0xfc0007ff, RD_s|RD_t|WR_LO|WR_d, 0, N412 }, 1611 {"dmadd16", "s,t", 0x00000029, 0xfc00ffff, RD_s|RD_t|MOD_LO, 0, N411 }, 1612 {"dmfc0", "t,G", 0x40200000, 0xffe007ff, LCD|WR_t|RD_C0, 0, I3 }, 1613 {"dmfc0", "t,+D", 0x40200000, 0xffe007f8, LCD|WR_t|RD_C0, 0, I64 }, 1614 {"dmfc0", "t,G,H", 0x40200000, 0xffe007f8, LCD|WR_t|RD_C0, 0, I64 }, 1615 {"dmt", "", 0x41600bc1, 0xffffffff, TRAP, 0, MT32 }, 1616 {"dmt", "t", 0x41600bc1, 0xffe0ffff, TRAP|WR_t, 0, MT32 }, 1617 {"dmtc0", "t,G", 0x40a00000, 0xffe007ff, COD|RD_t|WR_C0|WR_CC, 0, I3 }, 1618 {"dmtc0", "t,+D", 0x40a00000, 0xffe007f8, COD|RD_t|WR_C0|WR_CC, 0, I64 }, 1619 {"dmtc0", "t,G,H", 0x40a00000, 0xffe007f8, COD|RD_t|WR_C0|WR_CC, 0, I64 }, 1620 {"dmfc1", "t,S", 0x44200000, 0xffe007ff, LCD|WR_t|RD_S|FP_D, 0, I3 }, 1621 {"dmfc1", "t,G", 0x44200000, 0xffe007ff, LCD|WR_t|RD_S|FP_D, 0, I3 }, 1622 {"dmtc1", "t,S", 0x44a00000, 0xffe007ff, COD|RD_t|WR_S|FP_D, 0, I3 }, 1623 {"dmtc1", "t,G", 0x44a00000, 0xffe007ff, COD|RD_t|WR_S|FP_D, 0, I3 }, 1624 /* dmfc2 is at the bottom of the table. */ 1625 /* dmtc2 is at the bottom of the table. */ 1626 /* dmfc3 is at the bottom of the table. */ 1627 /* dmtc3 is at the bottom of the table. */ 1628 {"dmul", "d,v,t", 0, (int) M_DMUL, INSN_MACRO, 0, I3 }, 1629 {"dmul", "d,v,I", 0, (int) M_DMUL_I, INSN_MACRO, 0, I3 }, 1630 {"dmulo", "d,v,t", 0, (int) M_DMULO, INSN_MACRO, 0, I3 }, 1631 {"dmulo", "d,v,I", 0, (int) M_DMULO_I, INSN_MACRO, 0, I3 }, 1632 {"dmulou", "d,v,t", 0, (int) M_DMULOU, INSN_MACRO, 0, I3 }, 1633 {"dmulou", "d,v,I", 0, (int) M_DMULOU_I, INSN_MACRO, 0, I3 }, 1634 {"dmult", "s,t", 0x0000001c, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I3 }, 1635 {"dmultu", "s,t", 0x0000001d, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I3 }, 1636 {"dneg", "d,w", 0x0000002e, 0xffe007ff, WR_d|RD_t, 0, I3 }, /* dsub 0 */ 1637 {"dnegu", "d,w", 0x0000002f, 0xffe007ff, WR_d|RD_t, 0, I3 }, /* dsubu 0*/ 1638 {"drem", "z,s,t", 0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I3 }, 1639 {"drem", "d,v,t", 3, (int) M_DREM_3, INSN_MACRO, 0, I3 }, 1640 {"drem", "d,v,I", 3, (int) M_DREM_3I, INSN_MACRO, 0, I3 }, 1641 {"dremu", "z,s,t", 0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I3 }, 1642 {"dremu", "d,v,t", 3, (int) M_DREMU_3, INSN_MACRO, 0, I3 }, 1643 {"dremu", "d,v,I", 3, (int) M_DREMU_3I, INSN_MACRO, 0, I3 }, 1644 {"dret", "", 0x7000003e, 0xffffffff, 0, 0, N5 }, 1645 {"drol", "d,v,t", 0, (int) M_DROL, INSN_MACRO, 0, I3 }, 1646 {"drol", "d,v,I", 0, (int) M_DROL_I, INSN_MACRO, 0, I3 }, 1647 {"dror", "d,v,t", 0, (int) M_DROR, INSN_MACRO, 0, I3 }, 1648 {"dror", "d,v,I", 0, (int) M_DROR_I, INSN_MACRO, 0, I3 }, 1649 {"dror", "d,w,<", 0x0020003a, 0xffe0003f, WR_d|RD_t, 0, N5|I65 }, 1650 {"drorv", "d,t,s", 0x00000056, 0xfc0007ff, RD_t|RD_s|WR_d, 0, N5|I65 }, 1651 {"dror32", "d,w,<", 0x0020003e, 0xffe0003f, WR_d|RD_t, 0, N5|I65 }, 1652 {"drotl", "d,v,t", 0, (int) M_DROL, INSN_MACRO, 0, I65 }, 1653 {"drotl", "d,v,I", 0, (int) M_DROL_I, INSN_MACRO, 0, I65 }, 1654 {"drotr", "d,v,t", 0, (int) M_DROR, INSN_MACRO, 0, I65 }, 1655 {"drotr", "d,v,I", 0, (int) M_DROR_I, INSN_MACRO, 0, I65 }, 1656 {"drotrv", "d,t,s", 0x00000056, 0xfc0007ff, RD_t|RD_s|WR_d, 0, I65 }, 1657 {"drotr32", "d,w,<", 0x0020003e, 0xffe0003f, WR_d|RD_t, 0, I65 }, 1658 {"dsbh", "d,w", 0x7c0000a4, 0xffe007ff, WR_d|RD_t, 0, I65 }, 1659 {"dshd", "d,w", 0x7c000164, 0xffe007ff, WR_d|RD_t, 0, I65 }, 1660 {"dsllv", "d,t,s", 0x00000014, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I3 }, 1661 {"dsll32", "d,w,<", 0x0000003c, 0xffe0003f, WR_d|RD_t, 0, I3 }, 1662 {"dsll", "d,w,s", 0x00000014, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I3 }, /* dsllv */ 1663 {"dsll", "d,w,>", 0x0000003c, 0xffe0003f, WR_d|RD_t, 0, I3 }, /* dsll32 */ 1664 {"dsll", "d,w,<", 0x00000038, 0xffe0003f, WR_d|RD_t, 0, I3 }, 1665 {"dsrav", "d,t,s", 0x00000017, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I3 }, 1666 {"dsra32", "d,w,<", 0x0000003f, 0xffe0003f, WR_d|RD_t, 0, I3 }, 1667 {"dsra", "d,w,s", 0x00000017, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I3 }, /* dsrav */ 1668 {"dsra", "d,w,>", 0x0000003f, 0xffe0003f, WR_d|RD_t, 0, I3 }, /* dsra32 */ 1669 {"dsra", "d,w,<", 0x0000003b, 0xffe0003f, WR_d|RD_t, 0, I3 }, 1670 {"dsrlv", "d,t,s", 0x00000016, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I3 }, 1671 {"dsrl32", "d,w,<", 0x0000003e, 0xffe0003f, WR_d|RD_t, 0, I3 }, 1672 {"dsrl", "d,w,s", 0x00000016, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I3 }, /* dsrlv */ 1673 {"dsrl", "d,w,>", 0x0000003e, 0xffe0003f, WR_d|RD_t, 0, I3 }, /* dsrl32 */ 1674 {"dsrl", "d,w,<", 0x0000003a, 0xffe0003f, WR_d|RD_t, 0, I3 }, 1675 {"dsub", "d,v,t", 0x0000002e, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I3 }, 1676 {"dsub", "d,v,I", 0, (int) M_DSUB_I, INSN_MACRO, 0, I3 }, 1677 {"dsubu", "d,v,t", 0x0000002f, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I3 }, 1678 {"dsubu", "d,v,I", 0, (int) M_DSUBU_I, INSN_MACRO, 0, I3 }, 1679 {"dvpe", "", 0x41600001, 0xffffffff, TRAP, 0, MT32 }, 1680 {"dvpe", "t", 0x41600001, 0xffe0ffff, TRAP|WR_t, 0, MT32 }, 1681 {"ei", "", 0x41606020, 0xffffffff, WR_t|WR_C0, 0, I33 }, 1682 {"ei", "t", 0x41606020, 0xffe0ffff, WR_t|WR_C0, 0, I33 }, 1683 {"emt", "", 0x41600be1, 0xffffffff, TRAP, 0, MT32 }, 1684 {"emt", "t", 0x41600be1, 0xffe0ffff, TRAP|WR_t, 0, MT32 }, 1685 {"eret", "", 0x42000018, 0xffffffff, 0, 0, I3|I32 }, 1686 {"evpe", "", 0x41600021, 0xffffffff, TRAP, 0, MT32 }, 1687 {"evpe", "t", 0x41600021, 0xffe0ffff, TRAP|WR_t, 0, MT32 }, 1688 {"ext", "t,r,+A,+C", 0x7c000000, 0xfc00003f, WR_t|RD_s, 0, I33 }, 1689 {"floor.l.d", "D,S", 0x4620000b, 0xffff003f, WR_D|RD_S|FP_D, 0, I3|I33 }, 1690 {"floor.l.s", "D,S", 0x4600000b, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I3|I33 }, 1691 {"floor.w.d", "D,S", 0x4620000f, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I2 }, 1692 {"floor.w.s", "D,S", 0x4600000f, 0xffff003f, WR_D|RD_S|FP_S, 0, I2 }, 1693 {"hibernate","", 0x42000023, 0xffffffff, 0, 0, V1 }, 1694 {"ins", "t,r,+A,+B", 0x7c000004, 0xfc00003f, WR_t|RD_s, 0, I33 }, 1695 {"jr", "s", 0x00000008, 0xfc1fffff, UBD|RD_s, 0, I1 }, 1696 /* jr.hb is officially MIPS{32,64}R2, but it works on R1 as jr with 1697 the same hazard barrier effect. */ 1698 {"jr.hb", "s", 0x00000408, 0xfc1fffff, UBD|RD_s, 0, I32 }, 1699 {"j", "s", 0x00000008, 0xfc1fffff, UBD|RD_s, 0, I1 }, /* jr */ 1700 /* SVR4 PIC code requires special handling for j, so it must be a 1701 macro. */ 1702 {"j", "a", 0, (int) M_J_A, INSN_MACRO, 0, I1 }, 1703 /* This form of j is used by the disassembler and internally by the 1704 assembler, but will never match user input (because the line above 1705 will match first). */ 1706 {"j", "a", 0x08000000, 0xfc000000, UBD, 0, I1 }, 1707 {"jalr", "s", 0x0000f809, 0xfc1fffff, UBD|RD_s|WR_d, 0, I1 }, 1708 {"jalr", "d,s", 0x00000009, 0xfc1f07ff, UBD|RD_s|WR_d, 0, I1 }, 1709 /* jalr.hb is officially MIPS{32,64}R2, but it works on R1 as jalr 1710 with the same hazard barrier effect. */ 1711 {"jalr.hb", "s", 0x0000fc09, 0xfc1fffff, UBD|RD_s|WR_d, 0, I32 }, 1712 {"jalr.hb", "d,s", 0x00000409, 0xfc1f07ff, UBD|RD_s|WR_d, 0, I32 }, 1713 /* SVR4 PIC code requires special handling for jal, so it must be a 1714 macro. */ 1715 {"jal", "d,s", 0, (int) M_JAL_2, INSN_MACRO, 0, I1 }, 1716 {"jal", "s", 0, (int) M_JAL_1, INSN_MACRO, 0, I1 }, 1717 {"jal", "a", 0, (int) M_JAL_A, INSN_MACRO, 0, I1 }, 1718 /* This form of jal is used by the disassembler and internally by the 1719 assembler, but will never match user input (because the line above 1720 will match first). */ 1721 {"jal", "a", 0x0c000000, 0xfc000000, UBD|WR_31, 0, I1 }, 1722 {"jalx", "a", 0x74000000, 0xfc000000, UBD|WR_31, 0, I16 }, 1723 {"la", "t,A(b)", 0, (int) M_LA_AB, INSN_MACRO, 0, I1 }, 1724 {"lb", "t,o(b)", 0x80000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, 1725 {"lb", "t,A(b)", 0, (int) M_LB_AB, INSN_MACRO, 0, I1 }, 1726 {"lbu", "t,o(b)", 0x90000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, 1727 {"lbu", "t,A(b)", 0, (int) M_LBU_AB, INSN_MACRO, 0, I1 }, 1728 {"lca", "t,A(b)", 0, (int) M_LCA_AB, INSN_MACRO, 0, I1 }, 1729 {"ld", "t,o(b)", 0xdc000000, 0xfc000000, WR_t|RD_b, 0, I3 }, 1730 {"ld", "t,o(b)", 0, (int) M_LD_OB, INSN_MACRO, 0, I1 }, 1731 {"ld", "t,A(b)", 0, (int) M_LD_AB, INSN_MACRO, 0, I1 }, 1732 {"ldc1", "T,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, 1733 {"ldc1", "E,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, 1734 {"ldc1", "T,A(b)", 0, (int) M_LDC1_AB, INSN_MACRO, 0, I2 }, 1735 {"ldc1", "E,A(b)", 0, (int) M_LDC1_AB, INSN_MACRO, 0, I2 }, 1736 {"l.d", "T,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, /* ldc1 */ 1737 {"l.d", "T,o(b)", 0, (int) M_L_DOB, INSN_MACRO, 0, I1 }, 1738 {"l.d", "T,A(b)", 0, (int) M_L_DAB, INSN_MACRO, 0, I1 }, 1739 {"ldc2", "E,o(b)", 0xd8000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I2 }, 1740 {"ldc2", "E,A(b)", 0, (int) M_LDC2_AB, INSN_MACRO, 0, I2 }, 1741 {"ldc3", "E,o(b)", 0xdc000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I2 }, 1742 {"ldc3", "E,A(b)", 0, (int) M_LDC3_AB, INSN_MACRO, 0, I2 }, 1743 {"ldl", "t,o(b)", 0x68000000, 0xfc000000, LDD|WR_t|RD_b, 0, I3 }, 1744 {"ldl", "t,A(b)", 0, (int) M_LDL_AB, INSN_MACRO, 0, I3 }, 1745 {"ldr", "t,o(b)", 0x6c000000, 0xfc000000, LDD|WR_t|RD_b, 0, I3 }, 1746 {"ldr", "t,A(b)", 0, (int) M_LDR_AB, INSN_MACRO, 0, I3 }, 1747 {"ldxc1", "D,t(b)", 0x4c000001, 0xfc00f83f, LDD|WR_D|RD_t|RD_b|FP_D, 0, I4|I33 }, 1748 {"lh", "t,o(b)", 0x84000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, 1749 {"lh", "t,A(b)", 0, (int) M_LH_AB, INSN_MACRO, 0, I1 }, 1750 {"lhu", "t,o(b)", 0x94000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, 1751 {"lhu", "t,A(b)", 0, (int) M_LHU_AB, INSN_MACRO, 0, I1 }, 1752 /* li is at the start of the table. */ 1753 {"li.d", "t,F", 0, (int) M_LI_D, INSN_MACRO, 0, I1 }, 1754 {"li.d", "T,L", 0, (int) M_LI_DD, INSN_MACRO, 0, I1 }, 1755 {"li.s", "t,f", 0, (int) M_LI_S, INSN_MACRO, 0, I1 }, 1756 {"li.s", "T,l", 0, (int) M_LI_SS, INSN_MACRO, 0, I1 }, 1757 {"ll", "t,o(b)", 0xc0000000, 0xfc000000, LDD|RD_b|WR_t, 0, I2 }, 1758 {"ll", "t,A(b)", 0, (int) M_LL_AB, INSN_MACRO, 0, I2 }, 1759 {"lld", "t,o(b)", 0xd0000000, 0xfc000000, LDD|RD_b|WR_t, 0, I3 }, 1760 {"lld", "t,A(b)", 0, (int) M_LLD_AB, INSN_MACRO, 0, I3 }, 1761 {"lui", "t,u", 0x3c000000, 0xffe00000, WR_t, 0, I1 }, 1762 {"luxc1", "D,t(b)", 0x4c000005, 0xfc00f83f, LDD|WR_D|RD_t|RD_b|FP_D, 0, I5|I33|N55}, 1763 {"lw", "t,o(b)", 0x8c000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, 1764 {"lw", "t,A(b)", 0, (int) M_LW_AB, INSN_MACRO, 0, I1 }, 1765 {"lwc0", "E,o(b)", 0xc0000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I1 }, 1766 {"lwc0", "E,A(b)", 0, (int) M_LWC0_AB, INSN_MACRO, 0, I1 }, 1767 {"lwc1", "T,o(b)", 0xc4000000, 0xfc000000, CLD|RD_b|WR_T|FP_S, 0, I1 }, 1768 {"lwc1", "E,o(b)", 0xc4000000, 0xfc000000, CLD|RD_b|WR_T|FP_S, 0, I1 }, 1769 {"lwc1", "T,A(b)", 0, (int) M_LWC1_AB, INSN_MACRO, 0, I1 }, 1770 {"lwc1", "E,A(b)", 0, (int) M_LWC1_AB, INSN_MACRO, 0, I1 }, 1771 {"l.s", "T,o(b)", 0xc4000000, 0xfc000000, CLD|RD_b|WR_T|FP_S, 0, I1 }, /* lwc1 */ 1772 {"l.s", "T,A(b)", 0, (int) M_LWC1_AB, INSN_MACRO, 0, I1 }, 1773 {"lwc2", "E,o(b)", 0xc8000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I1 }, 1774 {"lwc2", "E,A(b)", 0, (int) M_LWC2_AB, INSN_MACRO, 0, I1 }, 1775 {"lwc3", "E,o(b)", 0xcc000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I1 }, 1776 {"lwc3", "E,A(b)", 0, (int) M_LWC3_AB, INSN_MACRO, 0, I1 }, 1777 {"lwl", "t,o(b)", 0x88000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, 1778 {"lwl", "t,A(b)", 0, (int) M_LWL_AB, INSN_MACRO, 0, I1 }, 1779 {"lcache", "t,o(b)", 0x88000000, 0xfc000000, LDD|RD_b|WR_t, 0, I2 }, /* same */ 1780 {"lcache", "t,A(b)", 0, (int) M_LWL_AB, INSN_MACRO, 0, I2 }, /* as lwl */ 1781 {"lwr", "t,o(b)", 0x98000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, 1782 {"lwr", "t,A(b)", 0, (int) M_LWR_AB, INSN_MACRO, 0, I1 }, 1783 {"flush", "t,o(b)", 0x98000000, 0xfc000000, LDD|RD_b|WR_t, 0, I2 }, /* same */ 1784 {"flush", "t,A(b)", 0, (int) M_LWR_AB, INSN_MACRO, 0, I2 }, /* as lwr */ 1785 {"fork", "d,s,t", 0x7c000008, 0xfc0007ff, TRAP|WR_d|RD_s|RD_t, 0, MT32 }, 1786 {"lwu", "t,o(b)", 0x9c000000, 0xfc000000, LDD|RD_b|WR_t, 0, I3 }, 1787 {"lwu", "t,A(b)", 0, (int) M_LWU_AB, INSN_MACRO, 0, I3 }, 1788 {"lwxc1", "D,t(b)", 0x4c000000, 0xfc00f83f, LDD|WR_D|RD_t|RD_b|FP_D, 0, I4|I33 }, 1789 {"lwxs", "d,t(b)", 0x70000088, 0xfc0007ff, LDD|RD_b|RD_t|WR_d, 0, SMT }, 1790 {"macc", "d,s,t", 0x00000028, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N412 }, 1791 {"macc", "d,s,t", 0x00000158, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1792 {"maccs", "d,s,t", 0x00000428, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N412 }, 1793 {"macchi", "d,s,t", 0x00000228, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N412 }, 1794 {"macchi", "d,s,t", 0x00000358, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1795 {"macchis", "d,s,t", 0x00000628, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N412 }, 1796 {"macchiu", "d,s,t", 0x00000268, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N412 }, 1797 {"macchiu", "d,s,t", 0x00000359, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1798 {"macchius","d,s,t", 0x00000668, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N412 }, 1799 {"maccu", "d,s,t", 0x00000068, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N412 }, 1800 {"maccu", "d,s,t", 0x00000159, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1801 {"maccus", "d,s,t", 0x00000468, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N412 }, 1802 {"mad", "s,t", 0x70000000, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, P3 }, 1803 {"madu", "s,t", 0x70000001, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, P3 }, 1804 {"madd.d", "D,R,S,T", 0x4c000021, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I4|I33 }, 1805 {"madd.s", "D,R,S,T", 0x4c000020, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0, I4|I33 }, 1806 {"madd.ps", "D,R,S,T", 0x4c000026, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I5|I33 }, 1807 {"madd", "s,t", 0x0000001c, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, L1 }, 1808 {"madd", "s,t", 0x70000000, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, I32|N55 }, 1809 {"madd", "s,t", 0x70000000, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, G1 }, 1810 {"madd", "7,s,t", 0x70000000, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 1811 {"madd", "d,s,t", 0x70000000, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, 0, G1 }, 1812 {"maddp", "s,t", 0x70000441, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, SMT }, 1813 {"maddu", "s,t", 0x0000001d, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, L1 }, 1814 {"maddu", "s,t", 0x70000001, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, I32|N55 }, 1815 {"maddu", "s,t", 0x70000001, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, G1 }, 1816 {"maddu", "7,s,t", 0x70000001, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 1817 {"maddu", "d,s,t", 0x70000001, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, 0, G1 }, 1818 {"madd16", "s,t", 0x00000028, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, N411 }, 1819 {"max.ob", "X,Y,Q", 0x78000007, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1820 {"max.ob", "D,S,T", 0x4ac00007, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1821 {"max.ob", "D,S,T[e]", 0x48000007, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 1822 {"max.ob", "D,S,k", 0x4bc00007, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1823 {"max.qh", "X,Y,Q", 0x78200007, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 1824 {"mfpc", "t,P", 0x4000c801, 0xffe0ffc1, LCD|WR_t|RD_C0, 0, M1|N5 }, 1825 {"mfps", "t,P", 0x4000c800, 0xffe0ffc1, LCD|WR_t|RD_C0, 0, M1|N5 }, 1826 {"mftacx", "d", 0x41020021, 0xffff07ff, TRAP|WR_d|RD_a, 0, MT32 }, 1827 {"mftacx", "d,*", 0x41020021, 0xfff307ff, TRAP|WR_d|RD_a, 0, MT32 }, 1828 {"mftc0", "d,+t", 0x41000000, 0xffe007ff, TRAP|LCD|WR_d|RD_C0, 0, MT32 }, 1829 {"mftc0", "d,+T", 0x41000000, 0xffe007f8, TRAP|LCD|WR_d|RD_C0, 0, MT32 }, 1830 {"mftc0", "d,E,H", 0x41000000, 0xffe007f8, TRAP|LCD|WR_d|RD_C0, 0, MT32 }, 1831 {"mftc1", "d,T", 0x41000022, 0xffe007ff, TRAP|LCD|WR_d|RD_T|FP_S, 0, MT32 }, 1832 {"mftc1", "d,E", 0x41000022, 0xffe007ff, TRAP|LCD|WR_d|RD_T|FP_S, 0, MT32 }, 1833 {"mftc2", "d,E", 0x41000024, 0xffe007ff, TRAP|LCD|WR_d|RD_C2, 0, MT32 }, 1834 {"mftdsp", "d", 0x41100021, 0xffff07ff, TRAP|WR_d, 0, MT32 }, 1835 {"mftgpr", "d,t", 0x41000020, 0xffe007ff, TRAP|WR_d|RD_t, 0, MT32 }, 1836 {"mfthc1", "d,T", 0x41000032, 0xffe007ff, TRAP|LCD|WR_d|RD_T|FP_D, 0, MT32 }, 1837 {"mfthc1", "d,E", 0x41000032, 0xffe007ff, TRAP|LCD|WR_d|RD_T|FP_D, 0, MT32 }, 1838 {"mfthc2", "d,E", 0x41000034, 0xffe007ff, TRAP|LCD|WR_d|RD_C2, 0, MT32 }, 1839 {"mfthi", "d", 0x41010021, 0xffff07ff, TRAP|WR_d|RD_a, 0, MT32 }, 1840 {"mfthi", "d,*", 0x41010021, 0xfff307ff, TRAP|WR_d|RD_a, 0, MT32 }, 1841 {"mftlo", "d", 0x41000021, 0xffff07ff, TRAP|WR_d|RD_a, 0, MT32 }, 1842 {"mftlo", "d,*", 0x41000021, 0xfff307ff, TRAP|WR_d|RD_a, 0, MT32 }, 1843 {"mftr", "d,t,!,H,$", 0x41000000, 0xffe007c8, TRAP|WR_d, 0, MT32 }, 1844 {"mfc0", "t,G", 0x40000000, 0xffe007ff, LCD|WR_t|RD_C0, 0, I1 }, 1845 {"mfc0", "t,+D", 0x40000000, 0xffe007f8, LCD|WR_t|RD_C0, 0, I32 }, 1846 {"mfc0", "t,G,H", 0x40000000, 0xffe007f8, LCD|WR_t|RD_C0, 0, I32 }, 1847 {"mfc1", "t,S", 0x44000000, 0xffe007ff, LCD|WR_t|RD_S|FP_S, 0, I1 }, 1848 {"mfc1", "t,G", 0x44000000, 0xffe007ff, LCD|WR_t|RD_S|FP_S, 0, I1 }, 1849 {"mfhc1", "t,S", 0x44600000, 0xffe007ff, LCD|WR_t|RD_S|FP_D, 0, I33 }, 1850 {"mfhc1", "t,G", 0x44600000, 0xffe007ff, LCD|WR_t|RD_S|FP_D, 0, I33 }, 1851 /* mfc2 is at the bottom of the table. */ 1852 /* mfhc2 is at the bottom of the table. */ 1853 /* mfc3 is at the bottom of the table. */ 1854 {"mfdr", "t,G", 0x7000003d, 0xffe007ff, LCD|WR_t|RD_C0, 0, N5 }, 1855 {"mfhi", "d", 0x00000010, 0xffff07ff, WR_d|RD_HI, 0, I1 }, 1856 {"mfhi", "d,9", 0x00000010, 0xff9f07ff, WR_d|RD_HI, 0, D32 }, 1857 {"mflo", "d", 0x00000012, 0xffff07ff, WR_d|RD_LO, 0, I1 }, 1858 {"mflo", "d,9", 0x00000012, 0xff9f07ff, WR_d|RD_LO, 0, D32 }, 1859 {"mflhxu", "d", 0x00000052, 0xffff07ff, WR_d|MOD_HILO, 0, SMT }, 1860 {"min.ob", "X,Y,Q", 0x78000006, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1861 {"min.ob", "D,S,T", 0x4ac00006, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1862 {"min.ob", "D,S,T[e]", 0x48000006, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 1863 {"min.ob", "D,S,k", 0x4bc00006, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1864 {"min.qh", "X,Y,Q", 0x78200006, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 1865 {"mov.d", "D,S", 0x46200006, 0xffff003f, WR_D|RD_S|FP_D, 0, I1 }, 1866 {"mov.s", "D,S", 0x46000006, 0xffff003f, WR_D|RD_S|FP_S, 0, I1 }, 1867 {"mov.ps", "D,S", 0x46c00006, 0xffff003f, WR_D|RD_S|FP_D, 0, I5|I33 }, 1868 {"movf", "d,s,N", 0x00000001, 0xfc0307ff, WR_d|RD_s|RD_CC|FP_S|FP_D, 0, I4|I32 }, 1869 {"movf.d", "D,S,N", 0x46200011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, I4|I32 }, 1870 {"movf.l", "D,S,N", 0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, MX|SB1 }, 1871 {"movf.l", "X,Y,N", 0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, MX|SB1 }, 1872 {"movf.s", "D,S,N", 0x46000011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S, 0, I4|I32 }, 1873 {"movf.ps", "D,S,N", 0x46c00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, I5|I33 }, 1874 {"movn", "d,v,t", 0x0000000b, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I4|I32 }, 1875 {"ffc", "d,v", 0x0000000b, 0xfc1f07ff, WR_d|RD_s, 0, L1 }, 1876 {"movn.d", "D,S,t", 0x46200013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, I4|I32 }, 1877 {"movn.l", "D,S,t", 0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, MX|SB1 }, 1878 {"movn.l", "X,Y,t", 0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, MX|SB1 }, 1879 {"movn.s", "D,S,t", 0x46000013, 0xffe0003f, WR_D|RD_S|RD_t|FP_S, 0, I4|I32 }, 1880 {"movn.ps", "D,S,t", 0x46c00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, I5|I33 }, 1881 {"movt", "d,s,N", 0x00010001, 0xfc0307ff, WR_d|RD_s|RD_CC|FP_S|FP_D, 0, I4|I32 }, 1882 {"movt.d", "D,S,N", 0x46210011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, I4|I32 }, 1883 {"movt.l", "D,S,N", 0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, MX|SB1 }, 1884 {"movt.l", "X,Y,N", 0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, MX|SB1 }, 1885 {"movt.s", "D,S,N", 0x46010011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S, 0, I4|I32 }, 1886 {"movt.ps", "D,S,N", 0x46c10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, I5|I33 }, 1887 {"movz", "d,v,t", 0x0000000a, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I4|I32 }, 1888 {"ffs", "d,v", 0x0000000a, 0xfc1f07ff, WR_d|RD_s, 0, L1 }, 1889 {"movz.d", "D,S,t", 0x46200012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, I4|I32 }, 1890 {"movz.l", "D,S,t", 0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, MX|SB1 }, 1891 {"movz.l", "X,Y,t", 0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, MX|SB1 }, 1892 {"movz.s", "D,S,t", 0x46000012, 0xffe0003f, WR_D|RD_S|RD_t|FP_S, 0, I4|I32 }, 1893 {"movz.ps", "D,S,t", 0x46c00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, I5|I33 }, 1894 {"msac", "d,s,t", 0x000001d8, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1895 {"msacu", "d,s,t", 0x000001d9, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1896 {"msachi", "d,s,t", 0x000003d8, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1897 {"msachiu", "d,s,t", 0x000003d9, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1898 /* move is at the top of the table. */ 1899 {"msgn.qh", "X,Y,Q", 0x78200000, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 1900 {"msub.d", "D,R,S,T", 0x4c000029, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I4|I33 }, 1901 {"msub.s", "D,R,S,T", 0x4c000028, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0, I4|I33 }, 1902 {"msub.ps", "D,R,S,T", 0x4c00002e, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I5|I33 }, 1903 {"msub", "s,t", 0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, L1 }, 1904 {"msub", "s,t", 0x70000004, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, I32|N55 }, 1905 {"msub", "7,s,t", 0x70000004, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 1906 {"msubu", "s,t", 0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, L1 }, 1907 {"msubu", "s,t", 0x70000005, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, I32|N55 }, 1908 {"msubu", "7,s,t", 0x70000005, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 1909 {"mtpc", "t,P", 0x4080c801, 0xffe0ffc1, COD|RD_t|WR_C0, 0, M1|N5 }, 1910 {"mtps", "t,P", 0x4080c800, 0xffe0ffc1, COD|RD_t|WR_C0, 0, M1|N5 }, 1911 {"mtc0", "t,G", 0x40800000, 0xffe007ff, COD|RD_t|WR_C0|WR_CC, 0, I1 }, 1912 {"mtc0", "t,+D", 0x40800000, 0xffe007f8, COD|RD_t|WR_C0|WR_CC, 0, I32 }, 1913 {"mtc0", "t,G,H", 0x40800000, 0xffe007f8, COD|RD_t|WR_C0|WR_CC, 0, I32 }, 1914 {"mtc1", "t,S", 0x44800000, 0xffe007ff, COD|RD_t|WR_S|FP_S, 0, I1 }, 1915 {"mtc1", "t,G", 0x44800000, 0xffe007ff, COD|RD_t|WR_S|FP_S, 0, I1 }, 1916 {"mthc1", "t,S", 0x44e00000, 0xffe007ff, COD|RD_t|WR_S|FP_D, 0, I33 }, 1917 {"mthc1", "t,G", 0x44e00000, 0xffe007ff, COD|RD_t|WR_S|FP_D, 0, I33 }, 1918 /* mtc2 is at the bottom of the table. */ 1919 /* mthc2 is at the bottom of the table. */ 1920 /* mtc3 is at the bottom of the table. */ 1921 {"mtdr", "t,G", 0x7080003d, 0xffe007ff, COD|RD_t|WR_C0, 0, N5 }, 1922 {"mthi", "s", 0x00000011, 0xfc1fffff, RD_s|WR_HI, 0, I1 }, 1923 {"mthi", "s,7", 0x00000011, 0xfc1fe7ff, RD_s|WR_HI, 0, D32 }, 1924 {"mtlo", "s", 0x00000013, 0xfc1fffff, RD_s|WR_LO, 0, I1 }, 1925 {"mtlo", "s,7", 0x00000013, 0xfc1fe7ff, RD_s|WR_LO, 0, D32 }, 1926 {"mtlhx", "s", 0x00000053, 0xfc1fffff, RD_s|MOD_HILO, 0, SMT }, 1927 {"mttc0", "t,G", 0x41800000, 0xffe007ff, TRAP|COD|RD_t|WR_C0|WR_CC, 0, MT32 }, 1928 {"mttc0", "t,+D", 0x41800000, 0xffe007f8, TRAP|COD|RD_t|WR_C0|WR_CC, 0, MT32 }, 1929 {"mttc0", "t,G,H", 0x41800000, 0xffe007f8, TRAP|COD|RD_t|WR_C0|WR_CC, 0, MT32 }, 1930 {"mttc1", "t,S", 0x41800022, 0xffe007ff, TRAP|COD|RD_t|WR_S|FP_S, 0, MT32 }, 1931 {"mttc1", "t,G", 0x41800022, 0xffe007ff, TRAP|COD|RD_t|WR_S|FP_S, 0, MT32 }, 1932 {"mttc2", "t,g", 0x41800024, 0xffe007ff, TRAP|COD|RD_t|WR_C2|WR_CC, 0, MT32 }, 1933 {"mttacx", "t", 0x41801021, 0xffe0ffff, TRAP|WR_a|RD_t, 0, MT32 }, 1934 {"mttacx", "t,&", 0x41801021, 0xffe09fff, TRAP|WR_a|RD_t, 0, MT32 }, 1935 {"mttdsp", "t", 0x41808021, 0xffe0ffff, TRAP|RD_t, 0, MT32 }, 1936 {"mttgpr", "t,d", 0x41800020, 0xffe007ff, TRAP|WR_d|RD_t, 0, MT32 }, 1937 {"mtthc1", "t,S", 0x41800032, 0xffe007ff, TRAP|COD|RD_t|WR_S|FP_D, 0, MT32 }, 1938 {"mtthc1", "t,G", 0x41800032, 0xffe007ff, TRAP|COD|RD_t|WR_S|FP_D, 0, MT32 }, 1939 {"mtthc2", "t,g", 0x41800034, 0xffe007ff, TRAP|COD|RD_t|WR_C2|WR_CC, 0, MT32 }, 1940 {"mtthi", "t", 0x41800821, 0xffe0ffff, TRAP|WR_a|RD_t, 0, MT32 }, 1941 {"mtthi", "t,&", 0x41800821, 0xffe09fff, TRAP|WR_a|RD_t, 0, MT32 }, 1942 {"mttlo", "t", 0x41800021, 0xffe0ffff, TRAP|WR_a|RD_t, 0, MT32 }, 1943 {"mttlo", "t,&", 0x41800021, 0xffe09fff, TRAP|WR_a|RD_t, 0, MT32 }, 1944 {"mttr", "t,d,!,H,$", 0x41800000, 0xffe007c8, TRAP|RD_t, 0, MT32 }, 1945 {"mul.d", "D,V,T", 0x46200002, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I1 }, 1946 {"mul.s", "D,V,T", 0x46000002, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, 0, I1 }, 1947 {"mul.ob", "X,Y,Q", 0x78000030, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 1948 {"mul.ob", "D,S,T", 0x4ac00030, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1949 {"mul.ob", "D,S,T[e]", 0x48000030, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 1950 {"mul.ob", "D,S,k", 0x4bc00030, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 1951 {"mul.ps", "D,V,T", 0x46c00002, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I5|I33 }, 1952 {"mul.qh", "X,Y,Q", 0x78200030, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 1953 {"mul", "d,v,t", 0x70000002, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, I32|P3|N55}, 1954 {"mul", "d,s,t", 0x00000058, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N54 }, 1955 {"mul", "d,v,t", 0, (int) M_MUL, INSN_MACRO, 0, I1 }, 1956 {"mul", "d,v,I", 0, (int) M_MUL_I, INSN_MACRO, 0, I1 }, 1957 {"mula.ob", "Y,Q", 0x78000033, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 1958 {"mula.ob", "S,T", 0x4ac00033, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1959 {"mula.ob", "S,T[e]", 0x48000033, 0xfe2007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1960 {"mula.ob", "S,k", 0x4bc00033, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1961 {"mula.qh", "Y,Q", 0x78200033, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 1962 {"mulhi", "d,s,t", 0x00000258, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1963 {"mulhiu", "d,s,t", 0x00000259, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1964 {"mull.ob", "Y,Q", 0x78000433, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 1965 {"mull.ob", "S,T", 0x4ac00433, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1966 {"mull.ob", "S,T[e]", 0x48000433, 0xfe2007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1967 {"mull.ob", "S,k", 0x4bc00433, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1968 {"mull.qh", "Y,Q", 0x78200433, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 1969 {"mulo", "d,v,t", 0, (int) M_MULO, INSN_MACRO, 0, I1 }, 1970 {"mulo", "d,v,I", 0, (int) M_MULO_I, INSN_MACRO, 0, I1 }, 1971 {"mulou", "d,v,t", 0, (int) M_MULOU, INSN_MACRO, 0, I1 }, 1972 {"mulou", "d,v,I", 0, (int) M_MULOU_I, INSN_MACRO, 0, I1 }, 1973 {"mulr.ps", "D,S,T", 0x46c0001a, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, M3D }, 1974 {"muls", "d,s,t", 0x000000d8, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1975 {"mulsu", "d,s,t", 0x000000d9, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1976 {"mulshi", "d,s,t", 0x000002d8, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1977 {"mulshiu", "d,s,t", 0x000002d9, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1978 {"muls.ob", "Y,Q", 0x78000032, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 1979 {"muls.ob", "S,T", 0x4ac00032, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1980 {"muls.ob", "S,T[e]", 0x48000032, 0xfe2007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1981 {"muls.ob", "S,k", 0x4bc00032, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1982 {"muls.qh", "Y,Q", 0x78200032, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 1983 {"mulsl.ob", "Y,Q", 0x78000432, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 1984 {"mulsl.ob", "S,T", 0x4ac00432, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1985 {"mulsl.ob", "S,T[e]", 0x48000432, 0xfe2007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1986 {"mulsl.ob", "S,k", 0x4bc00432, 0xffe007ff, WR_CC|RD_S|RD_T, 0, N54 }, 1987 {"mulsl.qh", "Y,Q", 0x78200432, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 1988 {"mult", "s,t", 0x00000018, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, I1 }, 1989 {"mult", "7,s,t", 0x00000018, 0xfc00e7ff, WR_a|RD_s|RD_t, 0, D33 }, 1990 {"mult", "d,s,t", 0x00000018, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, 0, G1 }, 1991 {"multp", "s,t", 0x00000459, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, SMT }, 1992 {"multu", "s,t", 0x00000019, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, I1 }, 1993 {"multu", "7,s,t", 0x00000019, 0xfc00e7ff, WR_a|RD_s|RD_t, 0, D33 }, 1994 {"multu", "d,s,t", 0x00000019, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, 0, G1 }, 1995 {"mulu", "d,s,t", 0x00000059, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d, 0, N5 }, 1996 {"neg", "d,w", 0x00000022, 0xffe007ff, WR_d|RD_t, 0, I1 }, /* sub 0 */ 1997 {"negu", "d,w", 0x00000023, 0xffe007ff, WR_d|RD_t, 0, I1 }, /* subu 0 */ 1998 {"neg.d", "D,V", 0x46200007, 0xffff003f, WR_D|RD_S|FP_D, 0, I1 }, 1999 {"neg.s", "D,V", 0x46000007, 0xffff003f, WR_D|RD_S|FP_S, 0, I1 }, 2000 {"neg.ps", "D,V", 0x46c00007, 0xffff003f, WR_D|RD_S|FP_D, 0, I5|I33 }, 2001 {"nmadd.d", "D,R,S,T", 0x4c000031, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I4|I33 }, 2002 {"nmadd.s", "D,R,S,T", 0x4c000030, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0, I4|I33 }, 2003 {"nmadd.ps","D,R,S,T", 0x4c000036, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I5|I33 }, 2004 {"nmsub.d", "D,R,S,T", 0x4c000039, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I4|I33 }, 2005 {"nmsub.s", "D,R,S,T", 0x4c000038, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0, I4|I33 }, 2006 {"nmsub.ps","D,R,S,T", 0x4c00003e, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I5|I33 }, 2007 /* nop is at the start of the table. */ 2008 {"nor", "d,v,t", 0x00000027, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 2009 {"nor", "t,r,I", 0, (int) M_NOR_I, INSN_MACRO, 0, I1 }, 2010 {"nor.ob", "X,Y,Q", 0x7800000f, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2011 {"nor.ob", "D,S,T", 0x4ac0000f, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2012 {"nor.ob", "D,S,T[e]", 0x4800000f, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 2013 {"nor.ob", "D,S,k", 0x4bc0000f, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2014 {"nor.qh", "X,Y,Q", 0x7820000f, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2015 {"not", "d,v", 0x00000027, 0xfc1f07ff, WR_d|RD_s|RD_t, 0, I1 },/*nor d,s,0*/ 2016 {"or", "d,v,t", 0x00000025, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 2017 {"or", "t,r,I", 0, (int) M_OR_I, INSN_MACRO, 0, I1 }, 2018 {"or.ob", "X,Y,Q", 0x7800000e, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2019 {"or.ob", "D,S,T", 0x4ac0000e, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2020 {"or.ob", "D,S,T[e]", 0x4800000e, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 2021 {"or.ob", "D,S,k", 0x4bc0000e, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2022 {"or.qh", "X,Y,Q", 0x7820000e, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2023 {"ori", "t,r,i", 0x34000000, 0xfc000000, WR_t|RD_s, 0, I1 }, 2024 {"pabsdiff.ob", "X,Y,Q",0x78000009, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, SB1 }, 2025 {"pabsdiffc.ob", "Y,Q", 0x78000035, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, SB1 }, 2026 {"pavg.ob", "X,Y,Q", 0x78000008, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, SB1 }, 2027 {"pickf.ob", "X,Y,Q", 0x78000002, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2028 {"pickf.ob", "D,S,T", 0x4ac00002, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2029 {"pickf.ob", "D,S,T[e]",0x48000002, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 2030 {"pickf.ob", "D,S,k", 0x4bc00002, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2031 {"pickf.qh", "X,Y,Q", 0x78200002, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2032 {"pickt.ob", "X,Y,Q", 0x78000003, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2033 {"pickt.ob", "D,S,T", 0x4ac00003, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2034 {"pickt.ob", "D,S,T[e]",0x48000003, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 2035 {"pickt.ob", "D,S,k", 0x4bc00003, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2036 {"pickt.qh", "X,Y,Q", 0x78200003, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2037 {"pll.ps", "D,V,T", 0x46c0002c, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I5|I33 }, 2038 {"plu.ps", "D,V,T", 0x46c0002d, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I5|I33 }, 2039 /* pref and prefx are at the start of the table. */ 2040 {"pul.ps", "D,V,T", 0x46c0002e, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I5|I33 }, 2041 {"puu.ps", "D,V,T", 0x46c0002f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I5|I33 }, 2042 {"pperm", "s,t", 0x70000481, 0xfc00ffff, MOD_HILO|RD_s|RD_t, 0, SMT }, 2043 {"rach.ob", "X", 0x7a00003f, 0xfffff83f, WR_D|FP_D, RD_MACC, MX|SB1 }, 2044 {"rach.ob", "D", 0x4a00003f, 0xfffff83f, WR_D, 0, N54 }, 2045 {"rach.qh", "X", 0x7a20003f, 0xfffff83f, WR_D|FP_D, RD_MACC, MX }, 2046 {"racl.ob", "X", 0x7800003f, 0xfffff83f, WR_D|FP_D, RD_MACC, MX|SB1 }, 2047 {"racl.ob", "D", 0x4800003f, 0xfffff83f, WR_D, 0, N54 }, 2048 {"racl.qh", "X", 0x7820003f, 0xfffff83f, WR_D|FP_D, RD_MACC, MX }, 2049 {"racm.ob", "X", 0x7900003f, 0xfffff83f, WR_D|FP_D, RD_MACC, MX|SB1 }, 2050 {"racm.ob", "D", 0x4900003f, 0xfffff83f, WR_D, 0, N54 }, 2051 {"racm.qh", "X", 0x7920003f, 0xfffff83f, WR_D|FP_D, RD_MACC, MX }, 2052 {"recip.d", "D,S", 0x46200015, 0xffff003f, WR_D|RD_S|FP_D, 0, I4|I33 }, 2053 {"recip.ps","D,S", 0x46c00015, 0xffff003f, WR_D|RD_S|FP_D, 0, SB1 }, 2054 {"recip.s", "D,S", 0x46000015, 0xffff003f, WR_D|RD_S|FP_S, 0, I4|I33 }, 2055 {"recip1.d", "D,S", 0x4620001d, 0xffff003f, WR_D|RD_S|FP_D, 0, M3D }, 2056 {"recip1.ps", "D,S", 0x46c0001d, 0xffff003f, WR_D|RD_S|FP_S, 0, M3D }, 2057 {"recip1.s", "D,S", 0x4600001d, 0xffff003f, WR_D|RD_S|FP_S, 0, M3D }, 2058 {"recip2.d", "D,S,T", 0x4620001c, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, M3D }, 2059 {"recip2.ps", "D,S,T", 0x46c0001c, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, 0, M3D }, 2060 {"recip2.s", "D,S,T", 0x4600001c, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, 0, M3D }, 2061 {"rem", "z,s,t", 0x0000001a, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I1 }, 2062 {"rem", "d,v,t", 0, (int) M_REM_3, INSN_MACRO, 0, I1 }, 2063 {"rem", "d,v,I", 0, (int) M_REM_3I, INSN_MACRO, 0, I1 }, 2064 {"remu", "z,s,t", 0x0000001b, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, I1 }, 2065 {"remu", "d,v,t", 0, (int) M_REMU_3, INSN_MACRO, 0, I1 }, 2066 {"remu", "d,v,I", 0, (int) M_REMU_3I, INSN_MACRO, 0, I1 }, 2067 {"rdhwr", "t,K", 0x7c00003b, 0xffe007ff, WR_t, 0, I33 }, 2068 {"rdpgpr", "d,w", 0x41400000, 0xffe007ff, WR_d, 0, I33 }, 2069 {"rfe", "", 0x42000010, 0xffffffff, 0, 0, I1|T3 }, 2070 {"rnas.qh", "X,Q", 0x78200025, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX }, 2071 {"rnau.ob", "X,Q", 0x78000021, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX|SB1 }, 2072 {"rnau.qh", "X,Q", 0x78200021, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX }, 2073 {"rnes.qh", "X,Q", 0x78200026, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX }, 2074 {"rneu.ob", "X,Q", 0x78000022, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX|SB1 }, 2075 {"rneu.qh", "X,Q", 0x78200022, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX }, 2076 {"rol", "d,v,t", 0, (int) M_ROL, INSN_MACRO, 0, I1 }, 2077 {"rol", "d,v,I", 0, (int) M_ROL_I, INSN_MACRO, 0, I1 }, 2078 {"ror", "d,v,t", 0, (int) M_ROR, INSN_MACRO, 0, I1 }, 2079 {"ror", "d,v,I", 0, (int) M_ROR_I, INSN_MACRO, 0, I1 }, 2080 {"ror", "d,w,<", 0x00200002, 0xffe0003f, WR_d|RD_t, 0, N5|I33|SMT }, 2081 {"rorv", "d,t,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, 0, N5|I33|SMT }, 2082 {"rotl", "d,v,t", 0, (int) M_ROL, INSN_MACRO, 0, I33|SMT }, 2083 {"rotl", "d,v,I", 0, (int) M_ROL_I, INSN_MACRO, 0, I33|SMT }, 2084 {"rotr", "d,v,t", 0, (int) M_ROR, INSN_MACRO, 0, I33|SMT }, 2085 {"rotr", "d,v,I", 0, (int) M_ROR_I, INSN_MACRO, 0, I33|SMT }, 2086 {"rotrv", "d,t,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, 0, I33|SMT }, 2087 {"round.l.d", "D,S", 0x46200008, 0xffff003f, WR_D|RD_S|FP_D, 0, I3|I33 }, 2088 {"round.l.s", "D,S", 0x46000008, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I3|I33 }, 2089 {"round.w.d", "D,S", 0x4620000c, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I2 }, 2090 {"round.w.s", "D,S", 0x4600000c, 0xffff003f, WR_D|RD_S|FP_S, 0, I2 }, 2091 {"rsqrt.d", "D,S", 0x46200016, 0xffff003f, WR_D|RD_S|FP_D, 0, I4|I33 }, 2092 {"rsqrt.ps","D,S", 0x46c00016, 0xffff003f, WR_D|RD_S|FP_D, 0, SB1 }, 2093 {"rsqrt.s", "D,S", 0x46000016, 0xffff003f, WR_D|RD_S|FP_S, 0, I4|I33 }, 2094 {"rsqrt1.d", "D,S", 0x4620001e, 0xffff003f, WR_D|RD_S|FP_D, 0, M3D }, 2095 {"rsqrt1.ps", "D,S", 0x46c0001e, 0xffff003f, WR_D|RD_S|FP_S, 0, M3D }, 2096 {"rsqrt1.s", "D,S", 0x4600001e, 0xffff003f, WR_D|RD_S|FP_S, 0, M3D }, 2097 {"rsqrt2.d", "D,S,T", 0x4620001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, M3D }, 2098 {"rsqrt2.ps", "D,S,T", 0x46c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, 0, M3D }, 2099 {"rsqrt2.s", "D,S,T", 0x4600001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, 0, M3D }, 2100 {"rzs.qh", "X,Q", 0x78200024, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX }, 2101 {"rzu.ob", "X,Q", 0x78000020, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX|SB1 }, 2102 {"rzu.ob", "D,k", 0x4bc00020, 0xffe0f83f, WR_D|RD_S|RD_T, 0, N54 }, 2103 {"rzu.qh", "X,Q", 0x78200020, 0xfc20f83f, WR_D|RD_T|FP_D, RD_MACC, MX }, 2104 {"sb", "t,o(b)", 0xa0000000, 0xfc000000, SM|RD_t|RD_b, 0, I1 }, 2105 {"sb", "t,A(b)", 0, (int) M_SB_AB, INSN_MACRO, 0, I1 }, 2106 {"sc", "t,o(b)", 0xe0000000, 0xfc000000, SM|RD_t|WR_t|RD_b, 0, I2 }, 2107 {"sc", "t,A(b)", 0, (int) M_SC_AB, INSN_MACRO, 0, I2 }, 2108 {"scd", "t,o(b)", 0xf0000000, 0xfc000000, SM|RD_t|WR_t|RD_b, 0, I3 }, 2109 {"scd", "t,A(b)", 0, (int) M_SCD_AB, INSN_MACRO, 0, I3 }, 2110 {"sd", "t,o(b)", 0xfc000000, 0xfc000000, SM|RD_t|RD_b, 0, I3 }, 2111 {"sd", "t,o(b)", 0, (int) M_SD_OB, INSN_MACRO, 0, I1 }, 2112 {"sd", "t,A(b)", 0, (int) M_SD_AB, INSN_MACRO, 0, I1 }, 2113 {"sdbbp", "", 0x0000000e, 0xffffffff, TRAP, 0, G2 }, 2114 {"sdbbp", "c", 0x0000000e, 0xfc00ffff, TRAP, 0, G2 }, 2115 {"sdbbp", "c,q", 0x0000000e, 0xfc00003f, TRAP, 0, G2 }, 2116 {"sdbbp", "", 0x7000003f, 0xffffffff, TRAP, 0, I32 }, 2117 {"sdbbp", "B", 0x7000003f, 0xfc00003f, TRAP, 0, I32 }, 2118 {"sdc1", "T,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, 2119 {"sdc1", "E,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, 2120 {"sdc1", "T,A(b)", 0, (int) M_SDC1_AB, INSN_MACRO, 0, I2 }, 2121 {"sdc1", "E,A(b)", 0, (int) M_SDC1_AB, INSN_MACRO, 0, I2 }, 2122 {"sdc2", "E,o(b)", 0xf8000000, 0xfc000000, SM|RD_C2|RD_b, 0, I2 }, 2123 {"sdc2", "E,A(b)", 0, (int) M_SDC2_AB, INSN_MACRO, 0, I2 }, 2124 {"sdc3", "E,o(b)", 0xfc000000, 0xfc000000, SM|RD_C3|RD_b, 0, I2 }, 2125 {"sdc3", "E,A(b)", 0, (int) M_SDC3_AB, INSN_MACRO, 0, I2 }, 2126 {"s.d", "T,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, 2127 {"s.d", "T,o(b)", 0, (int) M_S_DOB, INSN_MACRO, 0, I1 }, 2128 {"s.d", "T,A(b)", 0, (int) M_S_DAB, INSN_MACRO, 0, I1 }, 2129 {"sdl", "t,o(b)", 0xb0000000, 0xfc000000, SM|RD_t|RD_b, 0, I3 }, 2130 {"sdl", "t,A(b)", 0, (int) M_SDL_AB, INSN_MACRO, 0, I3 }, 2131 {"sdr", "t,o(b)", 0xb4000000, 0xfc000000, SM|RD_t|RD_b, 0, I3 }, 2132 {"sdr", "t,A(b)", 0, (int) M_SDR_AB, INSN_MACRO, 0, I3 }, 2133 {"sdxc1", "S,t(b)", 0x4c000009, 0xfc0007ff, SM|RD_S|RD_t|RD_b|FP_D, 0, I4|I33 }, 2134 {"seb", "d,w", 0x7c000420, 0xffe007ff, WR_d|RD_t, 0, I33 }, 2135 {"seh", "d,w", 0x7c000620, 0xffe007ff, WR_d|RD_t, 0, I33 }, 2136 {"selsl", "d,v,t", 0x00000005, 0xfc0007ff, WR_d|RD_s|RD_t, 0, L1 }, 2137 {"selsr", "d,v,t", 0x00000001, 0xfc0007ff, WR_d|RD_s|RD_t, 0, L1 }, 2138 {"seq", "d,v,t", 0, (int) M_SEQ, INSN_MACRO, 0, I1 }, 2139 {"seq", "d,v,I", 0, (int) M_SEQ_I, INSN_MACRO, 0, I1 }, 2140 {"sge", "d,v,t", 0, (int) M_SGE, INSN_MACRO, 0, I1 }, 2141 {"sge", "d,v,I", 0, (int) M_SGE_I, INSN_MACRO, 0, I1 }, 2142 {"sgeu", "d,v,t", 0, (int) M_SGEU, INSN_MACRO, 0, I1 }, 2143 {"sgeu", "d,v,I", 0, (int) M_SGEU_I, INSN_MACRO, 0, I1 }, 2144 {"sgt", "d,v,t", 0, (int) M_SGT, INSN_MACRO, 0, I1 }, 2145 {"sgt", "d,v,I", 0, (int) M_SGT_I, INSN_MACRO, 0, I1 }, 2146 {"sgtu", "d,v,t", 0, (int) M_SGTU, INSN_MACRO, 0, I1 }, 2147 {"sgtu", "d,v,I", 0, (int) M_SGTU_I, INSN_MACRO, 0, I1 }, 2148 {"sh", "t,o(b)", 0xa4000000, 0xfc000000, SM|RD_t|RD_b, 0, I1 }, 2149 {"sh", "t,A(b)", 0, (int) M_SH_AB, INSN_MACRO, 0, I1 }, 2150 {"shfl.bfla.qh", "X,Y,Z", 0x7a20001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2151 {"shfl.mixh.ob", "X,Y,Z", 0x7980001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2152 {"shfl.mixh.ob", "D,S,T", 0x4980001f, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2153 {"shfl.mixh.qh", "X,Y,Z", 0x7820001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2154 {"shfl.mixl.ob", "X,Y,Z", 0x79c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2155 {"shfl.mixl.ob", "D,S,T", 0x49c0001f, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2156 {"shfl.mixl.qh", "X,Y,Z", 0x78a0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2157 {"shfl.pach.ob", "X,Y,Z", 0x7900001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2158 {"shfl.pach.ob", "D,S,T", 0x4900001f, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2159 {"shfl.pach.qh", "X,Y,Z", 0x7920001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2160 {"shfl.pacl.ob", "D,S,T", 0x4940001f, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2161 {"shfl.repa.qh", "X,Y,Z", 0x7b20001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2162 {"shfl.repb.qh", "X,Y,Z", 0x7ba0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2163 {"shfl.upsl.ob", "X,Y,Z", 0x78c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2164 {"sle", "d,v,t", 0, (int) M_SLE, INSN_MACRO, 0, I1 }, 2165 {"sle", "d,v,I", 0, (int) M_SLE_I, INSN_MACRO, 0, I1 }, 2166 {"sleu", "d,v,t", 0, (int) M_SLEU, INSN_MACRO, 0, I1 }, 2167 {"sleu", "d,v,I", 0, (int) M_SLEU_I, INSN_MACRO, 0, I1 }, 2168 {"sllv", "d,t,s", 0x00000004, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I1 }, 2169 {"sll", "d,w,s", 0x00000004, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I1 }, /* sllv */ 2170 {"sll", "d,w,<", 0x00000000, 0xffe0003f, WR_d|RD_t, 0, I1 }, 2171 {"sll.ob", "X,Y,Q", 0x78000010, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2172 {"sll.ob", "D,S,T[e]", 0x48000010, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 2173 {"sll.ob", "D,S,k", 0x4bc00010, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2174 {"sll.qh", "X,Y,Q", 0x78200010, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2175 {"slt", "d,v,t", 0x0000002a, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 2176 {"slt", "d,v,I", 0, (int) M_SLT_I, INSN_MACRO, 0, I1 }, 2177 {"slti", "t,r,j", 0x28000000, 0xfc000000, WR_t|RD_s, 0, I1 }, 2178 {"sltiu", "t,r,j", 0x2c000000, 0xfc000000, WR_t|RD_s, 0, I1 }, 2179 {"sltu", "d,v,t", 0x0000002b, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 2180 {"sltu", "d,v,I", 0, (int) M_SLTU_I, INSN_MACRO, 0, I1 }, 2181 {"sne", "d,v,t", 0, (int) M_SNE, INSN_MACRO, 0, I1 }, 2182 {"sne", "d,v,I", 0, (int) M_SNE_I, INSN_MACRO, 0, I1 }, 2183 {"sqrt.d", "D,S", 0x46200004, 0xffff003f, WR_D|RD_S|FP_D, 0, I2 }, 2184 {"sqrt.s", "D,S", 0x46000004, 0xffff003f, WR_D|RD_S|FP_S, 0, I2 }, 2185 {"sqrt.ps", "D,S", 0x46c00004, 0xffff003f, WR_D|RD_S|FP_D, 0, SB1 }, 2186 {"srav", "d,t,s", 0x00000007, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I1 }, 2187 {"sra", "d,w,s", 0x00000007, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I1 }, /* srav */ 2188 {"sra", "d,w,<", 0x00000003, 0xffe0003f, WR_d|RD_t, 0, I1 }, 2189 {"sra.qh", "X,Y,Q", 0x78200013, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2190 {"srlv", "d,t,s", 0x00000006, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I1 }, 2191 {"srl", "d,w,s", 0x00000006, 0xfc0007ff, WR_d|RD_t|RD_s, 0, I1 }, /* srlv */ 2192 {"srl", "d,w,<", 0x00000002, 0xffe0003f, WR_d|RD_t, 0, I1 }, 2193 {"srl.ob", "X,Y,Q", 0x78000012, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2194 {"srl.ob", "D,S,T[e]", 0x48000012, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 2195 {"srl.ob", "D,S,k", 0x4bc00012, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2196 {"srl.qh", "X,Y,Q", 0x78200012, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2197 /* ssnop is at the start of the table. */ 2198 {"standby", "", 0x42000021, 0xffffffff, 0, 0, V1 }, 2199 {"sub", "d,v,t", 0x00000022, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 2200 {"sub", "d,v,I", 0, (int) M_SUB_I, INSN_MACRO, 0, I1 }, 2201 {"sub.d", "D,V,T", 0x46200001, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I1 }, 2202 {"sub.s", "D,V,T", 0x46000001, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, 0, I1 }, 2203 {"sub.ob", "X,Y,Q", 0x7800000a, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2204 {"sub.ob", "D,S,T", 0x4ac0000a, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2205 {"sub.ob", "D,S,T[e]", 0x4800000a, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 2206 {"sub.ob", "D,S,k", 0x4bc0000a, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2207 {"sub.ps", "D,V,T", 0x46c00001, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I5|I33 }, 2208 {"sub.qh", "X,Y,Q", 0x7820000a, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2209 {"suba.ob", "Y,Q", 0x78000036, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 2210 {"suba.qh", "Y,Q", 0x78200036, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 2211 {"subl.ob", "Y,Q", 0x78000436, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 2212 {"subl.qh", "Y,Q", 0x78200436, 0xfc2007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 2213 {"subu", "d,v,t", 0x00000023, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 2214 {"subu", "d,v,I", 0, (int) M_SUBU_I, INSN_MACRO, 0, I1 }, 2215 {"suspend", "", 0x42000022, 0xffffffff, 0, 0, V1 }, 2216 {"suxc1", "S,t(b)", 0x4c00000d, 0xfc0007ff, SM|RD_S|RD_t|RD_b, 0, I5|I33|N55}, 2217 {"sw", "t,o(b)", 0xac000000, 0xfc000000, SM|RD_t|RD_b, 0, I1 }, 2218 {"sw", "t,A(b)", 0, (int) M_SW_AB, INSN_MACRO, 0, I1 }, 2219 {"swc0", "E,o(b)", 0xe0000000, 0xfc000000, SM|RD_C0|RD_b, 0, I1 }, 2220 {"swc0", "E,A(b)", 0, (int) M_SWC0_AB, INSN_MACRO, 0, I1 }, 2221 {"swc1", "T,o(b)", 0xe4000000, 0xfc000000, SM|RD_T|RD_b|FP_S, 0, I1 }, 2222 {"swc1", "E,o(b)", 0xe4000000, 0xfc000000, SM|RD_T|RD_b|FP_S, 0, I1 }, 2223 {"swc1", "T,A(b)", 0, (int) M_SWC1_AB, INSN_MACRO, 0, I1 }, 2224 {"swc1", "E,A(b)", 0, (int) M_SWC1_AB, INSN_MACRO, 0, I1 }, 2225 {"s.s", "T,o(b)", 0xe4000000, 0xfc000000, SM|RD_T|RD_b|FP_S, 0, I1 }, /* swc1 */ 2226 {"s.s", "T,A(b)", 0, (int) M_SWC1_AB, INSN_MACRO, 0, I1 }, 2227 {"swc2", "E,o(b)", 0xe8000000, 0xfc000000, SM|RD_C2|RD_b, 0, I1 }, 2228 {"swc2", "E,A(b)", 0, (int) M_SWC2_AB, INSN_MACRO, 0, I1 }, 2229 {"swc3", "E,o(b)", 0xec000000, 0xfc000000, SM|RD_C3|RD_b, 0, I1 }, 2230 {"swc3", "E,A(b)", 0, (int) M_SWC3_AB, INSN_MACRO, 0, I1 }, 2231 {"swl", "t,o(b)", 0xa8000000, 0xfc000000, SM|RD_t|RD_b, 0, I1 }, 2232 {"swl", "t,A(b)", 0, (int) M_SWL_AB, INSN_MACRO, 0, I1 }, 2233 {"scache", "t,o(b)", 0xa8000000, 0xfc000000, RD_t|RD_b, 0, I2 }, /* same */ 2234 {"scache", "t,A(b)", 0, (int) M_SWL_AB, INSN_MACRO, 0, I2 }, /* as swl */ 2235 {"swr", "t,o(b)", 0xb8000000, 0xfc000000, SM|RD_t|RD_b, 0, I1 }, 2236 {"swr", "t,A(b)", 0, (int) M_SWR_AB, INSN_MACRO, 0, I1 }, 2237 {"invalidate", "t,o(b)",0xb8000000, 0xfc000000, RD_t|RD_b, 0, I2 }, /* same */ 2238 {"invalidate", "t,A(b)",0, (int) M_SWR_AB, INSN_MACRO, 0, I2 }, /* as swr */ 2239 {"swxc1", "S,t(b)", 0x4c000008, 0xfc0007ff, SM|RD_S|RD_t|RD_b|FP_S, 0, I4|I33 }, 2240 {"sync", "", 0x0000000f, 0xffffffff, INSN_SYNC, 0, I2|G1 }, 2241 {"sync.p", "", 0x0000040f, 0xffffffff, INSN_SYNC, 0, I2 }, 2242 {"sync.l", "", 0x0000000f, 0xffffffff, INSN_SYNC, 0, I2 }, 2243 {"synci", "o(b)", 0x041f0000, 0xfc1f0000, SM|RD_b, 0, I33 }, 2244 {"syscall", "", 0x0000000c, 0xffffffff, TRAP, 0, I1 }, 2245 {"syscall", "B", 0x0000000c, 0xfc00003f, TRAP, 0, I1 }, 2246 {"teqi", "s,j", 0x040c0000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, 2247 {"teq", "s,t", 0x00000034, 0xfc00ffff, RD_s|RD_t|TRAP, 0, I2 }, 2248 {"teq", "s,t,q", 0x00000034, 0xfc00003f, RD_s|RD_t|TRAP, 0, I2 }, 2249 {"teq", "s,j", 0x040c0000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, /* teqi */ 2250 {"teq", "s,I", 0, (int) M_TEQ_I, INSN_MACRO, 0, I2 }, 2251 {"tgei", "s,j", 0x04080000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, 2252 {"tge", "s,t", 0x00000030, 0xfc00ffff, RD_s|RD_t|TRAP, 0, I2 }, 2253 {"tge", "s,t,q", 0x00000030, 0xfc00003f, RD_s|RD_t|TRAP, 0, I2 }, 2254 {"tge", "s,j", 0x04080000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, /* tgei */ 2255 {"tge", "s,I", 0, (int) M_TGE_I, INSN_MACRO, 0, I2 }, 2256 {"tgeiu", "s,j", 0x04090000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, 2257 {"tgeu", "s,t", 0x00000031, 0xfc00ffff, RD_s|RD_t|TRAP, 0, I2 }, 2258 {"tgeu", "s,t,q", 0x00000031, 0xfc00003f, RD_s|RD_t|TRAP, 0, I2 }, 2259 {"tgeu", "s,j", 0x04090000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, /* tgeiu */ 2260 {"tgeu", "s,I", 0, (int) M_TGEU_I, INSN_MACRO, 0, I2 }, 2261 {"tlbp", "", 0x42000008, 0xffffffff, INSN_TLB, 0, I1 }, 2262 {"tlbr", "", 0x42000001, 0xffffffff, INSN_TLB, 0, I1 }, 2263 {"tlbwi", "", 0x42000002, 0xffffffff, INSN_TLB, 0, I1 }, 2264 {"tlbwr", "", 0x42000006, 0xffffffff, INSN_TLB, 0, I1 }, 2265 {"tlti", "s,j", 0x040a0000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, 2266 {"tlt", "s,t", 0x00000032, 0xfc00ffff, RD_s|RD_t|TRAP, 0, I2 }, 2267 {"tlt", "s,t,q", 0x00000032, 0xfc00003f, RD_s|RD_t|TRAP, 0, I2 }, 2268 {"tlt", "s,j", 0x040a0000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, /* tlti */ 2269 {"tlt", "s,I", 0, (int) M_TLT_I, INSN_MACRO, 0, I2 }, 2270 {"tltiu", "s,j", 0x040b0000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, 2271 {"tltu", "s,t", 0x00000033, 0xfc00ffff, RD_s|RD_t|TRAP, 0, I2 }, 2272 {"tltu", "s,t,q", 0x00000033, 0xfc00003f, RD_s|RD_t|TRAP, 0, I2 }, 2273 {"tltu", "s,j", 0x040b0000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, /* tltiu */ 2274 {"tltu", "s,I", 0, (int) M_TLTU_I, INSN_MACRO, 0, I2 }, 2275 {"tnei", "s,j", 0x040e0000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, 2276 {"tne", "s,t", 0x00000036, 0xfc00ffff, RD_s|RD_t|TRAP, 0, I2 }, 2277 {"tne", "s,t,q", 0x00000036, 0xfc00003f, RD_s|RD_t|TRAP, 0, I2 }, 2278 {"tne", "s,j", 0x040e0000, 0xfc1f0000, RD_s|TRAP, 0, I2 }, /* tnei */ 2279 {"tne", "s,I", 0, (int) M_TNE_I, INSN_MACRO, 0, I2 }, 2280 {"trunc.l.d", "D,S", 0x46200009, 0xffff003f, WR_D|RD_S|FP_D, 0, I3|I33 }, 2281 {"trunc.l.s", "D,S", 0x46000009, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I3|I33 }, 2282 {"trunc.w.d", "D,S", 0x4620000d, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I2 }, 2283 {"trunc.w.d", "D,S,x", 0x4620000d, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, I2 }, 2284 {"trunc.w.d", "D,S,t", 0, (int) M_TRUNCWD, INSN_MACRO, 0, I1 }, 2285 {"trunc.w.s", "D,S", 0x4600000d, 0xffff003f, WR_D|RD_S|FP_S, 0, I2 }, 2286 {"trunc.w.s", "D,S,x", 0x4600000d, 0xffff003f, WR_D|RD_S|FP_S, 0, I2 }, 2287 {"trunc.w.s", "D,S,t", 0, (int) M_TRUNCWS, INSN_MACRO, 0, I1 }, 2288 {"uld", "t,o(b)", 0, (int) M_ULD, INSN_MACRO, 0, I3 }, 2289 {"uld", "t,A(b)", 0, (int) M_ULD_A, INSN_MACRO, 0, I3 }, 2290 {"ulh", "t,o(b)", 0, (int) M_ULH, INSN_MACRO, 0, I1 }, 2291 {"ulh", "t,A(b)", 0, (int) M_ULH_A, INSN_MACRO, 0, I1 }, 2292 {"ulhu", "t,o(b)", 0, (int) M_ULHU, INSN_MACRO, 0, I1 }, 2293 {"ulhu", "t,A(b)", 0, (int) M_ULHU_A, INSN_MACRO, 0, I1 }, 2294 {"ulw", "t,o(b)", 0, (int) M_ULW, INSN_MACRO, 0, I1 }, 2295 {"ulw", "t,A(b)", 0, (int) M_ULW_A, INSN_MACRO, 0, I1 }, 2296 {"usd", "t,o(b)", 0, (int) M_USD, INSN_MACRO, 0, I3 }, 2297 {"usd", "t,A(b)", 0, (int) M_USD_A, INSN_MACRO, 0, I3 }, 2298 {"ush", "t,o(b)", 0, (int) M_USH, INSN_MACRO, 0, I1 }, 2299 {"ush", "t,A(b)", 0, (int) M_USH_A, INSN_MACRO, 0, I1 }, 2300 {"usw", "t,o(b)", 0, (int) M_USW, INSN_MACRO, 0, I1 }, 2301 {"usw", "t,A(b)", 0, (int) M_USW_A, INSN_MACRO, 0, I1 }, 2302 {"wach.ob", "Y", 0x7a00003e, 0xffff07ff, RD_S|FP_D, WR_MACC, MX|SB1 }, 2303 {"wach.ob", "S", 0x4a00003e, 0xffff07ff, RD_S, 0, N54 }, 2304 {"wach.qh", "Y", 0x7a20003e, 0xffff07ff, RD_S|FP_D, WR_MACC, MX }, 2305 {"wacl.ob", "Y,Z", 0x7800003e, 0xffe007ff, RD_S|RD_T|FP_D, WR_MACC, MX|SB1 }, 2306 {"wacl.ob", "S,T", 0x4800003e, 0xffe007ff, RD_S|RD_T, 0, N54 }, 2307 {"wacl.qh", "Y,Z", 0x7820003e, 0xffe007ff, RD_S|RD_T|FP_D, WR_MACC, MX }, 2308 {"wait", "", 0x42000020, 0xffffffff, TRAP, 0, I3|I32 }, 2309 {"wait", "J", 0x42000020, 0xfe00003f, TRAP, 0, I32|N55 }, 2310 {"waiti", "", 0x42000020, 0xffffffff, TRAP, 0, L1 }, 2311 {"wrpgpr", "d,w", 0x41c00000, 0xffe007ff, RD_t, 0, I33 }, 2312 {"wsbh", "d,w", 0x7c0000a0, 0xffe007ff, WR_d|RD_t, 0, I33 }, 2313 {"xor", "d,v,t", 0x00000026, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, 2314 {"xor", "t,r,I", 0, (int) M_XOR_I, INSN_MACRO, 0, I1 }, 2315 {"xor.ob", "X,Y,Q", 0x7800000d, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, 2316 {"xor.ob", "D,S,T", 0x4ac0000d, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2317 {"xor.ob", "D,S,T[e]", 0x4800000d, 0xfe20003f, WR_D|RD_S|RD_T, 0, N54 }, 2318 {"xor.ob", "D,S,k", 0x4bc0000d, 0xffe0003f, WR_D|RD_S|RD_T, 0, N54 }, 2319 {"xor.qh", "X,Y,Q", 0x7820000d, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, 2320 {"xori", "t,r,i", 0x38000000, 0xfc000000, WR_t|RD_s, 0, I1 }, 2321 {"yield", "s", 0x7c000009, 0xfc1fffff, TRAP|RD_s, 0, MT32 }, 2322 {"yield", "d,s", 0x7c000009, 0xfc1f07ff, TRAP|WR_d|RD_s, 0, MT32 }, 2323 2324 /* User Defined Instruction. */ 2325 {"udi0", "s,t,d,+1",0x70000010, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2326 {"udi0", "s,t,+2", 0x70000010, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2327 {"udi0", "s,+3", 0x70000010, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2328 {"udi0", "+4", 0x70000010, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2329 {"udi1", "s,t,d,+1",0x70000011, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2330 {"udi1", "s,t,+2", 0x70000011, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2331 {"udi1", "s,+3", 0x70000011, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2332 {"udi1", "+4", 0x70000011, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2333 {"udi2", "s,t,d,+1",0x70000012, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2334 {"udi2", "s,t,+2", 0x70000012, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2335 {"udi2", "s,+3", 0x70000012, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2336 {"udi2", "+4", 0x70000012, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2337 {"udi3", "s,t,d,+1",0x70000013, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2338 {"udi3", "s,t,+2", 0x70000013, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2339 {"udi3", "s,+3", 0x70000013, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2340 {"udi3", "+4", 0x70000013, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2341 {"udi4", "s,t,d,+1",0x70000014, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2342 {"udi4", "s,t,+2", 0x70000014, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2343 {"udi4", "s,+3", 0x70000014, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2344 {"udi4", "+4", 0x70000014, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2345 {"udi5", "s,t,d,+1",0x70000015, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2346 {"udi5", "s,t,+2", 0x70000015, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2347 {"udi5", "s,+3", 0x70000015, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2348 {"udi5", "+4", 0x70000015, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2349 {"udi6", "s,t,d,+1",0x70000016, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2350 {"udi6", "s,t,+2", 0x70000016, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2351 {"udi6", "s,+3", 0x70000016, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2352 {"udi6", "+4", 0x70000016, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2353 {"udi7", "s,t,d,+1",0x70000017, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2354 {"udi7", "s,t,+2", 0x70000017, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2355 {"udi7", "s,+3", 0x70000017, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2356 {"udi7", "+4", 0x70000017, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2357 {"udi8", "s,t,d,+1",0x70000018, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2358 {"udi8", "s,t,+2", 0x70000018, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2359 {"udi8", "s,+3", 0x70000018, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2360 {"udi8", "+4", 0x70000018, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2361 {"udi9", "s,t,d,+1",0x70000019, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2362 {"udi9", "s,t,+2", 0x70000019, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2363 {"udi9", "s,+3", 0x70000019, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2364 {"udi9", "+4", 0x70000019, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2365 {"udi10", "s,t,d,+1",0x7000001a, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2366 {"udi10", "s,t,+2", 0x7000001a, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2367 {"udi10", "s,+3", 0x7000001a, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2368 {"udi10", "+4", 0x7000001a, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2369 {"udi11", "s,t,d,+1",0x7000001b, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2370 {"udi11", "s,t,+2", 0x7000001b, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2371 {"udi11", "s,+3", 0x7000001b, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2372 {"udi11", "+4", 0x7000001b, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2373 {"udi12", "s,t,d,+1",0x7000001c, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2374 {"udi12", "s,t,+2", 0x7000001c, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2375 {"udi12", "s,+3", 0x7000001c, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2376 {"udi12", "+4", 0x7000001c, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2377 {"udi13", "s,t,d,+1",0x7000001d, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2378 {"udi13", "s,t,+2", 0x7000001d, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2379 {"udi13", "s,+3", 0x7000001d, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2380 {"udi13", "+4", 0x7000001d, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2381 {"udi14", "s,t,d,+1",0x7000001e, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2382 {"udi14", "s,t,+2", 0x7000001e, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2383 {"udi14", "s,+3", 0x7000001e, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2384 {"udi14", "+4", 0x7000001e, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2385 {"udi15", "s,t,d,+1",0x7000001f, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2386 {"udi15", "s,t,+2", 0x7000001f, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2387 {"udi15", "s,+3", 0x7000001f, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2388 {"udi15", "+4", 0x7000001f, 0xfc00003f, WR_d|RD_s|RD_t, 0, I33 }, 2389 2390 /* Coprocessor 2 move/branch operations overlap with VR5400 .ob format 2391 instructions so they are here for the latters to take precedence. */ 2392 {"bc2f", "p", 0x49000000, 0xffff0000, CBD|RD_CC, 0, I1 }, 2393 {"bc2f", "N,p", 0x49000000, 0xffe30000, CBD|RD_CC, 0, I32 }, 2394 {"bc2fl", "p", 0x49020000, 0xffff0000, CBL|RD_CC, 0, I2|T3 }, 2395 {"bc2fl", "N,p", 0x49020000, 0xffe30000, CBL|RD_CC, 0, I32 }, 2396 {"bc2t", "p", 0x49010000, 0xffff0000, CBD|RD_CC, 0, I1 }, 2397 {"bc2t", "N,p", 0x49010000, 0xffe30000, CBD|RD_CC, 0, I32 }, 2398 {"bc2tl", "p", 0x49030000, 0xffff0000, CBL|RD_CC, 0, I2|T3 }, 2399 {"bc2tl", "N,p", 0x49030000, 0xffe30000, CBL|RD_CC, 0, I32 }, 2400 {"cfc2", "t,G", 0x48400000, 0xffe007ff, LCD|WR_t|RD_C2, 0, I1 }, 2401 {"ctc2", "t,G", 0x48c00000, 0xffe007ff, COD|RD_t|WR_CC, 0, I1 }, 2402 {"dmfc2", "t,G", 0x48200000, 0xffe007ff, LCD|WR_t|RD_C2, 0, I3 }, 2403 {"dmfc2", "t,G,H", 0x48200000, 0xffe007f8, LCD|WR_t|RD_C2, 0, I64 }, 2404 {"dmtc2", "t,G", 0x48a00000, 0xffe007ff, COD|RD_t|WR_C2|WR_CC, 0, I3 }, 2405 {"dmtc2", "t,G,H", 0x48a00000, 0xffe007f8, COD|RD_t|WR_C2|WR_CC, 0, I64 }, 2406 {"mfc2", "t,G", 0x48000000, 0xffe007ff, LCD|WR_t|RD_C2, 0, I1 }, 2407 {"mfc2", "t,G,H", 0x48000000, 0xffe007f8, LCD|WR_t|RD_C2, 0, I32 }, 2408 {"mfhc2", "t,G", 0x48600000, 0xffe007ff, LCD|WR_t|RD_C2, 0, I33 }, 2409 {"mfhc2", "t,G,H", 0x48600000, 0xffe007f8, LCD|WR_t|RD_C2, 0, I33 }, 2410 {"mfhc2", "t,i", 0x48600000, 0xffe00000, LCD|WR_t|RD_C2, 0, I33 }, 2411 {"mtc2", "t,G", 0x48800000, 0xffe007ff, COD|RD_t|WR_C2|WR_CC, 0, I1 }, 2412 {"mtc2", "t,G,H", 0x48800000, 0xffe007f8, COD|RD_t|WR_C2|WR_CC, 0, I32 }, 2413 {"mthc2", "t,G", 0x48e00000, 0xffe007ff, COD|RD_t|WR_C2|WR_CC, 0, I33 }, 2414 {"mthc2", "t,G,H", 0x48e00000, 0xffe007f8, COD|RD_t|WR_C2|WR_CC, 0, I33 }, 2415 {"mthc2", "t,i", 0x48e00000, 0xffe00000, COD|RD_t|WR_C2|WR_CC, 0, I33 }, 2416 2417 /* Coprocessor 3 move/branch operations overlap with MIPS IV COP1X 2418 instructions, so they are here for the latters to take precedence. */ 2419 {"bc3f", "p", 0x4d000000, 0xffff0000, CBD|RD_CC, 0, I1 }, 2420 {"bc3fl", "p", 0x4d020000, 0xffff0000, CBL|RD_CC, 0, I2|T3 }, 2421 {"bc3t", "p", 0x4d010000, 0xffff0000, CBD|RD_CC, 0, I1 }, 2422 {"bc3tl", "p", 0x4d030000, 0xffff0000, CBL|RD_CC, 0, I2|T3 }, 2423 {"cfc3", "t,G", 0x4c400000, 0xffe007ff, LCD|WR_t|RD_C3, 0, I1 }, 2424 {"ctc3", "t,G", 0x4cc00000, 0xffe007ff, COD|RD_t|WR_CC, 0, I1 }, 2425 {"dmfc3", "t,G", 0x4c200000, 0xffe007ff, LCD|WR_t|RD_C3, 0, I3 }, 2426 {"dmtc3", "t,G", 0x4ca00000, 0xffe007ff, COD|RD_t|WR_C3|WR_CC, 0, I3 }, 2427 {"mfc3", "t,G", 0x4c000000, 0xffe007ff, LCD|WR_t|RD_C3, 0, I1 }, 2428 {"mfc3", "t,G,H", 0x4c000000, 0xffe007f8, LCD|WR_t|RD_C3, 0, I32 }, 2429 {"mtc3", "t,G", 0x4c800000, 0xffe007ff, COD|RD_t|WR_C3|WR_CC, 0, I1 }, 2430 {"mtc3", "t,G,H", 0x4c800000, 0xffe007f8, COD|RD_t|WR_C3|WR_CC, 0, I32 }, 2431 2432 /* No hazard protection on coprocessor instructions--they shouldn't 2433 change the state of the processor and if they do it's up to the 2434 user to put in nops as necessary. These are at the end so that the 2435 disassembler recognizes more specific versions first. */ 2436 {"c0", "C", 0x42000000, 0xfe000000, 0, 0, I1 }, 2437 {"c1", "C", 0x46000000, 0xfe000000, 0, 0, I1 }, 2438 {"c2", "C", 0x4a000000, 0xfe000000, 0, 0, I1 }, 2439 {"c3", "C", 0x4e000000, 0xfe000000, 0, 0, I1 }, 2440 {"cop0", "C", 0, (int) M_COP0, INSN_MACRO, 0, I1 }, 2441 {"cop1", "C", 0, (int) M_COP1, INSN_MACRO, 0, I1 }, 2442 {"cop2", "C", 0, (int) M_COP2, INSN_MACRO, 0, I1 }, 2443 {"cop3", "C", 0, (int) M_COP3, INSN_MACRO, 0, I1 }, 2444 /* Conflicts with the 4650's "mul" instruction. Nobody's using the 2445 4010 any more, so move this insn out of the way. If the object 2446 format gave us more info, we could do this right. */ 2447 {"addciu", "t,r,j", 0x70000000, 0xfc000000, WR_t|RD_s, 0, L1 }, 2448 /* MIPS DSP ASE */ 2449 {"absq_s.ph", "d,t", 0x7c000252, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2450 {"absq_s.pw", "d,t", 0x7c000456, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2451 {"absq_s.qh", "d,t", 0x7c000256, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2452 {"absq_s.w", "d,t", 0x7c000452, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2453 {"addq.ph", "d,s,t", 0x7c000290, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2454 {"addq.pw", "d,s,t", 0x7c000494, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2455 {"addq.qh", "d,s,t", 0x7c000294, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2456 {"addq_s.ph", "d,s,t", 0x7c000390, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2457 {"addq_s.pw", "d,s,t", 0x7c000594, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2458 {"addq_s.qh", "d,s,t", 0x7c000394, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2459 {"addq_s.w", "d,s,t", 0x7c000590, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2460 {"addsc", "d,s,t", 0x7c000410, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2461 {"addu.ob", "d,s,t", 0x7c000014, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2462 {"addu.qb", "d,s,t", 0x7c000010, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2463 {"addu_s.ob", "d,s,t", 0x7c000114, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2464 {"addu_s.qb", "d,s,t", 0x7c000110, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2465 {"addwc", "d,s,t", 0x7c000450, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2466 {"bitrev", "d,t", 0x7c0006d2, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2467 {"bposge32", "p", 0x041c0000, 0xffff0000, CBD, 0, D32 }, 2468 {"bposge64", "p", 0x041d0000, 0xffff0000, CBD, 0, D64 }, 2469 {"cmp.eq.ph", "s,t", 0x7c000211, 0xfc00ffff, RD_s|RD_t, 0, D32 }, 2470 {"cmp.eq.pw", "s,t", 0x7c000415, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2471 {"cmp.eq.qh", "s,t", 0x7c000215, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2472 {"cmpgu.eq.ob", "d,s,t", 0x7c000115, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2473 {"cmpgu.eq.qb", "d,s,t", 0x7c000111, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2474 {"cmpgu.le.ob", "d,s,t", 0x7c000195, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2475 {"cmpgu.le.qb", "d,s,t", 0x7c000191, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2476 {"cmpgu.lt.ob", "d,s,t", 0x7c000155, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2477 {"cmpgu.lt.qb", "d,s,t", 0x7c000151, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2478 {"cmp.le.ph", "s,t", 0x7c000291, 0xfc00ffff, RD_s|RD_t, 0, D32 }, 2479 {"cmp.le.pw", "s,t", 0x7c000495, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2480 {"cmp.le.qh", "s,t", 0x7c000295, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2481 {"cmp.lt.ph", "s,t", 0x7c000251, 0xfc00ffff, RD_s|RD_t, 0, D32 }, 2482 {"cmp.lt.pw", "s,t", 0x7c000455, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2483 {"cmp.lt.qh", "s,t", 0x7c000255, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2484 {"cmpu.eq.ob", "s,t", 0x7c000015, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2485 {"cmpu.eq.qb", "s,t", 0x7c000011, 0xfc00ffff, RD_s|RD_t, 0, D32 }, 2486 {"cmpu.le.ob", "s,t", 0x7c000095, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2487 {"cmpu.le.qb", "s,t", 0x7c000091, 0xfc00ffff, RD_s|RD_t, 0, D32 }, 2488 {"cmpu.lt.ob", "s,t", 0x7c000055, 0xfc00ffff, RD_s|RD_t, 0, D64 }, 2489 {"cmpu.lt.qb", "s,t", 0x7c000051, 0xfc00ffff, RD_s|RD_t, 0, D32 }, 2490 {"dextpdp", "t,7,6", 0x7c0002bc, 0xfc00e7ff, WR_t|RD_a|DSP_VOLA, 0, D64 }, 2491 {"dextpdpv", "t,7,s", 0x7c0002fc, 0xfc00e7ff, WR_t|RD_a|RD_s|DSP_VOLA, 0, D64 }, 2492 {"dextp", "t,7,6", 0x7c0000bc, 0xfc00e7ff, WR_t|RD_a, 0, D64 }, 2493 {"dextpv", "t,7,s", 0x7c0000fc, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D64 }, 2494 {"dextr.l", "t,7,6", 0x7c00043c, 0xfc00e7ff, WR_t|RD_a, 0, D64 }, 2495 {"dextr_r.l", "t,7,6", 0x7c00053c, 0xfc00e7ff, WR_t|RD_a, 0, D64 }, 2496 {"dextr_rs.l", "t,7,6", 0x7c0005bc, 0xfc00e7ff, WR_t|RD_a, 0, D64 }, 2497 {"dextr_rs.w", "t,7,6", 0x7c0001bc, 0xfc00e7ff, WR_t|RD_a, 0, D64 }, 2498 {"dextr_r.w", "t,7,6", 0x7c00013c, 0xfc00e7ff, WR_t|RD_a, 0, D64 }, 2499 {"dextr_s.h", "t,7,6", 0x7c0003bc, 0xfc00e7ff, WR_t|RD_a, 0, D64 }, 2500 {"dextrv.l", "t,7,s", 0x7c00047c, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D64 }, 2501 {"dextrv_r.l", "t,7,s", 0x7c00057c, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D64 }, 2502 {"dextrv_rs.l", "t,7,s", 0x7c0005fc, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D64 }, 2503 {"dextrv_rs.w", "t,7,s", 0x7c0001fc, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D64 }, 2504 {"dextrv_r.w", "t,7,s", 0x7c00017c, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D64 }, 2505 {"dextrv_s.h", "t,7,s", 0x7c0003fc, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D64 }, 2506 {"dextrv.w", "t,7,s", 0x7c00007c, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D64 }, 2507 {"dextr.w", "t,7,6", 0x7c00003c, 0xfc00e7ff, WR_t|RD_a, 0, D64 }, 2508 {"dinsv", "t,s", 0x7c00000d, 0xfc00ffff, WR_t|RD_s, 0, D64 }, 2509 {"dmadd", "7,s,t", 0x7c000674, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2510 {"dmaddu", "7,s,t", 0x7c000774, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2511 {"dmsub", "7,s,t", 0x7c0006f4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2512 {"dmsubu", "7,s,t", 0x7c0007f4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2513 {"dmthlip", "s,7", 0x7c0007fc, 0xfc1fe7ff, RD_s|MOD_a|DSP_VOLA, 0, D64 }, 2514 {"dpaq_sa.l.pw", "7,s,t", 0x7c000334, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2515 {"dpaq_sa.l.w", "7,s,t", 0x7c000330, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2516 {"dpaq_s.w.ph", "7,s,t", 0x7c000130, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2517 {"dpaq_s.w.qh", "7,s,t", 0x7c000134, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2518 {"dpau.h.obl", "7,s,t", 0x7c0000f4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2519 {"dpau.h.obr", "7,s,t", 0x7c0001f4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2520 {"dpau.h.qbl", "7,s,t", 0x7c0000f0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2521 {"dpau.h.qbr", "7,s,t", 0x7c0001f0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2522 {"dpsq_sa.l.pw", "7,s,t", 0x7c000374, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2523 {"dpsq_sa.l.w", "7,s,t", 0x7c000370, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2524 {"dpsq_s.w.ph", "7,s,t", 0x7c000170, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2525 {"dpsq_s.w.qh", "7,s,t", 0x7c000174, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2526 {"dpsu.h.obl", "7,s,t", 0x7c0002f4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2527 {"dpsu.h.obr", "7,s,t", 0x7c0003f4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2528 {"dpsu.h.qbl", "7,s,t", 0x7c0002f0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2529 {"dpsu.h.qbr", "7,s,t", 0x7c0003f0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2530 {"dshilo", "7,:", 0x7c0006bc, 0xfc07e7ff, MOD_a, 0, D64 }, 2531 {"dshilov", "7,s", 0x7c0006fc, 0xfc1fe7ff, MOD_a|RD_s, 0, D64 }, 2532 {"extpdp", "t,7,6", 0x7c0002b8, 0xfc00e7ff, WR_t|RD_a|DSP_VOLA, 0, D32 }, 2533 {"extpdpv", "t,7,s", 0x7c0002f8, 0xfc00e7ff, WR_t|RD_a|RD_s|DSP_VOLA, 0, D32 }, 2534 {"extp", "t,7,6", 0x7c0000b8, 0xfc00e7ff, WR_t|RD_a, 0, D32 }, 2535 {"extpv", "t,7,s", 0x7c0000f8, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D32 }, 2536 {"extr_rs.w", "t,7,6", 0x7c0001b8, 0xfc00e7ff, WR_t|RD_a, 0, D32 }, 2537 {"extr_r.w", "t,7,6", 0x7c000138, 0xfc00e7ff, WR_t|RD_a, 0, D32 }, 2538 {"extr_s.h", "t,7,6", 0x7c0003b8, 0xfc00e7ff, WR_t|RD_a, 0, D32 }, 2539 {"extrv_rs.w", "t,7,s", 0x7c0001f8, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D32 }, 2540 {"extrv_r.w", "t,7,s", 0x7c000178, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D32 }, 2541 {"extrv_s.h", "t,7,s", 0x7c0003f8, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D32 }, 2542 {"extrv.w", "t,7,s", 0x7c000078, 0xfc00e7ff, WR_t|RD_a|RD_s, 0, D32 }, 2543 {"extr.w", "t,7,6", 0x7c000038, 0xfc00e7ff, WR_t|RD_a, 0, D32 }, 2544 {"insv", "t,s", 0x7c00000c, 0xfc00ffff, WR_t|RD_s, 0, D32 }, 2545 {"lbux", "d,t(b)", 0x7c00018a, 0xfc0007ff, LDD|WR_d|RD_t|RD_b, 0, D32 }, 2546 {"ldx", "d,t(b)", 0x7c00020a, 0xfc0007ff, LDD|WR_d|RD_t|RD_b, 0, D64 }, 2547 {"lhx", "d,t(b)", 0x7c00010a, 0xfc0007ff, LDD|WR_d|RD_t|RD_b, 0, D32 }, 2548 {"lwx", "d,t(b)", 0x7c00000a, 0xfc0007ff, LDD|WR_d|RD_t|RD_b, 0, D32 }, 2549 {"maq_sa.w.phl", "7,s,t", 0x7c000430, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2550 {"maq_sa.w.phr", "7,s,t", 0x7c0004b0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2551 {"maq_sa.w.qhll", "7,s,t", 0x7c000434, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2552 {"maq_sa.w.qhlr", "7,s,t", 0x7c000474, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2553 {"maq_sa.w.qhrl", "7,s,t", 0x7c0004b4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2554 {"maq_sa.w.qhrr", "7,s,t", 0x7c0004f4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2555 {"maq_s.l.pwl", "7,s,t", 0x7c000734, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2556 {"maq_s.l.pwr", "7,s,t", 0x7c0007b4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2557 {"maq_s.w.phl", "7,s,t", 0x7c000530, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2558 {"maq_s.w.phr", "7,s,t", 0x7c0005b0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2559 {"maq_s.w.qhll", "7,s,t", 0x7c000534, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2560 {"maq_s.w.qhlr", "7,s,t", 0x7c000574, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2561 {"maq_s.w.qhrl", "7,s,t", 0x7c0005b4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2562 {"maq_s.w.qhrr", "7,s,t", 0x7c0005f4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2563 {"modsub", "d,s,t", 0x7c000490, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2564 {"mthlip", "s,7", 0x7c0007f8, 0xfc1fe7ff, RD_s|MOD_a|DSP_VOLA, 0, D32 }, 2565 {"muleq_s.pw.qhl", "d,s,t", 0x7c000714, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D64 }, 2566 {"muleq_s.pw.qhr", "d,s,t", 0x7c000754, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D64 }, 2567 {"muleq_s.w.phl", "d,s,t", 0x7c000710, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D32 }, 2568 {"muleq_s.w.phr", "d,s,t", 0x7c000750, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D32 }, 2569 {"muleu_s.ph.qbl", "d,s,t", 0x7c000190, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D32 }, 2570 {"muleu_s.ph.qbr", "d,s,t", 0x7c0001d0, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D32 }, 2571 {"muleu_s.qh.obl", "d,s,t", 0x7c000194, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D64 }, 2572 {"muleu_s.qh.obr", "d,s,t", 0x7c0001d4, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D64 }, 2573 {"mulq_rs.ph", "d,s,t", 0x7c0007d0, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D32 }, 2574 {"mulq_rs.qh", "d,s,t", 0x7c0007d4, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D64 }, 2575 {"mulsaq_s.l.pw", "7,s,t", 0x7c0003b4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2576 {"mulsaq_s.w.ph", "7,s,t", 0x7c0001b0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D32 }, 2577 {"mulsaq_s.w.qh", "7,s,t", 0x7c0001b4, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D64 }, 2578 {"packrl.ph", "d,s,t", 0x7c000391, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2579 {"packrl.pw", "d,s,t", 0x7c000395, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2580 {"pick.ob", "d,s,t", 0x7c0000d5, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2581 {"pick.ph", "d,s,t", 0x7c0002d1, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2582 {"pick.pw", "d,s,t", 0x7c0004d5, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2583 {"pick.qb", "d,s,t", 0x7c0000d1, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2584 {"pick.qh", "d,s,t", 0x7c0002d5, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2585 {"preceq.pw.qhla", "d,t", 0x7c000396, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2586 {"preceq.pw.qhl", "d,t", 0x7c000316, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2587 {"preceq.pw.qhra", "d,t", 0x7c0003d6, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2588 {"preceq.pw.qhr", "d,t", 0x7c000356, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2589 {"preceq.s.l.pwl", "d,t", 0x7c000516, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2590 {"preceq.s.l.pwr", "d,t", 0x7c000556, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2591 {"precequ.ph.qbla", "d,t", 0x7c000192, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2592 {"precequ.ph.qbl", "d,t", 0x7c000112, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2593 {"precequ.ph.qbra", "d,t", 0x7c0001d2, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2594 {"precequ.ph.qbr", "d,t", 0x7c000152, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2595 {"precequ.pw.qhla", "d,t", 0x7c000196, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2596 {"precequ.pw.qhl", "d,t", 0x7c000116, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2597 {"precequ.pw.qhra", "d,t", 0x7c0001d6, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2598 {"precequ.pw.qhr", "d,t", 0x7c000156, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2599 {"preceq.w.phl", "d,t", 0x7c000312, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2600 {"preceq.w.phr", "d,t", 0x7c000352, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2601 {"preceu.ph.qbla", "d,t", 0x7c000792, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2602 {"preceu.ph.qbl", "d,t", 0x7c000712, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2603 {"preceu.ph.qbra", "d,t", 0x7c0007d2, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2604 {"preceu.ph.qbr", "d,t", 0x7c000752, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2605 {"preceu.qh.obla", "d,t", 0x7c000796, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2606 {"preceu.qh.obl", "d,t", 0x7c000716, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2607 {"preceu.qh.obra", "d,t", 0x7c0007d6, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2608 {"preceu.qh.obr", "d,t", 0x7c000756, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2609 {"precrq.ob.qh", "d,s,t", 0x7c000315, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2610 {"precrq.ph.w", "d,s,t", 0x7c000511, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2611 {"precrq.pw.l", "d,s,t", 0x7c000715, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2612 {"precrq.qb.ph", "d,s,t", 0x7c000311, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2613 {"precrq.qh.pw", "d,s,t", 0x7c000515, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2614 {"precrq_rs.ph.w", "d,s,t", 0x7c000551, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2615 {"precrq_rs.qh.pw", "d,s,t", 0x7c000555, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2616 {"precrqu_s.ob.qh", "d,s,t", 0x7c0003d5, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2617 {"precrqu_s.qb.ph", "d,s,t", 0x7c0003d1, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2618 {"raddu.l.ob", "d,s", 0x7c000514, 0xfc1f07ff, WR_d|RD_s, 0, D64 }, 2619 {"raddu.w.qb", "d,s", 0x7c000510, 0xfc1f07ff, WR_d|RD_s, 0, D32 }, 2620 {"rddsp", "d", 0x7fff04b8, 0xffff07ff, WR_d, 0, D32 }, 2621 {"rddsp", "d,'", 0x7c0004b8, 0xffc007ff, WR_d, 0, D32 }, 2622 {"repl.ob", "d,5", 0x7c000096, 0xff0007ff, WR_d, 0, D64 }, 2623 {"repl.ph", "d,@", 0x7c000292, 0xfc0007ff, WR_d, 0, D32 }, 2624 {"repl.pw", "d,@", 0x7c000496, 0xfc0007ff, WR_d, 0, D64 }, 2625 {"repl.qb", "d,5", 0x7c000092, 0xff0007ff, WR_d, 0, D32 }, 2626 {"repl.qh", "d,@", 0x7c000296, 0xfc0007ff, WR_d, 0, D64 }, 2627 {"replv.ob", "d,t", 0x7c0000d6, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2628 {"replv.ph", "d,t", 0x7c0002d2, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2629 {"replv.pw", "d,t", 0x7c0004d6, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2630 {"replv.qb", "d,t", 0x7c0000d2, 0xffe007ff, WR_d|RD_t, 0, D32 }, 2631 {"replv.qh", "d,t", 0x7c0002d6, 0xffe007ff, WR_d|RD_t, 0, D64 }, 2632 {"shilo", "7,0", 0x7c0006b8, 0xfc0fe7ff, MOD_a, 0, D32 }, 2633 {"shilov", "7,s", 0x7c0006f8, 0xfc1fe7ff, MOD_a|RD_s, 0, D32 }, 2634 {"shll.ob", "d,t,3", 0x7c000017, 0xff0007ff, WR_d|RD_t, 0, D64 }, 2635 {"shll.ph", "d,t,4", 0x7c000213, 0xfe0007ff, WR_d|RD_t, 0, D32 }, 2636 {"shll.pw", "d,t,6", 0x7c000417, 0xfc0007ff, WR_d|RD_t, 0, D64 }, 2637 {"shll.qb", "d,t,3", 0x7c000013, 0xff0007ff, WR_d|RD_t, 0, D32 }, 2638 {"shll.qh", "d,t,4", 0x7c000217, 0xfe0007ff, WR_d|RD_t, 0, D64 }, 2639 {"shll_s.ph", "d,t,4", 0x7c000313, 0xfe0007ff, WR_d|RD_t, 0, D32 }, 2640 {"shll_s.pw", "d,t,6", 0x7c000517, 0xfc0007ff, WR_d|RD_t, 0, D64 }, 2641 {"shll_s.qh", "d,t,4", 0x7c000317, 0xfe0007ff, WR_d|RD_t, 0, D64 }, 2642 {"shll_s.w", "d,t,6", 0x7c000513, 0xfc0007ff, WR_d|RD_t, 0, D32 }, 2643 {"shllv.ob", "d,t,s", 0x7c000097, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2644 {"shllv.ph", "d,t,s", 0x7c000293, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2645 {"shllv.pw", "d,t,s", 0x7c000497, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2646 {"shllv.qb", "d,t,s", 0x7c000093, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2647 {"shllv.qh", "d,t,s", 0x7c000297, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2648 {"shllv_s.ph", "d,t,s", 0x7c000393, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2649 {"shllv_s.pw", "d,t,s", 0x7c000597, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2650 {"shllv_s.qh", "d,t,s", 0x7c000397, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2651 {"shllv_s.w", "d,t,s", 0x7c000593, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2652 {"shra.ph", "d,t,4", 0x7c000253, 0xfe0007ff, WR_d|RD_t, 0, D32 }, 2653 {"shra.pw", "d,t,6", 0x7c000457, 0xfc0007ff, WR_d|RD_t, 0, D64 }, 2654 {"shra.qh", "d,t,4", 0x7c000257, 0xfe0007ff, WR_d|RD_t, 0, D64 }, 2655 {"shra_r.ph", "d,t,4", 0x7c000353, 0xfe0007ff, WR_d|RD_t, 0, D32 }, 2656 {"shra_r.pw", "d,t,6", 0x7c000557, 0xfc0007ff, WR_d|RD_t, 0, D64 }, 2657 {"shra_r.qh", "d,t,4", 0x7c000357, 0xfe0007ff, WR_d|RD_t, 0, D64 }, 2658 {"shra_r.w", "d,t,6", 0x7c000553, 0xfc0007ff, WR_d|RD_t, 0, D32 }, 2659 {"shrav.ph", "d,t,s", 0x7c0002d3, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2660 {"shrav.pw", "d,t,s", 0x7c0004d7, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2661 {"shrav.qh", "d,t,s", 0x7c0002d7, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2662 {"shrav_r.ph", "d,t,s", 0x7c0003d3, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2663 {"shrav_r.pw", "d,t,s", 0x7c0005d7, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2664 {"shrav_r.qh", "d,t,s", 0x7c0003d7, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2665 {"shrav_r.w", "d,t,s", 0x7c0005d3, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2666 {"shrl.ob", "d,t,3", 0x7c000057, 0xff0007ff, WR_d|RD_t, 0, D64 }, 2667 {"shrl.qb", "d,t,3", 0x7c000053, 0xff0007ff, WR_d|RD_t, 0, D32 }, 2668 {"shrlv.ob", "d,t,s", 0x7c0000d7, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2669 {"shrlv.qb", "d,t,s", 0x7c0000d3, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2670 {"subq.ph", "d,s,t", 0x7c0002d0, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2671 {"subq.pw", "d,s,t", 0x7c0004d4, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2672 {"subq.qh", "d,s,t", 0x7c0002d4, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2673 {"subq_s.ph", "d,s,t", 0x7c0003d0, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2674 {"subq_s.pw", "d,s,t", 0x7c0005d4, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2675 {"subq_s.qh", "d,s,t", 0x7c0003d4, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2676 {"subq_s.w", "d,s,t", 0x7c0005d0, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2677 {"subu.ob", "d,s,t", 0x7c000054, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2678 {"subu.qb", "d,s,t", 0x7c000050, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2679 {"subu_s.ob", "d,s,t", 0x7c000154, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D64 }, 2680 {"subu_s.qb", "d,s,t", 0x7c000150, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D32 }, 2681 {"wrdsp", "s", 0x7c1ffcf8, 0xfc1fffff, RD_s|DSP_VOLA, 0, D32 }, 2682 {"wrdsp", "s,8", 0x7c0004f8, 0xfc1e07ff, RD_s|DSP_VOLA, 0, D32 }, 2683 /* MIPS DSP ASE Rev2 */ 2684 {"absq_s.qb", "d,t", 0x7c000052, 0xffe007ff, WR_d|RD_t, 0, D33 }, 2685 {"addu.ph", "d,s,t", 0x7c000210, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2686 {"addu_s.ph", "d,s,t", 0x7c000310, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2687 {"adduh.qb", "d,s,t", 0x7c000018, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2688 {"adduh_r.qb", "d,s,t", 0x7c000098, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2689 {"append", "t,s,h", 0x7c000031, 0xfc0007ff, WR_t|RD_t|RD_s, 0, D33 }, 2690 {"balign", "t,s,I", 0, (int) M_BALIGN, INSN_MACRO, 0, D33 }, 2691 {"balign", "t,s,2", 0x7c000431, 0xfc00e7ff, WR_t|RD_t|RD_s, 0, D33 }, 2692 {"cmpgdu.eq.qb", "d,s,t", 0x7c000611, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2693 {"cmpgdu.lt.qb", "d,s,t", 0x7c000651, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2694 {"cmpgdu.le.qb", "d,s,t", 0x7c000691, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2695 {"dpa.w.ph", "7,s,t", 0x7c000030, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2696 {"dps.w.ph", "7,s,t", 0x7c000070, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2697 {"mul.ph", "d,s,t", 0x7c000318, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D33 }, 2698 {"mul_s.ph", "d,s,t", 0x7c000398, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D33 }, 2699 {"mulq_rs.w", "d,s,t", 0x7c0005d8, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D33 }, 2700 {"mulq_s.ph", "d,s,t", 0x7c000790, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D33 }, 2701 {"mulq_s.w", "d,s,t", 0x7c000598, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, 0, D33 }, 2702 {"mulsa.w.ph", "7,s,t", 0x7c0000b0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2703 {"precr.qb.ph", "d,s,t", 0x7c000351, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2704 {"precr_sra.ph.w", "t,s,h", 0x7c000791, 0xfc0007ff, WR_t|RD_t|RD_s, 0, D33 }, 2705 {"precr_sra_r.ph.w", "t,s,h", 0x7c0007d1, 0xfc0007ff, WR_t|RD_t|RD_s, 0, D33 }, 2706 {"prepend", "t,s,h", 0x7c000071, 0xfc0007ff, WR_t|RD_t|RD_s, 0, D33 }, 2707 {"shra.qb", "d,t,3", 0x7c000113, 0xff0007ff, WR_d|RD_t, 0, D33 }, 2708 {"shra_r.qb", "d,t,3", 0x7c000153, 0xff0007ff, WR_d|RD_t, 0, D33 }, 2709 {"shrav.qb", "d,t,s", 0x7c000193, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2710 {"shrav_r.qb", "d,t,s", 0x7c0001d3, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2711 {"shrl.ph", "d,t,4", 0x7c000653, 0xfe0007ff, WR_d|RD_t, 0, D33 }, 2712 {"shrlv.ph", "d,t,s", 0x7c0006d3, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2713 {"subu.ph", "d,s,t", 0x7c000250, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2714 {"subu_s.ph", "d,s,t", 0x7c000350, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2715 {"subuh.qb", "d,s,t", 0x7c000058, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2716 {"subuh_r.qb", "d,s,t", 0x7c0000d8, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2717 {"addqh.ph", "d,s,t", 0x7c000218, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2718 {"addqh_r.ph", "d,s,t", 0x7c000298, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2719 {"addqh.w", "d,s,t", 0x7c000418, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2720 {"addqh_r.w", "d,s,t", 0x7c000498, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2721 {"subqh.ph", "d,s,t", 0x7c000258, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2722 {"subqh_r.ph", "d,s,t", 0x7c0002d8, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2723 {"subqh.w", "d,s,t", 0x7c000458, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2724 {"subqh_r.w", "d,s,t", 0x7c0004d8, 0xfc0007ff, WR_d|RD_s|RD_t, 0, D33 }, 2725 {"dpax.w.ph", "7,s,t", 0x7c000230, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2726 {"dpsx.w.ph", "7,s,t", 0x7c000270, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2727 {"dpaqx_s.w.ph", "7,s,t", 0x7c000630, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2728 {"dpaqx_sa.w.ph", "7,s,t", 0x7c0006b0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2729 {"dpsqx_s.w.ph", "7,s,t", 0x7c000670, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2730 {"dpsqx_sa.w.ph", "7,s,t", 0x7c0006f0, 0xfc00e7ff, MOD_a|RD_s|RD_t, 0, D33 }, 2731 /* Move bc0* after mftr and mttr to avoid opcode collision. */ 2732 {"bc0f", "p", 0x41000000, 0xffff0000, CBD|RD_CC, 0, I1 }, 2733 {"bc0fl", "p", 0x41020000, 0xffff0000, CBL|RD_CC, 0, I2|T3 }, 2734 {"bc0t", "p", 0x41010000, 0xffff0000, CBD|RD_CC, 0, I1 }, 2735 {"bc0tl", "p", 0x41030000, 0xffff0000, CBL|RD_CC, 0, I2|T3 }, 2736 /* ST Microelectronics Loongson-2E and -2F. */ 2737 {"mult.g", "d,s,t", 0x7c000018, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2738 {"mult.g", "d,s,t", 0x70000010, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2739 {"multu.g", "d,s,t", 0x7c000019, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2740 {"multu.g", "d,s,t", 0x70000012, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2741 {"dmult.g", "d,s,t", 0x7c00001c, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2742 {"dmult.g", "d,s,t", 0x70000011, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2743 {"dmultu.g", "d,s,t", 0x7c00001d, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2744 {"dmultu.g", "d,s,t", 0x70000013, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2745 {"div.g", "d,s,t", 0x7c00001a, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2746 {"div.g", "d,s,t", 0x70000014, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2747 {"divu.g", "d,s,t", 0x7c00001b, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2748 {"divu.g", "d,s,t", 0x70000016, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2749 {"ddiv.g", "d,s,t", 0x7c00001e, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2750 {"ddiv.g", "d,s,t", 0x70000015, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2751 {"ddivu.g", "d,s,t", 0x7c00001f, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2752 {"ddivu.g", "d,s,t", 0x70000017, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2753 {"mod.g", "d,s,t", 0x7c000022, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2754 {"mod.g", "d,s,t", 0x7000001c, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2755 {"modu.g", "d,s,t", 0x7c000023, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2756 {"modu.g", "d,s,t", 0x7000001e, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2757 {"dmod.g", "d,s,t", 0x7c000026, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2758 {"dmod.g", "d,s,t", 0x7000001d, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2759 {"dmodu.g", "d,s,t", 0x7c000027, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2E }, 2760 {"dmodu.g", "d,s,t", 0x7000001f, 0xfc0007ff, RD_s|RD_t|WR_d, 0, IL2F }, 2761 }; 2762 2763 #define MIPS_NUM_OPCODES \ 2764 ((sizeof mips_builtin_opcodes) / (sizeof (mips_builtin_opcodes[0]))) 2765 const int bfd_mips_num_builtin_opcodes = MIPS_NUM_OPCODES; 2766 2767 /* const removed from the following to allow for dynamic extensions to the 2768 * built-in instruction set. */ 2769 struct mips_opcode *mips_opcodes = 2770 (struct mips_opcode *) mips_builtin_opcodes; 2771 int bfd_mips_num_opcodes = MIPS_NUM_OPCODES; 2772 #undef MIPS_NUM_OPCODES 2773 2774 /* Mips instructions are at maximum this many bytes long. */ 2775 #define INSNLEN 4 2776 2777 2778 /* FIXME: These should be shared with gdb somehow. */ 2780 2781 struct mips_cp0sel_name 2782 { 2783 unsigned int cp0reg; 2784 unsigned int sel; 2785 const char * const name; 2786 }; 2787 2788 /* The mips16 registers. */ 2789 static const unsigned int mips16_to_32_reg_map[] = 2790 { 2791 16, 17, 2, 3, 4, 5, 6, 7 2792 }; 2793 2794 #define mips16_reg_names(rn) mips_gpr_names[mips16_to_32_reg_map[rn]] 2795 2796 2797 static const char * const mips_gpr_names_numeric[32] = 2798 { 2799 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 2800 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 2801 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 2802 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31" 2803 }; 2804 2805 static const char * const mips_gpr_names_oldabi[32] = 2806 { 2807 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", 2808 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", 2809 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 2810 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" 2811 }; 2812 2813 static const char * const mips_gpr_names_newabi[32] = 2814 { 2815 "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", 2816 "a4", "a5", "a6", "a7", "t0", "t1", "t2", "t3", 2817 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", 2818 "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra" 2819 }; 2820 2821 static const char * const mips_fpr_names_numeric[32] = 2822 { 2823 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", 2824 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", 2825 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", 2826 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31" 2827 }; 2828 2829 static const char * const mips_fpr_names_32[32] = 2830 { 2831 "fv0", "fv0f", "fv1", "fv1f", "ft0", "ft0f", "ft1", "ft1f", 2832 "ft2", "ft2f", "ft3", "ft3f", "fa0", "fa0f", "fa1", "fa1f", 2833 "ft4", "ft4f", "ft5", "ft5f", "fs0", "fs0f", "fs1", "fs1f", 2834 "fs2", "fs2f", "fs3", "fs3f", "fs4", "fs4f", "fs5", "fs5f" 2835 }; 2836 2837 static const char * const mips_fpr_names_n32[32] = 2838 { 2839 "fv0", "ft14", "fv1", "ft15", "ft0", "ft1", "ft2", "ft3", 2840 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3", 2841 "fa4", "fa5", "fa6", "fa7", "fs0", "ft8", "fs1", "ft9", 2842 "fs2", "ft10", "fs3", "ft11", "fs4", "ft12", "fs5", "ft13" 2843 }; 2844 2845 static const char * const mips_fpr_names_64[32] = 2846 { 2847 "fv0", "ft12", "fv1", "ft13", "ft0", "ft1", "ft2", "ft3", 2848 "ft4", "ft5", "ft6", "ft7", "fa0", "fa1", "fa2", "fa3", 2849 "fa4", "fa5", "fa6", "fa7", "ft8", "ft9", "ft10", "ft11", 2850 "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7" 2851 }; 2852 2853 static const char * const mips_cp0_names_numeric[32] = 2854 { 2855 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 2856 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 2857 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 2858 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31" 2859 }; 2860 2861 static const char * const mips_cp0_names_mips3264[32] = 2862 { 2863 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1", 2864 "c0_context", "c0_pagemask", "c0_wired", "$7", 2865 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare", 2866 "c0_status", "c0_cause", "c0_epc", "c0_prid", 2867 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi", 2868 "c0_xcontext", "$21", "$22", "c0_debug", 2869 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr", 2870 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave", 2871 }; 2872 2873 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264[] = 2874 { 2875 { 4, 1, "c0_contextconfig" }, 2876 { 0, 1, "c0_mvpcontrol" }, 2877 { 0, 2, "c0_mvpconf0" }, 2878 { 0, 3, "c0_mvpconf1" }, 2879 { 1, 1, "c0_vpecontrol" }, 2880 { 1, 2, "c0_vpeconf0" }, 2881 { 1, 3, "c0_vpeconf1" }, 2882 { 1, 4, "c0_yqmask" }, 2883 { 1, 5, "c0_vpeschedule" }, 2884 { 1, 6, "c0_vpeschefback" }, 2885 { 2, 1, "c0_tcstatus" }, 2886 { 2, 2, "c0_tcbind" }, 2887 { 2, 3, "c0_tcrestart" }, 2888 { 2, 4, "c0_tchalt" }, 2889 { 2, 5, "c0_tccontext" }, 2890 { 2, 6, "c0_tcschedule" }, 2891 { 2, 7, "c0_tcschefback" }, 2892 { 5, 1, "c0_pagegrain" }, 2893 { 6, 1, "c0_srsconf0" }, 2894 { 6, 2, "c0_srsconf1" }, 2895 { 6, 3, "c0_srsconf2" }, 2896 { 6, 4, "c0_srsconf3" }, 2897 { 6, 5, "c0_srsconf4" }, 2898 { 12, 1, "c0_intctl" }, 2899 { 12, 2, "c0_srsctl" }, 2900 { 12, 3, "c0_srsmap" }, 2901 { 15, 1, "c0_ebase" }, 2902 { 16, 1, "c0_config1" }, 2903 { 16, 2, "c0_config2" }, 2904 { 16, 3, "c0_config3" }, 2905 { 18, 1, "c0_watchlo,1" }, 2906 { 18, 2, "c0_watchlo,2" }, 2907 { 18, 3, "c0_watchlo,3" }, 2908 { 18, 4, "c0_watchlo,4" }, 2909 { 18, 5, "c0_watchlo,5" }, 2910 { 18, 6, "c0_watchlo,6" }, 2911 { 18, 7, "c0_watchlo,7" }, 2912 { 19, 1, "c0_watchhi,1" }, 2913 { 19, 2, "c0_watchhi,2" }, 2914 { 19, 3, "c0_watchhi,3" }, 2915 { 19, 4, "c0_watchhi,4" }, 2916 { 19, 5, "c0_watchhi,5" }, 2917 { 19, 6, "c0_watchhi,6" }, 2918 { 19, 7, "c0_watchhi,7" }, 2919 { 23, 1, "c0_tracecontrol" }, 2920 { 23, 2, "c0_tracecontrol2" }, 2921 { 23, 3, "c0_usertracedata" }, 2922 { 23, 4, "c0_tracebpc" }, 2923 { 25, 1, "c0_perfcnt,1" }, 2924 { 25, 2, "c0_perfcnt,2" }, 2925 { 25, 3, "c0_perfcnt,3" }, 2926 { 25, 4, "c0_perfcnt,4" }, 2927 { 25, 5, "c0_perfcnt,5" }, 2928 { 25, 6, "c0_perfcnt,6" }, 2929 { 25, 7, "c0_perfcnt,7" }, 2930 { 27, 1, "c0_cacheerr,1" }, 2931 { 27, 2, "c0_cacheerr,2" }, 2932 { 27, 3, "c0_cacheerr,3" }, 2933 { 28, 1, "c0_datalo" }, 2934 { 28, 2, "c0_taglo1" }, 2935 { 28, 3, "c0_datalo1" }, 2936 { 28, 4, "c0_taglo2" }, 2937 { 28, 5, "c0_datalo2" }, 2938 { 28, 6, "c0_taglo3" }, 2939 { 28, 7, "c0_datalo3" }, 2940 { 29, 1, "c0_datahi" }, 2941 { 29, 2, "c0_taghi1" }, 2942 { 29, 3, "c0_datahi1" }, 2943 { 29, 4, "c0_taghi2" }, 2944 { 29, 5, "c0_datahi2" }, 2945 { 29, 6, "c0_taghi3" }, 2946 { 29, 7, "c0_datahi3" }, 2947 }; 2948 2949 static const char * const mips_cp0_names_mips3264r2[32] = 2950 { 2951 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1", 2952 "c0_context", "c0_pagemask", "c0_wired", "c0_hwrena", 2953 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare", 2954 "c0_status", "c0_cause", "c0_epc", "c0_prid", 2955 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi", 2956 "c0_xcontext", "$21", "$22", "c0_debug", 2957 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr", 2958 "c0_taglo", "c0_taghi", "c0_errorepc", "c0_desave", 2959 }; 2960 2961 static const struct mips_cp0sel_name mips_cp0sel_names_mips3264r2[] = 2962 { 2963 { 4, 1, "c0_contextconfig" }, 2964 { 5, 1, "c0_pagegrain" }, 2965 { 12, 1, "c0_intctl" }, 2966 { 12, 2, "c0_srsctl" }, 2967 { 12, 3, "c0_srsmap" }, 2968 { 15, 1, "c0_ebase" }, 2969 { 16, 1, "c0_config1" }, 2970 { 16, 2, "c0_config2" }, 2971 { 16, 3, "c0_config3" }, 2972 { 18, 1, "c0_watchlo,1" }, 2973 { 18, 2, "c0_watchlo,2" }, 2974 { 18, 3, "c0_watchlo,3" }, 2975 { 18, 4, "c0_watchlo,4" }, 2976 { 18, 5, "c0_watchlo,5" }, 2977 { 18, 6, "c0_watchlo,6" }, 2978 { 18, 7, "c0_watchlo,7" }, 2979 { 19, 1, "c0_watchhi,1" }, 2980 { 19, 2, "c0_watchhi,2" }, 2981 { 19, 3, "c0_watchhi,3" }, 2982 { 19, 4, "c0_watchhi,4" }, 2983 { 19, 5, "c0_watchhi,5" }, 2984 { 19, 6, "c0_watchhi,6" }, 2985 { 19, 7, "c0_watchhi,7" }, 2986 { 23, 1, "c0_tracecontrol" }, 2987 { 23, 2, "c0_tracecontrol2" }, 2988 { 23, 3, "c0_usertracedata" }, 2989 { 23, 4, "c0_tracebpc" }, 2990 { 25, 1, "c0_perfcnt,1" }, 2991 { 25, 2, "c0_perfcnt,2" }, 2992 { 25, 3, "c0_perfcnt,3" }, 2993 { 25, 4, "c0_perfcnt,4" }, 2994 { 25, 5, "c0_perfcnt,5" }, 2995 { 25, 6, "c0_perfcnt,6" }, 2996 { 25, 7, "c0_perfcnt,7" }, 2997 { 27, 1, "c0_cacheerr,1" }, 2998 { 27, 2, "c0_cacheerr,2" }, 2999 { 27, 3, "c0_cacheerr,3" }, 3000 { 28, 1, "c0_datalo" }, 3001 { 28, 2, "c0_taglo1" }, 3002 { 28, 3, "c0_datalo1" }, 3003 { 28, 4, "c0_taglo2" }, 3004 { 28, 5, "c0_datalo2" }, 3005 { 28, 6, "c0_taglo3" }, 3006 { 28, 7, "c0_datalo3" }, 3007 { 29, 1, "c0_datahi" }, 3008 { 29, 2, "c0_taghi1" }, 3009 { 29, 3, "c0_datahi1" }, 3010 { 29, 4, "c0_taghi2" }, 3011 { 29, 5, "c0_datahi2" }, 3012 { 29, 6, "c0_taghi3" }, 3013 { 29, 7, "c0_datahi3" }, 3014 }; 3015 3016 /* SB-1: MIPS64 (mips_cp0_names_mips3264) with minor mods. */ 3017 static const char * const mips_cp0_names_sb1[32] = 3018 { 3019 "c0_index", "c0_random", "c0_entrylo0", "c0_entrylo1", 3020 "c0_context", "c0_pagemask", "c0_wired", "$7", 3021 "c0_badvaddr", "c0_count", "c0_entryhi", "c0_compare", 3022 "c0_status", "c0_cause", "c0_epc", "c0_prid", 3023 "c0_config", "c0_lladdr", "c0_watchlo", "c0_watchhi", 3024 "c0_xcontext", "$21", "$22", "c0_debug", 3025 "c0_depc", "c0_perfcnt", "c0_errctl", "c0_cacheerr_i", 3026 "c0_taglo_i", "c0_taghi_i", "c0_errorepc", "c0_desave", 3027 }; 3028 3029 static const struct mips_cp0sel_name mips_cp0sel_names_sb1[] = 3030 { 3031 { 16, 1, "c0_config1" }, 3032 { 18, 1, "c0_watchlo,1" }, 3033 { 19, 1, "c0_watchhi,1" }, 3034 { 22, 0, "c0_perftrace" }, 3035 { 23, 3, "c0_edebug" }, 3036 { 25, 1, "c0_perfcnt,1" }, 3037 { 25, 2, "c0_perfcnt,2" }, 3038 { 25, 3, "c0_perfcnt,3" }, 3039 { 25, 4, "c0_perfcnt,4" }, 3040 { 25, 5, "c0_perfcnt,5" }, 3041 { 25, 6, "c0_perfcnt,6" }, 3042 { 25, 7, "c0_perfcnt,7" }, 3043 { 26, 1, "c0_buserr_pa" }, 3044 { 27, 1, "c0_cacheerr_d" }, 3045 { 27, 3, "c0_cacheerr_d_pa" }, 3046 { 28, 1, "c0_datalo_i" }, 3047 { 28, 2, "c0_taglo_d" }, 3048 { 28, 3, "c0_datalo_d" }, 3049 { 29, 1, "c0_datahi_i" }, 3050 { 29, 2, "c0_taghi_d" }, 3051 { 29, 3, "c0_datahi_d" }, 3052 }; 3053 3054 static const char * const mips_hwr_names_numeric[32] = 3055 { 3056 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7", 3057 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 3058 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 3059 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31" 3060 }; 3061 3062 static const char * const mips_hwr_names_mips3264r2[32] = 3063 { 3064 "hwr_cpunum", "hwr_synci_step", "hwr_cc", "hwr_ccres", 3065 "$4", "$5", "$6", "$7", 3066 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", 3067 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23", 3068 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31" 3069 }; 3070 3071 struct mips_abi_choice 3072 { 3073 const char *name; 3074 const char * const *gpr_names; 3075 const char * const *fpr_names; 3076 }; 3077 3078 static struct mips_abi_choice mips_abi_choices[] = 3079 { 3080 { "numeric", mips_gpr_names_numeric, mips_fpr_names_numeric }, 3081 { "32", mips_gpr_names_oldabi, mips_fpr_names_32 }, 3082 { "n32", mips_gpr_names_newabi, mips_fpr_names_n32 }, 3083 { "64", mips_gpr_names_newabi, mips_fpr_names_64 }, 3084 }; 3085 3086 struct mips_arch_choice 3087 { 3088 const char *name; 3089 int bfd_mach_valid; 3090 unsigned long bfd_mach; 3091 int processor; 3092 int isa; 3093 const char * const *cp0_names; 3094 const struct mips_cp0sel_name *cp0sel_names; 3095 unsigned int cp0sel_names_len; 3096 const char * const *hwr_names; 3097 }; 3098 3099 #define bfd_mach_mips3000 3000 3100 #define bfd_mach_mips3900 3900 3101 #define bfd_mach_mips4000 4000 3102 #define bfd_mach_mips4010 4010 3103 #define bfd_mach_mips4100 4100 3104 #define bfd_mach_mips4111 4111 3105 #define bfd_mach_mips4120 4120 3106 #define bfd_mach_mips4300 4300 3107 #define bfd_mach_mips4400 4400 3108 #define bfd_mach_mips4600 4600 3109 #define bfd_mach_mips4650 4650 3110 #define bfd_mach_mips5000 5000 3111 #define bfd_mach_mips5400 5400 3112 #define bfd_mach_mips5500 5500 3113 #define bfd_mach_mips6000 6000 3114 #define bfd_mach_mips7000 7000 3115 #define bfd_mach_mips8000 8000 3116 #define bfd_mach_mips9000 9000 3117 #define bfd_mach_mips10000 10000 3118 #define bfd_mach_mips12000 12000 3119 #define bfd_mach_mips16 16 3120 #define bfd_mach_mips5 5 3121 #define bfd_mach_mips_sb1 12310201 /* octal 'SB', 01 */ 3122 #define bfd_mach_mipsisa32 32 3123 #define bfd_mach_mipsisa32r2 33 3124 #define bfd_mach_mipsisa64 64 3125 #define bfd_mach_mipsisa64r2 65 3126 3127 static const struct mips_arch_choice mips_arch_choices[] = 3128 { 3129 { "numeric", 0, 0, 0, 0, 3130 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3131 3132 { "r3000", 1, bfd_mach_mips3000, CPU_R3000, ISA_MIPS1, 3133 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3134 { "r3900", 1, bfd_mach_mips3900, CPU_R3900, ISA_MIPS1, 3135 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3136 { "r4000", 1, bfd_mach_mips4000, CPU_R4000, ISA_MIPS3, 3137 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3138 { "r4010", 1, bfd_mach_mips4010, CPU_R4010, ISA_MIPS2, 3139 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3140 { "vr4100", 1, bfd_mach_mips4100, CPU_VR4100, ISA_MIPS3, 3141 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3142 { "vr4111", 1, bfd_mach_mips4111, CPU_R4111, ISA_MIPS3, 3143 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3144 { "vr4120", 1, bfd_mach_mips4120, CPU_VR4120, ISA_MIPS3, 3145 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3146 { "r4300", 1, bfd_mach_mips4300, CPU_R4300, ISA_MIPS3, 3147 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3148 { "r4400", 1, bfd_mach_mips4400, CPU_R4400, ISA_MIPS3, 3149 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3150 { "r4600", 1, bfd_mach_mips4600, CPU_R4600, ISA_MIPS3, 3151 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3152 { "r4650", 1, bfd_mach_mips4650, CPU_R4650, ISA_MIPS3, 3153 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3154 { "r5000", 1, bfd_mach_mips5000, CPU_R5000, ISA_MIPS4, 3155 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3156 { "vr5400", 1, bfd_mach_mips5400, CPU_VR5400, ISA_MIPS4, 3157 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3158 { "vr5500", 1, bfd_mach_mips5500, CPU_VR5500, ISA_MIPS4, 3159 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3160 { "r6000", 1, bfd_mach_mips6000, CPU_R6000, ISA_MIPS2, 3161 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3162 { "rm7000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4, 3163 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3164 { "rm9000", 1, bfd_mach_mips7000, CPU_RM7000, ISA_MIPS4, 3165 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3166 { "r8000", 1, bfd_mach_mips8000, CPU_R8000, ISA_MIPS4, 3167 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3168 { "r10000", 1, bfd_mach_mips10000, CPU_R10000, ISA_MIPS4, 3169 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3170 { "r12000", 1, bfd_mach_mips12000, CPU_R12000, ISA_MIPS4, 3171 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3172 { "mips5", 1, bfd_mach_mips5, CPU_MIPS5, ISA_MIPS5, 3173 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3174 3175 /* For stock MIPS32, disassemble all applicable MIPS-specified ASEs. 3176 Note that MIPS-3D and MDMX are not applicable to MIPS32. (See 3177 _MIPS32 Architecture For Programmers Volume I: Introduction to the 3178 MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95), 3179 page 1. */ 3180 { "mips32", 1, bfd_mach_mipsisa32, CPU_MIPS32, 3181 ISA_MIPS32 | INSN_MIPS16 | INSN_SMARTMIPS, 3182 mips_cp0_names_mips3264, 3183 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264), 3184 mips_hwr_names_numeric }, 3185 3186 { "mips32r2", 1, bfd_mach_mipsisa32r2, CPU_MIPS32R2, 3187 (ISA_MIPS32R2 | INSN_MIPS16 | INSN_SMARTMIPS | INSN_DSP | INSN_DSPR2 3188 | INSN_MIPS3D | INSN_MT), 3189 mips_cp0_names_mips3264r2, 3190 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2), 3191 mips_hwr_names_mips3264r2 }, 3192 3193 /* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */ 3194 { "mips64", 1, bfd_mach_mipsisa64, CPU_MIPS64, 3195 ISA_MIPS64 | INSN_MIPS16 | INSN_MIPS3D | INSN_MDMX, 3196 mips_cp0_names_mips3264, 3197 mips_cp0sel_names_mips3264, ARRAY_SIZE (mips_cp0sel_names_mips3264), 3198 mips_hwr_names_numeric }, 3199 3200 { "mips64r2", 1, bfd_mach_mipsisa64r2, CPU_MIPS64R2, 3201 (ISA_MIPS64R2 | INSN_MIPS16 | INSN_MIPS3D | INSN_DSP | INSN_DSPR2 3202 | INSN_DSP64 | INSN_MT | INSN_MDMX), 3203 mips_cp0_names_mips3264r2, 3204 mips_cp0sel_names_mips3264r2, ARRAY_SIZE (mips_cp0sel_names_mips3264r2), 3205 mips_hwr_names_mips3264r2 }, 3206 3207 { "sb1", 1, bfd_mach_mips_sb1, CPU_SB1, 3208 ISA_MIPS64 | INSN_MIPS3D | INSN_SB1, 3209 mips_cp0_names_sb1, 3210 mips_cp0sel_names_sb1, ARRAY_SIZE (mips_cp0sel_names_sb1), 3211 mips_hwr_names_numeric }, 3212 3213 /* This entry, mips16, is here only for ISA/processor selection; do 3214 not print its name. */ 3215 { "", 1, bfd_mach_mips16, CPU_MIPS16, ISA_MIPS3 | INSN_MIPS16, 3216 mips_cp0_names_numeric, NULL, 0, mips_hwr_names_numeric }, 3217 }; 3218 3219 /* ISA and processor type to disassemble for, and register names to use. 3220 set_default_mips_dis_options and parse_mips_dis_options fill in these 3221 values. */ 3222 static int mips_processor; 3223 static int mips_isa; 3224 static const char * const *mips_gpr_names; 3225 static const char * const *mips_fpr_names; 3226 static const char * const *mips_cp0_names; 3227 static const struct mips_cp0sel_name *mips_cp0sel_names; 3228 static int mips_cp0sel_names_len; 3229 static const char * const *mips_hwr_names; 3230 3231 /* Other options */ 3232 static int no_aliases; /* If set disassemble as most general inst. */ 3233 3234 static const struct mips_abi_choice * 3236 choose_abi_by_name (const char *name, unsigned int namelen) 3237 { 3238 const struct mips_abi_choice *c; 3239 unsigned int i; 3240 3241 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_abi_choices) && c == NULL; i++) 3242 if (strncmp (mips_abi_choices[i].name, name, namelen) == 0 3243 && strlen (mips_abi_choices[i].name) == namelen) 3244 c = &mips_abi_choices[i]; 3245 3246 return c; 3247 } 3248 3249 static const struct mips_arch_choice * 3250 choose_arch_by_name (const char *name, unsigned int namelen) 3251 { 3252 const struct mips_arch_choice *c = NULL; 3253 unsigned int i; 3254 3255 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++) 3256 if (strncmp (mips_arch_choices[i].name, name, namelen) == 0 3257 && strlen (mips_arch_choices[i].name) == namelen) 3258 c = &mips_arch_choices[i]; 3259 3260 return c; 3261 } 3262 3263 static const struct mips_arch_choice * 3264 choose_arch_by_number (unsigned long mach) 3265 { 3266 static unsigned long hint_bfd_mach; 3267 static const struct mips_arch_choice *hint_arch_choice; 3268 const struct mips_arch_choice *c; 3269 unsigned int i; 3270 3271 /* We optimize this because even if the user specifies no 3272 flags, this will be done for every instruction! */ 3273 if (hint_bfd_mach == mach 3274 && hint_arch_choice != NULL 3275 && hint_arch_choice->bfd_mach == hint_bfd_mach) 3276 return hint_arch_choice; 3277 3278 for (i = 0, c = NULL; i < ARRAY_SIZE (mips_arch_choices) && c == NULL; i++) 3279 { 3280 if (mips_arch_choices[i].bfd_mach_valid 3281 && mips_arch_choices[i].bfd_mach == mach) 3282 { 3283 c = &mips_arch_choices[i]; 3284 hint_bfd_mach = mach; 3285 hint_arch_choice = c; 3286 } 3287 } 3288 return c; 3289 } 3290 3291 static void 3292 set_default_mips_dis_options (struct disassemble_info *info) 3293 { 3294 const struct mips_arch_choice *chosen_arch; 3295 3296 /* Defaults: mipsIII/r3000 (?!), (o)32-style ("oldabi") GPR names, 3297 and numeric FPR, CP0 register, and HWR names. */ 3298 mips_isa = ISA_MIPS3; 3299 mips_processor = CPU_R3000; 3300 mips_gpr_names = mips_gpr_names_oldabi; 3301 mips_fpr_names = mips_fpr_names_numeric; 3302 mips_cp0_names = mips_cp0_names_numeric; 3303 mips_cp0sel_names = NULL; 3304 mips_cp0sel_names_len = 0; 3305 mips_hwr_names = mips_hwr_names_numeric; 3306 no_aliases = 0; 3307 3308 /* If an ELF "newabi" binary, use the n32/(n)64 GPR names. */ 3309 #if 0 3310 if (info->flavour == bfd_target_elf_flavour && info->section != NULL) 3311 { 3312 Elf_Internal_Ehdr *header; 3313 3314 header = elf_elfheader (info->section->owner); 3315 if (is_newabi (header)) 3316 mips_gpr_names = mips_gpr_names_newabi; 3317 } 3318 #endif 3319 3320 /* Set ISA, architecture, and cp0 register names as best we can. */ 3321 #if !defined(SYMTAB_AVAILABLE) && 0 3322 /* This is running out on a target machine, not in a host tool. 3323 FIXME: Where does mips_target_info come from? */ 3324 target_processor = mips_target_info.processor; 3325 mips_isa = mips_target_info.isa; 3326 #else 3327 chosen_arch = choose_arch_by_number (info->mach); 3328 if (chosen_arch != NULL) 3329 { 3330 mips_processor = chosen_arch->processor; 3331 mips_isa = chosen_arch->isa; 3332 mips_cp0_names = chosen_arch->cp0_names; 3333 mips_cp0sel_names = chosen_arch->cp0sel_names; 3334 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len; 3335 mips_hwr_names = chosen_arch->hwr_names; 3336 } 3337 #endif 3338 } 3339 3340 static void 3341 parse_mips_dis_option (const char *option, unsigned int len) 3342 { 3343 unsigned int i, optionlen, vallen; 3344 const char *val; 3345 const struct mips_abi_choice *chosen_abi; 3346 const struct mips_arch_choice *chosen_arch; 3347 3348 /* Look for the = that delimits the end of the option name. */ 3349 for (i = 0; i < len; i++) 3350 { 3351 if (option[i] == '=') 3352 break; 3353 } 3354 if (i == 0) /* Invalid option: no name before '='. */ 3355 return; 3356 if (i == len) /* Invalid option: no '='. */ 3357 return; 3358 if (i == (len - 1)) /* Invalid option: no value after '='. */ 3359 return; 3360 3361 optionlen = i; 3362 val = option + (optionlen + 1); 3363 vallen = len - (optionlen + 1); 3364 3365 if (strncmp("gpr-names", option, optionlen) == 0 3366 && strlen("gpr-names") == optionlen) 3367 { 3368 chosen_abi = choose_abi_by_name (val, vallen); 3369 if (chosen_abi != NULL) 3370 mips_gpr_names = chosen_abi->gpr_names; 3371 return; 3372 } 3373 3374 if (strncmp("fpr-names", option, optionlen) == 0 3375 && strlen("fpr-names") == optionlen) 3376 { 3377 chosen_abi = choose_abi_by_name (val, vallen); 3378 if (chosen_abi != NULL) 3379 mips_fpr_names = chosen_abi->fpr_names; 3380 return; 3381 } 3382 3383 if (strncmp("cp0-names", option, optionlen) == 0 3384 && strlen("cp0-names") == optionlen) 3385 { 3386 chosen_arch = choose_arch_by_name (val, vallen); 3387 if (chosen_arch != NULL) 3388 { 3389 mips_cp0_names = chosen_arch->cp0_names; 3390 mips_cp0sel_names = chosen_arch->cp0sel_names; 3391 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len; 3392 } 3393 return; 3394 } 3395 3396 if (strncmp("hwr-names", option, optionlen) == 0 3397 && strlen("hwr-names") == optionlen) 3398 { 3399 chosen_arch = choose_arch_by_name (val, vallen); 3400 if (chosen_arch != NULL) 3401 mips_hwr_names = chosen_arch->hwr_names; 3402 return; 3403 } 3404 3405 if (strncmp("reg-names", option, optionlen) == 0 3406 && strlen("reg-names") == optionlen) 3407 { 3408 /* We check both ABI and ARCH here unconditionally, so 3409 that "numeric" will do the desirable thing: select 3410 numeric register names for all registers. Other than 3411 that, a given name probably won't match both. */ 3412 chosen_abi = choose_abi_by_name (val, vallen); 3413 if (chosen_abi != NULL) 3414 { 3415 mips_gpr_names = chosen_abi->gpr_names; 3416 mips_fpr_names = chosen_abi->fpr_names; 3417 } 3418 chosen_arch = choose_arch_by_name (val, vallen); 3419 if (chosen_arch != NULL) 3420 { 3421 mips_cp0_names = chosen_arch->cp0_names; 3422 mips_cp0sel_names = chosen_arch->cp0sel_names; 3423 mips_cp0sel_names_len = chosen_arch->cp0sel_names_len; 3424 mips_hwr_names = chosen_arch->hwr_names; 3425 } 3426 return; 3427 } 3428 3429 /* Invalid option. */ 3430 } 3431 3432 static void 3433 parse_mips_dis_options (const char *options) 3434 { 3435 const char *option_end; 3436 3437 if (options == NULL) 3438 return; 3439 3440 while (*options != '\0') 3441 { 3442 /* Skip empty options. */ 3443 if (*options == ',') 3444 { 3445 options++; 3446 continue; 3447 } 3448 3449 /* We know that *options is neither NUL or a comma. */ 3450 option_end = options + 1; 3451 while (*option_end != ',' && *option_end != '\0') 3452 option_end++; 3453 3454 parse_mips_dis_option (options, option_end - options); 3455 3456 /* Go on to the next one. If option_end points to a comma, it 3457 will be skipped above. */ 3458 options = option_end; 3459 } 3460 } 3461 3462 static const struct mips_cp0sel_name * 3463 lookup_mips_cp0sel_name (const struct mips_cp0sel_name *names, 3464 unsigned int len, 3465 unsigned int cp0reg, 3466 unsigned int sel) 3467 { 3468 unsigned int i; 3469 3470 for (i = 0; i < len; i++) 3471 if (names[i].cp0reg == cp0reg && names[i].sel == sel) 3472 return &names[i]; 3473 return NULL; 3474 } 3475 3476 /* Print insn arguments for 32/64-bit code. */ 3478 3479 static void 3480 print_insn_args (const char *d, 3481 register unsigned long int l, 3482 bfd_vma pc, 3483 struct disassemble_info *info, 3484 const struct mips_opcode *opp) 3485 { 3486 int op, delta; 3487 unsigned int lsb, msb, msbd; 3488 3489 lsb = 0; 3490 3491 for (; *d != '\0'; d++) 3492 { 3493 switch (*d) 3494 { 3495 case ',': 3496 case '(': 3497 case ')': 3498 case '[': 3499 case ']': 3500 (*info->fprintf_func) (info->stream, "%c", *d); 3501 break; 3502 3503 case '+': 3504 /* Extension character; switch for second char. */ 3505 d++; 3506 switch (*d) 3507 { 3508 case '\0': 3509 /* xgettext:c-format */ 3510 (*info->fprintf_func) (info->stream, 3511 _("# internal error, incomplete extension sequence (+)")); 3512 return; 3513 3514 case 'A': 3515 lsb = (l >> OP_SH_SHAMT) & OP_MASK_SHAMT; 3516 (*info->fprintf_func) (info->stream, "0x%x", lsb); 3517 break; 3518 3519 case 'B': 3520 msb = (l >> OP_SH_INSMSB) & OP_MASK_INSMSB; 3521 (*info->fprintf_func) (info->stream, "0x%x", msb - lsb + 1); 3522 break; 3523 3524 case '1': 3525 (*info->fprintf_func) (info->stream, "0x%lx", 3526 (l >> OP_SH_UDI1) & OP_MASK_UDI1); 3527 break; 3528 3529 case '2': 3530 (*info->fprintf_func) (info->stream, "0x%lx", 3531 (l >> OP_SH_UDI2) & OP_MASK_UDI2); 3532 break; 3533 3534 case '3': 3535 (*info->fprintf_func) (info->stream, "0x%lx", 3536 (l >> OP_SH_UDI3) & OP_MASK_UDI3); 3537 break; 3538 3539 case '4': 3540 (*info->fprintf_func) (info->stream, "0x%lx", 3541 (l >> OP_SH_UDI4) & OP_MASK_UDI4); 3542 break; 3543 3544 case 'C': 3545 case 'H': 3546 msbd = (l >> OP_SH_EXTMSBD) & OP_MASK_EXTMSBD; 3547 (*info->fprintf_func) (info->stream, "0x%x", msbd + 1); 3548 break; 3549 3550 case 'D': 3551 { 3552 const struct mips_cp0sel_name *n; 3553 unsigned int cp0reg, sel; 3554 3555 cp0reg = (l >> OP_SH_RD) & OP_MASK_RD; 3556 sel = (l >> OP_SH_SEL) & OP_MASK_SEL; 3557 3558 /* CP0 register including 'sel' code for mtcN (et al.), to be 3559 printed textually if known. If not known, print both 3560 CP0 register name and sel numerically since CP0 register 3561 with sel 0 may have a name unrelated to register being 3562 printed. */ 3563 n = lookup_mips_cp0sel_name(mips_cp0sel_names, 3564 mips_cp0sel_names_len, cp0reg, sel); 3565 if (n != NULL) 3566 (*info->fprintf_func) (info->stream, "%s", n->name); 3567 else 3568 (*info->fprintf_func) (info->stream, "$%d,%d", cp0reg, sel); 3569 break; 3570 } 3571 3572 case 'E': 3573 lsb = ((l >> OP_SH_SHAMT) & OP_MASK_SHAMT) + 32; 3574 (*info->fprintf_func) (info->stream, "0x%x", lsb); 3575 break; 3576 3577 case 'F': 3578 msb = ((l >> OP_SH_INSMSB) & OP_MASK_INSMSB) + 32; 3579 (*info->fprintf_func) (info->stream, "0x%x", msb - lsb + 1); 3580 break; 3581 3582 case 'G': 3583 msbd = ((l >> OP_SH_EXTMSBD) & OP_MASK_EXTMSBD) + 32; 3584 (*info->fprintf_func) (info->stream, "0x%x", msbd + 1); 3585 break; 3586 3587 case 't': /* Coprocessor 0 reg name */ 3588 (*info->fprintf_func) (info->stream, "%s", 3589 mips_cp0_names[(l >> OP_SH_RT) & 3590 OP_MASK_RT]); 3591 break; 3592 3593 case 'T': /* Coprocessor 0 reg name */ 3594 { 3595 const struct mips_cp0sel_name *n; 3596 unsigned int cp0reg, sel; 3597 3598 cp0reg = (l >> OP_SH_RT) & OP_MASK_RT; 3599 sel = (l >> OP_SH_SEL) & OP_MASK_SEL; 3600 3601 /* CP0 register including 'sel' code for mftc0, to be 3602 printed textually if known. If not known, print both 3603 CP0 register name and sel numerically since CP0 register 3604 with sel 0 may have a name unrelated to register being 3605 printed. */ 3606 n = lookup_mips_cp0sel_name(mips_cp0sel_names, 3607 mips_cp0sel_names_len, cp0reg, sel); 3608 if (n != NULL) 3609 (*info->fprintf_func) (info->stream, "%s", n->name); 3610 else 3611 (*info->fprintf_func) (info->stream, "$%d,%d", cp0reg, sel); 3612 break; 3613 } 3614 3615 default: 3616 /* xgettext:c-format */ 3617 (*info->fprintf_func) (info->stream, 3618 _("# internal error, undefined extension sequence (+%c)"), 3619 *d); 3620 return; 3621 } 3622 break; 3623 3624 case '2': 3625 (*info->fprintf_func) (info->stream, "0x%lx", 3626 (l >> OP_SH_BP) & OP_MASK_BP); 3627 break; 3628 3629 case '3': 3630 (*info->fprintf_func) (info->stream, "0x%lx", 3631 (l >> OP_SH_SA3) & OP_MASK_SA3); 3632 break; 3633 3634 case '4': 3635 (*info->fprintf_func) (info->stream, "0x%lx", 3636 (l >> OP_SH_SA4) & OP_MASK_SA4); 3637 break; 3638 3639 case '5': 3640 (*info->fprintf_func) (info->stream, "0x%lx", 3641 (l >> OP_SH_IMM8) & OP_MASK_IMM8); 3642 break; 3643 3644 case '6': 3645 (*info->fprintf_func) (info->stream, "0x%lx", 3646 (l >> OP_SH_RS) & OP_MASK_RS); 3647 break; 3648 3649 case '7': 3650 (*info->fprintf_func) (info->stream, "$ac%ld", 3651 (l >> OP_SH_DSPACC) & OP_MASK_DSPACC); 3652 break; 3653 3654 case '8': 3655 (*info->fprintf_func) (info->stream, "0x%lx", 3656 (l >> OP_SH_WRDSP) & OP_MASK_WRDSP); 3657 break; 3658 3659 case '9': 3660 (*info->fprintf_func) (info->stream, "$ac%ld", 3661 (l >> OP_SH_DSPACC_S) & OP_MASK_DSPACC_S); 3662 break; 3663 3664 case '0': /* dsp 6-bit signed immediate in bit 20 */ 3665 delta = ((l >> OP_SH_DSPSFT) & OP_MASK_DSPSFT); 3666 if (delta & 0x20) /* test sign bit */ 3667 delta |= ~OP_MASK_DSPSFT; 3668 (*info->fprintf_func) (info->stream, "%d", delta); 3669 break; 3670 3671 case ':': /* dsp 7-bit signed immediate in bit 19 */ 3672 delta = ((l >> OP_SH_DSPSFT_7) & OP_MASK_DSPSFT_7); 3673 if (delta & 0x40) /* test sign bit */ 3674 delta |= ~OP_MASK_DSPSFT_7; 3675 (*info->fprintf_func) (info->stream, "%d", delta); 3676 break; 3677 3678 case '\'': 3679 (*info->fprintf_func) (info->stream, "0x%lx", 3680 (l >> OP_SH_RDDSP) & OP_MASK_RDDSP); 3681 break; 3682 3683 case '@': /* dsp 10-bit signed immediate in bit 16 */ 3684 delta = ((l >> OP_SH_IMM10) & OP_MASK_IMM10); 3685 if (delta & 0x200) /* test sign bit */ 3686 delta |= ~OP_MASK_IMM10; 3687 (*info->fprintf_func) (info->stream, "%d", delta); 3688 break; 3689 3690 case '!': 3691 (*info->fprintf_func) (info->stream, "%ld", 3692 (l >> OP_SH_MT_U) & OP_MASK_MT_U); 3693 break; 3694 3695 case '$': 3696 (*info->fprintf_func) (info->stream, "%ld", 3697 (l >> OP_SH_MT_H) & OP_MASK_MT_H); 3698 break; 3699 3700 case '*': 3701 (*info->fprintf_func) (info->stream, "$ac%ld", 3702 (l >> OP_SH_MTACC_T) & OP_MASK_MTACC_T); 3703 break; 3704 3705 case '&': 3706 (*info->fprintf_func) (info->stream, "$ac%ld", 3707 (l >> OP_SH_MTACC_D) & OP_MASK_MTACC_D); 3708 break; 3709 3710 case 'g': 3711 /* Coprocessor register for CTTC1, MTTC2, MTHC2, CTTC2. */ 3712 (*info->fprintf_func) (info->stream, "$%ld", 3713 (l >> OP_SH_RD) & OP_MASK_RD); 3714 break; 3715 3716 case 's': 3717 case 'b': 3718 case 'r': 3719 case 'v': 3720 (*info->fprintf_func) (info->stream, "%s", 3721 mips_gpr_names[(l >> OP_SH_RS) & OP_MASK_RS]); 3722 break; 3723 3724 case 't': 3725 case 'w': 3726 (*info->fprintf_func) (info->stream, "%s", 3727 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]); 3728 break; 3729 3730 case 'i': 3731 case 'u': 3732 (*info->fprintf_func) (info->stream, "0x%lx", 3733 (l >> OP_SH_IMMEDIATE) & OP_MASK_IMMEDIATE); 3734 break; 3735 3736 case 'j': /* Same as i, but sign-extended. */ 3737 case 'o': 3738 delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA; 3739 if (delta & 0x8000) 3740 delta |= ~0xffff; 3741 (*info->fprintf_func) (info->stream, "%d", 3742 delta); 3743 break; 3744 3745 case 'h': 3746 (*info->fprintf_func) (info->stream, "0x%x", 3747 (unsigned int) ((l >> OP_SH_PREFX) 3748 & OP_MASK_PREFX)); 3749 break; 3750 3751 case 'k': 3752 (*info->fprintf_func) (info->stream, "0x%x", 3753 (unsigned int) ((l >> OP_SH_CACHE) 3754 & OP_MASK_CACHE)); 3755 break; 3756 3757 case 'a': 3758 info->target = (((pc + 4) & ~(bfd_vma) 0x0fffffff) 3759 | (((l >> OP_SH_TARGET) & OP_MASK_TARGET) << 2)); 3760 /* For gdb disassembler, force odd address on jalx. */ 3761 if (info->flavour == bfd_target_unknown_flavour 3762 && strcmp (opp->name, "jalx") == 0) 3763 info->target |= 1; 3764 (*info->print_address_func) (info->target, info); 3765 break; 3766 3767 case 'p': 3768 /* Sign extend the displacement. */ 3769 delta = (l >> OP_SH_DELTA) & OP_MASK_DELTA; 3770 if (delta & 0x8000) 3771 delta |= ~0xffff; 3772 info->target = (delta << 2) + pc + INSNLEN; 3773 (*info->print_address_func) (info->target, info); 3774 break; 3775 3776 case 'd': 3777 (*info->fprintf_func) (info->stream, "%s", 3778 mips_gpr_names[(l >> OP_SH_RD) & OP_MASK_RD]); 3779 break; 3780 3781 case 'U': 3782 { 3783 /* First check for both rd and rt being equal. */ 3784 unsigned int reg = (l >> OP_SH_RD) & OP_MASK_RD; 3785 if (reg == ((l >> OP_SH_RT) & OP_MASK_RT)) 3786 (*info->fprintf_func) (info->stream, "%s", 3787 mips_gpr_names[reg]); 3788 else 3789 { 3790 /* If one is zero use the other. */ 3791 if (reg == 0) 3792 (*info->fprintf_func) (info->stream, "%s", 3793 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]); 3794 else if (((l >> OP_SH_RT) & OP_MASK_RT) == 0) 3795 (*info->fprintf_func) (info->stream, "%s", 3796 mips_gpr_names[reg]); 3797 else /* Bogus, result depends on processor. */ 3798 (*info->fprintf_func) (info->stream, "%s or %s", 3799 mips_gpr_names[reg], 3800 mips_gpr_names[(l >> OP_SH_RT) & OP_MASK_RT]); 3801 } 3802 } 3803 break; 3804 3805 case 'z': 3806 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[0]); 3807 break; 3808 3809 case '<': 3810 (*info->fprintf_func) (info->stream, "0x%lx", 3811 (l >> OP_SH_SHAMT) & OP_MASK_SHAMT); 3812 break; 3813 3814 case 'c': 3815 (*info->fprintf_func) (info->stream, "0x%lx", 3816 (l >> OP_SH_CODE) & OP_MASK_CODE); 3817 break; 3818 3819 case 'q': 3820 (*info->fprintf_func) (info->stream, "0x%lx", 3821 (l >> OP_SH_CODE2) & OP_MASK_CODE2); 3822 break; 3823 3824 case 'C': 3825 (*info->fprintf_func) (info->stream, "0x%lx", 3826 (l >> OP_SH_COPZ) & OP_MASK_COPZ); 3827 break; 3828 3829 case 'B': 3830 (*info->fprintf_func) (info->stream, "0x%lx", 3831 3832 (l >> OP_SH_CODE20) & OP_MASK_CODE20); 3833 break; 3834 3835 case 'J': 3836 (*info->fprintf_func) (info->stream, "0x%lx", 3837 (l >> OP_SH_CODE19) & OP_MASK_CODE19); 3838 break; 3839 3840 case 'S': 3841 case 'V': 3842 (*info->fprintf_func) (info->stream, "%s", 3843 mips_fpr_names[(l >> OP_SH_FS) & OP_MASK_FS]); 3844 break; 3845 3846 case 'T': 3847 case 'W': 3848 (*info->fprintf_func) (info->stream, "%s", 3849 mips_fpr_names[(l >> OP_SH_FT) & OP_MASK_FT]); 3850 break; 3851 3852 case 'D': 3853 (*info->fprintf_func) (info->stream, "%s", 3854 mips_fpr_names[(l >> OP_SH_FD) & OP_MASK_FD]); 3855 break; 3856 3857 case 'R': 3858 (*info->fprintf_func) (info->stream, "%s", 3859 mips_fpr_names[(l >> OP_SH_FR) & OP_MASK_FR]); 3860 break; 3861 3862 case 'E': 3863 /* Coprocessor register for lwcN instructions, et al. 3864 3865 Note that there is no load/store cp0 instructions, and 3866 that FPU (cp1) instructions disassemble this field using 3867 'T' format. Therefore, until we gain understanding of 3868 cp2 register names, we can simply print the register 3869 numbers. */ 3870 (*info->fprintf_func) (info->stream, "$%ld", 3871 (l >> OP_SH_RT) & OP_MASK_RT); 3872 break; 3873 3874 case 'G': 3875 /* Coprocessor register for mtcN instructions, et al. Note 3876 that FPU (cp1) instructions disassemble this field using 3877 'S' format. Therefore, we only need to worry about cp0, 3878 cp2, and cp3. */ 3879 op = (l >> OP_SH_OP) & OP_MASK_OP; 3880 if (op == OP_OP_COP0) 3881 (*info->fprintf_func) (info->stream, "%s", 3882 mips_cp0_names[(l >> OP_SH_RD) & OP_MASK_RD]); 3883 else 3884 (*info->fprintf_func) (info->stream, "$%ld", 3885 (l >> OP_SH_RD) & OP_MASK_RD); 3886 break; 3887 3888 case 'K': 3889 (*info->fprintf_func) (info->stream, "%s", 3890 mips_hwr_names[(l >> OP_SH_RD) & OP_MASK_RD]); 3891 break; 3892 3893 case 'N': 3894 (*info->fprintf_func) (info->stream, 3895 ((opp->pinfo & (FP_D | FP_S)) != 0 3896 ? "$fcc%ld" : "$cc%ld"), 3897 (l >> OP_SH_BCC) & OP_MASK_BCC); 3898 break; 3899 3900 case 'M': 3901 (*info->fprintf_func) (info->stream, "$fcc%ld", 3902 (l >> OP_SH_CCC) & OP_MASK_CCC); 3903 break; 3904 3905 case 'P': 3906 (*info->fprintf_func) (info->stream, "%ld", 3907 (l >> OP_SH_PERFREG) & OP_MASK_PERFREG); 3908 break; 3909 3910 case 'e': 3911 (*info->fprintf_func) (info->stream, "%ld", 3912 (l >> OP_SH_VECBYTE) & OP_MASK_VECBYTE); 3913 break; 3914 3915 case '%': 3916 (*info->fprintf_func) (info->stream, "%ld", 3917 (l >> OP_SH_VECALIGN) & OP_MASK_VECALIGN); 3918 break; 3919 3920 case 'H': 3921 (*info->fprintf_func) (info->stream, "%ld", 3922 (l >> OP_SH_SEL) & OP_MASK_SEL); 3923 break; 3924 3925 case 'O': 3926 (*info->fprintf_func) (info->stream, "%ld", 3927 (l >> OP_SH_ALN) & OP_MASK_ALN); 3928 break; 3929 3930 case 'Q': 3931 { 3932 unsigned int vsel = (l >> OP_SH_VSEL) & OP_MASK_VSEL; 3933 3934 if ((vsel & 0x10) == 0) 3935 { 3936 int fmt; 3937 3938 vsel &= 0x0f; 3939 for (fmt = 0; fmt < 3; fmt++, vsel >>= 1) 3940 if ((vsel & 1) == 0) 3941 break; 3942 (*info->fprintf_func) (info->stream, "$v%ld[%d]", 3943 (l >> OP_SH_FT) & OP_MASK_FT, 3944 vsel >> 1); 3945 } 3946 else if ((vsel & 0x08) == 0) 3947 { 3948 (*info->fprintf_func) (info->stream, "$v%ld", 3949 (l >> OP_SH_FT) & OP_MASK_FT); 3950 } 3951 else 3952 { 3953 (*info->fprintf_func) (info->stream, "0x%lx", 3954 (l >> OP_SH_FT) & OP_MASK_FT); 3955 } 3956 } 3957 break; 3958 3959 case 'X': 3960 (*info->fprintf_func) (info->stream, "$v%ld", 3961 (l >> OP_SH_FD) & OP_MASK_FD); 3962 break; 3963 3964 case 'Y': 3965 (*info->fprintf_func) (info->stream, "$v%ld", 3966 (l >> OP_SH_FS) & OP_MASK_FS); 3967 break; 3968 3969 case 'Z': 3970 (*info->fprintf_func) (info->stream, "$v%ld", 3971 (l >> OP_SH_FT) & OP_MASK_FT); 3972 break; 3973 3974 default: 3975 /* xgettext:c-format */ 3976 (*info->fprintf_func) (info->stream, 3977 _("# internal error, undefined modifier(%c)"), 3978 *d); 3979 return; 3980 } 3981 } 3982 } 3983 3984 /* Check if the object uses NewABI conventions. */ 3986 #if 0 3987 static int 3988 is_newabi (header) 3989 Elf_Internal_Ehdr *header; 3990 { 3991 /* There are no old-style ABIs which use 64-bit ELF. */ 3992 if (header->e_ident[EI_CLASS] == ELFCLASS64) 3993 return 1; 3994 3995 /* If a 32-bit ELF file, n32 is a new-style ABI. */ 3996 if ((header->e_flags & EF_MIPS_ABI2) != 0) 3997 return 1; 3998 3999 return 0; 4000 } 4001 #endif 4002 4003 /* Print the mips instruction at address MEMADDR in debugged memory, 4005 on using INFO. Returns length of the instruction, in bytes, which is 4006 always INSNLEN. BIGENDIAN must be 1 if this is big-endian code, 0 if 4007 this is little-endian code. */ 4008 4009 static int 4010 print_insn_mips (bfd_vma memaddr, 4011 unsigned long int word, 4012 struct disassemble_info *info) 4013 { 4014 const struct mips_opcode *op; 4015 static bfd_boolean init = 0; 4016 static const struct mips_opcode *mips_hash[OP_MASK_OP + 1]; 4017 4018 /* Build a hash table to shorten the search time. */ 4019 if (! init) 4020 { 4021 unsigned int i; 4022 4023 for (i = 0; i <= OP_MASK_OP; i++) 4024 { 4025 for (op = mips_opcodes; op < &mips_opcodes[NUMOPCODES]; op++) 4026 { 4027 if (op->pinfo == INSN_MACRO 4028 || (no_aliases && (op->pinfo2 & INSN2_ALIAS))) 4029 continue; 4030 if (i == ((op->match >> OP_SH_OP) & OP_MASK_OP)) 4031 { 4032 mips_hash[i] = op; 4033 break; 4034 } 4035 } 4036 } 4037 4038 init = 1; 4039 } 4040 4041 info->bytes_per_chunk = INSNLEN; 4042 info->display_endian = info->endian; 4043 info->insn_info_valid = 1; 4044 info->branch_delay_insns = 0; 4045 info->data_size = 0; 4046 info->insn_type = dis_nonbranch; 4047 info->target = 0; 4048 info->target2 = 0; 4049 4050 op = mips_hash[(word >> OP_SH_OP) & OP_MASK_OP]; 4051 if (op != NULL) 4052 { 4053 for (; op < &mips_opcodes[NUMOPCODES]; op++) 4054 { 4055 if (op->pinfo != INSN_MACRO 4056 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS)) 4057 && (word & op->mask) == op->match) 4058 { 4059 const char *d; 4060 4061 /* We always allow to disassemble the jalx instruction. */ 4062 if (! OPCODE_IS_MEMBER (op, mips_isa, mips_processor) 4063 && strcmp (op->name, "jalx")) 4064 continue; 4065 4066 /* Figure out instruction type and branch delay information. */ 4067 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0) 4068 { 4069 if ((info->insn_type & INSN_WRITE_GPR_31) != 0) 4070 info->insn_type = dis_jsr; 4071 else 4072 info->insn_type = dis_branch; 4073 info->branch_delay_insns = 1; 4074 } 4075 else if ((op->pinfo & (INSN_COND_BRANCH_DELAY 4076 | INSN_COND_BRANCH_LIKELY)) != 0) 4077 { 4078 if ((info->insn_type & INSN_WRITE_GPR_31) != 0) 4079 info->insn_type = dis_condjsr; 4080 else 4081 info->insn_type = dis_condbranch; 4082 info->branch_delay_insns = 1; 4083 } 4084 else if ((op->pinfo & (INSN_STORE_MEMORY 4085 | INSN_LOAD_MEMORY_DELAY)) != 0) 4086 info->insn_type = dis_dref; 4087 4088 (*info->fprintf_func) (info->stream, "%s", op->name); 4089 4090 d = op->args; 4091 if (d != NULL && *d != '\0') 4092 { 4093 (*info->fprintf_func) (info->stream, "\t"); 4094 print_insn_args (d, word, memaddr, info, op); 4095 } 4096 4097 return INSNLEN; 4098 } 4099 } 4100 } 4101 4102 /* Handle undefined instructions. */ 4103 info->insn_type = dis_noninsn; 4104 (*info->fprintf_func) (info->stream, "0x%lx", word); 4105 return INSNLEN; 4106 } 4107 4108 /* In an environment where we do not know the symbol type of the 4110 instruction we are forced to assume that the low order bit of the 4111 instructions' address may mark it as a mips16 instruction. If we 4112 are single stepping, or the pc is within the disassembled function, 4113 this works. Otherwise, we need a clue. Sometimes. */ 4114 4115 static int 4116 _print_insn_mips (bfd_vma memaddr, 4117 struct disassemble_info *info, 4118 enum bfd_endian endianness) 4119 { 4120 bfd_byte buffer[INSNLEN]; 4121 int status; 4122 4123 set_default_mips_dis_options (info); 4124 parse_mips_dis_options (info->disassembler_options); 4125 4126 #if 0 4127 #if 1 4128 /* FIXME: If odd address, this is CLEARLY a mips 16 instruction. */ 4129 /* Only a few tools will work this way. */ 4130 if (memaddr & 0x01) 4131 return print_insn_mips16 (memaddr, info); 4132 #endif 4133 4134 #if SYMTAB_AVAILABLE 4135 if (info->mach == bfd_mach_mips16 4136 || (info->flavour == bfd_target_elf_flavour 4137 && info->symbols != NULL 4138 && ((*(elf_symbol_type **) info->symbols)->internal_elf_sym.st_other 4139 == STO_MIPS16))) 4140 return print_insn_mips16 (memaddr, info); 4141 #endif 4142 #endif 4143 4144 status = (*info->read_memory_func) (memaddr, buffer, INSNLEN, info); 4145 if (status == 0) 4146 { 4147 unsigned long insn; 4148 4149 if (endianness == BFD_ENDIAN_BIG) 4150 insn = (unsigned long) bfd_getb32 (buffer); 4151 else 4152 insn = (unsigned long) bfd_getl32 (buffer); 4153 4154 return print_insn_mips (memaddr, insn, info); 4155 } 4156 else 4157 { 4158 (*info->memory_error_func) (status, memaddr, info); 4159 return -1; 4160 } 4161 } 4162 4163 int 4164 print_insn_big_mips (bfd_vma memaddr, struct disassemble_info *info) 4165 { 4166 return _print_insn_mips (memaddr, info, BFD_ENDIAN_BIG); 4167 } 4168 4169 int 4170 print_insn_little_mips (bfd_vma memaddr, struct disassemble_info *info) 4171 { 4172 return _print_insn_mips (memaddr, info, BFD_ENDIAN_LITTLE); 4173 } 4174 4175 /* Disassemble mips16 instructions. */ 4177 #if 0 4178 static int 4179 print_insn_mips16 (bfd_vma memaddr, struct disassemble_info *info) 4180 { 4181 int status; 4182 bfd_byte buffer[2]; 4183 int length; 4184 int insn; 4185 bfd_boolean use_extend; 4186 int extend = 0; 4187 const struct mips_opcode *op, *opend; 4188 4189 info->bytes_per_chunk = 2; 4190 info->display_endian = info->endian; 4191 info->insn_info_valid = 1; 4192 info->branch_delay_insns = 0; 4193 info->data_size = 0; 4194 info->insn_type = dis_nonbranch; 4195 info->target = 0; 4196 info->target2 = 0; 4197 4198 status = (*info->read_memory_func) (memaddr, buffer, 2, info); 4199 if (status != 0) 4200 { 4201 (*info->memory_error_func) (status, memaddr, info); 4202 return -1; 4203 } 4204 4205 length = 2; 4206 4207 if (info->endian == BFD_ENDIAN_BIG) 4208 insn = bfd_getb16 (buffer); 4209 else 4210 insn = bfd_getl16 (buffer); 4211 4212 /* Handle the extend opcode specially. */ 4213 use_extend = FALSE; 4214 if ((insn & 0xf800) == 0xf000) 4215 { 4216 use_extend = TRUE; 4217 extend = insn & 0x7ff; 4218 4219 memaddr += 2; 4220 4221 status = (*info->read_memory_func) (memaddr, buffer, 2, info); 4222 if (status != 0) 4223 { 4224 (*info->fprintf_func) (info->stream, "extend 0x%x", 4225 (unsigned int) extend); 4226 (*info->memory_error_func) (status, memaddr, info); 4227 return -1; 4228 } 4229 4230 if (info->endian == BFD_ENDIAN_BIG) 4231 insn = bfd_getb16 (buffer); 4232 else 4233 insn = bfd_getl16 (buffer); 4234 4235 /* Check for an extend opcode followed by an extend opcode. */ 4236 if ((insn & 0xf800) == 0xf000) 4237 { 4238 (*info->fprintf_func) (info->stream, "extend 0x%x", 4239 (unsigned int) extend); 4240 info->insn_type = dis_noninsn; 4241 return length; 4242 } 4243 4244 length += 2; 4245 } 4246 4247 /* FIXME: Should probably use a hash table on the major opcode here. */ 4248 4249 opend = mips16_opcodes + bfd_mips16_num_opcodes; 4250 for (op = mips16_opcodes; op < opend; op++) 4251 { 4252 if (op->pinfo != INSN_MACRO 4253 && !(no_aliases && (op->pinfo2 & INSN2_ALIAS)) 4254 && (insn & op->mask) == op->match) 4255 { 4256 const char *s; 4257 4258 if (strchr (op->args, 'a') != NULL) 4259 { 4260 if (use_extend) 4261 { 4262 (*info->fprintf_func) (info->stream, "extend 0x%x", 4263 (unsigned int) extend); 4264 info->insn_type = dis_noninsn; 4265 return length - 2; 4266 } 4267 4268 use_extend = FALSE; 4269 4270 memaddr += 2; 4271 4272 status = (*info->read_memory_func) (memaddr, buffer, 2, 4273 info); 4274 if (status == 0) 4275 { 4276 use_extend = TRUE; 4277 if (info->endian == BFD_ENDIAN_BIG) 4278 extend = bfd_getb16 (buffer); 4279 else 4280 extend = bfd_getl16 (buffer); 4281 length += 2; 4282 } 4283 } 4284 4285 (*info->fprintf_func) (info->stream, "%s", op->name); 4286 if (op->args[0] != '\0') 4287 (*info->fprintf_func) (info->stream, "\t"); 4288 4289 for (s = op->args; *s != '\0'; s++) 4290 { 4291 if (*s == ',' 4292 && s[1] == 'w' 4293 && (((insn >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX) 4294 == ((insn >> MIPS16OP_SH_RY) & MIPS16OP_MASK_RY))) 4295 { 4296 /* Skip the register and the comma. */ 4297 ++s; 4298 continue; 4299 } 4300 if (*s == ',' 4301 && s[1] == 'v' 4302 && (((insn >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ) 4303 == ((insn >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX))) 4304 { 4305 /* Skip the register and the comma. */ 4306 ++s; 4307 continue; 4308 } 4309 print_mips16_insn_arg (*s, op, insn, use_extend, extend, memaddr, 4310 info); 4311 } 4312 4313 if ((op->pinfo & INSN_UNCOND_BRANCH_DELAY) != 0) 4314 { 4315 info->branch_delay_insns = 1; 4316 if (info->insn_type != dis_jsr) 4317 info->insn_type = dis_branch; 4318 } 4319 4320 return length; 4321 } 4322 } 4323 4324 if (use_extend) 4325 (*info->fprintf_func) (info->stream, "0x%x", extend | 0xf000); 4326 (*info->fprintf_func) (info->stream, "0x%x", insn); 4327 info->insn_type = dis_noninsn; 4328 4329 return length; 4330 } 4331 4332 /* Disassemble an operand for a mips16 instruction. */ 4333 4334 static void 4335 print_mips16_insn_arg (char type, 4336 const struct mips_opcode *op, 4337 int l, 4338 bfd_boolean use_extend, 4339 int extend, 4340 bfd_vma memaddr, 4341 struct disassemble_info *info) 4342 { 4343 switch (type) 4344 { 4345 case ',': 4346 case '(': 4347 case ')': 4348 (*info->fprintf_func) (info->stream, "%c", type); 4349 break; 4350 4351 case 'y': 4352 case 'w': 4353 (*info->fprintf_func) (info->stream, "%s", 4354 mips16_reg_names(((l >> MIPS16OP_SH_RY) 4355 & MIPS16OP_MASK_RY))); 4356 break; 4357 4358 case 'x': 4359 case 'v': 4360 (*info->fprintf_func) (info->stream, "%s", 4361 mips16_reg_names(((l >> MIPS16OP_SH_RX) 4362 & MIPS16OP_MASK_RX))); 4363 break; 4364 4365 case 'z': 4366 (*info->fprintf_func) (info->stream, "%s", 4367 mips16_reg_names(((l >> MIPS16OP_SH_RZ) 4368 & MIPS16OP_MASK_RZ))); 4369 break; 4370 4371 case 'Z': 4372 (*info->fprintf_func) (info->stream, "%s", 4373 mips16_reg_names(((l >> MIPS16OP_SH_MOVE32Z) 4374 & MIPS16OP_MASK_MOVE32Z))); 4375 break; 4376 4377 case '0': 4378 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[0]); 4379 break; 4380 4381 case 'S': 4382 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[29]); 4383 break; 4384 4385 case 'P': 4386 (*info->fprintf_func) (info->stream, "$pc"); 4387 break; 4388 4389 case 'R': 4390 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[31]); 4391 break; 4392 4393 case 'X': 4394 (*info->fprintf_func) (info->stream, "%s", 4395 mips_gpr_names[((l >> MIPS16OP_SH_REGR32) 4396 & MIPS16OP_MASK_REGR32)]); 4397 break; 4398 4399 case 'Y': 4400 (*info->fprintf_func) (info->stream, "%s", 4401 mips_gpr_names[MIPS16OP_EXTRACT_REG32R (l)]); 4402 break; 4403 4404 case '<': 4405 case '>': 4406 case '[': 4407 case ']': 4408 case '4': 4409 case '5': 4410 case 'H': 4411 case 'W': 4412 case 'D': 4413 case 'j': 4414 case '6': 4415 case '8': 4416 case 'V': 4417 case 'C': 4418 case 'U': 4419 case 'k': 4420 case 'K': 4421 case 'p': 4422 case 'q': 4423 case 'A': 4424 case 'B': 4425 case 'E': 4426 { 4427 int immed, nbits, shift, signedp, extbits, pcrel, extu, branch; 4428 4429 shift = 0; 4430 signedp = 0; 4431 extbits = 16; 4432 pcrel = 0; 4433 extu = 0; 4434 branch = 0; 4435 switch (type) 4436 { 4437 case '<': 4438 nbits = 3; 4439 immed = (l >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ; 4440 extbits = 5; 4441 extu = 1; 4442 break; 4443 case '>': 4444 nbits = 3; 4445 immed = (l >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX; 4446 extbits = 5; 4447 extu = 1; 4448 break; 4449 case '[': 4450 nbits = 3; 4451 immed = (l >> MIPS16OP_SH_RZ) & MIPS16OP_MASK_RZ; 4452 extbits = 6; 4453 extu = 1; 4454 break; 4455 case ']': 4456 nbits = 3; 4457 immed = (l >> MIPS16OP_SH_RX) & MIPS16OP_MASK_RX; 4458 extbits = 6; 4459 extu = 1; 4460 break; 4461 case '4': 4462 nbits = 4; 4463 immed = (l >> MIPS16OP_SH_IMM4) & MIPS16OP_MASK_IMM4; 4464 signedp = 1; 4465 extbits = 15; 4466 break; 4467 case '5': 4468 nbits = 5; 4469 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5; 4470 info->insn_type = dis_dref; 4471 info->data_size = 1; 4472 break; 4473 case 'H': 4474 nbits = 5; 4475 shift = 1; 4476 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5; 4477 info->insn_type = dis_dref; 4478 info->data_size = 2; 4479 break; 4480 case 'W': 4481 nbits = 5; 4482 shift = 2; 4483 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5; 4484 if ((op->pinfo & MIPS16_INSN_READ_PC) == 0 4485 && (op->pinfo & MIPS16_INSN_READ_SP) == 0) 4486 { 4487 info->insn_type = dis_dref; 4488 info->data_size = 4; 4489 } 4490 break; 4491 case 'D': 4492 nbits = 5; 4493 shift = 3; 4494 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5; 4495 info->insn_type = dis_dref; 4496 info->data_size = 8; 4497 break; 4498 case 'j': 4499 nbits = 5; 4500 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5; 4501 signedp = 1; 4502 break; 4503 case '6': 4504 nbits = 6; 4505 immed = (l >> MIPS16OP_SH_IMM6) & MIPS16OP_MASK_IMM6; 4506 break; 4507 case '8': 4508 nbits = 8; 4509 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8; 4510 break; 4511 case 'V': 4512 nbits = 8; 4513 shift = 2; 4514 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8; 4515 /* FIXME: This might be lw, or it might be addiu to $sp or 4516 $pc. We assume it's load. */ 4517 info->insn_type = dis_dref; 4518 info->data_size = 4; 4519 break; 4520 case 'C': 4521 nbits = 8; 4522 shift = 3; 4523 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8; 4524 info->insn_type = dis_dref; 4525 info->data_size = 8; 4526 break; 4527 case 'U': 4528 nbits = 8; 4529 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8; 4530 extu = 1; 4531 break; 4532 case 'k': 4533 nbits = 8; 4534 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8; 4535 signedp = 1; 4536 break; 4537 case 'K': 4538 nbits = 8; 4539 shift = 3; 4540 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8; 4541 signedp = 1; 4542 break; 4543 case 'p': 4544 nbits = 8; 4545 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8; 4546 signedp = 1; 4547 pcrel = 1; 4548 branch = 1; 4549 info->insn_type = dis_condbranch; 4550 break; 4551 case 'q': 4552 nbits = 11; 4553 immed = (l >> MIPS16OP_SH_IMM11) & MIPS16OP_MASK_IMM11; 4554 signedp = 1; 4555 pcrel = 1; 4556 branch = 1; 4557 info->insn_type = dis_branch; 4558 break; 4559 case 'A': 4560 nbits = 8; 4561 shift = 2; 4562 immed = (l >> MIPS16OP_SH_IMM8) & MIPS16OP_MASK_IMM8; 4563 pcrel = 1; 4564 /* FIXME: This can be lw or la. We assume it is lw. */ 4565 info->insn_type = dis_dref; 4566 info->data_size = 4; 4567 break; 4568 case 'B': 4569 nbits = 5; 4570 shift = 3; 4571 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5; 4572 pcrel = 1; 4573 info->insn_type = dis_dref; 4574 info->data_size = 8; 4575 break; 4576 case 'E': 4577 nbits = 5; 4578 shift = 2; 4579 immed = (l >> MIPS16OP_SH_IMM5) & MIPS16OP_MASK_IMM5; 4580 pcrel = 1; 4581 break; 4582 default: 4583 abort (); 4584 } 4585 4586 if (! use_extend) 4587 { 4588 if (signedp && immed >= (1 << (nbits - 1))) 4589 immed -= 1 << nbits; 4590 immed <<= shift; 4591 if ((type == '<' || type == '>' || type == '[' || type == ']') 4592 && immed == 0) 4593 immed = 8; 4594 } 4595 else 4596 { 4597 if (extbits == 16) 4598 immed |= ((extend & 0x1f) << 11) | (extend & 0x7e0); 4599 else if (extbits == 15) 4600 immed |= ((extend & 0xf) << 11) | (extend & 0x7f0); 4601 else 4602 immed = ((extend >> 6) & 0x1f) | (extend & 0x20); 4603 immed &= (1 << extbits) - 1; 4604 if (! extu && immed >= (1 << (extbits - 1))) 4605 immed -= 1 << extbits; 4606 } 4607 4608 if (! pcrel) 4609 (*info->fprintf_func) (info->stream, "%d", immed); 4610 else 4611 { 4612 bfd_vma baseaddr; 4613 4614 if (branch) 4615 { 4616 immed *= 2; 4617 baseaddr = memaddr + 2; 4618 } 4619 else if (use_extend) 4620 baseaddr = memaddr - 2; 4621 else 4622 { 4623 int status; 4624 bfd_byte buffer[2]; 4625 4626 baseaddr = memaddr; 4627 4628 /* If this instruction is in the delay slot of a jr 4629 instruction, the base address is the address of the 4630 jr instruction. If it is in the delay slot of jalr 4631 instruction, the base address is the address of the 4632 jalr instruction. This test is unreliable: we have 4633 no way of knowing whether the previous word is 4634 instruction or data. */ 4635 status = (*info->read_memory_func) (memaddr - 4, buffer, 2, 4636 info); 4637 if (status == 0 4638 && (((info->endian == BFD_ENDIAN_BIG 4639 ? bfd_getb16 (buffer) 4640 : bfd_getl16 (buffer)) 4641 & 0xf800) == 0x1800)) 4642 baseaddr = memaddr - 4; 4643 else 4644 { 4645 status = (*info->read_memory_func) (memaddr - 2, buffer, 4646 2, info); 4647 if (status == 0 4648 && (((info->endian == BFD_ENDIAN_BIG 4649 ? bfd_getb16 (buffer) 4650 : bfd_getl16 (buffer)) 4651 & 0xf81f) == 0xe800)) 4652 baseaddr = memaddr - 2; 4653 } 4654 } 4655 info->target = (baseaddr & ~((1 << shift) - 1)) + immed; 4656 if (pcrel && branch 4657 && info->flavour == bfd_target_unknown_flavour) 4658 /* For gdb disassembler, maintain odd address. */ 4659 info->target |= 1; 4660 (*info->print_address_func) (info->target, info); 4661 } 4662 } 4663 break; 4664 4665 case 'a': 4666 { 4667 int jalx = l & 0x400; 4668 4669 if (! use_extend) 4670 extend = 0; 4671 l = ((l & 0x1f) << 23) | ((l & 0x3e0) << 13) | (extend << 2); 4672 if (!jalx && info->flavour == bfd_target_unknown_flavour) 4673 /* For gdb disassembler, maintain odd address. */ 4674 l |= 1; 4675 } 4676 info->target = ((memaddr + 4) & ~(bfd_vma) 0x0fffffff) | l; 4677 (*info->print_address_func) (info->target, info); 4678 info->insn_type = dis_jsr; 4679 info->branch_delay_insns = 1; 4680 break; 4681 4682 case 'l': 4683 case 'L': 4684 { 4685 int need_comma, amask, smask; 4686 4687 need_comma = 0; 4688 4689 l = (l >> MIPS16OP_SH_IMM6) & MIPS16OP_MASK_IMM6; 4690 4691 amask = (l >> 3) & 7; 4692 4693 if (amask > 0 && amask < 5) 4694 { 4695 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[4]); 4696 if (amask > 1) 4697 (*info->fprintf_func) (info->stream, "-%s", 4698 mips_gpr_names[amask + 3]); 4699 need_comma = 1; 4700 } 4701 4702 smask = (l >> 1) & 3; 4703 if (smask == 3) 4704 { 4705 (*info->fprintf_func) (info->stream, "%s??", 4706 need_comma ? "," : ""); 4707 need_comma = 1; 4708 } 4709 else if (smask > 0) 4710 { 4711 (*info->fprintf_func) (info->stream, "%s%s", 4712 need_comma ? "," : "", 4713 mips_gpr_names[16]); 4714 if (smask > 1) 4715 (*info->fprintf_func) (info->stream, "-%s", 4716 mips_gpr_names[smask + 15]); 4717 need_comma = 1; 4718 } 4719 4720 if (l & 1) 4721 { 4722 (*info->fprintf_func) (info->stream, "%s%s", 4723 need_comma ? "," : "", 4724 mips_gpr_names[31]); 4725 need_comma = 1; 4726 } 4727 4728 if (amask == 5 || amask == 6) 4729 { 4730 (*info->fprintf_func) (info->stream, "%s$f0", 4731 need_comma ? "," : ""); 4732 if (amask == 6) 4733 (*info->fprintf_func) (info->stream, "-$f1"); 4734 } 4735 } 4736 break; 4737 4738 case 'm': 4739 case 'M': 4740 /* MIPS16e save/restore. */ 4741 { 4742 int need_comma = 0; 4743 int amask, args, statics; 4744 int nsreg, smask; 4745 int framesz; 4746 int i, j; 4747 4748 l = l & 0x7f; 4749 if (use_extend) 4750 l |= extend << 16; 4751 4752 amask = (l >> 16) & 0xf; 4753 if (amask == MIPS16_ALL_ARGS) 4754 { 4755 args = 4; 4756 statics = 0; 4757 } 4758 else if (amask == MIPS16_ALL_STATICS) 4759 { 4760 args = 0; 4761 statics = 4; 4762 } 4763 else 4764 { 4765 args = amask >> 2; 4766 statics = amask & 3; 4767 } 4768 4769 if (args > 0) { 4770 (*info->fprintf_func) (info->stream, "%s", mips_gpr_names[4]); 4771 if (args > 1) 4772 (*info->fprintf_func) (info->stream, "-%s", 4773 mips_gpr_names[4 + args - 1]); 4774 need_comma = 1; 4775 } 4776 4777 framesz = (((l >> 16) & 0xf0) | (l & 0x0f)) * 8; 4778 if (framesz == 0 && !use_extend) 4779 framesz = 128; 4780 4781 (*info->fprintf_func) (info->stream, "%s%d", 4782 need_comma ? "," : "", 4783 framesz); 4784 4785 if (l & 0x40) /* $ra */ 4786 (*info->fprintf_func) (info->stream, ",%s", mips_gpr_names[31]); 4787 4788 nsreg = (l >> 24) & 0x7; 4789 smask = 0; 4790 if (l & 0x20) /* $s0 */ 4791 smask |= 1 << 0; 4792 if (l & 0x10) /* $s1 */ 4793 smask |= 1 << 1; 4794 if (nsreg > 0) /* $s2-$s8 */ 4795 smask |= ((1 << nsreg) - 1) << 2; 4796 4797 /* Find first set static reg bit. */ 4798 for (i = 0; i < 9; i++) 4799 { 4800 if (smask & (1 << i)) 4801 { 4802 (*info->fprintf_func) (info->stream, ",%s", 4803 mips_gpr_names[i == 8 ? 30 : (16 + i)]); 4804 /* Skip over string of set bits. */ 4805 for (j = i; smask & (2 << j); j++) 4806 continue; 4807 if (j > i) 4808 (*info->fprintf_func) (info->stream, "-%s", 4809 mips_gpr_names[j == 8 ? 30 : (16 + j)]); 4810 i = j + 1; 4811 } 4812 } 4813 4814 /* Statics $ax - $a3. */ 4815 if (statics == 1) 4816 (*info->fprintf_func) (info->stream, ",%s", mips_gpr_names[7]); 4817 else if (statics > 0) 4818 (*info->fprintf_func) (info->stream, ",%s-%s", 4819 mips_gpr_names[7 - statics + 1], 4820 mips_gpr_names[7]); 4821 } 4822 break; 4823 4824 default: 4825 /* xgettext:c-format */ 4826 (*info->fprintf_func) 4827 (info->stream, 4828 _("# internal disassembler error, unrecognised modifier (%c)"), 4829 type); 4830 abort (); 4831 } 4832 } 4833 4834 void 4835 print_mips_disassembler_options (FILE *stream) 4836 { 4837 unsigned int i; 4838 4839 fprintf (stream, _("\n\ 4840 The following MIPS specific disassembler options are supported for use\n\ 4841 with the -M switch (multiple options should be separated by commas):\n")); 4842 4843 fprintf (stream, _("\n\ 4844 gpr-names=ABI Print GPR names according to specified ABI.\n\ 4845 Default: based on binary being disassembled.\n")); 4846 4847 fprintf (stream, _("\n\ 4848 fpr-names=ABI Print FPR names according to specified ABI.\n\ 4849 Default: numeric.\n")); 4850 4851 fprintf (stream, _("\n\ 4852 cp0-names=ARCH Print CP0 register names according to\n\ 4853 specified architecture.\n\ 4854 Default: based on binary being disassembled.\n")); 4855 4856 fprintf (stream, _("\n\ 4857 hwr-names=ARCH Print HWR names according to specified\n\ 4858 architecture.\n\ 4859 Default: based on binary being disassembled.\n")); 4860 4861 fprintf (stream, _("\n\ 4862 reg-names=ABI Print GPR and FPR names according to\n\ 4863 specified ABI.\n")); 4864 4865 fprintf (stream, _("\n\ 4866 reg-names=ARCH Print CP0 register and HWR names according to\n\ 4867 specified architecture.\n")); 4868 4869 fprintf (stream, _("\n\ 4870 For the options above, the following values are supported for \"ABI\":\n\ 4871 ")); 4872 for (i = 0; i < ARRAY_SIZE (mips_abi_choices); i++) 4873 fprintf (stream, " %s", mips_abi_choices[i].name); 4874 fprintf (stream, _("\n")); 4875 4876 fprintf (stream, _("\n\ 4877 For the options above, The following values are supported for \"ARCH\":\n\ 4878 ")); 4879 for (i = 0; i < ARRAY_SIZE (mips_arch_choices); i++) 4880 if (*mips_arch_choices[i].name != '\0') 4881 fprintf (stream, " %s", mips_arch_choices[i].name); 4882 fprintf (stream, _("\n")); 4883 4884 fprintf (stream, _("\n")); 4885 } 4886 #endif 4887