Home | History | Annotate | Line # | Download | only in mips
      1 // -*- C -*-
      2 //
      3 //    <insn> ::=
      4 //        <insn-word> { "+" <insn-word> }
      5 //        ":" <format-name>
      6 //        ":" <filter-flags>
      7 //        ":" <options>
      8 //        ":" <name>
      9 //        <nl>
     10 //        { <insn-model> }
     11 //        { <insn-mnemonic> }
     12 //        <code-block>
     13 //
     14 
     15 
     16 // IGEN config - mips16
     17 // :option:16::insn-bit-size:16
     18 // :option:16::hi-bit-nr:15
     19 :option:16::insn-specifying-widths:true
     20 :option:16::gen-delayed-branch:false
     21 
     22 // IGEN config - mips32/64..
     23 // :option:32::insn-bit-size:32
     24 // :option:32::hi-bit-nr:31
     25 :option:32::insn-specifying-widths:true
     26 :option:32::gen-delayed-branch:false
     27 
     28 
     29 // Generate separate simulators for each target
     30 // :option:::multi-sim:true
     31 
     32 
     33 // Models known by this simulator are defined below.
     34 //
     35 // When placing models in the instruction descriptions, please place
     36 // them one per line, in the order given here.
     37 
     38 //  MIPS ISAs:
     39 //
     40 //  Instructions and related functions for these models are included in
     41 //  this file.
     42 :model:::mipsI:mips3000:
     43 :model:::mipsII:mips6000:
     44 :model:::mipsIII:mips4000:
     45 :model:::mipsIV:mips8000:
     46 :model:::mipsV:mipsisaV:
     47 :model:::mips32:mipsisa32:
     48 :model:::mips32r2:mipsisa32r2:
     49 :model:::mips32r6:mipsisa32r6:
     50 :model:::mips64:mipsisa64:
     51 :model:::mips64r2:mipsisa64r2:
     52 :model:::mips64r6:mipsisa64r6:
     53 
     54 //  Vendor ISAs:
     55 //
     56 //  Standard MIPS ISA instructions used for these models are listed here,
     57 //  as are functions needed by those standard instructions.  Instructions
     58 //  which are model-dependent and which are not in the standard MIPS ISAs
     59 //  (or which pre-date or use different encodings than the standard
     60 //  instructions) are (for the most part) in separate .igen files.
     61 :model:::vr4100:mips4100:		// vr.igen
     62 :model:::vr4120:mips4120:
     63 :model:::vr5000:mips5000:
     64 :model:::vr5400:mips5400:
     65 :model:::vr5500:mips5500:
     66 :model:::r3900:mips3900:		// tx.igen
     67 
     68 //  MIPS Application Specific Extensions (ASEs)
     69 //
     70 //  Instructions for the ASEs are in separate .igen files.
     71 //  ASEs add instructions on to a base ISA.
     72 :model:::mips16:mips16:			// m16.igen (and m16.dc)
     73 :model:::mips16e:mips16e:		// m16e.igen
     74 :model:::mips3d:mips3d:			// mips3d.igen
     75 :model:::mdmx:mdmx:			// mdmx.igen
     76 :model:::dsp:dsp:			// dsp.igen
     77 :model:::dsp2:dsp2:			// dsp2.igen
     78 :model:::smartmips:smartmips:		// smartmips.igen
     79 :model:::micromips32:micromips64:	// micromips.igen
     80 :model:::micromips64:micromips64:	// micromips.igen
     81 :model:::micromipsdsp:micromipsdsp:	// micromipsdsp.igen
     82 
     83 //  Vendor Extensions
     84 //
     85 //  Instructions specific to these extensions are in separate .igen files.
     86 //  Extensions add instructions on to a base ISA.
     87 :model:::sb1:sb1:			// sb1.igen
     88 
     89 
     90 // Pseudo instructions known by IGEN
     91 :internal::::illegal:
     92 {
     93   SignalException (ReservedInstruction, 0);
     94 }
     95 
     96 
     97 // Pseudo instructions known by interp.c
     98 // For grep - RSVD_INSTRUCTION, RSVD_INSTRUCTION_MASK
     99 000000,5.*,5.*,5.*,5.OP,111001:SPECIAL:32::RSVD
    100 "rsvd <OP>"
    101 {
    102   SignalException (ReservedInstruction, instruction_0);
    103 }
    104 
    105 
    106 
    107 // Helpers:
    108 //
    109 // Check if given instruction is CTI, if so signal
    110 //
    111 :function:::void:signal_if_cti:instruction_word instr
    112 {
    113   uint32_t maj = (instr & 0xfc000000) >> 26;
    114   uint32_t special = instr & 0x3f;
    115   if ((maj & 0x3e) == 0x06 /* Branch/Jump */
    116       || ((maj & 0x38) == 0 && !((maj & 0x6) == 0))
    117       || maj == 0x18
    118       || (maj & 0x37) == 0x32
    119       || (maj & 0x37) == 0x36
    120       || ((maj == 0) && (special == 0x9))
    121       /* DERET/ERET/WAIT */
    122       || ((maj == 0x10) && (instr & 0x02000000)
    123 	  && (special == 0x1f || special == 0x18 || special == 0x20)))
    124     {
    125       SignalException (ReservedInstruction, instr);
    126     }
    127 }
    128 
    129 //
    130 // Simulate a 32 bit delayslot instruction
    131 //
    132 
    133 :function:::address_word:delayslot32:address_word target
    134 {
    135   instruction_word delay_insn;
    136   sim_events_slip (SD, 1);
    137   DSPC = CIA;
    138   CIA = CIA + 4; /* NOTE not mips16 */
    139   STATE |= simDELAYSLOT;
    140   delay_insn = IMEM32 (CIA); /* NOTE not mips16 */
    141   signal_if_cti (SD_, delay_insn);
    142   ENGINE_ISSUE_PREFIX_HOOK();
    143   idecode_issue (CPU_, delay_insn, (CIA));
    144   STATE &= ~simDELAYSLOT;
    145   return target;
    146 }
    147 
    148 //
    149 // Simulate a 32 bit forbidden slot instruction
    150 //
    151 
    152 :function:::address_word:forbiddenslot32:
    153 *mips32r6:
    154 *mips64r6:
    155 {
    156   instruction_word delay_insn;
    157   sim_events_slip (SD, 1);
    158   DSPC = CIA;
    159   CIA = CIA + 4;
    160   STATE |= simFORBIDDENSLOT;
    161   delay_insn = IMEM32 (CIA);
    162   signal_if_cti (SD_, delay_insn);
    163   ENGINE_ISSUE_PREFIX_HOOK ();
    164   idecode_issue (CPU_, delay_insn, (CIA));
    165   STATE &= ~simFORBIDDENSLOT;
    166   return CIA + 4;
    167 }
    168 
    169 :function:::address_word:nullify_next_insn32:
    170 {
    171   sim_events_slip (SD, 1);
    172   dotrace (SD, CPU, tracefh, 2, CIA + 4, 4, "load instruction");
    173   return CIA + 8;
    174 }
    175 
    176 
    177 // Helper:
    178 //
    179 // Calculate an effective address given a base and an offset.
    180 //
    181 
    182 :function:::address_word:loadstore_ea:address_word base, address_word offset
    183 *mipsI:
    184 *mipsII:
    185 *mipsIII:
    186 *mipsIV:
    187 *mipsV:
    188 *mips32:
    189 *mips32r2:
    190 *mips32r6:
    191 *vr4100:
    192 *vr5000:
    193 *r3900:
    194 *micromips32:
    195 {
    196   return base + offset;
    197 }
    198 
    199 :function:::address_word:loadstore_ea:address_word base, address_word offset
    200 *mips64:
    201 *mips64r2:
    202 *micromips64:
    203 *mips64r6:
    204 {
    205 #if 0 /* XXX FIXME: enable this only after some additional testing.  */
    206   /* If in user mode and UX is not set, use 32-bit compatibility effective
    207      address computations as defined in the MIPS64 Architecture for
    208      Programmers Volume III, Revision 0.95, section 4.9.  */
    209   if ((SR & (status_KSU_mask|status_EXL|status_ERL|status_UX))
    210       == (ksu_user << status_KSU_shift))
    211     return (address_word)((int32_t)base + (int32_t)offset);
    212 #endif
    213   return base + offset;
    214 }
    215 
    216 
    217 // Helper:
    218 //
    219 // Check that a 32-bit register value is properly sign-extended.
    220 // (See NotWordValue in ISA spec.)
    221 //
    222 
    223 :function:::int:not_word_value:unsigned_word value
    224 *mipsI:
    225 *mipsII:
    226 *mipsIII:
    227 *mipsIV:
    228 *mipsV:
    229 *vr4100:
    230 *vr5000:
    231 *r3900:
    232 *mips32:
    233 *mips32r2:
    234 *mips32r6:
    235 *mips64:
    236 *mips64r2:
    237 *micromips32:
    238 *micromips64:
    239 *mips64r6:
    240 {
    241 #if WITH_TARGET_WORD_BITSIZE == 64
    242   return value != (((value & 0xffffffff) ^ 0x80000000) - 0x80000000);
    243 #else
    244   return 0;
    245 #endif
    246 }
    247 
    248 // Helper:
    249 //
    250 // Handle UNPREDICTABLE operation behaviour.  The goal here is to prevent
    251 // theoretically portable code which invokes non-portable behaviour from
    252 // running with no indication of the portability issue.
    253 // (See definition of UNPREDICTABLE in ISA spec.)
    254 //
    255 
    256 :function:::void:unpredictable:
    257 *mipsI:
    258 *mipsII:
    259 *mipsIII:
    260 *mipsIV:
    261 *mipsV:
    262 *vr4100:
    263 *vr5000:
    264 *r3900:
    265 {
    266 }
    267 
    268 :function:::void:unpredictable:
    269 *mips32:
    270 *mips32r2:
    271 *mips32r6:
    272 *mips64:
    273 *mips64r2:
    274 *micromips32:
    275 *micromips64:
    276 *mips64r6:
    277 {
    278   unpredictable_action (CPU, CIA);
    279 }
    280 
    281 
    282 // Helpers:
    283 //
    284 // Check that an access to a HI/LO register meets timing requirements
    285 //
    286 // In all MIPS ISAs,
    287 //
    288 //	OP {HI and LO} followed by MT{LO or HI} (and not MT{HI or LO})
    289 //	makes subsequent MF{HI or LO} UNPREDICTABLE. (1)
    290 //
    291 // The following restrictions exist for MIPS I - MIPS III:
    292 //
    293 //	MF{HI or LO} followed by MT{HI or LO} w/ less than 2 instructions
    294 //	in between makes MF UNPREDICTABLE. (2)
    295 //
    296 //	MF{HI or LO} followed by OP {HI and LO} w/ less than 2 instructions
    297 //	in between makes MF UNPREDICTABLE. (3)
    298 //
    299 // On the r3900, restriction (2) is not present, and restriction (3) is not
    300 // present for multiplication.
    301 //
    302 // Unfortunately, there seems to be some confusion about whether the last
    303 // two restrictions should apply to "MIPS IV" as well.  One edition of
    304 // the MIPS IV ISA says they do, but references in later ISA documents
    305 // suggest they don't.
    306 //
    307 // In reality, some MIPS IV parts, such as the VR5000 and VR5400, do have
    308 // these restrictions, while others, like the VR5500, don't.  To accommodate
    309 // such differences, the MIPS IV and MIPS V version of these helper functions
    310 // use auxiliary routines to determine whether the restriction applies.
    311 
    312 // check_mf_cycles:
    313 //
    314 // Helper used by check_mt_hilo, check_mult_hilo, and check_div_hilo
    315 // to check for restrictions (2) and (3) above.
    316 //
    317 :function:::int:check_mf_cycles:hilo_history *history, int64_t time, const char *new
    318 {
    319   if (history->mf.timestamp + 3 > time)
    320     {
    321       sim_engine_abort (SD, CPU, CIA, "HILO: %s: %s at 0x%08lx too close to MF at 0x%08lx\n",
    322 			itable[MY_INDEX].name,
    323 			new, (long) CIA,
    324 			(long) history->mf.cia);
    325       return 0;
    326     }
    327   return 1;
    328 }
    329 
    330 
    331 // check_mt_hilo:
    332 //
    333 // Check for restriction (2) above (for ISAs/processors that have it),
    334 // and record timestamps for restriction (1) above.
    335 //
    336 :function:::int:check_mt_hilo:hilo_history *history
    337 *mipsI:
    338 *mipsII:
    339 *mipsIII:
    340 *vr4100:
    341 *vr5000:
    342 {
    343   int64_t time = sim_events_time (SD);
    344   int ok = check_mf_cycles (SD_, history, time, "MT");
    345   history->mt.timestamp = time;
    346   history->mt.cia = CIA;
    347   return ok;
    348 }
    349 
    350 :function:::int:check_mt_hilo:hilo_history *history
    351 *mipsIV:
    352 *mipsV:
    353 {
    354   int64_t time = sim_events_time (SD);
    355   int ok = (! MIPS_MACH_HAS_MT_HILO_HAZARD (SD)
    356 	    || check_mf_cycles (SD_, history, time, "MT"));
    357   history->mt.timestamp = time;
    358   history->mt.cia = CIA;
    359   return ok;
    360 }
    361 
    362 :function:::int:check_mt_hilo:hilo_history *history
    363 *mips32:
    364 *mips32r2:
    365 *mips32r6:
    366 *mips64:
    367 *mips64r2:
    368 *mips64r6:
    369 *r3900:
    370 *micromips32:
    371 *micromips64:
    372 {
    373   int64_t time = sim_events_time (SD);
    374   history->mt.timestamp = time;
    375   history->mt.cia = CIA;
    376   return 1;
    377 }
    378 
    379 
    380 // check_mf_hilo:
    381 //
    382 // Check for restriction (1) above, and record timestamps for
    383 // restriction (2) and (3) above.
    384 //
    385 :function:::int:check_mf_hilo:hilo_history *history, hilo_history *peer
    386 *mipsI:
    387 *mipsII:
    388 *mipsIII:
    389 *mipsIV:
    390 *mipsV:
    391 *mips32:
    392 *mips32r2:
    393 *mips32r6:
    394 *mips64:
    395 *mips64r2:
    396 *mips64r6:
    397 *vr4100:
    398 *vr5000:
    399 *r3900:
    400 *micromips32:
    401 *micromips64:
    402 {
    403   int64_t time = sim_events_time (SD);
    404   int ok = 1;
    405   if (peer != NULL
    406       && peer->mt.timestamp > history->op.timestamp
    407       && history->mt.timestamp < history->op.timestamp
    408       && ! (history->mf.timestamp > history->op.timestamp
    409 	    && history->mf.timestamp < peer->mt.timestamp)
    410       && ! (peer->mf.timestamp > history->op.timestamp
    411 	    && peer->mf.timestamp < peer->mt.timestamp))
    412     {
    413       /* The peer has been written to since the last OP yet we have
    414          not */
    415       sim_engine_abort (SD, CPU, CIA, "HILO: %s: MF at 0x%08lx following OP at 0x%08lx corrupted by MT at 0x%08lx\n",
    416 			itable[MY_INDEX].name,
    417 			(long) CIA,
    418 			(long) history->op.cia,
    419 			(long) peer->mt.cia);
    420       ok = 0;
    421     }
    422   history->mf.timestamp = time;
    423   history->mf.cia = CIA;
    424   return ok;
    425 }
    426 
    427 
    428 
    429 // check_mult_hilo:
    430 //
    431 // Check for restriction (3) above (for ISAs/processors that have it)
    432 // for MULT ops, and record timestamps for restriction (1) above.
    433 //
    434 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
    435 *mipsI:
    436 *mipsII:
    437 *mipsIII:
    438 *vr4100:
    439 *vr5000:
    440 {
    441   int64_t time = sim_events_time (SD);
    442   int ok = (check_mf_cycles (SD_, hi, time, "OP")
    443 	    && check_mf_cycles (SD_, lo, time, "OP"));
    444   hi->op.timestamp = time;
    445   lo->op.timestamp = time;
    446   hi->op.cia = CIA;
    447   lo->op.cia = CIA;
    448   return ok;
    449 }
    450 
    451 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
    452 *mipsIV:
    453 *mipsV:
    454 {
    455   int64_t time = sim_events_time (SD);
    456   int ok = (! MIPS_MACH_HAS_MULT_HILO_HAZARD (SD)
    457 	    || (check_mf_cycles (SD_, hi, time, "OP")
    458 	        && check_mf_cycles (SD_, lo, time, "OP")));
    459   hi->op.timestamp = time;
    460   lo->op.timestamp = time;
    461   hi->op.cia = CIA;
    462   lo->op.cia = CIA;
    463   return ok;
    464 }
    465 
    466 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
    467 *mips32:
    468 *mips32r2:
    469 *mips32r6:
    470 *mips64:
    471 *mips64r2:
    472 *mips64r6:
    473 *r3900:
    474 *micromips32:
    475 *micromips64:
    476 {
    477   /* FIXME: could record the fact that a stall occurred if we want */
    478   int64_t time = sim_events_time (SD);
    479   hi->op.timestamp = time;
    480   lo->op.timestamp = time;
    481   hi->op.cia = CIA;
    482   lo->op.cia = CIA;
    483   return 1;
    484 }
    485 
    486 
    487 // check_div_hilo:
    488 //
    489 // Check for restriction (3) above (for ISAs/processors that have it)
    490 // for DIV ops, and record timestamps for restriction (1) above.
    491 //
    492 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
    493 *mipsI:
    494 *mipsII:
    495 *mipsIII:
    496 *vr4100:
    497 *vr5000:
    498 *r3900:
    499 {
    500   int64_t time = sim_events_time (SD);
    501   int ok = (check_mf_cycles (SD_, hi, time, "OP")
    502 	    && check_mf_cycles (SD_, lo, time, "OP"));
    503   hi->op.timestamp = time;
    504   lo->op.timestamp = time;
    505   hi->op.cia = CIA;
    506   lo->op.cia = CIA;
    507   return ok;
    508 }
    509 
    510 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
    511 *mipsIV:
    512 *mipsV:
    513 {
    514   int64_t time = sim_events_time (SD);
    515   int ok = (! MIPS_MACH_HAS_DIV_HILO_HAZARD (SD)
    516 	    || (check_mf_cycles (SD_, hi, time, "OP")
    517 	        && check_mf_cycles (SD_, lo, time, "OP")));
    518   hi->op.timestamp = time;
    519   lo->op.timestamp = time;
    520   hi->op.cia = CIA;
    521   lo->op.cia = CIA;
    522   return ok;
    523 }
    524 
    525 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
    526 *mips32:
    527 *mips32r2:
    528 *mips32r6:
    529 *mips64:
    530 *mips64r2:
    531 *micromips32:
    532 *micromips64:
    533 *mips64r6:
    534 {
    535   int64_t time = sim_events_time (SD);
    536   hi->op.timestamp = time;
    537   lo->op.timestamp = time;
    538   hi->op.cia = CIA;
    539   lo->op.cia = CIA;
    540   return 1;
    541 }
    542 
    543 
    544 // Helper:
    545 //
    546 // Check that the 64-bit instruction can currently be used, and signal
    547 // a ReservedInstruction exception if not.
    548 //
    549 
    550 :function:::void:check_u64:instruction_word insn
    551 *mipsIII:
    552 *mipsIV:
    553 *mipsV:
    554 *vr4100:
    555 *vr5000:
    556 *vr5400:
    557 *vr5500:
    558 *r3900:
    559 {
    560   // The check should be similar to mips64 for any with PX/UX bit equivalents.
    561 }
    562 
    563 :function:::void:check_u64:instruction_word insn
    564 *mips16e:
    565 *mips64:
    566 *mips64r2:
    567 *mips32:
    568 *mips32r2:
    569 *mips32r6:
    570 *micromips64:
    571 *micromips32:
    572 *mips64r6:
    573 {
    574 #if 0 /* XXX FIXME: enable this only after some additional testing.  */
    575   if (UserMode && (SR & (status_UX|status_PX)) == 0)
    576     SignalException (ReservedInstruction, insn);
    577 #endif
    578 }
    579 
    580 
    581 
    582 //
    583 // MIPS Architecture:
    584 //
    585 //        CPU Instruction Set (mipsI - mipsV, mips32/r2, mips64/r2)
    586 //
    587 
    588 
    589 :function:::void:do_add:int rs, int rt, int rd
    590 {
    591   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
    592     Unpredictable ();
    593   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
    594   {
    595     ALU32_BEGIN (GPR[rs]);
    596     ALU32_ADD (GPR[rt]);
    597     ALU32_END (GPR[rd]);   /* This checks for overflow.  */
    598   }
    599   TRACE_ALU_RESULT (GPR[rd]);
    600 }
    601 
    602 :function:::void:do_addi:int rs, int rt, uint16_t immediate
    603 {
    604   if (NotWordValue (GPR[rs]))
    605     Unpredictable ();
    606   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
    607   {
    608     ALU32_BEGIN (GPR[rs]);
    609     ALU32_ADD (EXTEND16 (immediate));
    610     ALU32_END (GPR[rt]);   /* This checks for overflow.  */
    611   }
    612   TRACE_ALU_RESULT (GPR[rt]);
    613 }
    614 
    615 :function:::void:do_andi:int rs, int rt, unsigned int immediate
    616 {
    617   TRACE_ALU_INPUT2 (GPR[rs], immediate);
    618   GPR[rt] = GPR[rs] & immediate;
    619   TRACE_ALU_RESULT (GPR[rt]);
    620 }
    621 
    622 :function:::void:do_dadd:int rd, int rs, int rt
    623 {
    624   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
    625   {
    626     ALU64_BEGIN (GPR[rs]);
    627     ALU64_ADD (GPR[rt]);
    628     ALU64_END (GPR[rd]);   /* This checks for overflow.  */
    629   }
    630   TRACE_ALU_RESULT (GPR[rd]);
    631 }
    632 
    633 :function:::void:do_daddi:int rt, int rs, int immediate
    634 {
    635   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
    636   {
    637     ALU64_BEGIN (GPR[rs]);
    638     ALU64_ADD (EXTEND16 (immediate));
    639     ALU64_END (GPR[rt]);   /* This checks for overflow.  */
    640   }
    641   TRACE_ALU_RESULT (GPR[rt]);
    642 }
    643 
    644 :function:::void:do_dsll32:int rd, int rt, int shift
    645 {
    646   int s = 32 + shift;
    647   TRACE_ALU_INPUT2 (GPR[rt], s);
    648   GPR[rd] = GPR[rt] << s;
    649   TRACE_ALU_RESULT (GPR[rd]);
    650 }
    651 
    652 :function:::void:do_dsra32:int rd, int rt, int shift
    653 {
    654   int s = 32 + shift;
    655   TRACE_ALU_INPUT2 (GPR[rt], s);
    656   GPR[rd] = ((int64_t) GPR[rt]) >> s;
    657   TRACE_ALU_RESULT (GPR[rd]);
    658 }
    659 
    660 :function:::void:do_dsrl32:int rd, int rt, int shift
    661 {
    662   int s = 32 + shift;
    663   TRACE_ALU_INPUT2 (GPR[rt], s);
    664   GPR[rd] = (uint64_t) GPR[rt] >> s;
    665   TRACE_ALU_RESULT (GPR[rd]);
    666 }
    667 
    668 :function:::void:do_dsub:int rd, int rs, int rt
    669 {
    670   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
    671   {
    672     ALU64_BEGIN (GPR[rs]);
    673     ALU64_SUB (GPR[rt]);
    674     ALU64_END (GPR[rd]);   /* This checks for overflow.  */
    675   }
    676   TRACE_ALU_RESULT (GPR[rd]);
    677 }
    678 
    679 :function:::void:do_break:address_word instruction_0
    680 {
    681   /* Check for some break instruction which are reserved for use by the
    682      simulator.  */
    683   unsigned int break_code = instruction_0 & HALT_INSTRUCTION_MASK;
    684   if (break_code == (HALT_INSTRUCTION  & HALT_INSTRUCTION_MASK) ||
    685       break_code == (HALT_INSTRUCTION2 & HALT_INSTRUCTION_MASK))
    686     {
    687       sim_engine_halt (SD, CPU, NULL, cia,
    688 		       sim_exited, (unsigned int)(A0 & 0xFFFFFFFF));
    689     }
    690   else if (break_code == (BREAKPOINT_INSTRUCTION  & HALT_INSTRUCTION_MASK) ||
    691 	   break_code == (BREAKPOINT_INSTRUCTION2 & HALT_INSTRUCTION_MASK))
    692     {
    693       if (STATE & simDELAYSLOT)
    694 	PC = cia - 4; /* reference the branch instruction */
    695       else
    696 	PC = cia;
    697       SignalException (BreakPoint, instruction_0);
    698     }
    699 
    700   else
    701     {
    702       /* If we get this far, we're not an instruction reserved by the sim.  Raise
    703 	 the exception. */
    704       SignalException (BreakPoint, instruction_0);
    705     }
    706 }
    707 
    708 :function:::void:do_break16:address_word instruction_0
    709 {
    710   if (STATE & simDELAYSLOT)
    711     PC = cia - 2; /* reference the branch instruction */
    712   else
    713     PC = cia;
    714   SignalException (BreakPoint, instruction_0);
    715 }
    716 
    717 :function:::void:do_clo:int rd, int rs
    718 {
    719   uint32_t temp = GPR[rs];
    720   uint32_t i, mask;
    721   if (NotWordValue (GPR[rs]))
    722     Unpredictable ();
    723   TRACE_ALU_INPUT1 (GPR[rs]);
    724   for (mask = ((uint32_t)1<<31), i = 0; i < 32; ++i)
    725     {
    726       if ((temp & mask) == 0)
    727 	break;
    728       mask >>= 1;
    729     }
    730   GPR[rd] = EXTEND32 (i);
    731   TRACE_ALU_RESULT (GPR[rd]);
    732 }
    733 
    734 :function:::void:do_clz:int rd, int rs
    735 {
    736   uint32_t temp = GPR[rs];
    737   uint32_t i, mask;
    738   if (NotWordValue (GPR[rs]))
    739     Unpredictable ();
    740   TRACE_ALU_INPUT1 (GPR[rs]);
    741   for (mask = ((uint32_t)1<<31), i = 0; i < 32; ++i)
    742     {
    743       if ((temp & mask) != 0)
    744 	break;
    745       mask >>= 1;
    746     }
    747   GPR[rd] = EXTEND32 (i);
    748   TRACE_ALU_RESULT (GPR[rd]);
    749 }
    750 
    751 :function:::void:do_dclo:int rd, int rs
    752 {
    753   uint64_t temp = GPR[rs];
    754   uint32_t i;
    755   uint64_t mask;
    756   TRACE_ALU_INPUT1 (GPR[rs]);
    757   for (mask = ((uint64_t)1<<63), i = 0; i < 64; ++i)
    758     {
    759       if ((temp & mask) == 0)
    760 	break;
    761       mask >>= 1;
    762     }
    763   GPR[rd] = EXTEND32 (i);
    764   TRACE_ALU_RESULT (GPR[rd]);
    765 }
    766 
    767 :function:::void:do_dclz:int rd, int rs
    768 {
    769   uint64_t temp = GPR[rs];
    770   uint32_t i;
    771   uint64_t mask;
    772   TRACE_ALU_INPUT1 (GPR[rs]);
    773   for (mask = ((uint64_t)1<<63), i = 0; i < 64; ++i)
    774     {
    775       if ((temp & mask) != 0)
    776 	break;
    777       mask >>= 1;
    778     }
    779   GPR[rd] = EXTEND32 (i);
    780   TRACE_ALU_RESULT (GPR[rd]);
    781 }
    782 
    783 :function:::void:do_lb:int rt, int offset, int base
    784 {
    785   GPR[rt] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[base],
    786 			      EXTEND16 (offset)));
    787 }
    788 
    789 :function:::void:do_lh:int rt, int offset, int base
    790 {
    791   GPR[rt] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[base],
    792 			       EXTEND16 (offset)));
    793 }
    794 
    795 :function:::void:do_lwr:int rt, int offset, int base
    796 {
    797   GPR[rt] = EXTEND32 (do_load_right (SD_, AccessLength_WORD, GPR[base],
    798 				     EXTEND16 (offset), GPR[rt]));
    799 }
    800 
    801 :function:::void:do_lwl:int rt, int offset, int base
    802 {
    803   GPR[rt] = EXTEND32 (do_load_left (SD_, AccessLength_WORD, GPR[base],
    804 				    EXTEND16 (offset), GPR[rt]));
    805 }
    806 
    807 :function:::void:do_lwc:int num, int rt, int offset, int base
    808 {
    809   COP_LW (num, rt, do_load (SD_, AccessLength_WORD, GPR[base],
    810 			    EXTEND16 (offset)));
    811 }
    812 
    813 :function:::void:do_lw:int rt, int offset, int base
    814 {
    815   GPR[rt] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[base],
    816 			       EXTEND16 (offset)));
    817 }
    818 
    819 :function:::void:do_lwu:int rt, int offset, int base, address_word instruction_0
    820 {
    821   check_u64 (SD_, instruction_0);
    822   GPR[rt] = do_load (SD_, AccessLength_WORD, GPR[base], EXTEND16 (offset));
    823 }
    824 
    825 :function:::void:do_lhu:int rt, int offset, int base
    826 {
    827   GPR[rt] = do_load (SD_, AccessLength_HALFWORD, GPR[base], EXTEND16 (offset));
    828 }
    829 
    830 :function:::void:do_ldc:int num, int rt, int offset, int base
    831 {
    832   COP_LD (num, rt, do_load (SD_, AccessLength_DOUBLEWORD, GPR[base],
    833 			    EXTEND16 (offset)));
    834 }
    835 
    836 :function:::void:do_lbu:int rt, int offset, int base
    837 {
    838   GPR[rt] = do_load (SD_, AccessLength_BYTE, GPR[base], EXTEND16 (offset));
    839 }
    840 
    841 :function:::void:do_ll:int rt, int insn_offset, int basereg
    842 {
    843   address_word base = GPR[basereg];
    844   address_word offset = EXTEND16 (insn_offset);
    845     {
    846       address_word vaddr = loadstore_ea (SD_, base, offset);
    847       address_word paddr = vaddr;
    848       if ((vaddr & 3) != 0)
    849 	{
    850 	  SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, read_transfer,
    851 			   sim_core_unaligned_signal);
    852 	}
    853       else
    854 	{
    855 	  uint64_t memval = 0;
    856 	  uint64_t memval1 = 0;
    857 	  uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
    858 	  unsigned int shift = 2;
    859 	  unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
    860 	  unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
    861 	  unsigned int byte;
    862 	  paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
    863 	  LoadMemory (&memval, &memval1, AccessLength_WORD, paddr, vaddr,
    864 		      isDATA, isREAL);
    865 	  byte = ((vaddr & mask) ^ (bigend << shift));
    866 	  GPR[rt] = EXTEND32 (memval >> (8 * byte));
    867 	  LLBIT = 1;
    868 	}
    869     }
    870 }
    871 
    872 :function:::void:do_lld:int rt, int roffset, int rbase
    873 {
    874   address_word base = GPR[rbase];
    875   address_word offset = EXTEND16 (roffset);
    876   {
    877     address_word vaddr = loadstore_ea (SD_, base, offset);
    878     address_word paddr = vaddr;
    879 
    880     if ((vaddr & 7) != 0)
    881       {
    882 	SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, read_transfer,
    883 		sim_core_unaligned_signal);
    884       }
    885     else
    886       {
    887 	uint64_t memval = 0;
    888 	uint64_t memval1 = 0;
    889 	LoadMemory (&memval, &memval1, AccessLength_DOUBLEWORD, paddr, vaddr,
    890 		    isDATA, isREAL);
    891 	GPR[rt] = memval;
    892 	LLBIT = 1;
    893       }
    894   }
    895 }
    896 
    897 :function:::void:do_lui:int rt, int immediate
    898 {
    899   TRACE_ALU_INPUT1 (immediate);
    900   GPR[rt] = EXTEND32 (immediate << 16);
    901   TRACE_ALU_RESULT (GPR[rt]);
    902 }
    903 
    904 :function:::void:do_madd:int rs, int rt
    905 {
    906   int64_t temp;
    907   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
    908   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
    909     Unpredictable ();
    910   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
    911   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
    912 	  + ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs])));
    913   LO = EXTEND32 (temp);
    914   HI = EXTEND32 (VH4_8 (temp));
    915   TRACE_ALU_RESULT2 (HI, LO);
    916 }
    917 
    918 :function:::void:do_dsp_madd:int ac, int rs, int rt
    919 {
    920   int64_t temp;
    921   if (ac == 0)
    922     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
    923   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
    924     Unpredictable ();
    925   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
    926   temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac)))
    927 	  + ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs])));
    928   DSPLO(ac) = EXTEND32 (temp);
    929   DSPHI(ac) = EXTEND32 (VH4_8 (temp));
    930   if (ac == 0)
    931     TRACE_ALU_RESULT2 (HI, LO);
    932 }
    933 
    934 :function:::void:do_maddu:int rs, int rt
    935 {
    936   uint64_t temp;
    937   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
    938   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
    939     Unpredictable ();
    940   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
    941   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
    942 	  + ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt])));
    943   ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp;  /* SmartMIPS */
    944   LO = EXTEND32 (temp);
    945   HI = EXTEND32 (VH4_8 (temp));
    946   TRACE_ALU_RESULT2 (HI, LO);
    947 }
    948 
    949 :function:::void:do_dsp_maddu:int ac, int rs, int rt
    950 {
    951   uint64_t temp;
    952   if (ac == 0)
    953     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
    954   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
    955     Unpredictable ();
    956   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
    957   temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac)))
    958 	  + ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt])));
    959   if (ac == 0)
    960     ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp;  /* SmartMIPS */
    961   DSPLO(ac) = EXTEND32 (temp);
    962   DSPHI(ac) = EXTEND32 (VH4_8 (temp));
    963   if (ac == 0)
    964     TRACE_ALU_RESULT2 (HI, LO);
    965 }
    966 
    967 :function:::void:do_dsp_mfhi:int ac, int rd
    968 {
    969   if (ac == 0)
    970     do_mfhi (SD_, rd);
    971   else
    972     GPR[rd] = DSPHI(ac);
    973 }
    974 
    975 :function:::void:do_dsp_mflo:int ac, int rd
    976 {
    977   if (ac == 0)
    978     do_mflo (SD_, rd);
    979   else
    980     GPR[rd] = DSPLO(ac);
    981 }
    982 
    983 :function:::void:do_movn:int rd, int rs, int rt
    984 {
    985   if (GPR[rt] != 0)
    986     {
    987       GPR[rd] = GPR[rs];
    988       TRACE_ALU_RESULT (GPR[rd]);
    989     }
    990 }
    991 
    992 :function:::void:do_movz:int rd, int rs, int rt
    993 {
    994   if (GPR[rt] == 0)
    995     {
    996       GPR[rd] = GPR[rs];
    997       TRACE_ALU_RESULT (GPR[rd]);
    998     }
    999 }
   1000 
   1001 :function:::void:do_msub:int rs, int rt
   1002 {
   1003   int64_t temp;
   1004   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   1005   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1006     Unpredictable ();
   1007   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1008   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
   1009 	  - ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs])));
   1010   LO = EXTEND32 (temp);
   1011   HI = EXTEND32 (VH4_8 (temp));
   1012   TRACE_ALU_RESULT2 (HI, LO);
   1013 }
   1014 
   1015 :function:::void:do_dsp_msub:int ac, int rs, int rt
   1016 {
   1017   int64_t temp;
   1018   if (ac == 0)
   1019     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   1020   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1021     Unpredictable ();
   1022   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1023   temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac)))
   1024 	  - ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs])));
   1025   DSPLO(ac) = EXTEND32 (temp);
   1026   DSPHI(ac) = EXTEND32 (VH4_8 (temp));
   1027   if (ac == 0)
   1028     TRACE_ALU_RESULT2 (HI, LO);
   1029 }
   1030 
   1031 :function:::void:do_msubu:int rs, int rt
   1032 {
   1033   uint64_t temp;
   1034   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   1035   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1036     Unpredictable ();
   1037   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1038   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
   1039 	  - ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt])));
   1040   LO = EXTEND32 (temp);
   1041   HI = EXTEND32 (VH4_8 (temp));
   1042   TRACE_ALU_RESULT2 (HI, LO);
   1043 }
   1044 
   1045 :function:::void:do_dsp_msubu:int ac, int rs, int rt
   1046 {
   1047   uint64_t temp;
   1048   if (ac == 0)
   1049     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   1050   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1051     Unpredictable ();
   1052   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1053   temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac)))
   1054 	  - ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt])));
   1055   DSPLO(ac) = EXTEND32 (temp);
   1056   DSPHI(ac) = EXTEND32 (VH4_8 (temp));
   1057   if (ac == 0)
   1058     TRACE_ALU_RESULT2 (HI, LO);
   1059 }
   1060 
   1061 :function:::void:do_mthi:int rs
   1062 {
   1063   check_mt_hilo (SD_, HIHISTORY);
   1064   HI = GPR[rs];
   1065 }
   1066 
   1067 :function:::void:do_dsp_mthi:int ac, int rs
   1068 {
   1069   if (ac == 0)
   1070     check_mt_hilo (SD_, HIHISTORY);
   1071   DSPHI(ac) = GPR[rs];
   1072 }
   1073 
   1074 :function:::void:do_mtlo:int rs
   1075 {
   1076   check_mt_hilo (SD_, LOHISTORY);
   1077   LO = GPR[rs];
   1078 }
   1079 
   1080 :function:::void:do_dsp_mtlo:int ac, int rs
   1081 {
   1082   if (ac == 0)
   1083     check_mt_hilo (SD_, LOHISTORY);
   1084   DSPLO(ac) = GPR[rs];
   1085 }
   1086 
   1087 :function:::void:do_mul:int rd, int rs, int rt
   1088 {
   1089   int64_t prod;
   1090   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1091     Unpredictable ();
   1092   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1093   prod = (((int64_t)(int32_t) GPR[rs])
   1094 	  * ((int64_t)(int32_t) GPR[rt]));
   1095   GPR[rd] = EXTEND32 (VL4_8 (prod));
   1096   TRACE_ALU_RESULT (GPR[rd]);
   1097 }
   1098 
   1099 :function:::void:do_dsp_mult:int ac, int rs, int rt
   1100 {
   1101   int64_t prod;
   1102   if (ac == 0)
   1103     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   1104   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1105     Unpredictable ();
   1106   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1107   prod = ((int64_t)(int32_t) GPR[rs])
   1108 	  * ((int64_t)(int32_t) GPR[rt]);
   1109   DSPLO(ac) = EXTEND32 (VL4_8 (prod));
   1110   DSPHI(ac) = EXTEND32 (VH4_8 (prod));
   1111   if (ac == 0)
   1112   {
   1113     ACX = 0;  /* SmartMIPS */
   1114     TRACE_ALU_RESULT2 (HI, LO);
   1115   }
   1116 }
   1117 
   1118 :function:::void:do_dsp_multu:int ac, int rs, int rt
   1119 {
   1120   uint64_t prod;
   1121   if (ac == 0)
   1122     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   1123   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1124     Unpredictable ();
   1125   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1126   prod = ((uint64_t)(uint32_t) GPR[rs])
   1127           * ((uint64_t)(uint32_t) GPR[rt]);
   1128   DSPLO(ac) = EXTEND32 (VL4_8 (prod));
   1129   DSPHI(ac) = EXTEND32 (VH4_8 (prod));
   1130   if (ac == 0)
   1131     TRACE_ALU_RESULT2 (HI, LO);
   1132 }
   1133 
   1134 :function:::void:do_pref:int hint, int insn_offset, int insn_base
   1135 {
   1136   /*
   1137   address_word base = GPR[insn_base];
   1138   address_word offset = EXTEND16 (insn_offset);
   1139   address_word vaddr = loadstore_ea (SD_, base, offset);
   1140   address_word paddr = vaddr;
   1141   Prefetch (paddr, vaddr, isDATA, hint);
   1142   */
   1143 }
   1144 
   1145 :function:::void:do_sc:int rt, int offsetarg, int basereg, address_word instruction_0, int store_ll_bit
   1146 {
   1147   address_word base = GPR[basereg];
   1148   address_word offset = EXTEND16 (offsetarg);
   1149   {
   1150     address_word vaddr = loadstore_ea (SD_, base, offset);
   1151     address_word paddr = vaddr;
   1152 
   1153     if ((vaddr & 3) != 0)
   1154       {
   1155 	SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer,
   1156 			 sim_core_unaligned_signal);
   1157       }
   1158     else
   1159       {
   1160 	uint64_t memval = 0;
   1161 	uint64_t memval1 = 0;
   1162 	uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   1163 	address_word reverseendian =
   1164 	  (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
   1165 	address_word bigendiancpu =
   1166 	  (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
   1167 	unsigned int byte;
   1168 	paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
   1169 	byte = ((vaddr & mask) ^ bigendiancpu);
   1170 	memval = ((uint64_t) GPR[rt] << (8 * byte));
   1171 	if (LLBIT)
   1172 	  StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr,
   1173 		        isREAL);
   1174 	if (store_ll_bit)
   1175 	  GPR[rt] = LLBIT;
   1176       }
   1177   }
   1178 }
   1179 
   1180 :function:::void:do_scd:int rt, int roffset, int rbase, int store_ll_bit
   1181 {
   1182   address_word base = GPR[rbase];
   1183   address_word offset = EXTEND16 (roffset);
   1184   {
   1185     address_word vaddr = loadstore_ea (SD_, base, offset);
   1186     address_word paddr = vaddr;
   1187 
   1188     if ((vaddr & 7) != 0)
   1189       {
   1190 	SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, write_transfer,
   1191 			 sim_core_unaligned_signal);
   1192       }
   1193     else
   1194       {
   1195 	uint64_t memval = 0;
   1196 	uint64_t memval1 = 0;
   1197 	memval = GPR[rt];
   1198 	if (LLBIT)
   1199 	  StoreMemory (AccessLength_DOUBLEWORD, memval, memval1, paddr, vaddr,
   1200 		       isREAL);
   1201 	if (store_ll_bit)
   1202 	  GPR[rt] = LLBIT;
   1203       }
   1204   }
   1205 }
   1206 
   1207 :function:::void:do_sub:int rs, int rt, int rd
   1208 {
   1209   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1210     Unpredictable ();
   1211   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1212   {
   1213     ALU32_BEGIN (GPR[rs]);
   1214     ALU32_SUB (GPR[rt]);
   1215     ALU32_END (GPR[rd]);   /* This checks for overflow.  */
   1216   }
   1217   TRACE_ALU_RESULT (GPR[rd]);
   1218 }
   1219 
   1220 :function:::void:do_sw:int rt, int offset, int base
   1221 {
   1222   do_store (SD_, AccessLength_WORD, GPR[base], EXTEND16 (offset), GPR[rt]);
   1223 }
   1224 
   1225 :function:::void:do_teq:int rs, int rt, address_word instruction_0
   1226 {
   1227   if ((signed_word) GPR[rs] == (signed_word) GPR[rt])
   1228     SignalException (Trap, instruction_0);
   1229 }
   1230 
   1231 :function:::void:do_teqi:int rs, int immediate, address_word instruction_0
   1232 {
   1233   if ((signed_word) GPR[rs] == (signed_word) EXTEND16 (immediate))
   1234     SignalException (Trap, instruction_0);
   1235 }
   1236 
   1237 :function:::void:do_tge:int rs, int rt, address_word instruction_0
   1238 {
   1239   if ((signed_word) GPR[rs] >= (signed_word) GPR[rt])
   1240     SignalException (Trap, instruction_0);
   1241 }
   1242 
   1243 :function:::void:do_tgei:int rs, int immediate, address_word instruction_0
   1244 {
   1245   if ((signed_word) GPR[rs] >= (signed_word) EXTEND16 (immediate))
   1246     SignalException (Trap, instruction_0);
   1247 }
   1248 
   1249 :function:::void:do_tgeiu:int rs, int immediate, address_word instruction_0
   1250 {
   1251   if ((unsigned_word) GPR[rs] >= (unsigned_word) EXTEND16 (immediate))
   1252     SignalException (Trap, instruction_0);
   1253 }
   1254 
   1255 :function:::void:do_tgeu:int rs ,int rt, address_word instruction_0
   1256 {
   1257   if ((unsigned_word) GPR[rs] >= (unsigned_word) GPR[rt])
   1258     SignalException (Trap, instruction_0);
   1259 }
   1260 
   1261 :function:::void:do_tlt:int rs, int rt, address_word instruction_0
   1262 {
   1263   if ((signed_word) GPR[rs] < (signed_word) GPR[rt])
   1264     SignalException (Trap, instruction_0);
   1265 }
   1266 
   1267 :function:::void:do_tlti:int rs, int immediate, address_word instruction_0
   1268 {
   1269   if ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate))
   1270     SignalException (Trap, instruction_0);
   1271 }
   1272 
   1273 :function:::void:do_tltiu:int rs, int immediate, address_word instruction_0
   1274 {
   1275   if ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate))
   1276     SignalException (Trap, instruction_0);
   1277 }
   1278 
   1279 :function:::void:do_tltu:int rs, int rt, address_word instruction_0
   1280 {
   1281   if ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt])
   1282     SignalException (Trap, instruction_0);
   1283 }
   1284 
   1285 :function:::void:do_tne:int rs, int rt, address_word instruction_0
   1286 {
   1287   if ((signed_word) GPR[rs] != (signed_word) GPR[rt])
   1288     SignalException (Trap, instruction_0);
   1289 }
   1290 
   1291 :function:::void:do_tnei:int rs, int immediate, address_word instruction_0
   1292 {
   1293   if ((signed_word) GPR[rs] != (signed_word) EXTEND16 (immediate))
   1294     SignalException (Trap, instruction_0);
   1295 }
   1296 
   1297 :function:::void:do_abs_fmt:int fmt, int fd, int fs, address_word instruction_0
   1298 {
   1299   check_fpu (SD_);
   1300   check_fmt_p (SD_, fmt, instruction_0);
   1301   StoreFPR (fd, fmt, AbsoluteValue (ValueFPR (fs, fmt), fmt));
   1302 }
   1303 
   1304 :function:::void:do_add_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0
   1305 {
   1306   check_fpu (SD_);
   1307   check_fmt_p (SD_, fmt, instruction_0);
   1308   StoreFPR (fd, fmt, Add (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt));
   1309 }
   1310 
   1311 :function:::void:do_alnv_ps:int fd, int fs, int ft, int rs, address_word instruction_0
   1312 {
   1313   uint64_t fsx;
   1314   uint64_t ftx;
   1315   uint64_t fdx;
   1316   check_fpu (SD_);
   1317   check_u64 (SD_, instruction_0);
   1318   fsx = ValueFPR (fs, fmt_ps);
   1319   if ((GPR[rs] & 0x3) != 0)
   1320     Unpredictable ();
   1321   if ((GPR[rs] & 0x4) == 0)
   1322     fdx = fsx;
   1323   else
   1324     {
   1325       ftx = ValueFPR (ft, fmt_ps);
   1326       if (BigEndianCPU)
   1327 	fdx = PackPS (PSLower (fsx), PSUpper (ftx));
   1328       else
   1329 	fdx = PackPS (PSLower (ftx), PSUpper (fsx));
   1330     }
   1331   StoreFPR (fd, fmt_ps, fdx);
   1332 }
   1333 
   1334 :function:::void:do_c_cond_fmt:int cond, int fmt, int cc, int fs, int ft, address_word instruction_0
   1335 {
   1336   check_fpu (SD_);
   1337   check_fmt_p (SD_, fmt, instruction_0);
   1338   Compare (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt, cond, cc);
   1339   TRACE_ALU_RESULT (ValueFCR (31));
   1340 }
   1341 
   1342 :function:::void:do_ceil_fmt:int type, int fmt, int fd, int fs, address_word instruction_0
   1343 {
   1344   check_fpu (SD_);
   1345   check_fmt_p (SD_, fmt, instruction_0);
   1346   StoreFPR (fd, type, Convert (FP_RM_TOPINF, ValueFPR (fs, fmt), fmt,
   1347 	    type));
   1348 }
   1349 
   1350 :function:::void:do_cfc1:int rt, int fs
   1351 {
   1352   check_fpu (SD_);
   1353   if (fs == 0 || fs == 25 || fs == 26 || fs == 28 || fs == 31)
   1354     {
   1355       unsigned_word  fcr = ValueFCR (fs);
   1356       TRACE_ALU_INPUT1 (fcr);
   1357       GPR[rt] = fcr;
   1358     }
   1359   /* else NOP */
   1360   TRACE_ALU_RESULT (GPR[rt]);
   1361 }
   1362 
   1363 :function:::void:do_ctc1:int rt, int fs
   1364 {
   1365   check_fpu (SD_);
   1366   TRACE_ALU_INPUT1 (GPR[rt]);
   1367   if (fs == 25 || fs == 26 || fs == 28 || fs == 31)
   1368       StoreFCR (fs, GPR[rt]);
   1369   /* else NOP */
   1370 }
   1371 
   1372 :function:::void:do_cvt_d_fmt:int fmt, int fd, int fs, address_word instruction_0
   1373 {
   1374   check_fpu (SD_);
   1375   if ((fmt == fmt_double) | 0)
   1376     SignalException (ReservedInstruction, instruction_0);
   1377   StoreFPR (fd, fmt_double, Convert (GETRM (), ValueFPR (fs, fmt), fmt,
   1378 	    fmt_double));
   1379 }
   1380 
   1381 :function:::void:do_cvt_l_fmt:int fmt, int fd, int fs, address_word instruction_0
   1382 {
   1383   check_fpu (SD_);
   1384   if ((fmt == fmt_long) | ((fmt == fmt_long) || (fmt == fmt_word)))
   1385     SignalException (ReservedInstruction, instruction_0);
   1386   StoreFPR (fd, fmt_long, Convert (GETRM (), ValueFPR (fs, fmt), fmt,
   1387 	    fmt_long));
   1388 }
   1389 
   1390 :function:::void:do_cvt_ps_s:int fd, int fs, int ft, address_word instruction_0
   1391 {
   1392   check_fpu (SD_);
   1393   check_u64 (SD_, instruction_0);
   1394   StoreFPR (fd, fmt_ps, PackPS (ValueFPR (fs, fmt_single),
   1395 				ValueFPR (ft, fmt_single)));
   1396 }
   1397 
   1398 :function:::void:do_cvt_s_fmt:int fmt, int fd, int fs, address_word instruction_0
   1399 {
   1400   check_fpu (SD_);
   1401   if ((fmt == fmt_single) | 0)
   1402     SignalException (ReservedInstruction, instruction_0);
   1403   StoreFPR (fd, fmt_single, Convert (GETRM (), ValueFPR (fs, fmt), fmt,
   1404 	    fmt_single));
   1405 }
   1406 
   1407 :function:::void:do_cvt_s_pl:int fd, int fs, address_word instruction_0
   1408 {
   1409   check_fpu (SD_);
   1410   check_u64 (SD_, instruction_0);
   1411   StoreFPR (fd, fmt_single, PSLower (ValueFPR (fs, fmt_ps)));
   1412 }
   1413 
   1414 :function:::void:do_cvt_s_pu:int fd, int fs, address_word instruction_0
   1415 {
   1416   check_fpu (SD_);
   1417   check_u64 (SD_, instruction_0);
   1418   StoreFPR (fd, fmt_single, PSUpper (ValueFPR (fs, fmt_ps)));
   1419 }
   1420 
   1421 :function:::void:do_cvt_w_fmt:int fmt, int fd, int fs, address_word instruction_0
   1422 {
   1423   check_fpu (SD_);
   1424   if ((fmt == fmt_word) | ((fmt == fmt_long) || (fmt == fmt_word)))
   1425     SignalException (ReservedInstruction, instruction_0);
   1426   StoreFPR (fd, fmt_word, Convert (GETRM (), ValueFPR (fs, fmt), fmt,
   1427 	    fmt_word));
   1428 }
   1429 
   1430 :function:::void:do_div_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0
   1431 {
   1432   check_fpu (SD_);
   1433   StoreFPR (fd, fmt, Divide (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt));
   1434 }
   1435 
   1436 :function:::void:do_dmfc1b:int rt, int fs
   1437 *mipsIV:
   1438 *mipsV:
   1439 *mips64:
   1440 *mips64r2:
   1441 *mips64r6:
   1442 *vr4100:
   1443 *vr5000:
   1444 *r3900:
   1445 *micromips64:
   1446 {
   1447   if (SizeFGR () == 64)
   1448     GPR[rt] = FGR[fs];
   1449   else if ((fs & 0x1) == 0)
   1450     GPR[rt] = SET64HI (FGR[fs+1]) | FGR[fs];
   1451   else
   1452     Unpredictable ();
   1453   TRACE_ALU_RESULT (GPR[rt]);
   1454 }
   1455 
   1456 :function:::void:do_dmtc1b:int rt, int fs
   1457 {
   1458   if (SizeFGR () == 64)
   1459     StoreFPR (fs, fmt_uninterpreted_64, GPR[rt]);
   1460   else if ((fs & 0x1) == 0)
   1461     StoreFPR (fs, fmt_uninterpreted_64, GPR[rt]);
   1462   else
   1463     Unpredictable ();
   1464 }
   1465 
   1466 :function:::void:do_floor_fmt:int type, int fmt, int fd, int fs
   1467 {
   1468   check_fpu (SD_);
   1469   StoreFPR (fd, type, Convert (FP_RM_TOMINF, ValueFPR (fs, fmt), fmt,
   1470 	    type));
   1471 }
   1472 
   1473 :function:::void:do_luxc1_32:int fd, int rindex, int rbase
   1474 *mips32r2:
   1475 *micromips32:
   1476 {
   1477   address_word base = GPR[rbase];
   1478   address_word index = GPR[rindex];
   1479   address_word vaddr = base + index;
   1480   check_fpu (SD_);
   1481   if (SizeFGR () != 64)
   1482     Unpredictable ();
   1483   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
   1484   if ((vaddr & 0x7) != 0)
   1485     index -= (vaddr & 0x7);
   1486   COP_LD (1, fd, do_load_double (SD_, base, index));
   1487 }
   1488 
   1489 :function:::void:do_luxc1_64:int fd, int rindex, int rbase
   1490 {
   1491   address_word base = GPR[rbase];
   1492   address_word index = GPR[rindex];
   1493   address_word vaddr = base + index;
   1494   if (SizeFGR () != 64)
   1495     Unpredictable ();
   1496   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
   1497   if ((vaddr & 0x7) != 0)
   1498     index -= (vaddr & 0x7);
   1499   COP_LD (1, fd, do_load (SD_, AccessLength_DOUBLEWORD, base, index));
   1500 
   1501 }
   1502 
   1503 :function:::void:do_lwc1:int ft, int offset, int base
   1504 {
   1505   check_fpu (SD_);
   1506   COP_LW (1, ft, do_load (SD_, AccessLength_WORD, GPR[base],
   1507 			  EXTEND16 (offset)));
   1508 }
   1509 
   1510 :function:::void:do_lwxc1:int fd, int index, int base, address_word instruction_0
   1511 {
   1512   check_fpu (SD_);
   1513   check_u64 (SD_, instruction_0);
   1514   COP_LW (1, fd, do_load (SD_, AccessLength_WORD, GPR[base], GPR[index]));
   1515 }
   1516 
   1517 :function:::void:do_madd_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0
   1518 {
   1519   check_fpu (SD_);
   1520   check_u64 (SD_, instruction_0);
   1521   check_fmt_p (SD_, fmt, instruction_0);
   1522   StoreFPR (fd, fmt, MultiplyAdd (ValueFPR (fs, fmt), ValueFPR (ft, fmt),
   1523 				  ValueFPR (fr, fmt), fmt));
   1524 }
   1525 
   1526 :function:::void:do_mfc1b:int rt, int fs
   1527 {
   1528   check_fpu (SD_);
   1529   GPR[rt] = EXTEND32 (FGR[fs]);
   1530   TRACE_ALU_RESULT (GPR[rt]);
   1531 }
   1532 
   1533 :function:::void:do_mov_fmt:int fmt, int fd, int fs, address_word instruction_0
   1534 {
   1535   check_fpu (SD_);
   1536   check_fmt_p (SD_, fmt, instruction_0);
   1537   StoreFPR (fd, fmt, ValueFPR (fs, fmt));
   1538 }
   1539 
   1540 :function:::void:do_movtf:int tf, int rd, int rs, int cc
   1541 {
   1542   check_fpu (SD_);
   1543   if (GETFCC(cc) == tf)
   1544     GPR[rd] = GPR[rs];
   1545 }
   1546 
   1547 :function:::void:do_movtf_fmt:int tf, int fmt, int fd, int fs, int cc
   1548 {
   1549   check_fpu (SD_);
   1550   if (fmt != fmt_ps)
   1551   {
   1552     if (GETFCC(cc) == tf)
   1553       StoreFPR (fd, fmt, ValueFPR (fs, fmt));
   1554     else
   1555       StoreFPR (fd, fmt, ValueFPR (fd, fmt));   /* set fmt */
   1556   }
   1557   else
   1558   {
   1559     uint64_t fdx;
   1560     fdx = PackPS (PSUpper (ValueFPR ((GETFCC (cc+1) == tf) ? fs : fd,
   1561 				      fmt_ps)),
   1562                   PSLower (ValueFPR ((GETFCC (cc+0) == tf) ? fs : fd,
   1563 				      fmt_ps)));
   1564     StoreFPR (fd, fmt_ps, fdx);
   1565   }
   1566 }
   1567 
   1568 :function:::void:do_movn_fmt:int fmt, int fd, int fs, int rt
   1569 {
   1570   check_fpu (SD_);
   1571   if (GPR[rt] != 0)
   1572     StoreFPR (fd, fmt, ValueFPR (fs, fmt));
   1573   else
   1574     StoreFPR (fd, fmt, ValueFPR (fd, fmt));
   1575 }
   1576 
   1577 :function:::void:do_movz_fmt:int fmt, int fd, int fs, int rt
   1578 {
   1579   check_fpu (SD_);
   1580   if (GPR[rt] == 0)
   1581     StoreFPR (fd, fmt, ValueFPR (fs, fmt));
   1582   else
   1583     StoreFPR (fd, fmt, ValueFPR (fd, fmt));
   1584 }
   1585 
   1586 :function:::void:do_msub_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0
   1587 {
   1588   check_fpu (SD_);
   1589   check_u64 (SD_, instruction_0);
   1590   check_fmt_p (SD_, fmt, instruction_0);
   1591   StoreFPR (fd, fmt, MultiplySub (ValueFPR (fs, fmt), ValueFPR (ft, fmt),
   1592 				  ValueFPR (fr, fmt), fmt));
   1593 }
   1594 
   1595 :function:::void:do_mtc1b:int rt, int fs
   1596 {
   1597   check_fpu (SD_);
   1598   StoreFPR (fs, fmt_uninterpreted_32, VL4_8 (GPR[rt]));
   1599 }
   1600 
   1601 :function:::void:do_mul_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0
   1602 {
   1603   check_fpu (SD_);
   1604   check_fmt_p (SD_, fmt, instruction_0);
   1605   StoreFPR (fd, fmt, Multiply (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt));
   1606 }
   1607 
   1608 :function:::void:do_neg_fmt:int fmt, int fd, int fs, address_word instruction_0
   1609 {
   1610   check_fpu (SD_);
   1611   check_fmt_p (SD_, fmt, instruction_0);
   1612   StoreFPR (fd, fmt, Negate (ValueFPR (fs, fmt), fmt));
   1613 }
   1614 
   1615 :function:::void:do_nmadd_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0
   1616 {
   1617   check_fpu (SD_);
   1618   check_u64 (SD_, instruction_0);
   1619   check_fmt_p (SD_, fmt, instruction_0);
   1620   StoreFPR (fd, fmt, NegMultiplyAdd (ValueFPR (fs, fmt), ValueFPR (ft, fmt),
   1621 				     ValueFPR (fr, fmt), fmt));
   1622 }
   1623 
   1624 :function:::void:do_nmsub_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0
   1625 {
   1626   check_fpu (SD_);
   1627   check_u64 (SD_, instruction_0);
   1628   check_fmt_p (SD_, fmt, instruction_0);
   1629   StoreFPR (fd, fmt, NegMultiplySub (ValueFPR (fs, fmt), ValueFPR (ft, fmt),
   1630 				     ValueFPR (fr, fmt), fmt));
   1631 }
   1632 
   1633 :function:::void:do_pll_ps:int fd, int fs, int ft, address_word instruction_0
   1634 {
   1635   check_fpu (SD_);
   1636   check_u64 (SD_, instruction_0);
   1637   StoreFPR (fd, fmt_ps, PackPS (PSLower (ValueFPR (fs, fmt_ps)),
   1638 				PSLower (ValueFPR (ft, fmt_ps))));
   1639 }
   1640 
   1641 :function:::void:do_plu_ps:int fd, int fs, int ft, address_word instruction_0
   1642 {
   1643   check_fpu (SD_);
   1644   check_u64 (SD_, instruction_0);
   1645   StoreFPR (fd, fmt_ps, PackPS (PSLower (ValueFPR (fs, fmt_ps)),
   1646 				PSUpper (ValueFPR (ft, fmt_ps))));
   1647 }
   1648 
   1649 :function:::void:do_pul_ps:int fd, int fs, int ft, address_word instruction_0
   1650 {
   1651   check_fpu (SD_);
   1652   check_u64 (SD_, instruction_0);
   1653   StoreFPR (fd, fmt_ps, PackPS (PSUpper (ValueFPR (fs, fmt_ps)),
   1654 				PSLower (ValueFPR (ft, fmt_ps))));
   1655 }
   1656 
   1657 :function:::void:do_puu_ps:int fd, int fs, int ft, address_word instruction_0
   1658 {
   1659   check_fpu (SD_);
   1660   check_u64 (SD_, instruction_0);
   1661   StoreFPR (fd, fmt_ps, PackPS (PSUpper (ValueFPR (fs, fmt_ps)),
   1662 				PSUpper (ValueFPR (ft, fmt_ps))));
   1663 }
   1664 
   1665 :function:::void:do_recip_fmt:int fmt, int fd, int fs
   1666 {
   1667   check_fpu (SD_);
   1668   StoreFPR (fd, fmt, Recip (ValueFPR (fs, fmt), fmt));
   1669 }
   1670 
   1671 :function:::void:do_round_fmt:int type, int fmt, int fd, int fs
   1672 {
   1673   check_fpu (SD_);
   1674   StoreFPR (fd, type, Convert (FP_RM_NEAREST, ValueFPR (fs, fmt), fmt,
   1675 	    type));
   1676 }
   1677 
   1678 :function:::void:do_rsqrt_fmt:int fmt, int fd, int fs
   1679 {
   1680   check_fpu (SD_);
   1681   StoreFPR (fd, fmt, RSquareRoot (ValueFPR (fs, fmt), fmt));
   1682 }
   1683 
   1684 :function:::void:do_prefx:int hint, int rindex, int rbase
   1685 {
   1686   /*
   1687   address_word base = GPR[rbase];
   1688   address_word index = GPR[rindex];
   1689   address_word vaddr = loadstore_ea (SD_, base, index);
   1690   address_word paddr = vaddr;
   1691   Prefetch (paddr, vaddr, isDATA, hint);
   1692   */
   1693 }
   1694 
   1695 :function:::void:do_sdc1:int ft, int offset, int base
   1696 *mipsII:
   1697 *mips32:
   1698 *mips32r2:
   1699 *mips32r6:
   1700 *micromips32:
   1701 {
   1702   check_fpu (SD_);
   1703   do_store_double (SD_, GPR[base], EXTEND16 (offset), COP_SD (1, ft));
   1704 }
   1705 
   1706 :function:::void:do_suxc1_32:int fs, int rindex, int rbase
   1707 *mips32r2:
   1708 *micromips32:
   1709 {
   1710   address_word base = GPR[rbase];
   1711   address_word index = GPR[rindex];
   1712   address_word vaddr = base + index;
   1713   check_fpu (SD_);
   1714   if (SizeFGR () != 64)
   1715     Unpredictable ();
   1716   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
   1717   if ((vaddr & 0x7) != 0)
   1718     index -= (vaddr & 0x7);
   1719   do_store_double (SD_, base, index, COP_SD (1, fs));
   1720 }
   1721 
   1722 :function:::void:do_suxc1_64:int fs, int rindex, int rbase
   1723 {
   1724   address_word base = GPR[rbase];
   1725   address_word index = GPR[rindex];
   1726   address_word vaddr = base + index;
   1727   if (SizeFGR () != 64)
   1728     Unpredictable ();
   1729   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
   1730   if ((vaddr & 0x7) != 0)
   1731     index -= (vaddr & 0x7);
   1732   do_store (SD_, AccessLength_DOUBLEWORD, base, index, COP_SD (1, fs));
   1733 }
   1734 
   1735 :function:::void:do_sqrt_fmt:int fmt, int fd, int fs
   1736 {
   1737   check_fpu (SD_);
   1738   StoreFPR (fd, fmt,  (SquareRoot (ValueFPR (fs, fmt), fmt)));
   1739 }
   1740 
   1741 :function:::void:do_sub_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0
   1742 {
   1743   check_fpu (SD_);
   1744   check_fmt_p (SD_, fmt, instruction_0);
   1745   StoreFPR (fd, fmt, Sub (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt));
   1746 }
   1747 
   1748 :function:::void:do_swc1:int ft, int roffset, int rbase, address_word instruction_0
   1749 {
   1750   address_word base = GPR[rbase];
   1751   address_word offset = EXTEND16 (roffset);
   1752   check_fpu (SD_);
   1753   {
   1754     address_word vaddr = loadstore_ea (SD_, base, offset);
   1755     address_word paddr = vaddr;
   1756 
   1757     if ((vaddr & 3) != 0)
   1758       {
   1759 	SIM_CORE_SIGNAL (SD, CPU, cia, read_map, AccessLength_WORD+1, vaddr,
   1760 			 write_transfer, sim_core_unaligned_signal);
   1761       }
   1762     else
   1763       {
   1764 	uword64 memval = 0;
   1765 	uword64 memval1 = 0;
   1766 	uword64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   1767 	address_word reverseendian =
   1768 	  (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
   1769 	address_word bigendiancpu =
   1770 	  (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
   1771 	unsigned int byte;
   1772 	paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
   1773 	byte = ((vaddr & mask) ^ bigendiancpu);
   1774 	memval = (((uword64)COP_SW(1, ft)) << (8 * byte));
   1775 	StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr, isREAL);
   1776       }
   1777   }
   1778 }
   1779 
   1780 :function:::void:do_swxc1:int fs, int rindex, int rbase, address_word instruction_0
   1781 {
   1782   address_word base = GPR[rbase];
   1783   address_word index = GPR[rindex];
   1784   check_fpu (SD_);
   1785   check_u64 (SD_, instruction_0);
   1786     {
   1787       address_word vaddr = loadstore_ea (SD_, base, index);
   1788       address_word paddr = vaddr;
   1789 
   1790       if ((vaddr & 3) != 0)
   1791 	{
   1792 	  SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer,
   1793 			   sim_core_unaligned_signal);
   1794 	}
   1795       else
   1796 	{
   1797 	  uint64_t memval = 0;
   1798 	  uint64_t memval1 = 0;
   1799 	  uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   1800 	  address_word reverseendian =
   1801 	    (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
   1802 	  address_word bigendiancpu =
   1803 	    (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
   1804 	  unsigned int byte;
   1805 	  paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
   1806 	  byte = ((vaddr & mask) ^ bigendiancpu);
   1807 	  memval = (((uint64_t)COP_SW(1,fs)) << (8 * byte));
   1808 	  StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr,
   1809 		       isREAL);
   1810 	}
   1811   }
   1812 }
   1813 
   1814 :function:::void:do_trunc_fmt:int type, int fmt, int fd, int fs
   1815 {
   1816   check_fpu (SD_);
   1817   StoreFPR (fd, type, Convert (FP_RM_TOZERO, ValueFPR (fs, fmt), fmt,
   1818 	    type));
   1819 }
   1820 
   1821 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
   1822 "add r<RD>, r<RS>, r<RT>"
   1823 *mipsI:
   1824 *mipsII:
   1825 *mipsIII:
   1826 *mipsIV:
   1827 *mipsV:
   1828 *mips32:
   1829 *mips32r2:
   1830 *mips32r6:
   1831 *mips64:
   1832 *mips64r2:
   1833 *mips64r6:
   1834 *vr4100:
   1835 *vr5000:
   1836 *r3900:
   1837 {
   1838   do_add (SD_, RS, RT, RD);
   1839 }
   1840 
   1841 
   1842 
   1843 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
   1844 "addi r<RT>, r<RS>, <IMMEDIATE>"
   1845 *mipsI:
   1846 *mipsII:
   1847 *mipsIII:
   1848 *mipsIV:
   1849 *mipsV:
   1850 *mips32:
   1851 *mips32r2:
   1852 *mips64:
   1853 *mips64r2:
   1854 *vr4100:
   1855 *vr5000:
   1856 *r3900:
   1857 {
   1858   do_addi (SD_, RS, RT, IMMEDIATE);
   1859 }
   1860 
   1861 
   1862 
   1863 :function:::void:do_addiu:int rs, int rt, uint16_t immediate
   1864 {
   1865   if (NotWordValue (GPR[rs]))
   1866     Unpredictable ();
   1867   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
   1868   GPR[rt] = EXTEND32 (GPR[rs] + EXTEND16 (immediate));
   1869   TRACE_ALU_RESULT (GPR[rt]);
   1870 }
   1871 
   1872 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
   1873 "addiu r<RT>, r<RS>, <IMMEDIATE>"
   1874 *mipsI:
   1875 *mipsII:
   1876 *mipsIII:
   1877 *mipsIV:
   1878 *mipsV:
   1879 *mips32:
   1880 *mips32r2:
   1881 *mips32r6:
   1882 *mips64:
   1883 *mips64r2:
   1884 *mips64r6:
   1885 *vr4100:
   1886 *vr5000:
   1887 *r3900:
   1888 {
   1889   do_addiu (SD_, RS, RT, IMMEDIATE);
   1890 }
   1891 
   1892 
   1893 
   1894 :function:::void:do_addu:int rs, int rt, int rd
   1895 {
   1896   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   1897     Unpredictable ();
   1898   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1899   GPR[rd] = EXTEND32 (GPR[rs] + GPR[rt]);
   1900   TRACE_ALU_RESULT (GPR[rd]);
   1901 }
   1902 
   1903 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
   1904 "addu r<RD>, r<RS>, r<RT>"
   1905 *mipsI:
   1906 *mipsII:
   1907 *mipsIII:
   1908 *mipsIV:
   1909 *mipsV:
   1910 *mips32:
   1911 *mips32r2:
   1912 *mips32r6:
   1913 *mips64:
   1914 *mips64r2:
   1915 *mips64r6:
   1916 *vr4100:
   1917 *vr5000:
   1918 *r3900:
   1919 {
   1920   do_addu (SD_, RS, RT, RD);
   1921 }
   1922 
   1923 
   1924 
   1925 :function:::void:do_and:int rs, int rt, int rd
   1926 {
   1927   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   1928   GPR[rd] = GPR[rs] & GPR[rt];
   1929   TRACE_ALU_RESULT (GPR[rd]);
   1930 }
   1931 
   1932 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
   1933 "and r<RD>, r<RS>, r<RT>"
   1934 *mipsI:
   1935 *mipsII:
   1936 *mipsIII:
   1937 *mipsIV:
   1938 *mipsV:
   1939 *mips32:
   1940 *mips32r2:
   1941 *mips32r6:
   1942 *mips64:
   1943 *mips64r2:
   1944 *mips64r6:
   1945 *vr4100:
   1946 *vr5000:
   1947 *r3900:
   1948 {
   1949   do_and (SD_, RS, RT, RD);
   1950 }
   1951 
   1952 
   1953 
   1954 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
   1955 "andi r<RT>, r<RS>, %#lx<IMMEDIATE>"
   1956 *mipsI:
   1957 *mipsII:
   1958 *mipsIII:
   1959 *mipsIV:
   1960 *mipsV:
   1961 *mips32:
   1962 *mips32r2:
   1963 *mips32r6:
   1964 *mips64:
   1965 *mips64r2:
   1966 *mips64r6:
   1967 *vr4100:
   1968 *vr5000:
   1969 *r3900:
   1970 {
   1971   do_andi (SD_,RS, RT, IMMEDIATE);
   1972 }
   1973 
   1974 
   1975 
   1976 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
   1977 "beq r<RS>, r<RT>, <OFFSET>"
   1978 *mipsI:
   1979 *mipsII:
   1980 *mipsIII:
   1981 *mipsIV:
   1982 *mipsV:
   1983 *mips32:
   1984 *mips32r2:
   1985 *mips64:
   1986 *mips64r2:
   1987 *vr4100:
   1988 *vr5000:
   1989 *r3900:
   1990 {
   1991   address_word offset = EXTEND16 (OFFSET) << 2;
   1992   if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
   1993     {
   1994       DELAY_SLOT (NIA + offset);
   1995     }
   1996 }
   1997 
   1998 
   1999 000100,5.RS,5.RT,16.OFFSET:R6:32::BEQ
   2000 "beq r<RS>, r<RT>, <OFFSET>"
   2001 *mips32r6:
   2002 *mips64r6:
   2003 {
   2004   address_word offset = EXTEND16 (OFFSET) << 2;
   2005   if (GPR[RS] == GPR[RT])
   2006     DELAY_SLOT (NIA  + offset);
   2007   else
   2008     FORBIDDEN_SLOT ();
   2009 }
   2010 
   2011 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
   2012 "beql r<RS>, r<RT>, <OFFSET>"
   2013 *mipsII:
   2014 *mipsIII:
   2015 *mipsIV:
   2016 *mipsV:
   2017 *mips32:
   2018 *mips32r2:
   2019 *mips64:
   2020 *mips64r2:
   2021 *vr4100:
   2022 *vr5000:
   2023 *r3900:
   2024 {
   2025   address_word offset = EXTEND16 (OFFSET) << 2;
   2026   if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
   2027     {
   2028       DELAY_SLOT (NIA + offset);
   2029     }
   2030   else
   2031     NULLIFY_NEXT_INSTRUCTION ();
   2032 }
   2033 
   2034 
   2035 
   2036 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
   2037 "bgez r<RS>, <OFFSET>"
   2038 *mipsI:
   2039 *mipsII:
   2040 *mipsIII:
   2041 *mipsIV:
   2042 *mipsV:
   2043 *mips32:
   2044 *mips32r2:
   2045 *mips32r6:
   2046 *mips64:
   2047 *mips64r2:
   2048 *mips64r6:
   2049 *vr4100:
   2050 *vr5000:
   2051 *r3900:
   2052 {
   2053   address_word offset = EXTEND16 (OFFSET) << 2;
   2054   if ((signed_word) GPR[RS] >= 0)
   2055     {
   2056       DELAY_SLOT (NIA + offset);
   2057     }
   2058 }
   2059 
   2060 
   2061 
   2062 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
   2063 "bgezal r<RS>, <OFFSET>"
   2064 *mipsI:
   2065 *mipsII:
   2066 *mipsIII:
   2067 *mipsIV:
   2068 *mipsV:
   2069 *mips32:
   2070 *mips32r2:
   2071 *mips64:
   2072 *mips64r2:
   2073 *vr4100:
   2074 *vr5000:
   2075 *r3900:
   2076 {
   2077   address_word offset = EXTEND16 (OFFSET) << 2;
   2078   if (RS == 31)
   2079     Unpredictable ();
   2080   RA = (CIA + 8);
   2081   if ((signed_word) GPR[RS] >= 0)
   2082     {
   2083       DELAY_SLOT (NIA + offset);
   2084     }
   2085 }
   2086 
   2087 000001,00000,10001,16.OFFSET:REGIMM:32::BAL
   2088 "bal <OFFSET>"
   2089 *mips32r6:
   2090 *mips64r6:
   2091 {
   2092   address_word offset = EXTEND16 (OFFSET) << 2;
   2093   RA = (CIA + 8);
   2094   DELAY_SLOT (NIA + offset);
   2095 }
   2096 
   2097 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
   2098 "bgezall r<RS>, <OFFSET>"
   2099 *mipsII:
   2100 *mipsIII:
   2101 *mipsIV:
   2102 *mipsV:
   2103 *mips32:
   2104 *mips32r2:
   2105 *mips64:
   2106 *mips64r2:
   2107 *vr4100:
   2108 *vr5000:
   2109 *r3900:
   2110 {
   2111   address_word offset = EXTEND16 (OFFSET) << 2;
   2112   if (RS == 31)
   2113     Unpredictable ();
   2114   RA = (CIA + 8);
   2115   /* NOTE: The branch occurs AFTER the next instruction has been
   2116      executed */
   2117   if ((signed_word) GPR[RS] >= 0)
   2118     {
   2119       DELAY_SLOT (NIA + offset);
   2120     }
   2121   else
   2122     NULLIFY_NEXT_INSTRUCTION ();
   2123 }
   2124 
   2125 
   2126 
   2127 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
   2128 "bgezl r<RS>, <OFFSET>"
   2129 *mipsII:
   2130 *mipsIII:
   2131 *mipsIV:
   2132 *mipsV:
   2133 *mips32:
   2134 *mips32r2:
   2135 *mips64:
   2136 *mips64r2:
   2137 *vr4100:
   2138 *vr5000:
   2139 *r3900:
   2140 {
   2141   address_word offset = EXTEND16 (OFFSET) << 2;
   2142   if ((signed_word) GPR[RS] >= 0)
   2143     {
   2144       DELAY_SLOT (NIA + offset);
   2145     }
   2146   else
   2147     NULLIFY_NEXT_INSTRUCTION ();
   2148 }
   2149 
   2150 
   2151 
   2152 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
   2153 "bgtz r<RS>, <OFFSET>"
   2154 *mipsI:
   2155 *mipsII:
   2156 *mipsIII:
   2157 *mipsIV:
   2158 *mipsV:
   2159 *mips32:
   2160 *mips32r2:
   2161 *mips32r6:
   2162 *mips64:
   2163 *mips64r2:
   2164 *mips64r6:
   2165 *vr4100:
   2166 *vr5000:
   2167 *r3900:
   2168 {
   2169   address_word offset = EXTEND16 (OFFSET) << 2;
   2170   if ((signed_word) GPR[RS] > 0)
   2171     {
   2172       DELAY_SLOT (NIA + offset);
   2173     }
   2174 }
   2175 
   2176 
   2177 
   2178 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
   2179 "bgtzl r<RS>, <OFFSET>"
   2180 *mipsII:
   2181 *mipsIII:
   2182 *mipsIV:
   2183 *mipsV:
   2184 *mips32:
   2185 *mips32r2:
   2186 *mips64:
   2187 *mips64r2:
   2188 *vr4100:
   2189 *vr5000:
   2190 *r3900:
   2191 {
   2192   address_word offset = EXTEND16 (OFFSET) << 2;
   2193   /* NOTE: The branch occurs AFTER the next instruction has been
   2194      executed */
   2195   if ((signed_word) GPR[RS] > 0)
   2196     {
   2197       DELAY_SLOT (NIA + offset);
   2198     }
   2199   else
   2200     NULLIFY_NEXT_INSTRUCTION ();
   2201 }
   2202 
   2203 
   2204 
   2205 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
   2206 "blez r<RS>, <OFFSET>"
   2207 *mipsI:
   2208 *mipsII:
   2209 *mipsIII:
   2210 *mipsIV:
   2211 *mipsV:
   2212 *mips32:
   2213 *mips32r2:
   2214 *mips32r6:
   2215 *mips64:
   2216 *mips64r2:
   2217 *mips64r6:
   2218 *vr4100:
   2219 *vr5000:
   2220 *r3900:
   2221 {
   2222   address_word offset = EXTEND16 (OFFSET) << 2;
   2223   /* NOTE: The branch occurs AFTER the next instruction has been
   2224      executed */
   2225   if ((signed_word) GPR[RS] <= 0)
   2226     {
   2227       DELAY_SLOT (NIA + offset);
   2228     }
   2229 }
   2230 
   2231 
   2232 
   2233 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
   2234 "bgezl r<RS>, <OFFSET>"
   2235 *mipsII:
   2236 *mipsIII:
   2237 *mipsIV:
   2238 *mipsV:
   2239 *mips32:
   2240 *mips32r2:
   2241 *mips64:
   2242 *mips64r2:
   2243 *vr4100:
   2244 *vr5000:
   2245 *r3900:
   2246 {
   2247   address_word offset = EXTEND16 (OFFSET) << 2;
   2248   if ((signed_word) GPR[RS] <= 0)
   2249     {
   2250       DELAY_SLOT (NIA + offset);
   2251     }
   2252   else
   2253     NULLIFY_NEXT_INSTRUCTION ();
   2254 }
   2255 
   2256 
   2257 
   2258 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
   2259 "bltz r<RS>, <OFFSET>"
   2260 *mipsI:
   2261 *mipsII:
   2262 *mipsIII:
   2263 *mipsIV:
   2264 *mipsV:
   2265 *mips32:
   2266 *mips32r2:
   2267 *mips32r6:
   2268 *mips64:
   2269 *mips64r2:
   2270 *mips64r6:
   2271 *vr4100:
   2272 *vr5000:
   2273 *r3900:
   2274 {
   2275   address_word offset = EXTEND16 (OFFSET) << 2;
   2276   if ((signed_word) GPR[RS] < 0)
   2277     {
   2278       DELAY_SLOT (NIA + offset);
   2279     }
   2280 }
   2281 
   2282 
   2283 
   2284 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
   2285 "bltzal r<RS>, <OFFSET>"
   2286 *mipsI:
   2287 *mipsII:
   2288 *mipsIII:
   2289 *mipsIV:
   2290 *mipsV:
   2291 *mips32:
   2292 *mips32r2:
   2293 *mips64:
   2294 *mips64r2:
   2295 *vr4100:
   2296 *vr5000:
   2297 *r3900:
   2298 {
   2299   address_word offset = EXTEND16 (OFFSET) << 2;
   2300   if (RS == 31)
   2301     Unpredictable ();
   2302   RA = (CIA + 8);
   2303   /* NOTE: The branch occurs AFTER the next instruction has been
   2304      executed */
   2305   if ((signed_word) GPR[RS] < 0)
   2306     {
   2307       DELAY_SLOT (NIA + offset);
   2308     }
   2309 }
   2310 
   2311 
   2312 
   2313 000001,00000,10000,16.OFFSET:REGIMM:32::NAL
   2314 "nal <OFFSET>"
   2315 *mips32r6:
   2316 *mips64r6:
   2317 {
   2318   address_word offset = EXTEND16 (OFFSET) << 2;
   2319   RA = (CIA + 8);
   2320   FORBIDDEN_SLOT ();
   2321 }
   2322 
   2323 
   2324 
   2325 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
   2326 "bltzall r<RS>, <OFFSET>"
   2327 *mipsII:
   2328 *mipsIII:
   2329 *mipsIV:
   2330 *mipsV:
   2331 *mips32:
   2332 *mips32r2:
   2333 *mips64:
   2334 *mips64r2:
   2335 *vr4100:
   2336 *vr5000:
   2337 *r3900:
   2338 {
   2339   address_word offset = EXTEND16 (OFFSET) << 2;
   2340   if (RS == 31)
   2341     Unpredictable ();
   2342   RA = (CIA + 8);
   2343   if ((signed_word) GPR[RS] < 0)
   2344     {
   2345       DELAY_SLOT (NIA + offset);
   2346     }
   2347   else
   2348     NULLIFY_NEXT_INSTRUCTION ();
   2349 }
   2350 
   2351 
   2352 
   2353 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
   2354 "bltzl r<RS>, <OFFSET>"
   2355 *mipsII:
   2356 *mipsIII:
   2357 *mipsIV:
   2358 *mipsV:
   2359 *mips32:
   2360 *mips32r2:
   2361 *mips64:
   2362 *mips64r2:
   2363 *vr4100:
   2364 *vr5000:
   2365 *r3900:
   2366 {
   2367   address_word offset = EXTEND16 (OFFSET) << 2;
   2368   /* NOTE: The branch occurs AFTER the next instruction has been
   2369      executed */
   2370   if ((signed_word) GPR[RS] < 0)
   2371     {
   2372       DELAY_SLOT (NIA + offset);
   2373     }
   2374   else
   2375     NULLIFY_NEXT_INSTRUCTION ();
   2376 }
   2377 
   2378 
   2379 
   2380 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
   2381 "bne r<RS>, r<RT>, <OFFSET>"
   2382 *mipsI:
   2383 *mipsII:
   2384 *mipsIII:
   2385 *mipsIV:
   2386 *mipsV:
   2387 *mips32:
   2388 *mips32r2:
   2389 *mips32r6:
   2390 *mips64:
   2391 *mips64r2:
   2392 *mips64r6:
   2393 *vr4100:
   2394 *vr5000:
   2395 *r3900:
   2396 {
   2397   address_word offset = EXTEND16 (OFFSET) << 2;
   2398   if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
   2399     {
   2400       DELAY_SLOT (NIA + offset);
   2401     }
   2402 }
   2403 
   2404 
   2405 
   2406 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
   2407 "bnel r<RS>, r<RT>, <OFFSET>"
   2408 *mipsII:
   2409 *mipsIII:
   2410 *mipsIV:
   2411 *mipsV:
   2412 *mips32:
   2413 *mips32r2:
   2414 *mips64:
   2415 *mips64r2:
   2416 *vr4100:
   2417 *vr5000:
   2418 *r3900:
   2419 {
   2420   address_word offset = EXTEND16 (OFFSET) << 2;
   2421   if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
   2422     {
   2423       DELAY_SLOT (NIA + offset);
   2424     }
   2425   else
   2426     NULLIFY_NEXT_INSTRUCTION ();
   2427 }
   2428 
   2429 
   2430 
   2431 000000,20.CODE,001101:SPECIAL:32::BREAK
   2432 "break %#lx<CODE>"
   2433 *mipsI:
   2434 *mipsII:
   2435 *mipsIII:
   2436 *mipsIV:
   2437 *mipsV:
   2438 *mips32:
   2439 *mips32r2:
   2440 *mips32r6:
   2441 *mips64:
   2442 *mips64r2:
   2443 *mips64r6:
   2444 *vr4100:
   2445 *vr5000:
   2446 *r3900:
   2447 {
   2448   do_break (SD_, instruction_0);
   2449 }
   2450 
   2451 
   2452 
   2453 011100,5.RS,5.RT,5.RD,00000,100001:SPECIAL2:32::CLO
   2454 "clo r<RD>, r<RS>"
   2455 *mips32:
   2456 *mips32r2:
   2457 *mips64:
   2458 *mips64r2:
   2459 *vr5500:
   2460 {
   2461   if (RT != RD)
   2462     Unpredictable ();
   2463   do_clo (SD_, RD, RS);
   2464 }
   2465 
   2466 
   2467 
   2468 011100,5.RS,5.RT,5.RD,00000,100000:SPECIAL2:32::CLZ
   2469 "clz r<RD>, r<RS>"
   2470 *mips32:
   2471 *mips32r2:
   2472 *mips64:
   2473 *mips64r2:
   2474 *vr5500:
   2475 {
   2476   if (RT != RD)
   2477     Unpredictable ();
   2478   do_clz (SD_, RD, RS);
   2479 }
   2480 
   2481 
   2482 
   2483 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
   2484 "dadd r<RD>, r<RS>, r<RT>"
   2485 *mipsIII:
   2486 *mipsIV:
   2487 *mipsV:
   2488 *mips64:
   2489 *mips64r2:
   2490 *mips64r6:
   2491 *vr4100:
   2492 *vr5000:
   2493 {
   2494   check_u64 (SD_, instruction_0);
   2495   do_dadd (SD_, RD, RS, RT);
   2496 }
   2497 
   2498 
   2499 
   2500 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
   2501 "daddi r<RT>, r<RS>, <IMMEDIATE>"
   2502 *mipsIII:
   2503 *mipsIV:
   2504 *mipsV:
   2505 *mips64:
   2506 *mips64r2:
   2507 *vr4100:
   2508 *vr5000:
   2509 {
   2510   check_u64 (SD_, instruction_0);
   2511   do_daddi (SD_, RT, RS, IMMEDIATE);
   2512 }
   2513 
   2514 
   2515 
   2516 :function:::void:do_daddiu:int rs, int rt, uint16_t immediate
   2517 {
   2518   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
   2519   GPR[rt] = GPR[rs] + EXTEND16 (immediate);
   2520   TRACE_ALU_RESULT (GPR[rt]);
   2521 }
   2522 
   2523 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
   2524 "daddiu r<RT>, r<RS>, <IMMEDIATE>"
   2525 *mipsIII:
   2526 *mipsIV:
   2527 *mipsV:
   2528 *mips64:
   2529 *mips64r2:
   2530 *mips64r6:
   2531 *vr4100:
   2532 *vr5000:
   2533 {
   2534   check_u64 (SD_, instruction_0);
   2535   do_daddiu (SD_, RS, RT, IMMEDIATE);
   2536 }
   2537 
   2538 
   2539 
   2540 :function:::void:do_daddu:int rs, int rt, int rd
   2541 {
   2542   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   2543   GPR[rd] = GPR[rs] + GPR[rt];
   2544   TRACE_ALU_RESULT (GPR[rd]);
   2545 }
   2546 
   2547 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
   2548 "daddu r<RD>, r<RS>, r<RT>"
   2549 *mipsIII:
   2550 *mipsIV:
   2551 *mipsV:
   2552 *mips64:
   2553 *mips64r2:
   2554 *mips64r6:
   2555 *vr4100:
   2556 *vr5000:
   2557 {
   2558   check_u64 (SD_, instruction_0);
   2559   do_daddu (SD_, RS, RT, RD);
   2560 }
   2561 
   2562 
   2563 
   2564 011100,5.RS,5.RT,5.RD,00000,100101:SPECIAL2:64::DCLO
   2565 "dclo r<RD>, r<RS>"
   2566 *mips64:
   2567 *mips64r2:
   2568 *vr5500:
   2569 {
   2570   if (RT != RD)
   2571     Unpredictable ();
   2572   check_u64 (SD_, instruction_0);
   2573   if (RT != RD)
   2574     Unpredictable ();
   2575   do_dclo (SD_, RD, RS);
   2576 }
   2577 
   2578 
   2579 
   2580 011100,5.RS,5.RT,5.RD,00000,100100:SPECIAL2:64::DCLZ
   2581 "dclz r<RD>, r<RS>"
   2582 *mips64:
   2583 *mips64r2:
   2584 *vr5500:
   2585 {
   2586   if (RT != RD)
   2587     Unpredictable ();
   2588   check_u64 (SD_, instruction_0);
   2589   if (RT != RD)
   2590     Unpredictable ();
   2591   do_dclz (SD_, RD, RS);
   2592 }
   2593 
   2594 
   2595 
   2596 :function:::void:do_ddiv:int rs, int rt
   2597 {
   2598   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
   2599   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   2600   {
   2601     int64_t n = GPR[rs];
   2602     int64_t d = GPR[rt];
   2603     int64_t hi;
   2604     int64_t lo;
   2605     if (d == 0)
   2606       {
   2607 	lo = SIGNED64 (0x8000000000000000);
   2608 	hi = 0;
   2609       }
   2610     else if (d == -1 && n == SIGNED64 (0x8000000000000000))
   2611       {
   2612 	lo = SIGNED64 (0x8000000000000000);
   2613 	hi = 0;
   2614       }
   2615     else
   2616       {
   2617 	lo = (n / d);
   2618 	hi = (n % d);
   2619       }
   2620     HI = hi;
   2621     LO = lo;
   2622   }
   2623   TRACE_ALU_RESULT2 (HI, LO);
   2624 }
   2625 
   2626 000000,5.RS,5.RT,0000000000,011110:SPECIAL:64::DDIV
   2627 "ddiv r<RS>, r<RT>"
   2628 *mipsIII:
   2629 *mipsIV:
   2630 *mipsV:
   2631 *mips64:
   2632 *mips64r2:
   2633 *vr4100:
   2634 *vr5000:
   2635 {
   2636   check_u64 (SD_, instruction_0);
   2637   do_ddiv (SD_, RS, RT);
   2638 }
   2639 
   2640 
   2641 
   2642 :function:::void:do_ddivu:int rs, int rt
   2643 {
   2644   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
   2645   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   2646   {
   2647     uint64_t n = GPR[rs];
   2648     uint64_t d = GPR[rt];
   2649     uint64_t hi;
   2650     uint64_t lo;
   2651     if (d == 0)
   2652       {
   2653 	lo = SIGNED64 (0x8000000000000000);
   2654 	hi = 0;
   2655       }
   2656     else
   2657       {
   2658 	lo = (n / d);
   2659 	hi = (n % d);
   2660       }
   2661     HI = hi;
   2662     LO = lo;
   2663   }
   2664   TRACE_ALU_RESULT2 (HI, LO);
   2665 }
   2666 
   2667 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
   2668 "ddivu r<RS>, r<RT>"
   2669 *mipsIII:
   2670 *mipsIV:
   2671 *mipsV:
   2672 *mips64:
   2673 *mips64r2:
   2674 *vr4100:
   2675 *vr5000:
   2676 {
   2677   check_u64 (SD_, instruction_0);
   2678   do_ddivu (SD_, RS, RT);
   2679 }
   2680 
   2681 :function:::void:do_div:int rs, int rt
   2682 {
   2683   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
   2684   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   2685   {
   2686     int32_t n = GPR[rs];
   2687     int32_t d = GPR[rt];
   2688     if (d == 0)
   2689       {
   2690 	LO = EXTEND32 (0x80000000);
   2691 	HI = EXTEND32 (0);
   2692       }
   2693     else if (n == SIGNED32 (0x80000000) && d == -1)
   2694       {
   2695 	LO = EXTEND32 (0x80000000);
   2696 	HI = EXTEND32 (0);
   2697       }
   2698     else
   2699       {
   2700 	LO = EXTEND32 (n / d);
   2701 	HI = EXTEND32 (n % d);
   2702       }
   2703   }
   2704   TRACE_ALU_RESULT2 (HI, LO);
   2705 }
   2706 
   2707 000000,5.RS,5.RT,0000000000,011010:SPECIAL:32::DIV
   2708 "div r<RS>, r<RT>"
   2709 *mipsI:
   2710 *mipsII:
   2711 *mipsIII:
   2712 *mipsIV:
   2713 *mipsV:
   2714 *mips32:
   2715 *mips32r2:
   2716 *mips64:
   2717 *mips64r2:
   2718 *vr4100:
   2719 *vr5000:
   2720 *r3900:
   2721 {
   2722   do_div (SD_, RS, RT);
   2723 }
   2724 
   2725 
   2726 
   2727 :function:::void:do_divu:int rs, int rt
   2728 {
   2729   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
   2730   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   2731   {
   2732     uint32_t n = GPR[rs];
   2733     uint32_t d = GPR[rt];
   2734     if (d == 0)
   2735       {
   2736 	LO = EXTEND32 (0x80000000);
   2737 	HI = EXTEND32 (0);
   2738       }
   2739     else
   2740       {
   2741 	LO = EXTEND32 (n / d);
   2742 	HI = EXTEND32 (n % d);
   2743       }
   2744   }
   2745   TRACE_ALU_RESULT2 (HI, LO);
   2746 }
   2747 
   2748 000000,5.RS,5.RT,0000000000,011011:SPECIAL:32::DIVU
   2749 "divu r<RS>, r<RT>"
   2750 *mipsI:
   2751 *mipsII:
   2752 *mipsIII:
   2753 *mipsIV:
   2754 *mipsV:
   2755 *mips32:
   2756 *mips32r2:
   2757 *mips64:
   2758 *mips64r2:
   2759 *vr4100:
   2760 *vr5000:
   2761 *r3900:
   2762 {
   2763   do_divu (SD_, RS, RT);
   2764 }
   2765 
   2766 
   2767 :function:::void:do_dmultx:int rs, int rt, int rd, int signed_p
   2768 {
   2769   uint64_t lo;
   2770   uint64_t hi;
   2771   uint64_t m00;
   2772   uint64_t m01;
   2773   uint64_t m10;
   2774   uint64_t m11;
   2775   uint64_t mid;
   2776   int sign;
   2777   uint64_t op1 = GPR[rs];
   2778   uint64_t op2 = GPR[rt];
   2779   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   2780   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   2781   /* make signed multiply unsigned */
   2782   sign = 0;
   2783   if (signed_p)
   2784     {
   2785       if ((int64_t) op1 < 0)
   2786 	{
   2787 	  op1 = - op1;
   2788 	  ++sign;
   2789 	}
   2790       if ((int64_t) op2 < 0)
   2791 	{
   2792 	  op2 = - op2;
   2793 	  ++sign;
   2794 	}
   2795     }
   2796   /* multiply out the 4 sub products */
   2797   m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2));
   2798   m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2));
   2799   m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2));
   2800   m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2));
   2801   /* add the products */
   2802   mid = ((uint64_t) VH4_8 (m00)
   2803 	 + (uint64_t) VL4_8 (m10)
   2804 	 + (uint64_t) VL4_8 (m01));
   2805   lo = U8_4 (mid, m00);
   2806   hi = (m11
   2807 	+ (uint64_t) VH4_8 (mid)
   2808 	+ (uint64_t) VH4_8 (m01)
   2809 	+ (uint64_t) VH4_8 (m10));
   2810   /* fix the sign */
   2811   if (sign & 1)
   2812     {
   2813       lo = -lo;
   2814       if (lo == 0)
   2815 	hi = -hi;
   2816       else
   2817 	hi = -hi - 1;
   2818     }
   2819   /* save the result HI/LO (and a gpr) */
   2820   LO = lo;
   2821   HI = hi;
   2822   if (rd != 0)
   2823     GPR[rd] = lo;
   2824   TRACE_ALU_RESULT2 (HI, LO);
   2825 }
   2826 
   2827 :function:::void:do_dmult:int rs, int rt, int rd
   2828 {
   2829   do_dmultx (SD_, rs, rt, rd, 1);
   2830 }
   2831 
   2832 000000,5.RS,5.RT,0000000000,011100:SPECIAL:64::DMULT
   2833 "dmult r<RS>, r<RT>"
   2834 *mipsIII:
   2835 *mipsIV:
   2836 *mipsV:
   2837 *mips64:
   2838 *mips64r2:
   2839 *vr4100:
   2840 {
   2841   check_u64 (SD_, instruction_0);
   2842   do_dmult (SD_, RS, RT, 0);
   2843 }
   2844 
   2845 000000,5.RS,5.RT,5.RD,00000,011100:SPECIAL:64::DMULT
   2846 "dmult r<RS>, r<RT>":RD == 0
   2847 "dmult r<RD>, r<RS>, r<RT>"
   2848 *vr5000:
   2849 {
   2850   check_u64 (SD_, instruction_0);
   2851   do_dmult (SD_, RS, RT, RD);
   2852 }
   2853 
   2854 
   2855 
   2856 :function:::void:do_dmultu:int rs, int rt, int rd
   2857 {
   2858   do_dmultx (SD_, rs, rt, rd, 0);
   2859 }
   2860 
   2861 000000,5.RS,5.RT,0000000000,011101:SPECIAL:64::DMULTU
   2862 "dmultu r<RS>, r<RT>"
   2863 *mipsIII:
   2864 *mipsIV:
   2865 *mipsV:
   2866 *mips64:
   2867 *mips64r2:
   2868 *vr4100:
   2869 {
   2870   check_u64 (SD_, instruction_0);
   2871   do_dmultu (SD_, RS, RT, 0);
   2872 }
   2873 
   2874 000000,5.RS,5.RT,5.RD,00000,011101:SPECIAL:64::DMULTU
   2875 "dmultu r<RD>, r<RS>, r<RT>":RD == 0
   2876 "dmultu r<RS>, r<RT>"
   2877 *vr5000:
   2878 {
   2879   check_u64 (SD_, instruction_0);
   2880   do_dmultu (SD_, RS, RT, RD);
   2881 }
   2882 
   2883 
   2884 :function:::uint64_t:do_dror:uint64_t x,uint64_t y
   2885 {
   2886   uint64_t result;
   2887 
   2888   y &= 63;
   2889   TRACE_ALU_INPUT2 (x, y);
   2890   result = ROTR64 (x, y);
   2891   TRACE_ALU_RESULT (result);
   2892   return result;
   2893 }
   2894 
   2895 000000,00001,5.RT,5.RD,5.SHIFT,111010::64::DROR
   2896 "dror r<RD>, r<RT>, <SHIFT>"
   2897 *mips64r2:
   2898 *mips64r6:
   2899 *vr5400:
   2900 *vr5500:
   2901 {
   2902   check_u64 (SD_, instruction_0);
   2903   GPR[RD] = do_dror (SD_, GPR[RT], SHIFT);
   2904 }
   2905 
   2906 000000,00001,5.RT,5.RD,5.SHIFT,111110::64::DROR32
   2907 "dror32 r<RD>, r<RT>, <SHIFT>"
   2908 *mips64r2:
   2909 *mips64r6:
   2910 *vr5400:
   2911 *vr5500:
   2912 {
   2913   check_u64 (SD_, instruction_0);
   2914   GPR[RD] = do_dror (SD_, GPR[RT], SHIFT + 32);
   2915 }
   2916 
   2917 000000,5.RS,5.RT,5.RD,00001,010110::64::DRORV
   2918 "drorv r<RD>, r<RT>, r<RS>"
   2919 *mips64r2:
   2920 *mips64r6:
   2921 *vr5400:
   2922 *vr5500:
   2923 {
   2924   check_u64 (SD_, instruction_0);
   2925   GPR[RD] = do_dror (SD_, GPR[RT], GPR[RS]);
   2926 }
   2927 
   2928 
   2929 :function:::void:do_dsll:int rt, int rd, int shift
   2930 {
   2931   TRACE_ALU_INPUT2 (GPR[rt], shift);
   2932   GPR[rd] = GPR[rt] << shift;
   2933   TRACE_ALU_RESULT (GPR[rd]);
   2934 }
   2935 
   2936 000000,00000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
   2937 "dsll r<RD>, r<RT>, <SHIFT>"
   2938 *mipsIII:
   2939 *mipsIV:
   2940 *mipsV:
   2941 *mips64:
   2942 *mips64r2:
   2943 *mips64r6:
   2944 *vr4100:
   2945 *vr5000:
   2946 {
   2947   check_u64 (SD_, instruction_0);
   2948   do_dsll (SD_, RT, RD, SHIFT);
   2949 }
   2950 
   2951 
   2952 000000,00000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
   2953 "dsll32 r<RD>, r<RT>, <SHIFT>"
   2954 *mipsIII:
   2955 *mipsIV:
   2956 *mipsV:
   2957 *mips64:
   2958 *mips64r2:
   2959 *mips64r6:
   2960 *vr4100:
   2961 *vr5000:
   2962 {
   2963   check_u64 (SD_, instruction_0);
   2964   do_dsll32 (SD_, RD, RT, SHIFT);
   2965 }
   2966 
   2967 :function:::void:do_dsllv:int rs, int rt, int rd
   2968 {
   2969   int s = MASKED64 (GPR[rs], 5, 0);
   2970   TRACE_ALU_INPUT2 (GPR[rt], s);
   2971   GPR[rd] = GPR[rt] << s;
   2972   TRACE_ALU_RESULT (GPR[rd]);
   2973 }
   2974 
   2975 000000,5.RS,5.RT,5.RD,00000,010100:SPECIAL:64::DSLLV
   2976 "dsllv r<RD>, r<RT>, r<RS>"
   2977 *mipsIII:
   2978 *mipsIV:
   2979 *mipsV:
   2980 *mips64:
   2981 *mips64r2:
   2982 *mips64r6:
   2983 *vr4100:
   2984 *vr5000:
   2985 {
   2986   check_u64 (SD_, instruction_0);
   2987   do_dsllv (SD_, RS, RT, RD);
   2988 }
   2989 
   2990 :function:::void:do_dsra:int rt, int rd, int shift
   2991 {
   2992   TRACE_ALU_INPUT2 (GPR[rt], shift);
   2993   GPR[rd] = ((int64_t) GPR[rt]) >> shift;
   2994   TRACE_ALU_RESULT (GPR[rd]);
   2995 }
   2996 
   2997 
   2998 000000,00000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
   2999 "dsra r<RD>, r<RT>, <SHIFT>"
   3000 *mipsIII:
   3001 *mipsIV:
   3002 *mipsV:
   3003 *mips64:
   3004 *mips64r2:
   3005 *mips64r6:
   3006 *vr4100:
   3007 *vr5000:
   3008 {
   3009   check_u64 (SD_, instruction_0);
   3010   do_dsra (SD_, RT, RD, SHIFT);
   3011 }
   3012 
   3013 
   3014 000000,00000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
   3015 "dsra32 r<RD>, r<RT>, <SHIFT>"
   3016 *mipsIII:
   3017 *mipsIV:
   3018 *mipsV:
   3019 *mips64:
   3020 *mips64r2:
   3021 *mips64r6:
   3022 *vr4100:
   3023 *vr5000:
   3024 {
   3025   check_u64 (SD_, instruction_0);
   3026   do_dsra32 (SD_, RD, RT, SHIFT);
   3027 }
   3028 
   3029 
   3030 :function:::void:do_dsrav:int rs, int rt, int rd
   3031 {
   3032   int s = MASKED64 (GPR[rs], 5, 0);
   3033   TRACE_ALU_INPUT2 (GPR[rt], s);
   3034   GPR[rd] = ((int64_t) GPR[rt]) >> s;
   3035   TRACE_ALU_RESULT (GPR[rd]);
   3036 }
   3037 
   3038 000000,5.RS,5.RT,5.RD,00000,010111:SPECIAL:64::DSRAV
   3039 "dsrav r<RD>, r<RT>, r<RS>"
   3040 *mipsIII:
   3041 *mipsIV:
   3042 *mipsV:
   3043 *mips64:
   3044 *mips64r2:
   3045 *mips64r6:
   3046 *vr4100:
   3047 *vr5000:
   3048 {
   3049   check_u64 (SD_, instruction_0);
   3050   do_dsrav (SD_, RS, RT, RD);
   3051 }
   3052 
   3053 :function:::void:do_dsrl:int rt, int rd, int shift
   3054 {
   3055   TRACE_ALU_INPUT2 (GPR[rt], shift);
   3056   GPR[rd] = (uint64_t) GPR[rt] >> shift;
   3057   TRACE_ALU_RESULT (GPR[rd]);
   3058 }
   3059 
   3060 
   3061 000000,00000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
   3062 "dsrl r<RD>, r<RT>, <SHIFT>"
   3063 *mipsIII:
   3064 *mipsIV:
   3065 *mipsV:
   3066 *mips64:
   3067 *mips64r2:
   3068 *mips64r6:
   3069 *vr4100:
   3070 *vr5000:
   3071 {
   3072   check_u64 (SD_, instruction_0);
   3073   do_dsrl (SD_, RT, RD, SHIFT);
   3074 }
   3075 
   3076 
   3077 000000,00000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
   3078 "dsrl32 r<RD>, r<RT>, <SHIFT>"
   3079 *mipsIII:
   3080 *mipsIV:
   3081 *mipsV:
   3082 *mips64:
   3083 *mips64r2:
   3084 *mips64r6:
   3085 *vr4100:
   3086 *vr5000:
   3087 {
   3088   check_u64 (SD_, instruction_0);
   3089   do_dsrl32 (SD_, RD, RT, SHIFT);
   3090 }
   3091 
   3092 
   3093 :function:::void:do_dsrlv:int rs, int rt, int rd
   3094 {
   3095   int s = MASKED64 (GPR[rs], 5, 0);
   3096   TRACE_ALU_INPUT2 (GPR[rt], s);
   3097   GPR[rd] = (uint64_t) GPR[rt] >> s;
   3098   TRACE_ALU_RESULT (GPR[rd]);
   3099 }
   3100 
   3101 
   3102 
   3103 000000,5.RS,5.RT,5.RD,00000,010110:SPECIAL:64::DSRLV
   3104 "dsrlv r<RD>, r<RT>, r<RS>"
   3105 *mipsIII:
   3106 *mipsIV:
   3107 *mipsV:
   3108 *mips64:
   3109 *mips64r2:
   3110 *mips64r6:
   3111 *vr4100:
   3112 *vr5000:
   3113 {
   3114   check_u64 (SD_, instruction_0);
   3115   do_dsrlv (SD_, RS, RT, RD);
   3116 }
   3117 
   3118 
   3119 000000,5.RS,5.RT,5.RD,00000,101110:SPECIAL:64::DSUB
   3120 "dsub r<RD>, r<RS>, r<RT>"
   3121 *mipsIII:
   3122 *mipsIV:
   3123 *mipsV:
   3124 *mips64:
   3125 *mips64r2:
   3126 *mips64r6:
   3127 *vr4100:
   3128 *vr5000:
   3129 {
   3130   check_u64 (SD_, instruction_0);
   3131   do_dsub (SD_, RD, RS, RT);
   3132 }
   3133 
   3134 
   3135 :function:::void:do_dsubu:int rs, int rt, int rd
   3136 {
   3137   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   3138   GPR[rd] = GPR[rs] - GPR[rt];
   3139   TRACE_ALU_RESULT (GPR[rd]);
   3140 }
   3141 
   3142 000000,5.RS,5.RT,5.RD,00000,101111:SPECIAL:64::DSUBU
   3143 "dsubu r<RD>, r<RS>, r<RT>"
   3144 *mipsIII:
   3145 *mipsIV:
   3146 *mipsV:
   3147 *mips64:
   3148 *mips64r2:
   3149 *mips64r6:
   3150 *vr4100:
   3151 *vr5000:
   3152 {
   3153   check_u64 (SD_, instruction_0);
   3154   do_dsubu (SD_, RS, RT, RD);
   3155 }
   3156 
   3157 
   3158 000010,26.INSTR_INDEX:NORMAL:32::J
   3159 "j <INSTR_INDEX>"
   3160 *mipsI:
   3161 *mipsII:
   3162 *mipsIII:
   3163 *mipsIV:
   3164 *mipsV:
   3165 *mips32:
   3166 *mips32r2:
   3167 *mips32r6:
   3168 *mips64:
   3169 *mips64r2:
   3170 *mips64r6:
   3171 *vr4100:
   3172 *vr5000:
   3173 *r3900:
   3174 {
   3175   /* NOTE: The region used is that of the delay slot NIA and NOT the
   3176      current instruction */
   3177   address_word region = (NIA & MASK (63, 28));
   3178   DELAY_SLOT (region | (INSTR_INDEX << 2));
   3179 }
   3180 
   3181 
   3182 000011,26.INSTR_INDEX:NORMAL:32::JAL
   3183 "jal <INSTR_INDEX>"
   3184 *mipsI:
   3185 *mipsII:
   3186 *mipsIII:
   3187 *mipsIV:
   3188 *mipsV:
   3189 *mips32:
   3190 *mips32r2:
   3191 *mips32r6:
   3192 *mips64:
   3193 *mips64r2:
   3194 *mips64r6:
   3195 *vr4100:
   3196 *vr5000:
   3197 *r3900:
   3198 {
   3199   /* NOTE: The region used is that of the delay slot and NOT the
   3200      current instruction */
   3201   address_word region = (NIA & MASK (63, 28));
   3202   GPR[31] = CIA + 8;
   3203   DELAY_SLOT (region | (INSTR_INDEX << 2));
   3204 }
   3205 
   3206 000000,5.RS,00000,5.RD,00000,001001:SPECIAL:32::JALR
   3207 "jalr r<RS>":RD == 31
   3208 "jalr r<RD>, r<RS>"
   3209 *mipsI:
   3210 *mipsII:
   3211 *mipsIII:
   3212 *mipsIV:
   3213 *mipsV:
   3214 *mips32:
   3215 *mips32r2:
   3216 *mips32r6:
   3217 *mips64:
   3218 *mips64r2:
   3219 *mips64r6:
   3220 *vr4100:
   3221 *vr5000:
   3222 *r3900:
   3223 {
   3224   address_word temp = GPR[RS];
   3225   GPR[RD] = CIA + 8;
   3226   DELAY_SLOT (temp);
   3227 }
   3228 
   3229 000000,5.RS,00000,5.RD,10000,001001:SPECIAL:32::JALR_HB
   3230 "jalr.hb r<RS>":RD == 31
   3231 "jalr.hb r<RD>, r<RS>"
   3232 *mips32r2:
   3233 *mips32r6:
   3234 *mips64r2:
   3235 *mips64r6:
   3236 {
   3237   address_word temp = GPR[RS];
   3238   GPR[RD] = CIA + 8;
   3239   DELAY_SLOT (temp);
   3240 }
   3241 
   3242 000000,5.RS,0000000000,00000,001000:SPECIAL:32::JR
   3243 "jr r<RS>"
   3244 *mipsI:
   3245 *mipsII:
   3246 *mipsIII:
   3247 *mipsIV:
   3248 *mipsV:
   3249 *mips32:
   3250 *mips32r2:
   3251 *mips32r6:
   3252 *mips64:
   3253 *mips64r2:
   3254 *mips64r6:
   3255 *vr4100:
   3256 *vr5000:
   3257 *r3900:
   3258 {
   3259   DELAY_SLOT (GPR[RS]);
   3260 }
   3261 
   3262 000000,5.RS,0000000000,10000,001000:SPECIAL:32::JR_HB
   3263 "jr.hb r<RS>"
   3264 *mips32r2:
   3265 *mips32r6:
   3266 *mips64r2:
   3267 *mips64r6:
   3268 {
   3269   DELAY_SLOT (GPR[RS]);
   3270 }
   3271 
   3272 :function:::unsigned_word:do_load:unsigned access, address_word base, address_word offset
   3273 {
   3274   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   3275   address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
   3276   address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
   3277   unsigned int byte;
   3278   address_word paddr;
   3279   uint64_t memval;
   3280   address_word vaddr;
   3281 
   3282   paddr = vaddr = loadstore_ea (SD_, base, offset);
   3283   if ((vaddr & access) != 0)
   3284     {
   3285       SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, access+1, vaddr, read_transfer, sim_core_unaligned_signal);
   3286     }
   3287   paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
   3288   LoadMemory (&memval, NULL, access, paddr, vaddr, isDATA, isREAL);
   3289   byte = ((vaddr & mask) ^ bigendiancpu);
   3290   return (memval >> (8 * byte));
   3291 }
   3292 
   3293 :function:::unsigned_word:do_load_left:unsigned access, address_word base, address_word offset, unsigned_word rt
   3294 {
   3295   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   3296   address_word reverseendian = (ReverseEndian ? -1 : 0);
   3297   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
   3298   unsigned int byte;
   3299   unsigned int word;
   3300   address_word paddr;
   3301   uint64_t memval;
   3302   address_word vaddr;
   3303   int nr_lhs_bits;
   3304   int nr_rhs_bits;
   3305   unsigned_word lhs_mask;
   3306   unsigned_word temp;
   3307 
   3308   paddr = vaddr = loadstore_ea (SD_, base, offset);
   3309   paddr = (paddr ^ (reverseendian & mask));
   3310   if (BigEndianMem == 0)
   3311     paddr = paddr & ~access;
   3312 
   3313   /* compute where within the word/mem we are */
   3314   byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
   3315   word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
   3316   nr_lhs_bits = 8 * byte + 8;
   3317   nr_rhs_bits = 8 * access - 8 * byte;
   3318   /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
   3319 
   3320   /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
   3321 	   (long) ((uint64_t) vaddr >> 32), (long) vaddr,
   3322 	   (long) ((uint64_t) paddr >> 32), (long) paddr,
   3323 	   word, byte, nr_lhs_bits, nr_rhs_bits); */
   3324 
   3325   LoadMemory (&memval, NULL, byte, paddr, vaddr, isDATA, isREAL);
   3326   if (word == 0)
   3327     {
   3328       /* GPR{31..32-NR_LHS_BITS} = memval{NR_LHS_BITS-1..0} */
   3329       temp = (memval << nr_rhs_bits);
   3330     }
   3331   else
   3332     {
   3333       /* GPR{31..32-NR_LHS_BITS = memval{32+NR_LHS_BITS..32} */
   3334       temp = (memval >> nr_lhs_bits);
   3335     }
   3336   lhs_mask = LSMASK (nr_lhs_bits + nr_rhs_bits - 1, nr_rhs_bits);
   3337   rt = (rt & ~lhs_mask) | (temp & lhs_mask);
   3338 
   3339   /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx & 0x%08lx%08lx -> 0x%08lx%08lx\n",
   3340 	   (long) ((uint64_t) memval >> 32), (long) memval,
   3341 	   (long) ((uint64_t) temp >> 32), (long) temp,
   3342 	   (long) ((uint64_t) lhs_mask >> 32), (long) lhs_mask,
   3343 	   (long) (rt >> 32), (long) rt); */
   3344   return rt;
   3345 }
   3346 
   3347 :function:::unsigned_word:do_load_right:unsigned access, address_word base, address_word offset, unsigned_word rt
   3348 {
   3349   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   3350   address_word reverseendian = (ReverseEndian ? -1 : 0);
   3351   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
   3352   unsigned int byte;
   3353   address_word paddr;
   3354   uint64_t memval;
   3355   address_word vaddr;
   3356 
   3357   paddr = vaddr = loadstore_ea (SD_, base, offset);
   3358   /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */
   3359   paddr = (paddr ^ (reverseendian & mask));
   3360   if (BigEndianMem != 0)
   3361     paddr = paddr & ~access;
   3362   byte = ((vaddr & mask) ^ (bigendiancpu & mask));
   3363   /* NOTE: SPEC is wrong, had `byte' not `access - byte'.  See SW. */
   3364   LoadMemory (&memval, NULL, access - (access & byte), paddr, vaddr, isDATA, isREAL);
   3365   /* printf ("lr: 0x%08lx %d@0x%08lx 0x%08lx\n",
   3366      (long) paddr, byte, (long) paddr, (long) memval); */
   3367   {
   3368     unsigned_word screen = LSMASK (8 * (access - (byte & access) + 1) - 1, 0);
   3369     rt &= ~screen;
   3370     rt |= (memval >> (8 * byte)) & screen;
   3371   }
   3372   return rt;
   3373 }
   3374 
   3375 
   3376 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
   3377 "lb r<RT>, <OFFSET>(r<BASE>)"
   3378 *mipsI:
   3379 *mipsII:
   3380 *mipsIII:
   3381 *mipsIV:
   3382 *mipsV:
   3383 *mips32:
   3384 *mips32r2:
   3385 *mips32r6:
   3386 *mips64:
   3387 *mips64r2:
   3388 *mips64r6:
   3389 *vr4100:
   3390 *vr5000:
   3391 *r3900:
   3392 {
   3393   do_lb (SD_,RT,OFFSET,BASE);
   3394 }
   3395 
   3396 
   3397 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
   3398 "lbu r<RT>, <OFFSET>(r<BASE>)"
   3399 *mipsI:
   3400 *mipsII:
   3401 *mipsIII:
   3402 *mipsIV:
   3403 *mipsV:
   3404 *mips32:
   3405 *mips32r2:
   3406 *mips32r6:
   3407 *mips64:
   3408 *mips64r2:
   3409 *mips64r6:
   3410 *vr4100:
   3411 *vr5000:
   3412 *r3900:
   3413 {
   3414   do_lbu (SD_, RT,OFFSET,BASE);
   3415 }
   3416 
   3417 
   3418 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
   3419 "ld r<RT>, <OFFSET>(r<BASE>)"
   3420 *mipsIII:
   3421 *mipsIV:
   3422 *mipsV:
   3423 *mips64:
   3424 *mips64r2:
   3425 *mips64r6:
   3426 *vr4100:
   3427 *vr5000:
   3428 {
   3429   check_u64 (SD_, instruction_0);
   3430   GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
   3431 }
   3432 
   3433 
   3434 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
   3435 "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
   3436 *mipsII:
   3437 *mipsIII:
   3438 *mipsIV:
   3439 *mipsV:
   3440 *mips32:
   3441 *mips32r2:
   3442 *mips64:
   3443 *mips64r2:
   3444 *vr4100:
   3445 *vr5000:
   3446 *r3900:
   3447 {
   3448   do_ldc (SD_, ZZ, RT, OFFSET, BASE);
   3449 }
   3450 
   3451 
   3452 
   3453 
   3454 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
   3455 "ldl r<RT>, <OFFSET>(r<BASE>)"
   3456 *mipsIII:
   3457 *mipsIV:
   3458 *mipsV:
   3459 *mips64:
   3460 *mips64r2:
   3461 *vr4100:
   3462 *vr5000:
   3463 {
   3464   check_u64 (SD_, instruction_0);
   3465   GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   3466 }
   3467 
   3468 
   3469 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
   3470 "ldr r<RT>, <OFFSET>(r<BASE>)"
   3471 *mipsIII:
   3472 *mipsIV:
   3473 *mipsV:
   3474 *mips64:
   3475 *mips64r2:
   3476 *vr4100:
   3477 *vr5000:
   3478 {
   3479   check_u64 (SD_, instruction_0);
   3480   GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   3481 }
   3482 
   3483 
   3484 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
   3485 "lh r<RT>, <OFFSET>(r<BASE>)"
   3486 *mipsI:
   3487 *mipsII:
   3488 *mipsIII:
   3489 *mipsIV:
   3490 *mipsV:
   3491 *mips32:
   3492 *mips32r2:
   3493 *mips32r6:
   3494 *mips64:
   3495 *mips64r2:
   3496 *mips64r6:
   3497 *vr4100:
   3498 *vr5000:
   3499 *r3900:
   3500 {
   3501   do_lh (SD_,RT,OFFSET,BASE);
   3502 }
   3503 
   3504 
   3505 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
   3506 "lhu r<RT>, <OFFSET>(r<BASE>)"
   3507 *mipsI:
   3508 *mipsII:
   3509 *mipsIII:
   3510 *mipsIV:
   3511 *mipsV:
   3512 *mips32:
   3513 *mips32r2:
   3514 *mips32r6:
   3515 *mips64:
   3516 *mips64r2:
   3517 *mips64r6:
   3518 *vr4100:
   3519 *vr5000:
   3520 *r3900:
   3521 {
   3522   do_lhu (SD_,RT,OFFSET,BASE);
   3523 }
   3524 
   3525 
   3526 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
   3527 "ll r<RT>, <OFFSET>(r<BASE>)"
   3528 *mipsII:
   3529 *mipsIII:
   3530 *mipsIV:
   3531 *mipsV:
   3532 *mips32:
   3533 *mips32r2:
   3534 *mips64:
   3535 *mips64r2:
   3536 *vr4100:
   3537 *vr5000:
   3538 {
   3539   do_ll (SD_, RT, OFFSET, BASE);
   3540 }
   3541 
   3542 
   3543 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
   3544 "lld r<RT>, <OFFSET>(r<BASE>)"
   3545 *mipsIII:
   3546 *mipsIV:
   3547 *mipsV:
   3548 *mips64:
   3549 *mips64r2:
   3550 *vr4100:
   3551 *vr5000:
   3552 {
   3553   check_u64 (SD_, instruction_0);
   3554   do_lld (SD_, RT, OFFSET, BASE);
   3555 }
   3556 
   3557 
   3558 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
   3559 "lui r<RT>, %#lx<IMMEDIATE>"
   3560 *mipsI:
   3561 *mipsII:
   3562 *mipsIII:
   3563 *mipsIV:
   3564 *mipsV:
   3565 *mips32:
   3566 *mips32r2:
   3567 *mips32r6:
   3568 *mips64:
   3569 *mips64r2:
   3570 *mips64r6:
   3571 *vr4100:
   3572 *vr5000:
   3573 *r3900:
   3574 {
   3575   do_lui (SD_, RT, IMMEDIATE);
   3576 }
   3577 
   3578 
   3579 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
   3580 "lw r<RT>, <OFFSET>(r<BASE>)"
   3581 *mipsI:
   3582 *mipsII:
   3583 *mipsIII:
   3584 *mipsIV:
   3585 *mipsV:
   3586 *mips32:
   3587 *mips32r2:
   3588 *mips32r6:
   3589 *mips64:
   3590 *mips64r2:
   3591 *mips64r6:
   3592 *vr4100:
   3593 *vr5000:
   3594 *r3900:
   3595 {
   3596   do_lw (SD_,RT,OFFSET,BASE);
   3597 }
   3598 
   3599 
   3600 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
   3601 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
   3602 *mipsI:
   3603 *mipsII:
   3604 *mipsIII:
   3605 *mipsIV:
   3606 *mipsV:
   3607 *mips32:
   3608 *mips32r2:
   3609 *mips64:
   3610 *mips64r2:
   3611 *vr4100:
   3612 *vr5000:
   3613 *r3900:
   3614 {
   3615   do_lwc (SD_, ZZ, RT, OFFSET, BASE);
   3616 }
   3617 
   3618 
   3619 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
   3620 "lwl r<RT>, <OFFSET>(r<BASE>)"
   3621 *mipsI:
   3622 *mipsII:
   3623 *mipsIII:
   3624 *mipsIV:
   3625 *mipsV:
   3626 *mips32:
   3627 *mips32r2:
   3628 *mips64:
   3629 *mips64r2:
   3630 *vr4100:
   3631 *vr5000:
   3632 *r3900:
   3633 {
   3634   do_lwl (SD_, RT, OFFSET, BASE);
   3635 }
   3636 
   3637 
   3638 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
   3639 "lwr r<RT>, <OFFSET>(r<BASE>)"
   3640 *mipsI:
   3641 *mipsII:
   3642 *mipsIII:
   3643 *mipsIV:
   3644 *mipsV:
   3645 *mips32:
   3646 *mips32r2:
   3647 *mips64:
   3648 *mips64r2:
   3649 *vr4100:
   3650 *vr5000:
   3651 *r3900:
   3652 {
   3653   do_lwr (SD_, RT, OFFSET, BASE);
   3654 }
   3655 
   3656 
   3657 100111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LWU
   3658 "lwu r<RT>, <OFFSET>(r<BASE>)"
   3659 *mipsIII:
   3660 *mipsIV:
   3661 *mipsV:
   3662 *mips64:
   3663 *mips64r2:
   3664 *mips64r6:
   3665 *vr4100:
   3666 *vr5000:
   3667 {
   3668   do_lwu (SD_, RT, OFFSET, BASE, instruction_0);
   3669 }
   3670 
   3671 
   3672 
   3673 011100,5.RS,5.RT,00000,00000,000000:SPECIAL2:32::MADD
   3674 "madd r<RS>, r<RT>"
   3675 *mips32:
   3676 *mips64:
   3677 *vr5500:
   3678 {
   3679   do_madd (SD_, RS, RT);
   3680 }
   3681 
   3682 
   3683 011100,5.RS,5.RT,000,2.AC,00000,000000:SPECIAL2:32::MADD
   3684 "madd r<RS>, r<RT>":AC == 0
   3685 "madd ac<AC>, r<RS>, r<RT>"
   3686 *mips32r2:
   3687 *mips64r2:
   3688 *dsp2:
   3689 {
   3690   do_dsp_madd (SD_, AC, RS, RT);
   3691 }
   3692 
   3693 
   3694 011100,5.RS,5.RT,00000,00000,000001:SPECIAL2:32::MADDU
   3695 "maddu r<RS>, r<RT>"
   3696 *mips32:
   3697 *mips64:
   3698 *vr5500:
   3699 {
   3700   do_maddu (SD_, RS, RT);
   3701 }
   3702 
   3703 
   3704 011100,5.RS,5.RT,000,2.AC,00000,000001:SPECIAL2:32::MADDU
   3705 "maddu r<RS>, r<RT>":AC == 0
   3706 "maddu ac<AC>, r<RS>, r<RT>"
   3707 *mips32r2:
   3708 *mips64r2:
   3709 *dsp2:
   3710 {
   3711   do_dsp_maddu (SD_, AC, RS, RT);
   3712 }
   3713 
   3714 
   3715 :function:::void:do_mfhi:int rd
   3716 {
   3717   check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
   3718   TRACE_ALU_INPUT1 (HI);
   3719   GPR[rd] = HI;
   3720   TRACE_ALU_RESULT (GPR[rd]);
   3721 }
   3722 
   3723 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
   3724 "mfhi r<RD>"
   3725 *mipsI:
   3726 *mipsII:
   3727 *mipsIII:
   3728 *mipsIV:
   3729 *mipsV:
   3730 *vr4100:
   3731 *vr5000:
   3732 *r3900:
   3733 *mips32:
   3734 *mips64:
   3735 {
   3736   do_mfhi (SD_, RD);
   3737 }
   3738 
   3739 
   3740 000000,000,2.AC,00000,5.RD,00000,010000:SPECIAL:32::MFHI
   3741 "mfhi r<RD>":AC == 0
   3742 "mfhi r<RD>, ac<AC>"
   3743 *mips32r2:
   3744 *mips64r2:
   3745 *dsp:
   3746 {
   3747   do_dsp_mfhi (SD_, AC, RD);
   3748 }
   3749 
   3750 
   3751 :function:::void:do_mflo:int rd
   3752 {
   3753   check_mf_hilo (SD_, LOHISTORY, HIHISTORY);
   3754   TRACE_ALU_INPUT1 (LO);
   3755   GPR[rd] = LO;
   3756   TRACE_ALU_RESULT (GPR[rd]);
   3757 }
   3758 
   3759 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
   3760 "mflo r<RD>"
   3761 *mipsI:
   3762 *mipsII:
   3763 *mipsIII:
   3764 *mipsIV:
   3765 *mipsV:
   3766 *vr4100:
   3767 *vr5000:
   3768 *r3900:
   3769 *mips32:
   3770 *mips64:
   3771 {
   3772   do_mflo (SD_, RD);
   3773 }
   3774 
   3775 
   3776 000000,000,2.AC,00000,5.RD,00000,010010:SPECIAL:32::MFLO
   3777 "mflo r<RD>":AC == 0
   3778 "mflo r<RD>, ac<AC>"
   3779 *mips32r2:
   3780 *mips64r2:
   3781 *dsp:
   3782 {
   3783   do_dsp_mflo (SD_, AC, RD);
   3784 }
   3785 
   3786 
   3787 000000,5.RS,5.RT,5.RD,00000,001011:SPECIAL:32::MOVN
   3788 "movn r<RD>, r<RS>, r<RT>"
   3789 *mipsIV:
   3790 *mipsV:
   3791 *mips32:
   3792 *mips32r2:
   3793 *mips64:
   3794 *mips64r2:
   3795 *vr5000:
   3796 {
   3797   do_movn (SD_, RD, RS, RT);
   3798 }
   3799 
   3800 
   3801 
   3802 000000,5.RS,5.RT,5.RD,00000,001010:SPECIAL:32::MOVZ
   3803 "movz r<RD>, r<RS>, r<RT>"
   3804 *mipsIV:
   3805 *mipsV:
   3806 *mips32:
   3807 *mips32r2:
   3808 *mips64:
   3809 *mips64r2:
   3810 *vr5000:
   3811 {
   3812   do_movz (SD_, RD, RS, RT);
   3813 }
   3814 
   3815 
   3816 
   3817 011100,5.RS,5.RT,00000,00000,000100:SPECIAL2:32::MSUB
   3818 "msub r<RS>, r<RT>"
   3819 *mips32:
   3820 *mips64:
   3821 *vr5500:
   3822 {
   3823   do_msub (SD_, RS, RT);
   3824 }
   3825 
   3826 
   3827 011100,5.RS,5.RT,000,2.AC,00000,000100:SPECIAL2:32::MSUB
   3828 "msub r<RS>, r<RT>":AC == 0
   3829 "msub ac<AC>, r<RS>, r<RT>"
   3830 *mips32r2:
   3831 *mips64r2:
   3832 *dsp2:
   3833 {
   3834   do_dsp_msub (SD_, AC, RS, RT);
   3835 }
   3836 
   3837 
   3838 011100,5.RS,5.RT,00000,00000,000101:SPECIAL2:32::MSUBU
   3839 "msubu r<RS>, r<RT>"
   3840 *mips32:
   3841 *mips64:
   3842 *vr5500:
   3843 {
   3844   do_msubu (SD_, RS, RT);
   3845 }
   3846 
   3847 
   3848 011100,5.RS,5.RT,000,2.AC,00000,000101:SPECIAL2:32::MSUBU
   3849 "msubu r<RS>, r<RT>":AC == 0
   3850 "msubu ac<AC>, r<RS>, r<RT>"
   3851 *mips32r2:
   3852 *mips64r2:
   3853 *dsp2:
   3854 {
   3855   do_dsp_msubu (SD_, AC, RS, RT);
   3856 }
   3857 
   3858 
   3859 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
   3860 "mthi r<RS>"
   3861 *mipsI:
   3862 *mipsII:
   3863 *mipsIII:
   3864 *mipsIV:
   3865 *mipsV:
   3866 *vr4100:
   3867 *vr5000:
   3868 *r3900:
   3869 *mips32:
   3870 *mips64:
   3871 {
   3872   do_mthi (SD_, RS);
   3873 }
   3874 
   3875 
   3876 000000,5.RS,00000,000,2.AC,00000,010001:SPECIAL:32::MTHI
   3877 "mthi r<RS>":AC == 0
   3878 "mthi r<RS>, ac<AC>"
   3879 *mips32r2:
   3880 *mips64r2:
   3881 *dsp:
   3882 {
   3883   do_dsp_mthi (SD_, AC, RS);
   3884 }
   3885 
   3886 
   3887 000000,5.RS,000000000000000,010011:SPECIAL:32::MTLO
   3888 "mtlo r<RS>"
   3889 *mipsI:
   3890 *mipsII:
   3891 *mipsIII:
   3892 *mipsIV:
   3893 *mipsV:
   3894 *vr4100:
   3895 *vr5000:
   3896 *r3900:
   3897 *mips32:
   3898 *mips64:
   3899 {
   3900   do_mtlo (SD_, RS);
   3901 }
   3902 
   3903 
   3904 000000,5.RS,00000,000,2.AC,00000,010011:SPECIAL:32::MTLO
   3905 "mtlo r<RS>":AC == 0
   3906 "mtlo r<RS>, ac<AC>"
   3907 *mips32r2:
   3908 *mips64r2:
   3909 *dsp:
   3910 {
   3911   do_dsp_mtlo (SD_, AC, RS);
   3912 }
   3913 
   3914 
   3915 011100,5.RS,5.RT,5.RD,00000,000010:SPECIAL2:32::MUL
   3916 "mul r<RD>, r<RS>, r<RT>"
   3917 *mips32:
   3918 *mips32r2:
   3919 *mips64:
   3920 *mips64r2:
   3921 *vr5500:
   3922 {
   3923   do_mul (SD_, RD, RS, RT);
   3924 }
   3925 
   3926 
   3927 
   3928 :function:::void:do_mult:int rs, int rt, int rd
   3929 {
   3930   int64_t prod;
   3931   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   3932   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   3933     Unpredictable ();
   3934   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   3935   prod = (((int64_t)(int32_t) GPR[rs])
   3936 	  * ((int64_t)(int32_t) GPR[rt]));
   3937   LO = EXTEND32 (VL4_8 (prod));
   3938   HI = EXTEND32 (VH4_8 (prod));
   3939   ACX = 0;  /* SmartMIPS */
   3940   if (rd != 0)
   3941     GPR[rd] = LO;
   3942   TRACE_ALU_RESULT2 (HI, LO);
   3943 }
   3944 
   3945 000000,5.RS,5.RT,0000000000,011000:SPECIAL:32::MULT
   3946 "mult r<RS>, r<RT>"
   3947 *mipsI:
   3948 *mipsII:
   3949 *mipsIII:
   3950 *mipsIV:
   3951 *mipsV:
   3952 *mips32:
   3953 *mips64:
   3954 *vr4100:
   3955 {
   3956   do_mult (SD_, RS, RT, 0);
   3957 }
   3958 
   3959 
   3960 000000,5.RS,5.RT,000,2.AC,00000,011000:SPECIAL:32::MULT
   3961 "mult r<RS>, r<RT>":AC == 0
   3962 "mult ac<AC>, r<RS>, r<RT>"
   3963 *mips32r2:
   3964 *mips64r2:
   3965 *dsp2:
   3966 {
   3967   do_dsp_mult (SD_, AC, RS, RT);
   3968 }
   3969 
   3970 
   3971 000000,5.RS,5.RT,5.RD,00000,011000:SPECIAL:32::MULT
   3972 "mult r<RS>, r<RT>":RD == 0
   3973 "mult r<RD>, r<RS>, r<RT>"
   3974 *vr5000:
   3975 *r3900:
   3976 {
   3977   do_mult (SD_, RS, RT, RD);
   3978 }
   3979 
   3980 
   3981 :function:::void:do_multu:int rs, int rt, int rd
   3982 {
   3983   uint64_t prod;
   3984   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
   3985   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   3986     Unpredictable ();
   3987   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   3988   prod = (((uint64_t)(uint32_t) GPR[rs])
   3989 	  * ((uint64_t)(uint32_t) GPR[rt]));
   3990   LO = EXTEND32 (VL4_8 (prod));
   3991   HI = EXTEND32 (VH4_8 (prod));
   3992   if (rd != 0)
   3993     GPR[rd] = LO;
   3994   TRACE_ALU_RESULT2 (HI, LO);
   3995 }
   3996 
   3997 000000,5.RS,5.RT,0000000000,011001:SPECIAL:32::MULTU
   3998 "multu r<RS>, r<RT>"
   3999 *mipsI:
   4000 *mipsII:
   4001 *mipsIII:
   4002 *mipsIV:
   4003 *mipsV:
   4004 *mips32:
   4005 *mips64:
   4006 *vr4100:
   4007 {
   4008   do_multu (SD_, RS, RT, 0);
   4009 }
   4010 
   4011 
   4012 000000,5.RS,5.RT,000,2.AC,00000,011001:SPECIAL:32::MULTU
   4013 "multu r<RS>, r<RT>":AC == 0
   4014 "multu r<RS>, r<RT>"
   4015 *mips32r2:
   4016 *mips64r2:
   4017 *dsp2:
   4018 {
   4019   do_dsp_multu (SD_, AC, RS, RT);
   4020 }
   4021 
   4022 
   4023 000000,5.RS,5.RT,5.RD,00000,011001:SPECIAL:32::MULTU
   4024 "multu r<RS>, r<RT>":RD == 0
   4025 "multu r<RD>, r<RS>, r<RT>"
   4026 *vr5000:
   4027 *r3900:
   4028 {
   4029   do_multu (SD_, RS, RT, RD);
   4030 }
   4031 
   4032 
   4033 :function:::void:do_nor:int rs, int rt, int rd
   4034 {
   4035   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   4036   GPR[rd] = ~ (GPR[rs] | GPR[rt]);
   4037   TRACE_ALU_RESULT (GPR[rd]);
   4038 }
   4039 
   4040 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
   4041 "nor r<RD>, r<RS>, r<RT>"
   4042 *mipsI:
   4043 *mipsII:
   4044 *mipsIII:
   4045 *mipsIV:
   4046 *mipsV:
   4047 *mips32:
   4048 *mips32r2:
   4049 *mips32r6:
   4050 *mips64:
   4051 *mips64r2:
   4052 *mips64r6:
   4053 *vr4100:
   4054 *vr5000:
   4055 *r3900:
   4056 {
   4057   do_nor (SD_, RS, RT, RD);
   4058 }
   4059 
   4060 
   4061 :function:::void:do_or:int rs, int rt, int rd
   4062 {
   4063   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   4064   GPR[rd] = (GPR[rs] | GPR[rt]);
   4065   TRACE_ALU_RESULT (GPR[rd]);
   4066 }
   4067 
   4068 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
   4069 "or r<RD>, r<RS>, r<RT>"
   4070 *mipsI:
   4071 *mipsII:
   4072 *mipsIII:
   4073 *mipsIV:
   4074 *mipsV:
   4075 *mips32:
   4076 *mips32r2:
   4077 *mips32r6:
   4078 *mips64:
   4079 *mips64r2:
   4080 *mips64r6:
   4081 *vr4100:
   4082 *vr5000:
   4083 *r3900:
   4084 {
   4085   do_or (SD_, RS, RT, RD);
   4086 }
   4087 
   4088 
   4089 
   4090 :function:::void:do_ori:int rs, int rt, unsigned immediate
   4091 {
   4092   TRACE_ALU_INPUT2 (GPR[rs], immediate);
   4093   GPR[rt] = (GPR[rs] | immediate);
   4094   TRACE_ALU_RESULT (GPR[rt]);
   4095 }
   4096 
   4097 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
   4098 "ori r<RT>, r<RS>, %#lx<IMMEDIATE>"
   4099 *mipsI:
   4100 *mipsII:
   4101 *mipsIII:
   4102 *mipsIV:
   4103 *mipsV:
   4104 *mips32:
   4105 *mips32r2:
   4106 *mips32r6:
   4107 *mips64:
   4108 *mips64r2:
   4109 *mips64r6:
   4110 *vr4100:
   4111 *vr5000:
   4112 *r3900:
   4113 {
   4114   do_ori (SD_, RS, RT, IMMEDIATE);
   4115 }
   4116 
   4117 
   4118 110011,5.BASE,5.HINT,16.OFFSET:NORMAL:32::PREF
   4119 "pref <HINT>, <OFFSET>(r<BASE>)"
   4120 *mipsIV:
   4121 *mipsV:
   4122 *mips32:
   4123 *mips32r2:
   4124 *mips64:
   4125 *mips64r2:
   4126 *vr5000:
   4127 {
   4128   do_pref (SD_, HINT, OFFSET, BASE);
   4129 }
   4130 
   4131 
   4132 :function:::uint64_t:do_ror:uint32_t x,uint32_t y
   4133 {
   4134   uint64_t result;
   4135 
   4136   y &= 31;
   4137   TRACE_ALU_INPUT2 (x, y);
   4138   result = EXTEND32 (ROTR32 (x, y));
   4139   TRACE_ALU_RESULT (result);
   4140   return result;
   4141 }
   4142 
   4143 000000,00001,5.RT,5.RD,5.SHIFT,000010::32::ROR
   4144 "ror r<RD>, r<RT>, <SHIFT>"
   4145 *mips32r2:
   4146 *mips32r6:
   4147 *mips64r2:
   4148 *mips64r6:
   4149 *smartmips:
   4150 *vr5400:
   4151 *vr5500:
   4152 {
   4153   GPR[RD] = do_ror (SD_, GPR[RT], SHIFT);
   4154 }
   4155 
   4156 000000,5.RS,5.RT,5.RD,00001,000110::32::RORV
   4157 "rorv r<RD>, r<RT>, r<RS>"
   4158 *mips32r2:
   4159 *mips32r6:
   4160 *mips64r2:
   4161 *mips64r6:
   4162 *smartmips:
   4163 *vr5400:
   4164 *vr5500:
   4165 {
   4166   GPR[RD] = do_ror (SD_, GPR[RT], GPR[RS]);
   4167 }
   4168 
   4169 
   4170 :function:::void:do_store:unsigned access, address_word base, address_word offset, unsigned_word word
   4171 {
   4172   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   4173   address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
   4174   address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
   4175   unsigned int byte;
   4176   address_word paddr;
   4177   uint64_t memval;
   4178   address_word vaddr;
   4179 
   4180   paddr = vaddr = loadstore_ea (SD_, base, offset);
   4181   if ((vaddr & access) != 0)
   4182     {
   4183       SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, access+1, vaddr, write_transfer, sim_core_unaligned_signal);
   4184     }
   4185   paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
   4186   byte = ((vaddr & mask) ^ bigendiancpu);
   4187   memval = (word << (8 * byte));
   4188   StoreMemory (access, memval, 0, paddr, vaddr, isREAL);
   4189 }
   4190 
   4191 :function:::void:do_store_left:unsigned access, address_word base, address_word offset, unsigned_word rt
   4192 {
   4193   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   4194   address_word reverseendian = (ReverseEndian ? -1 : 0);
   4195   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
   4196   unsigned int byte;
   4197   unsigned int word;
   4198   address_word paddr;
   4199   uint64_t memval;
   4200   address_word vaddr;
   4201   int nr_lhs_bits;
   4202   int nr_rhs_bits;
   4203 
   4204   paddr = vaddr = loadstore_ea (SD_, base, offset);
   4205   paddr = (paddr ^ (reverseendian & mask));
   4206   if (BigEndianMem == 0)
   4207     paddr = paddr & ~access;
   4208 
   4209   /* compute where within the word/mem we are */
   4210   byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
   4211   word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
   4212   nr_lhs_bits = 8 * byte + 8;
   4213   nr_rhs_bits = 8 * access - 8 * byte;
   4214   /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
   4215   /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
   4216 	   (long) ((uint64_t) vaddr >> 32), (long) vaddr,
   4217 	   (long) ((uint64_t) paddr >> 32), (long) paddr,
   4218 	   word, byte, nr_lhs_bits, nr_rhs_bits); */
   4219 
   4220   if (word == 0)
   4221     {
   4222       memval = (rt >> nr_rhs_bits);
   4223     }
   4224   else
   4225     {
   4226       memval = (rt << nr_lhs_bits);
   4227     }
   4228   /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx\n",
   4229 	   (long) ((uint64_t) rt >> 32), (long) rt,
   4230 	   (long) ((uint64_t) memval >> 32), (long) memval); */
   4231   StoreMemory (byte, memval, 0, paddr, vaddr, isREAL);
   4232 }
   4233 
   4234 :function:::void:do_store_right:unsigned access, address_word base, address_word offset, unsigned_word rt
   4235 {
   4236   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
   4237   address_word reverseendian = (ReverseEndian ? -1 : 0);
   4238   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
   4239   unsigned int byte;
   4240   address_word paddr;
   4241   uint64_t memval;
   4242   address_word vaddr;
   4243 
   4244   paddr = vaddr = loadstore_ea (SD_, base, offset);
   4245   paddr = (paddr ^ (reverseendian & mask));
   4246   if (BigEndianMem != 0)
   4247     paddr &= ~access;
   4248   byte = ((vaddr & mask) ^ (bigendiancpu & mask));
   4249   memval = (rt << (byte * 8));
   4250   StoreMemory (access - (access & byte), memval, 0, paddr, vaddr, isREAL);
   4251 }
   4252 
   4253 
   4254 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
   4255 "sb r<RT>, <OFFSET>(r<BASE>)"
   4256 *mipsI:
   4257 *mipsII:
   4258 *mipsIII:
   4259 *mipsIV:
   4260 *mipsV:
   4261 *mips32:
   4262 *mips32r2:
   4263 *mips32r6:
   4264 *mips64:
   4265 *mips64r2:
   4266 *mips64r6:
   4267 *vr4100:
   4268 *vr5000:
   4269 *r3900:
   4270 {
   4271   do_store (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   4272 }
   4273 
   4274 
   4275 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
   4276 "sc r<RT>, <OFFSET>(r<BASE>)"
   4277 *mipsII:
   4278 *mipsIII:
   4279 *mipsIV:
   4280 *mipsV:
   4281 *mips32:
   4282 *mips32r2:
   4283 *mips64:
   4284 *mips64r2:
   4285 *vr4100:
   4286 *vr5000:
   4287 {
   4288   do_sc (SD_, RT, OFFSET, BASE, instruction_0, 1);
   4289 }
   4290 
   4291 
   4292 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
   4293 "scd r<RT>, <OFFSET>(r<BASE>)"
   4294 *mipsIII:
   4295 *mipsIV:
   4296 *mipsV:
   4297 *mips64:
   4298 *mips64r2:
   4299 *vr4100:
   4300 *vr5000:
   4301 {
   4302   check_u64 (SD_, instruction_0);
   4303   do_scd (SD_, RT, OFFSET, BASE, 1);
   4304 }
   4305 
   4306 
   4307 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
   4308 "sd r<RT>, <OFFSET>(r<BASE>)"
   4309 *mipsIII:
   4310 *mipsIV:
   4311 *mipsV:
   4312 *mips64:
   4313 *mips64r2:
   4314 *mips64r6:
   4315 *vr4100:
   4316 *vr5000:
   4317 {
   4318   check_u64 (SD_, instruction_0);
   4319   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   4320 }
   4321 
   4322 
   4323 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
   4324 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
   4325 *mipsII:
   4326 *mipsIII:
   4327 *mipsIV:
   4328 *mipsV:
   4329 *mips32:
   4330 *mips32r2:
   4331 *mips64:
   4332 *mips64r2:
   4333 *vr4100:
   4334 *vr5000:
   4335 {
   4336   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (ZZ, RT));
   4337 }
   4338 
   4339 
   4340 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
   4341 "sdl r<RT>, <OFFSET>(r<BASE>)"
   4342 *mipsIII:
   4343 *mipsIV:
   4344 *mipsV:
   4345 *mips64:
   4346 *mips64r2:
   4347 *vr4100:
   4348 *vr5000:
   4349 {
   4350   check_u64 (SD_, instruction_0);
   4351   do_store_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   4352 }
   4353 
   4354 
   4355 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
   4356 "sdr r<RT>, <OFFSET>(r<BASE>)"
   4357 *mipsIII:
   4358 *mipsIV:
   4359 *mipsV:
   4360 *mips64:
   4361 *mips64r2:
   4362 *vr4100:
   4363 *vr5000:
   4364 {
   4365   check_u64 (SD_, instruction_0);
   4366   do_store_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   4367 }
   4368 
   4369 
   4370 
   4371 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
   4372 "sh r<RT>, <OFFSET>(r<BASE>)"
   4373 *mipsI:
   4374 *mipsII:
   4375 *mipsIII:
   4376 *mipsIV:
   4377 *mipsV:
   4378 *mips32:
   4379 *mips32r2:
   4380 *mips32r6:
   4381 *mips64:
   4382 *mips64r2:
   4383 *mips64r6:
   4384 *vr4100:
   4385 *vr5000:
   4386 *r3900:
   4387 {
   4388   do_store (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   4389 }
   4390 
   4391 
   4392 :function:::void:do_sll:int rt, int rd, int shift
   4393 {
   4394   uint32_t temp = (GPR[rt] << shift);
   4395   TRACE_ALU_INPUT2 (GPR[rt], shift);
   4396   GPR[rd] = EXTEND32 (temp);
   4397   TRACE_ALU_RESULT (GPR[rd]);
   4398 }
   4399 
   4400 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLa
   4401 "nop":RD == 0 && RT == 0 && SHIFT == 0
   4402 "sll r<RD>, r<RT>, <SHIFT>"
   4403 *mipsI:
   4404 *mipsII:
   4405 *mipsIII:
   4406 *mipsIV:
   4407 *mipsV:
   4408 *vr4100:
   4409 *vr5000:
   4410 *r3900:
   4411 {
   4412   /* Skip shift for NOP, so that there won't be lots of extraneous
   4413      trace output.  */
   4414   if (RD != 0 || RT != 0 || SHIFT != 0)
   4415     do_sll (SD_, RT, RD, SHIFT);
   4416 }
   4417 
   4418 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLb
   4419 "nop":RD == 0 && RT == 0 && SHIFT == 0
   4420 "ssnop":RD == 0 && RT == 0 && SHIFT == 1
   4421 "ehb":RD == 0 && RT == 0 && SHIFT == 3
   4422 "sll r<RD>, r<RT>, <SHIFT>"
   4423 *mips32:
   4424 *mips32r2:
   4425 *mips32r6:
   4426 *mips64:
   4427 *mips64r2:
   4428 *mips64r6:
   4429 {
   4430   do_sll (SD_, RT, RD, SHIFT);
   4431 }
   4432 
   4433 
   4434 :function:::void:do_sllv:int rs, int rt, int rd
   4435 {
   4436   int s = MASKED (GPR[rs], 4, 0);
   4437   uint32_t temp = (GPR[rt] << s);
   4438   TRACE_ALU_INPUT2 (GPR[rt], s);
   4439   GPR[rd] = EXTEND32 (temp);
   4440   TRACE_ALU_RESULT (GPR[rd]);
   4441 }
   4442 
   4443 000000,5.RS,5.RT,5.RD,00000,000100:SPECIAL:32::SLLV
   4444 "sllv r<RD>, r<RT>, r<RS>"
   4445 *mipsI:
   4446 *mipsII:
   4447 *mipsIII:
   4448 *mipsIV:
   4449 *mipsV:
   4450 *mips32:
   4451 *mips32r2:
   4452 *mips32r6:
   4453 *mips64:
   4454 *mips64r2:
   4455 *mips64r6:
   4456 *vr4100:
   4457 *vr5000:
   4458 *r3900:
   4459 {
   4460   do_sllv (SD_, RS, RT, RD);
   4461 }
   4462 
   4463 
   4464 :function:::void:do_slt:int rs, int rt, int rd
   4465 {
   4466   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   4467   GPR[rd] = ((signed_word) GPR[rs] < (signed_word) GPR[rt]);
   4468   TRACE_ALU_RESULT (GPR[rd]);
   4469 }
   4470 
   4471 000000,5.RS,5.RT,5.RD,00000,101010:SPECIAL:32::SLT
   4472 "slt r<RD>, r<RS>, r<RT>"
   4473 *mipsI:
   4474 *mipsII:
   4475 *mipsIII:
   4476 *mipsIV:
   4477 *mipsV:
   4478 *mips32:
   4479 *mips32r2:
   4480 *mips32r6:
   4481 *mips64:
   4482 *mips64r2:
   4483 *mips64r6:
   4484 *vr4100:
   4485 *vr5000:
   4486 *r3900:
   4487 {
   4488   do_slt (SD_, RS, RT, RD);
   4489 }
   4490 
   4491 
   4492 :function:::void:do_slti:int rs, int rt, uint16_t immediate
   4493 {
   4494   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
   4495   GPR[rt] = ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate));
   4496   TRACE_ALU_RESULT (GPR[rt]);
   4497 }
   4498 
   4499 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
   4500 "slti r<RT>, r<RS>, <IMMEDIATE>"
   4501 *mipsI:
   4502 *mipsII:
   4503 *mipsIII:
   4504 *mipsIV:
   4505 *mipsV:
   4506 *mips32:
   4507 *mips32r2:
   4508 *mips32r6:
   4509 *mips64:
   4510 *mips64r2:
   4511 *mips64r6:
   4512 *vr4100:
   4513 *vr5000:
   4514 *r3900:
   4515 {
   4516   do_slti (SD_, RS, RT, IMMEDIATE);
   4517 }
   4518 
   4519 
   4520 :function:::void:do_sltiu:int rs, int rt, uint16_t immediate
   4521 {
   4522   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
   4523   GPR[rt] = ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate));
   4524   TRACE_ALU_RESULT (GPR[rt]);
   4525 }
   4526 
   4527 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
   4528 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
   4529 *mipsI:
   4530 *mipsII:
   4531 *mipsIII:
   4532 *mipsIV:
   4533 *mipsV:
   4534 *mips32:
   4535 *mips32r2:
   4536 *mips32r6:
   4537 *mips64:
   4538 *mips64r2:
   4539 *mips64r6:
   4540 *vr4100:
   4541 *vr5000:
   4542 *r3900:
   4543 {
   4544   do_sltiu (SD_, RS, RT, IMMEDIATE);
   4545 }
   4546 
   4547 
   4548 
   4549 :function:::void:do_sltu:int rs, int rt, int rd
   4550 {
   4551   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   4552   GPR[rd] = ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt]);
   4553   TRACE_ALU_RESULT (GPR[rd]);
   4554 }
   4555 
   4556 000000,5.RS,5.RT,5.RD,00000,101011:SPECIAL:32::SLTU
   4557 "sltu r<RD>, r<RS>, r<RT>"
   4558 *mipsI:
   4559 *mipsII:
   4560 *mipsIII:
   4561 *mipsIV:
   4562 *mipsV:
   4563 *mips32:
   4564 *mips32r2:
   4565 *mips32r6:
   4566 *mips64:
   4567 *mips64r2:
   4568 *mips64r6:
   4569 *vr4100:
   4570 *vr5000:
   4571 *r3900:
   4572 {
   4573   do_sltu (SD_, RS, RT, RD);
   4574 }
   4575 
   4576 
   4577 :function:::void:do_sra:int rt, int rd, int shift
   4578 {
   4579   int32_t temp = (int32_t) GPR[rt] >> shift;
   4580   if (NotWordValue (GPR[rt]))
   4581     Unpredictable ();
   4582   TRACE_ALU_INPUT2 (GPR[rt], shift);
   4583   GPR[rd] = EXTEND32 (temp);
   4584   TRACE_ALU_RESULT (GPR[rd]);
   4585 }
   4586 
   4587 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
   4588 "sra r<RD>, r<RT>, <SHIFT>"
   4589 *mipsI:
   4590 *mipsII:
   4591 *mipsIII:
   4592 *mipsIV:
   4593 *mipsV:
   4594 *mips32:
   4595 *mips32r2:
   4596 *mips32r6:
   4597 *mips64:
   4598 *mips64r2:
   4599 *mips64r6:
   4600 *vr4100:
   4601 *vr5000:
   4602 *r3900:
   4603 {
   4604   do_sra (SD_, RT, RD, SHIFT);
   4605 }
   4606 
   4607 
   4608 
   4609 :function:::void:do_srav:int rs, int rt, int rd
   4610 {
   4611   int s = MASKED (GPR[rs], 4, 0);
   4612   int32_t temp = (int32_t) GPR[rt] >> s;
   4613   if (NotWordValue (GPR[rt]))
   4614     Unpredictable ();
   4615   TRACE_ALU_INPUT2 (GPR[rt], s);
   4616   GPR[rd] = EXTEND32 (temp);
   4617   TRACE_ALU_RESULT (GPR[rd]);
   4618 }
   4619 
   4620 000000,5.RS,5.RT,5.RD,00000,000111:SPECIAL:32::SRAV
   4621 "srav r<RD>, r<RT>, r<RS>"
   4622 *mipsI:
   4623 *mipsII:
   4624 *mipsIII:
   4625 *mipsIV:
   4626 *mipsV:
   4627 *mips32:
   4628 *mips32r2:
   4629 *mips32r6:
   4630 *mips64:
   4631 *mips64r2:
   4632 *mips64r6:
   4633 *vr4100:
   4634 *vr5000:
   4635 *r3900:
   4636 {
   4637   do_srav (SD_, RS, RT, RD);
   4638 }
   4639 
   4640 
   4641 
   4642 :function:::void:do_srl:int rt, int rd, int shift
   4643 {
   4644   uint32_t temp = (uint32_t) GPR[rt] >> shift;
   4645   if (NotWordValue (GPR[rt]))
   4646     Unpredictable ();
   4647   TRACE_ALU_INPUT2 (GPR[rt], shift);
   4648   GPR[rd] = EXTEND32 (temp);
   4649   TRACE_ALU_RESULT (GPR[rd]);
   4650 }
   4651 
   4652 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
   4653 "srl r<RD>, r<RT>, <SHIFT>"
   4654 *mipsI:
   4655 *mipsII:
   4656 *mipsIII:
   4657 *mipsIV:
   4658 *mipsV:
   4659 *mips32:
   4660 *mips32r2:
   4661 *mips32r6:
   4662 *mips64:
   4663 *mips64r2:
   4664 *mips64r6:
   4665 *vr4100:
   4666 *vr5000:
   4667 *r3900:
   4668 {
   4669   do_srl (SD_, RT, RD, SHIFT);
   4670 }
   4671 
   4672 
   4673 :function:::void:do_srlv:int rs, int rt, int rd
   4674 {
   4675   int s = MASKED (GPR[rs], 4, 0);
   4676   uint32_t temp = (uint32_t) GPR[rt] >> s;
   4677   if (NotWordValue (GPR[rt]))
   4678     Unpredictable ();
   4679   TRACE_ALU_INPUT2 (GPR[rt], s);
   4680   GPR[rd] = EXTEND32 (temp);
   4681   TRACE_ALU_RESULT (GPR[rd]);
   4682 }
   4683 
   4684 000000,5.RS,5.RT,5.RD,00000,000110:SPECIAL:32::SRLV
   4685 "srlv r<RD>, r<RT>, r<RS>"
   4686 *mipsI:
   4687 *mipsII:
   4688 *mipsIII:
   4689 *mipsIV:
   4690 *mipsV:
   4691 *mips32:
   4692 *mips32r2:
   4693 *mips32r6:
   4694 *mips64:
   4695 *mips64r2:
   4696 *mips64r6:
   4697 *vr4100:
   4698 *vr5000:
   4699 *r3900:
   4700 {
   4701   do_srlv (SD_, RS, RT, RD);
   4702 }
   4703 
   4704 
   4705 000000,5.RS,5.RT,5.RD,00000,100010:SPECIAL:32::SUB
   4706 "sub r<RD>, r<RS>, r<RT>"
   4707 *mipsI:
   4708 *mipsII:
   4709 *mipsIII:
   4710 *mipsIV:
   4711 *mipsV:
   4712 *mips32:
   4713 *mips32r2:
   4714 *mips32r6:
   4715 *mips64:
   4716 *mips64r2:
   4717 *mips64r6:
   4718 *vr4100:
   4719 *vr5000:
   4720 *r3900:
   4721 {
   4722   do_sub (SD_, RD, RS, RT);
   4723 }
   4724 
   4725 
   4726 :function:::void:do_subu:int rs, int rt, int rd
   4727 {
   4728   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
   4729     Unpredictable ();
   4730   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   4731   GPR[rd] = EXTEND32 (GPR[rs] - GPR[rt]);
   4732   TRACE_ALU_RESULT (GPR[rd]);
   4733 }
   4734 
   4735 000000,5.RS,5.RT,5.RD,00000,100011:SPECIAL:32::SUBU
   4736 "subu r<RD>, r<RS>, r<RT>"
   4737 *mipsI:
   4738 *mipsII:
   4739 *mipsIII:
   4740 *mipsIV:
   4741 *mipsV:
   4742 *mips32:
   4743 *mips32r2:
   4744 *mips32r6:
   4745 *mips64:
   4746 *mips64r2:
   4747 *mips64r6:
   4748 *vr4100:
   4749 *vr5000:
   4750 *r3900:
   4751 {
   4752   do_subu (SD_, RS, RT, RD);
   4753 }
   4754 
   4755 
   4756 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
   4757 "sw r<RT>, <OFFSET>(r<BASE>)"
   4758 *mipsI:
   4759 *mipsII:
   4760 *mipsIII:
   4761 *mipsIV:
   4762 *mipsV:
   4763 *mips32:
   4764 *mips32r2:
   4765 *mips32r6:
   4766 *mips64:
   4767 *mips64r2:
   4768 *mips64r6:
   4769 *vr4100:
   4770 *r3900:
   4771 *vr5000:
   4772 {
   4773   do_sw (SD_, RT, OFFSET, BASE);
   4774 }
   4775 
   4776 
   4777 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
   4778 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
   4779 *mipsI:
   4780 *mipsII:
   4781 *mipsIII:
   4782 *mipsIV:
   4783 *mipsV:
   4784 *mips32:
   4785 *mips32r2:
   4786 *mips64:
   4787 *mips64r2:
   4788 *vr4100:
   4789 *vr5000:
   4790 *r3900:
   4791 {
   4792   do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), COP_SW (ZZ, RT));
   4793 }
   4794 
   4795 
   4796 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
   4797 "swl r<RT>, <OFFSET>(r<BASE>)"
   4798 *mipsI:
   4799 *mipsII:
   4800 *mipsIII:
   4801 *mipsIV:
   4802 *mipsV:
   4803 *mips32:
   4804 *mips32r2:
   4805 *mips64:
   4806 *mips64r2:
   4807 *vr4100:
   4808 *vr5000:
   4809 *r3900:
   4810 {
   4811   do_store_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   4812 }
   4813 
   4814 
   4815 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
   4816 "swr r<RT>, <OFFSET>(r<BASE>)"
   4817 *mipsI:
   4818 *mipsII:
   4819 *mipsIII:
   4820 *mipsIV:
   4821 *mipsV:
   4822 *mips32:
   4823 *mips32r2:
   4824 *mips64:
   4825 *mips64r2:
   4826 *vr4100:
   4827 *vr5000:
   4828 *r3900:
   4829 {
   4830   do_store_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
   4831 }
   4832 
   4833 
   4834 000000,000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
   4835 "sync":STYPE == 0
   4836 "sync <STYPE>"
   4837 *mipsII:
   4838 *mipsIII:
   4839 *mipsIV:
   4840 *mipsV:
   4841 *mips32:
   4842 *mips32r2:
   4843 *mips32r6:
   4844 *mips64:
   4845 *mips64r2:
   4846 *mips64r6:
   4847 *vr4100:
   4848 *vr5000:
   4849 *r3900:
   4850 {
   4851   SyncOperation (STYPE);
   4852 }
   4853 
   4854 
   4855 000000,20.CODE,001100:SPECIAL:32::SYSCALL
   4856 "syscall %#lx<CODE>"
   4857 *mipsI:
   4858 *mipsII:
   4859 *mipsIII:
   4860 *mipsIV:
   4861 *mipsV:
   4862 *mips32:
   4863 *mips32r2:
   4864 *mips32r6:
   4865 *mips64:
   4866 *mips64r2:
   4867 *mips64r6:
   4868 *vr4100:
   4869 *vr5000:
   4870 *r3900:
   4871 {
   4872   SignalException (SystemCall, instruction_0);
   4873 }
   4874 
   4875 
   4876 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
   4877 "teq r<RS>, r<RT>"
   4878 *mipsII:
   4879 *mipsIII:
   4880 *mipsIV:
   4881 *mipsV:
   4882 *mips32:
   4883 *mips32r2:
   4884 *mips32r6:
   4885 *mips64:
   4886 *mips64r2:
   4887 *mips64r6:
   4888 *vr4100:
   4889 *vr5000:
   4890 {
   4891   do_teq (SD_, RS, RT, instruction_0);
   4892 }
   4893 
   4894 
   4895 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
   4896 "teqi r<RS>, <IMMEDIATE>"
   4897 *mipsII:
   4898 *mipsIII:
   4899 *mipsIV:
   4900 *mipsV:
   4901 *mips32:
   4902 *mips32r2:
   4903 *mips64:
   4904 *mips64r2:
   4905 *vr4100:
   4906 *vr5000:
   4907 {
   4908   do_teqi (SD_, RS, IMMEDIATE, instruction_0);
   4909 }
   4910 
   4911 
   4912 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
   4913 "tge r<RS>, r<RT>"
   4914 *mipsII:
   4915 *mipsIII:
   4916 *mipsIV:
   4917 *mipsV:
   4918 *mips32:
   4919 *mips32r2:
   4920 *mips32r6:
   4921 *mips64:
   4922 *mips64r2:
   4923 *mips64r6:
   4924 *vr4100:
   4925 *vr5000:
   4926 {
   4927   do_tge (SD_, RS, RT, instruction_0);
   4928 }
   4929 
   4930 
   4931 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
   4932 "tgei r<RS>, <IMMEDIATE>"
   4933 *mipsII:
   4934 *mipsIII:
   4935 *mipsIV:
   4936 *mipsV:
   4937 *mips32:
   4938 *mips32r2:
   4939 *mips64:
   4940 *mips64r2:
   4941 *vr4100:
   4942 *vr5000:
   4943 {
   4944   do_tgei (SD_, RS, IMMEDIATE, instruction_0);
   4945 }
   4946 
   4947 
   4948 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
   4949 "tgeiu r<RS>, <IMMEDIATE>"
   4950 *mipsII:
   4951 *mipsIII:
   4952 *mipsIV:
   4953 *mipsV:
   4954 *mips32:
   4955 *mips32r2:
   4956 *mips64:
   4957 *mips64r2:
   4958 *vr4100:
   4959 *vr5000:
   4960 {
   4961   do_tgeiu (SD_, RS, IMMEDIATE, instruction_0);
   4962 }
   4963 
   4964 
   4965 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
   4966 "tgeu r<RS>, r<RT>"
   4967 *mipsII:
   4968 *mipsIII:
   4969 *mipsIV:
   4970 *mipsV:
   4971 *mips32:
   4972 *mips32r2:
   4973 *mips32r6:
   4974 *mips64:
   4975 *mips64r2:
   4976 *mips64r6:
   4977 *vr4100:
   4978 *vr5000:
   4979 {
   4980   do_tgeu (SD_, RS, RT, instruction_0);
   4981 }
   4982 
   4983 
   4984 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
   4985 "tlt r<RS>, r<RT>"
   4986 *mipsII:
   4987 *mipsIII:
   4988 *mipsIV:
   4989 *mipsV:
   4990 *mips32:
   4991 *mips32r2:
   4992 *mips32r6:
   4993 *mips64:
   4994 *mips64r2:
   4995 *mips64r6:
   4996 *vr4100:
   4997 *vr5000:
   4998 {
   4999   do_tlt (SD_, RS, RT, instruction_0);
   5000 }
   5001 
   5002 
   5003 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
   5004 "tlti r<RS>, <IMMEDIATE>"
   5005 *mipsII:
   5006 *mipsIII:
   5007 *mipsIV:
   5008 *mipsV:
   5009 *mips32:
   5010 *mips32r2:
   5011 *mips64:
   5012 *mips64r2:
   5013 *vr4100:
   5014 *vr5000:
   5015 {
   5016   do_tlti (SD_, RS, IMMEDIATE, instruction_0);
   5017 }
   5018 
   5019 
   5020 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
   5021 "tltiu r<RS>, <IMMEDIATE>"
   5022 *mipsII:
   5023 *mipsIII:
   5024 *mipsIV:
   5025 *mipsV:
   5026 *mips32:
   5027 *mips32r2:
   5028 *mips64:
   5029 *mips64r2:
   5030 *vr4100:
   5031 *vr5000:
   5032 {
   5033   do_tltiu (SD_, RS, IMMEDIATE, instruction_0);
   5034 }
   5035 
   5036 
   5037 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
   5038 "tltu r<RS>, r<RT>"
   5039 *mipsII:
   5040 *mipsIII:
   5041 *mipsIV:
   5042 *mipsV:
   5043 *mips32:
   5044 *mips32r2:
   5045 *mips32r6:
   5046 *mips64:
   5047 *mips64r2:
   5048 *mips64r6:
   5049 *vr4100:
   5050 *vr5000:
   5051 {
   5052   do_tltu (SD_, RS, RT, instruction_0);
   5053 }
   5054 
   5055 
   5056 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
   5057 "tne r<RS>, r<RT>"
   5058 *mipsII:
   5059 *mipsIII:
   5060 *mipsIV:
   5061 *mipsV:
   5062 *mips32:
   5063 *mips32r2:
   5064 *mips32r6:
   5065 *mips64:
   5066 *mips64r2:
   5067 *mips64r6:
   5068 *vr4100:
   5069 *vr5000:
   5070 {
   5071   do_tne (SD_, RS, RT, instruction_0);
   5072 }
   5073 
   5074 
   5075 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
   5076 "tnei r<RS>, <IMMEDIATE>"
   5077 *mipsII:
   5078 *mipsIII:
   5079 *mipsIV:
   5080 *mipsV:
   5081 *mips32:
   5082 *mips32r2:
   5083 *mips64:
   5084 *mips64r2:
   5085 *vr4100:
   5086 *vr5000:
   5087 {
   5088   do_tnei (SD_, RS, IMMEDIATE, instruction_0);
   5089 }
   5090 
   5091 
   5092 :function:::void:do_xor:int rs, int rt, int rd
   5093 {
   5094   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
   5095   GPR[rd] = GPR[rs] ^ GPR[rt];
   5096   TRACE_ALU_RESULT (GPR[rd]);
   5097 }
   5098 
   5099 000000,5.RS,5.RT,5.RD,00000,100110:SPECIAL:32::XOR
   5100 "xor r<RD>, r<RS>, r<RT>"
   5101 *mipsI:
   5102 *mipsII:
   5103 *mipsIII:
   5104 *mipsIV:
   5105 *mipsV:
   5106 *mips32:
   5107 *mips32r2:
   5108 *mips32r6:
   5109 *mips64:
   5110 *mips64r2:
   5111 *mips64r6:
   5112 *vr4100:
   5113 *vr5000:
   5114 *r3900:
   5115 {
   5116   do_xor (SD_, RS, RT, RD);
   5117 }
   5118 
   5119 
   5120 :function:::void:do_xori:int rs, int rt, uint16_t immediate
   5121 {
   5122   TRACE_ALU_INPUT2 (GPR[rs], immediate);
   5123   GPR[rt] = GPR[rs] ^ immediate;
   5124   TRACE_ALU_RESULT (GPR[rt]);
   5125 }
   5126 
   5127 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
   5128 "xori r<RT>, r<RS>, %#lx<IMMEDIATE>"
   5129 *mipsI:
   5130 *mipsII:
   5131 *mipsIII:
   5132 *mipsIV:
   5133 *mipsV:
   5134 *mips32:
   5135 *mips32r2:
   5136 *mips32r6:
   5137 *mips64:
   5138 *mips64r2:
   5139 *mips64r6:
   5140 *vr4100:
   5141 *vr5000:
   5142 *r3900:
   5143 {
   5144   do_xori (SD_, RS, RT, IMMEDIATE);
   5145 }
   5146 
   5147 
   5148 //
   5149 // MIPS Architecture:
   5150 //
   5151 //        FPU Instruction Set (COP1 & COP1X)
   5152 //
   5153 
   5154 
   5155 :%s::::FMT:int fmt
   5156 {
   5157   switch (fmt)
   5158     {
   5159     case fmt_single: return "s";
   5160     case fmt_double: return "d";
   5161     case fmt_word: return "w";
   5162     case fmt_long: return "l";
   5163     case fmt_ps: return "ps";
   5164     default: return "?";
   5165     }
   5166 }
   5167 
   5168 :%s::::TF:int tf
   5169 {
   5170   if (tf)
   5171     return "t";
   5172   else
   5173     return "f";
   5174 }
   5175 
   5176 :%s::::ND:int nd
   5177 {
   5178   if (nd)
   5179     return "l";
   5180   else
   5181     return "";
   5182 }
   5183 
   5184 :%s::::COND:int cond
   5185 {
   5186   switch (cond)
   5187     {
   5188     case 00: return "f";
   5189     case 01: return "un";
   5190     case 02: return "eq";
   5191     case 03: return "ueq";
   5192     case 04: return "olt";
   5193     case 05: return "ult";
   5194     case 06: return "ole";
   5195     case 07: return "ule";
   5196     case 010: return "sf";
   5197     case 011: return "ngle";
   5198     case 012: return "seq";
   5199     case 013: return "ngl";
   5200     case 014: return "lt";
   5201     case 015: return "nge";
   5202     case 016: return "le";
   5203     case 017: return "ngt";
   5204     default: return "?";
   5205     }
   5206 }
   5207 
   5208 
   5209 // Helpers:
   5210 //
   5211 // Check that the given FPU format is usable, and signal a
   5212 // ReservedInstruction exception if not.
   5213 //
   5214 
   5215 // check_fmt_p checks that the format is single, double, or paired single.
   5216 :function:::void:check_fmt_p:int fmt, instruction_word insn
   5217 *mipsI:
   5218 *mipsII:
   5219 *mipsIII:
   5220 *mipsIV:
   5221 *mips32:
   5222 *mips32r6:
   5223 *mips64r6:
   5224 *vr4100:
   5225 *vr5000:
   5226 *r3900:
   5227 {
   5228   /* None of these ISAs support Paired Single, so just fall back to
   5229      the single/double check.  */
   5230   if ((fmt != fmt_single) && (fmt != fmt_double))
   5231     SignalException (ReservedInstruction, insn);
   5232 }
   5233 
   5234 :function:::void:check_fmt_p:int fmt, instruction_word insn
   5235 *mips32r2:
   5236 *micromips32:
   5237 {
   5238   if ((fmt != fmt_single) && (fmt != fmt_double) && (fmt != fmt_ps))
   5239     SignalException (ReservedInstruction, insn);
   5240 }
   5241 
   5242 :function:::void:check_fmt_p:int fmt, instruction_word insn
   5243 *mipsV:
   5244 *mips64:
   5245 *mips64r2:
   5246 *micromips64:
   5247 {
   5248   if ((fmt != fmt_single) && (fmt != fmt_double)
   5249       && (fmt != fmt_ps || (UserMode && (SR & (status_UX|status_PX)) == 0)))
   5250     SignalException (ReservedInstruction, insn);
   5251 }
   5252 
   5253 
   5254 // Helper:
   5255 //
   5256 // Check that the FPU is currently usable, and signal a CoProcessorUnusable
   5257 // exception if not.
   5258 //
   5259 
   5260 :function:::void:check_fpu:
   5261 *mipsI:
   5262 *mipsII:
   5263 *mipsIII:
   5264 *mipsIV:
   5265 *mipsV:
   5266 *mips32:
   5267 *mips32r2:
   5268 *mips64:
   5269 *mips64r2:
   5270 *vr4100:
   5271 *vr5000:
   5272 *r3900:
   5273 *micromips32:
   5274 *micromips64:
   5275 {
   5276   if (! COP_Usable (1))
   5277     SignalExceptionCoProcessorUnusable (1);
   5278 
   5279   FCSR &= ~(fcsr_NAN2008_mask | fcsr_ABS2008_mask);
   5280   sim_fpu_quiet_nan_inverted = true;
   5281 }
   5282 
   5283 // Helper:
   5284 //
   5285 // Check that the FPU is currently usable, and signal a CoProcessorUnusable
   5286 // exception if not.
   5287 //
   5288 
   5289 :function:::void:check_fpu:
   5290 *mips32r6:
   5291 *mips64r6:
   5292 {
   5293   if (! COP_Usable (1))
   5294     SignalExceptionCoProcessorUnusable (1);
   5295 
   5296   FCSR |= (fcsr_NAN2008_mask | fcsr_ABS2008_mask);
   5297   sim_fpu_quiet_nan_inverted = 0;
   5298   sim_fpu_set_mode (sim_fpu_ieee754_2008);
   5299 }
   5300 
   5301 // Helper:
   5302 //
   5303 // Load a double word FP value using 2 32-bit memory cycles a la MIPS II
   5304 // or MIPS32.  do_load cannot be used instead because it returns an
   5305 // unsigned_word, which is limited to the size of the machine's registers.
   5306 //
   5307 
   5308 :function:::uint64_t:do_load_double:address_word base, address_word offset
   5309 *mipsII:
   5310 *mips32:
   5311 *mips32r2:
   5312 *mips32r6:
   5313 *micromips32:
   5314 {
   5315   int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian);
   5316   address_word vaddr;
   5317   address_word paddr;
   5318   uint64_t memval;
   5319   uint64_t v;
   5320 
   5321   paddr = vaddr = loadstore_ea (SD_, base, offset);
   5322   if ((vaddr & AccessLength_DOUBLEWORD) != 0)
   5323     {
   5324       SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map,
   5325 		       AccessLength_DOUBLEWORD + 1, vaddr, read_transfer,
   5326 		       sim_core_unaligned_signal);
   5327     }
   5328   LoadMemory (&memval, NULL, AccessLength_WORD, paddr, vaddr, isDATA, isREAL);
   5329   v = (uint64_t)memval;
   5330   LoadMemory (&memval, NULL, AccessLength_WORD, paddr + 4, vaddr + 4, isDATA,
   5331 	      isREAL);
   5332   return (bigendian ? ((v << 32) | memval) : (v | (memval << 32)));
   5333 }
   5334 
   5335 
   5336 // Helper:
   5337 //
   5338 // Store a double word FP value using 2 32-bit memory cycles a la MIPS II
   5339 // or MIPS32.  do_load cannot be used instead because it returns an
   5340 // unsigned_word, which is limited to the size of the machine's registers.
   5341 //
   5342 
   5343 :function:::void:do_store_double:address_word base, address_word offset, uint64_t v
   5344 *mipsII:
   5345 *mips32:
   5346 *mips32r2:
   5347 *micromips32:
   5348  *mips32r6:
   5349 {
   5350   int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian);
   5351   address_word vaddr;
   5352   address_word paddr;
   5353   uint64_t memval;
   5354 
   5355   paddr = vaddr = loadstore_ea (SD_, base, offset);
   5356   if ((vaddr & AccessLength_DOUBLEWORD) != 0)
   5357     {
   5358       SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map,
   5359 		       AccessLength_DOUBLEWORD + 1, vaddr, write_transfer,
   5360 		       sim_core_unaligned_signal);
   5361     }
   5362   memval = (bigendian ? (v >> 32) : (v & 0xFFFFFFFF));
   5363   StoreMemory (AccessLength_WORD, memval, 0, paddr, vaddr, isREAL);
   5364   memval = (bigendian ? (v & 0xFFFFFFFF) : (v >> 32));
   5365   StoreMemory (AccessLength_WORD, memval, 0, paddr + 4, vaddr + 4, isREAL);
   5366 }
   5367 
   5368 
   5369 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
   5370 "abs.%s<FMT> f<FD>, f<FS>"
   5371 *mipsI:
   5372 *mipsII:
   5373 *mipsIII:
   5374 *mipsIV:
   5375 *mipsV:
   5376 *mips32:
   5377 *mips32r2:
   5378 *mips32r6:
   5379 *mips64:
   5380 *mips64r2:
   5381 *mips64r6:
   5382 *vr4100:
   5383 *vr5000:
   5384 *r3900:
   5385 {
   5386   do_abs_fmt (SD_, FMT, FD, FS, instruction_0);
   5387 }
   5388 
   5389 
   5390 
   5391 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt
   5392 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
   5393 *mipsI:
   5394 *mipsII:
   5395 *mipsIII:
   5396 *mipsIV:
   5397 *mipsV:
   5398 *mips32:
   5399 *mips32r2:
   5400 *mips32r6:
   5401 *mips64:
   5402 *mips64r2:
   5403 *mips64r6:
   5404 *vr4100:
   5405 *vr5000:
   5406 *r3900:
   5407 {
   5408   do_add_fmt (SD_, FMT, FD, FS, FT, instruction_0);
   5409 }
   5410 
   5411 
   5412 010011,5.RS,5.FT,5.FS,5.FD,011,110:COP1X:32,f::ALNV.PS
   5413 "alnv.ps f<FD>, f<FS>, f<FT>, r<RS>"
   5414 *mipsV:
   5415 *mips32r2:
   5416 *mips64:
   5417 *mips64r2:
   5418 {
   5419   do_alnv_ps (SD_, FD, FS, FT, RS, instruction_0);
   5420 }
   5421 
   5422 
   5423 // BC1F
   5424 // BC1FL
   5425 // BC1T
   5426 // BC1TL
   5427 
   5428 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1a
   5429 "bc1%s<TF>%s<ND> <OFFSET>"
   5430 *mipsI:
   5431 *mipsII:
   5432 *mipsIII:
   5433 {
   5434   check_fpu (SD_);
   5435   TRACE_BRANCH_INPUT (PREVCOC1());
   5436   if (PREVCOC1() == TF)
   5437     {
   5438       address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
   5439       TRACE_BRANCH_RESULT (dest);
   5440       DELAY_SLOT (dest);
   5441     }
   5442   else if (ND)
   5443     {
   5444       TRACE_BRANCH_RESULT (0);
   5445       NULLIFY_NEXT_INSTRUCTION ();
   5446     }
   5447   else
   5448     {
   5449       TRACE_BRANCH_RESULT (NIA);
   5450     }
   5451 }
   5452 
   5453 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1b
   5454 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
   5455 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
   5456 *mipsIV:
   5457 *mipsV:
   5458 *mips32:
   5459 *mips32r2:
   5460 *mips64:
   5461 *mips64r2:
   5462 #*vr4100:
   5463 *vr5000:
   5464 *r3900:
   5465 {
   5466   check_fpu (SD_);
   5467   if (GETFCC(CC) == TF)
   5468     {
   5469       address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
   5470       DELAY_SLOT (dest);
   5471     }
   5472   else if (ND)
   5473     {
   5474       NULLIFY_NEXT_INSTRUCTION ();
   5475     }
   5476 }
   5477 
   5478 
   5479 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,3.0,00,11,4.COND:COP1:32,f::C.cond.fmta
   5480 "c.%s<COND>.%s<FMT> f<FS>, f<FT>"
   5481 *mipsI:
   5482 *mipsII:
   5483 *mipsIII:
   5484 {
   5485   int fmt = FMT;
   5486   check_fpu (SD_);
   5487   Compare (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt, COND, 0);
   5488   TRACE_ALU_RESULT (ValueFCR (31));
   5489 }
   5490 
   5491 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32,f::C.cond.fmtb
   5492 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
   5493 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
   5494 *mipsIV:
   5495 *mipsV:
   5496 *mips32:
   5497 *mips32r2:
   5498 *mips64:
   5499 *mips64r2:
   5500 *vr4100:
   5501 *vr5000:
   5502 *r3900:
   5503 {
   5504   do_c_cond_fmt (SD_, COND, FMT, CC, FS, FT, instruction_0);
   5505 }
   5506 
   5507 
   5508 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001010:COP1:32,f::CEIL.L.fmt
   5509 "ceil.l.%s<FMT> f<FD>, f<FS>"
   5510 *mipsIII:
   5511 *mipsIV:
   5512 *mipsV:
   5513 *mips32r2:
   5514 *mips32r6:
   5515 *mips64:
   5516 *mips64r2:
   5517 *mips64r6:
   5518 *vr4100:
   5519 *vr5000:
   5520 *r3900:
   5521 {
   5522   do_ceil_fmt (SD_, fmt_long, FMT, FD, FS, instruction_0);
   5523 }
   5524 
   5525 
   5526 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001110:COP1:32,f::CEIL.W
   5527 "ceil.w.%s<FMT> f<FD>, f<FS>"
   5528 *mipsII:
   5529 *mipsIII:
   5530 *mipsIV:
   5531 *mipsV:
   5532 *mips32:
   5533 *mips32r2:
   5534 *mips32r6:
   5535 *mips64:
   5536 *mips64r2:
   5537 *mips64r6:
   5538 *vr4100:
   5539 *vr5000:
   5540 *r3900:
   5541 {
   5542   do_ceil_fmt (SD_, fmt_word, FMT, FD, FS, instruction_0);
   5543 }
   5544 
   5545 
   5546 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1a
   5547 "cfc1 r<RT>, f<FS>"
   5548 *mipsI:
   5549 *mipsII:
   5550 *mipsIII:
   5551 {
   5552   check_fpu (SD_);
   5553   if (FS == 0)
   5554     PENDING_FILL (RT, EXTEND32 (FCR0));
   5555   else if (FS == 31)
   5556     PENDING_FILL (RT, EXTEND32 (FCR31));
   5557   /* else NOP */
   5558 }
   5559 
   5560 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1b
   5561 "cfc1 r<RT>, f<FS>"
   5562 *mipsIV:
   5563 *vr4100:
   5564 *vr5000:
   5565 *r3900:
   5566 {
   5567   check_fpu (SD_);
   5568   if (FS == 0 || FS == 31)
   5569     {
   5570       unsigned_word  fcr = ValueFCR (FS);
   5571       TRACE_ALU_INPUT1 (fcr);
   5572       GPR[RT] = fcr;
   5573     }
   5574   /* else NOP */
   5575   TRACE_ALU_RESULT (GPR[RT]);
   5576 }
   5577 
   5578 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1c
   5579 "cfc1 r<RT>, f<FS>"
   5580 *mipsV:
   5581 *mips32:
   5582 *mips32r2:
   5583 *mips32r6:
   5584 *mips64:
   5585 *mips64r2:
   5586 *mips64r6:
   5587 {
   5588   do_cfc1 (SD_, RT, FS);
   5589 }
   5590 
   5591 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1a
   5592 "ctc1 r<RT>, f<FS>"
   5593 *mipsI:
   5594 *mipsII:
   5595 *mipsIII:
   5596 {
   5597   check_fpu (SD_);
   5598   if (FS == 31)
   5599     PENDING_FILL (FCRCS_REGNUM, VL4_8 (GPR[RT]));
   5600   /* else NOP */
   5601 }
   5602 
   5603 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1b
   5604 "ctc1 r<RT>, f<FS>"
   5605 *mipsIV:
   5606 *vr4100:
   5607 *vr5000:
   5608 *r3900:
   5609 {
   5610   check_fpu (SD_);
   5611   TRACE_ALU_INPUT1 (GPR[RT]);
   5612   if (FS == 31)
   5613     StoreFCR (FS, GPR[RT]);
   5614   /* else NOP */
   5615 }
   5616 
   5617 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1c
   5618 "ctc1 r<RT>, f<FS>"
   5619 *mipsV:
   5620 *mips32:
   5621 *mips32r2:
   5622 *mips32r6:
   5623 *mips64:
   5624 *mips64r2:
   5625 *mips64r6:
   5626 {
   5627   do_ctc1 (SD_, RT, FS);
   5628 }
   5629 
   5630 
   5631 //
   5632 // FIXME: Does not correctly differentiate between mips*
   5633 //
   5634 010001,10,3.FMT!1!2!3!6!7,00000,5.FS,5.FD,100001:COP1:32,f::CVT.D.fmt
   5635 "cvt.d.%s<FMT> f<FD>, f<FS>"
   5636 *mipsI:
   5637 *mipsII:
   5638 *mipsIII:
   5639 *mipsIV:
   5640 *mipsV:
   5641 *mips32:
   5642 *mips32r2:
   5643 *mips32r6:
   5644 *mips64:
   5645 *mips64r2:
   5646 *mips64r6:
   5647 *vr4100:
   5648 *vr5000:
   5649 *r3900:
   5650 {
   5651   do_cvt_d_fmt (SD_, FMT, FD, FS, instruction_0);
   5652 }
   5653 
   5654 
   5655 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100101:COP1:32,f::CVT.L.fmt
   5656 "cvt.l.%s<FMT> f<FD>, f<FS>"
   5657 *mipsIII:
   5658 *mipsIV:
   5659 *mipsV:
   5660 *mips32r2:
   5661 *mips32r6:
   5662 *mips64:
   5663 *mips64r2:
   5664 *mips64r6:
   5665 *vr4100:
   5666 *vr5000:
   5667 *r3900:
   5668 {
   5669   do_cvt_l_fmt (SD_, FMT, FD, FS, instruction_0);
   5670 }
   5671 
   5672 
   5673 010001,10,000,5.FT,5.FS,5.FD,100110:COP1:32,f::CVT.PS.S
   5674 "cvt.ps.s f<FD>, f<FS>, f<FT>"
   5675 *mipsV:
   5676 *mips32r2:
   5677 *mips64:
   5678 *mips64r2:
   5679 {
   5680   do_cvt_ps_s (SD_, FD, FS, FT, instruction_0);
   5681 }
   5682 
   5683 
   5684 //
   5685 // FIXME: Does not correctly differentiate between mips*
   5686 //
   5687 010001,10,3.FMT!0!2!3!6!7,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.fmt
   5688 "cvt.s.%s<FMT> f<FD>, f<FS>"
   5689 *mipsI:
   5690 *mipsII:
   5691 *mipsIII:
   5692 *mipsIV:
   5693 *mipsV:
   5694 *mips32:
   5695 *mips32r2:
   5696 *mips32r6:
   5697 *mips64:
   5698 *mips64r2:
   5699 *mips64r6:
   5700 *vr4100:
   5701 *vr5000:
   5702 *r3900:
   5703 {
   5704   do_cvt_s_fmt (SD_, FMT, FD, FS, instruction_0);
   5705 }
   5706 
   5707 
   5708 010001,10,110,00000,5.FS,5.FD,101000:COP1:32,f::CVT.S.PL
   5709 "cvt.s.pl f<FD>, f<FS>"
   5710 *mipsV:
   5711 *mips32r2:
   5712 *mips64:
   5713 *mips64r2:
   5714 {
   5715   do_cvt_s_pl (SD_, FD, FS, instruction_0);
   5716 }
   5717 
   5718 
   5719 010001,10,110,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.PU
   5720 "cvt.s.pu f<FD>, f<FS>"
   5721 *mipsV:
   5722 *mips32r2:
   5723 *mips64:
   5724 *mips64r2:
   5725 {
   5726   do_cvt_s_pu (SD_, FD, FS, instruction_0);
   5727 }
   5728 
   5729 
   5730 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100100:COP1:32,f::CVT.W.fmt
   5731 "cvt.w.%s<FMT> f<FD>, f<FS>"
   5732 *mipsI:
   5733 *mipsII:
   5734 *mipsIII:
   5735 *mipsIV:
   5736 *mipsV:
   5737 *mips32:
   5738 *mips32r2:
   5739 *mips32r6:
   5740 *mips64:
   5741 *mips64r2:
   5742 *mips64r6:
   5743 *vr4100:
   5744 *vr5000:
   5745 *r3900:
   5746 {
   5747   do_cvt_w_fmt (SD_, FMT, FD, FS, instruction_0);
   5748 }
   5749 
   5750 
   5751 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,5.FD,000011:COP1:32,f::DIV.fmt
   5752 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
   5753 *mipsI:
   5754 *mipsII:
   5755 *mipsIII:
   5756 *mipsIV:
   5757 *mipsV:
   5758 *mips32:
   5759 *mips32r2:
   5760 *mips32r6:
   5761 *mips64:
   5762 *mips64r2:
   5763 *mips64r6:
   5764 *vr4100:
   5765 *vr5000:
   5766 *r3900:
   5767 {
   5768   do_div_fmt (SD_, FMT, FD, FS, FT, instruction_0);
   5769 }
   5770 
   5771 
   5772 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1a
   5773 "dmfc1 r<RT>, f<FS>"
   5774 *mipsIII:
   5775 {
   5776   uint64_t v;
   5777   check_fpu (SD_);
   5778   check_u64 (SD_, instruction_0);
   5779   if (SizeFGR () == 64)
   5780     v = FGR[FS];
   5781   else if ((FS & 0x1) == 0)
   5782     v = SET64HI (FGR[FS+1]) | FGR[FS];
   5783   else
   5784     Unpredictable ();
   5785   PENDING_FILL (RT, v);
   5786   TRACE_ALU_RESULT (v);
   5787 }
   5788 
   5789 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1b
   5790 "dmfc1 r<RT>, f<FS>"
   5791 *mipsIV:
   5792 *mipsV:
   5793 *mips64:
   5794 *mips64r2:
   5795 *mips64r6:
   5796 *vr4100:
   5797 *vr5000:
   5798 *r3900:
   5799 {
   5800   check_fpu (SD_);
   5801   check_u64 (SD_, instruction_0);
   5802   do_dmfc1b (SD_, RT, FS);
   5803 }
   5804 
   5805 
   5806 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1a
   5807 "dmtc1 r<RT>, f<FS>"
   5808 *mipsIII:
   5809 {
   5810   uint64_t v;
   5811   check_fpu (SD_);
   5812   check_u64 (SD_, instruction_0);
   5813   if (SizeFGR () == 64)
   5814     PENDING_FILL ((FS + FGR_BASE), GPR[RT]);
   5815   else if ((FS & 0x1) == 0)
   5816     {
   5817       PENDING_FILL (((FS + 1) + FGR_BASE), VH4_8 (GPR[RT]));
   5818       PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT]));
   5819     }
   5820   else
   5821     Unpredictable ();
   5822   TRACE_FP_RESULT (GPR[RT]);
   5823 }
   5824 
   5825 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1b
   5826 "dmtc1 r<RT>, f<FS>"
   5827 *mipsIV:
   5828 *mipsV:
   5829 *mips64:
   5830 *mips64r2:
   5831 *mips64r6:
   5832 *vr4100:
   5833 *vr5000:
   5834 *r3900:
   5835 {
   5836   check_fpu (SD_);
   5837   check_u64 (SD_, instruction_0);
   5838   do_dmtc1b (SD_, RT, FS);
   5839 }
   5840 
   5841 
   5842 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001011:COP1:32,f::FLOOR.L.fmt
   5843 "floor.l.%s<FMT> f<FD>, f<FS>"
   5844 *mipsIII:
   5845 *mipsIV:
   5846 *mipsV:
   5847 *mips32r2:
   5848 *mips32r6:
   5849 *mips64:
   5850 *mips64r2:
   5851 *mips64r6:
   5852 *vr4100:
   5853 *vr5000:
   5854 *r3900:
   5855 {
   5856   do_floor_fmt (SD_, fmt_long, FMT, FD, FS);
   5857 }
   5858 
   5859 
   5860 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001111:COP1:32,f::FLOOR.W.fmt
   5861 "floor.w.%s<FMT> f<FD>, f<FS>"
   5862 *mipsII:
   5863 *mipsIII:
   5864 *mipsIV:
   5865 *mipsV:
   5866 *mips32:
   5867 *mips32r2:
   5868 *mips32r6:
   5869 *mips64:
   5870 *mips64r2:
   5871 *mips64r6:
   5872 *vr4100:
   5873 *vr5000:
   5874 *r3900:
   5875 {
   5876   do_floor_fmt (SD_, fmt_word, FMT, FD, FS);
   5877 }
   5878 
   5879 
   5880 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1a
   5881 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
   5882 *mipsII:
   5883 *mips32:
   5884 *mips32r2:
   5885 *mips32r6:
   5886 {
   5887   check_fpu (SD_);
   5888   COP_LD (1, FT, do_load_double (SD_, GPR[BASE], EXTEND16 (OFFSET)));
   5889 }
   5890 
   5891 
   5892 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1b
   5893 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
   5894 *mipsIII:
   5895 *mipsIV:
   5896 *mipsV:
   5897 *mips64:
   5898 *mips64r2:
   5899 *mips64r6:
   5900 *vr4100:
   5901 *vr5000:
   5902 *r3900:
   5903 {
   5904   check_fpu (SD_);
   5905   COP_LD (1, FT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
   5906 }
   5907 
   5908 
   5909 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:32,f::LDXC1
   5910 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
   5911 *mips32r2:
   5912 {
   5913   check_fpu (SD_);
   5914   COP_LD (1, FD, do_load_double (SD_, GPR[BASE], GPR[INDEX]));
   5915 }
   5916 
   5917 
   5918 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64,f::LDXC1
   5919 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
   5920 *mipsIV:
   5921 *mipsV:
   5922 *mips64:
   5923 *mips64r2:
   5924 *vr5000:
   5925 {
   5926   check_fpu (SD_);
   5927   check_u64 (SD_, instruction_0);
   5928   COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX]));
   5929 }
   5930 
   5931 
   5932 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:32,f::LUXC1
   5933 "luxc1 f<FD>, r<INDEX>(r<BASE>)"
   5934 *mips32r2:
   5935 {
   5936   do_luxc1_32 (SD_, FD, INDEX, BASE);
   5937 }
   5938 
   5939 
   5940 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:64,f::LUXC1
   5941 "luxc1 f<FD>, r<INDEX>(r<BASE>)"
   5942 *mipsV:
   5943 *mips64:
   5944 *mips64r2:
   5945 {
   5946   check_fpu (SD_);
   5947   check_u64 (SD_, instruction_0);
   5948   do_luxc1_64 (SD_, FD, INDEX, BASE);
   5949 }
   5950 
   5951 
   5952 110001,5.BASE,5.FT,16.OFFSET:COP1:32,f::LWC1
   5953 "lwc1 f<FT>, <OFFSET>(r<BASE>)"
   5954 *mipsI:
   5955 *mipsII:
   5956 *mipsIII:
   5957 *mipsIV:
   5958 *mipsV:
   5959 *mips32:
   5960 *mips32r2:
   5961 *mips32r6:
   5962 *mips64:
   5963 *mips64r2:
   5964 *mips64r6:
   5965 *vr4100:
   5966 *vr5000:
   5967 *r3900:
   5968 {
   5969   do_lwc1 (SD_, FT, OFFSET, BASE);
   5970 }
   5971 
   5972 
   5973 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32,f::LWXC1
   5974 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
   5975 *mipsIV:
   5976 *mipsV:
   5977 *mips32r2:
   5978 *mips64:
   5979 *mips64r2:
   5980 *vr5000:
   5981 {
   5982   do_lwxc1 (SD_, FD, INDEX, BASE, instruction_0);
   5983 }
   5984 
   5985 
   5986 
   5987 010011,5.FR,5.FT,5.FS,5.FD,100,3.FMT!2!3!4!5!7:COP1X:32,f::MADD.fmt
   5988 "madd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
   5989 *mipsIV:
   5990 *mipsV:
   5991 *mips32r2:
   5992 *mips64:
   5993 *mips64r2:
   5994 *vr5000:
   5995 {
   5996   do_madd_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0);
   5997 }
   5998 
   5999 
   6000 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1a
   6001 "mfc1 r<RT>, f<FS>"
   6002 *mipsI:
   6003 *mipsII:
   6004 *mipsIII:
   6005 {
   6006   uint64_t v;
   6007   check_fpu (SD_);
   6008   v = EXTEND32 (FGR[FS]);
   6009   PENDING_FILL (RT, v);
   6010   TRACE_ALU_RESULT (v);
   6011 }
   6012 
   6013 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1b
   6014 "mfc1 r<RT>, f<FS>"
   6015 *mipsIV:
   6016 *mipsV:
   6017 *mips32:
   6018 *mips32r2:
   6019 *mips32r6:
   6020 *mips64:
   6021 *mips64r2:
   6022 *mips64r6:
   6023 *vr4100:
   6024 *vr5000:
   6025 *r3900:
   6026 {
   6027   do_mfc1b (SD_, RT, FS);
   6028 }
   6029 
   6030 
   6031 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000110:COP1:32,f::MOV.fmt
   6032 "mov.%s<FMT> f<FD>, f<FS>"
   6033 *mipsI:
   6034 *mipsII:
   6035 *mipsIII:
   6036 *mipsIV:
   6037 *mipsV:
   6038 *mips32:
   6039 *mips32r2:
   6040 *mips32r6:
   6041 *mips64:
   6042 *mips64r2:
   6043 *mips64r6:
   6044 *vr4100:
   6045 *vr5000:
   6046 *r3900:
   6047 {
   6048   do_mov_fmt (SD_, FMT, FD, FS, instruction_0);
   6049 }
   6050 
   6051 
   6052 // MOVF
   6053 // MOVT
   6054 000000,5.RS,3.CC,0,1.TF,5.RD,00000,000001:SPECIAL:32,f::MOVtf
   6055 "mov%s<TF> r<RD>, r<RS>, <CC>"
   6056 *mipsIV:
   6057 *mipsV:
   6058 *mips32:
   6059 *mips32r2:
   6060 *mips64:
   6061 *mips64r2:
   6062 *vr5000:
   6063 {
   6064   do_movtf (SD_, TF, RD, RS, CC);
   6065 }
   6066 
   6067 
   6068 // MOVF.fmt
   6069 // MOVT.fmt
   6070 010001,10,3.FMT!2!3!4!5!7,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32,f::MOVtf.fmt
   6071 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
   6072 *mipsIV:
   6073 *mipsV:
   6074 *mips32:
   6075 *mips32r2:
   6076 *mips64:
   6077 *mips64r2:
   6078 *vr5000:
   6079 {
   6080   do_movtf_fmt (SD_, TF, FMT, FD, FS, CC);
   6081 }
   6082 
   6083 
   6084 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010011:COP1:32,f::MOVN.fmt
   6085 "movn.%s<FMT> f<FD>, f<FS>, r<RT>"
   6086 *mipsIV:
   6087 *mipsV:
   6088 *mips32:
   6089 *mips32r2:
   6090 *mips64:
   6091 *mips64r2:
   6092 *vr5000:
   6093 {
   6094   do_movn_fmt (SD_, FMT, FD, FS, RT);
   6095 }
   6096 
   6097 
   6098 // MOVT see MOVtf
   6099 
   6100 
   6101 // MOVT.fmt see MOVtf.fmt
   6102 
   6103 
   6104 
   6105 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010010:COP1:32,f::MOVZ.fmt
   6106 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
   6107 *mipsIV:
   6108 *mipsV:
   6109 *mips32:
   6110 *mips32r2:
   6111 *mips64:
   6112 *mips64r2:
   6113 *vr5000:
   6114 {
   6115   do_movz_fmt (SD_, FMT, FD, FS, RT);
   6116 }
   6117 
   6118 
   6119 010011,5.FR,5.FT,5.FS,5.FD,101,3.FMT!2!3!4!5!7:COP1X:32,f::MSUB.fmt
   6120 "msub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
   6121 *mipsIV:
   6122 *mipsV:
   6123 *mips32r2:
   6124 *mips64:
   6125 *mips64r2:
   6126 *vr5000:
   6127 {
   6128   do_msub_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0);
   6129 }
   6130 
   6131 
   6132 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1a
   6133 "mtc1 r<RT>, f<FS>"
   6134 *mipsI:
   6135 *mipsII:
   6136 *mipsIII:
   6137 {
   6138   check_fpu (SD_);
   6139   if (SizeFGR () == 64)
   6140     PENDING_FILL ((FS + FGR_BASE), (SET64HI (0xDEADC0DE) | VL4_8 (GPR[RT])));
   6141   else
   6142     PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT]));
   6143   TRACE_FP_RESULT (GPR[RT]);
   6144 }
   6145 
   6146 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1b
   6147 "mtc1 r<RT>, f<FS>"
   6148 *mipsIV:
   6149 *mipsV:
   6150 *mips32:
   6151 *mips32r2:
   6152 *mips32r6:
   6153 *mips64:
   6154 *mips64r2:
   6155 *mips64r6:
   6156 *vr4100:
   6157 *vr5000:
   6158 *r3900:
   6159 {
   6160   do_mtc1b (SD_, RT, FS);
   6161 }
   6162 
   6163 
   6164 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000010:COP1:32,f::MUL.fmt
   6165 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
   6166 *mipsI:
   6167 *mipsII:
   6168 *mipsIII:
   6169 *mipsIV:
   6170 *mipsV:
   6171 *mips32:
   6172 *mips32r2:
   6173 *mips32r6:
   6174 *mips64:
   6175 *mips64r2:
   6176 *mips64r6:
   6177 *vr4100:
   6178 *vr5000:
   6179 *r3900:
   6180 {
   6181   do_mul_fmt (SD_, FMT, FD, FS, FT, instruction_0);
   6182 }
   6183 
   6184 
   6185 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000111:COP1:32,f::NEG.fmt
   6186 "neg.%s<FMT> f<FD>, f<FS>"
   6187 *mipsI:
   6188 *mipsII:
   6189 *mipsIII:
   6190 *mipsIV:
   6191 *mipsV:
   6192 *mips32:
   6193 *mips32r2:
   6194 *mips32r6:
   6195 *mips64:
   6196 *mips64r2:
   6197 *mips64r6:
   6198 *vr4100:
   6199 *vr5000:
   6200 *r3900:
   6201 {
   6202   do_neg_fmt (SD_, FMT, FD, FS, instruction_0);
   6203 }
   6204 
   6205 
   6206 010011,5.FR,5.FT,5.FS,5.FD,110,3.FMT!2!3!4!5!7:COP1X:32,f::NMADD.fmt
   6207 "nmadd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
   6208 *mipsIV:
   6209 *mipsV:
   6210 *mips32r2:
   6211 *mips64:
   6212 *mips64r2:
   6213 *vr5000:
   6214 {
   6215   do_nmadd_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0);
   6216 }
   6217 
   6218 
   6219 010011,5.FR,5.FT,5.FS,5.FD,111,3.FMT!2!3!4!5!7:COP1X:32,f::NMSUB.fmt
   6220 "nmsub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
   6221 *mipsIV:
   6222 *mipsV:
   6223 *mips32r2:
   6224 *mips64:
   6225 *mips64r2:
   6226 *vr5000:
   6227 {
   6228   do_nmsub_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0);
   6229 }
   6230 
   6231 
   6232 010001,10,110,5.FT,5.FS,5.FD,101100:COP1:32,f::PLL.PS
   6233 "pll.ps f<FD>, f<FS>, f<FT>"
   6234 *mipsV:
   6235 *mips32r2:
   6236 *mips64:
   6237 *mips64r2:
   6238 {
   6239   do_pll_ps (SD_, FD, FS, FT, instruction_0);
   6240 }
   6241 
   6242 
   6243 010001,10,110,5.FT,5.FS,5.FD,101101:COP1:32,f::PLU.PS
   6244 "plu.ps f<FD>, f<FS>, f<FT>"
   6245 *mipsV:
   6246 *mips32r2:
   6247 *mips64:
   6248 *mips64r2:
   6249 {
   6250   do_plu_ps (SD_, FD, FS, FT, instruction_0);
   6251 }
   6252 
   6253 
   6254 010011,5.BASE,5.INDEX,5.HINT,00000,001111:COP1X:32::PREFX
   6255 "prefx <HINT>, r<INDEX>(r<BASE>)"
   6256 *mipsIV:
   6257 *mipsV:
   6258 *mips32r2:
   6259 *mips64:
   6260 *mips64r2:
   6261 *vr5000:
   6262 {
   6263   do_prefx (SD_, HINT, INDEX, BASE);
   6264 }
   6265 
   6266 
   6267 010001,10,110,5.FT,5.FS,5.FD,101110:COP1:32,f::PUL.PS
   6268 "pul.ps f<FD>, f<FS>, f<FT>"
   6269 *mipsV:
   6270 *mips32r2:
   6271 *mips64:
   6272 *mips64r2:
   6273 {
   6274   do_pul_ps (SD_, FD, FS, FT, instruction_0);
   6275 }
   6276 
   6277 
   6278 010001,10,110,5.FT,5.FS,5.FD,101111:COP1:32,f::PUU.PS
   6279 "puu.ps f<FD>, f<FS>, f<FT>"
   6280 *mipsV:
   6281 *mips32r2:
   6282 *mips64:
   6283 *mips64r2:
   6284 {
   6285   do_puu_ps (SD_, FD, FS, FT, instruction_0);
   6286 }
   6287 
   6288 
   6289 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010101:COP1:32,f::RECIP.fmt
   6290 "recip.%s<FMT> f<FD>, f<FS>"
   6291 *mipsIV:
   6292 *mipsV:
   6293 *mips32r2:
   6294 *mips32r6:
   6295 *mips64:
   6296 *mips64r2:
   6297 *mips64r6:
   6298 *vr5000:
   6299 {
   6300   do_recip_fmt (SD_, FMT, FD, FS);
   6301 }
   6302 
   6303 
   6304 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001000:COP1:32,f::ROUND.L.fmt
   6305 "round.l.%s<FMT> f<FD>, f<FS>"
   6306 *mipsIII:
   6307 *mipsIV:
   6308 *mipsV:
   6309 *mips32r2:
   6310 *mips32r6:
   6311 *mips64:
   6312 *mips64r2:
   6313 *mips64r6:
   6314 *vr4100:
   6315 *vr5000:
   6316 *r3900:
   6317 {
   6318   do_round_fmt (SD_, fmt_long, FMT, FD, FS);
   6319 }
   6320 
   6321 
   6322 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001100:COP1:32,f::ROUND.W.fmt
   6323 "round.w.%s<FMT> f<FD>, f<FS>"
   6324 *mipsII:
   6325 *mipsIII:
   6326 *mipsIV:
   6327 *mipsV:
   6328 *mips32:
   6329 *mips32r2:
   6330 *mips32r6:
   6331 *mips64:
   6332 *mips64r2:
   6333 *mips64r6:
   6334 *vr4100:
   6335 *vr5000:
   6336 *r3900:
   6337 {
   6338   do_round_fmt (SD_, fmt_word, FMT, FD, FS);
   6339 }
   6340 
   6341 
   6342 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010110:COP1:32,f::RSQRT.fmt
   6343 "rsqrt.%s<FMT> f<FD>, f<FS>"
   6344 *mipsIV:
   6345 *mipsV:
   6346 *mips32r2:
   6347 *mips32r6:
   6348 *mips64:
   6349 *mips64r2:
   6350 *mips64r6:
   6351 *vr5000:
   6352 {
   6353   do_rsqrt_fmt (SD_, FMT, FD, FS);
   6354 }
   6355 
   6356 
   6357 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1a
   6358 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
   6359 *mipsII:
   6360 *mips32:
   6361 *mips32r2:
   6362 *mips32r6:
   6363 {
   6364   do_sdc1 (SD_, FT, OFFSET, BASE);
   6365 }
   6366 
   6367 
   6368 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1b
   6369 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
   6370 *mipsIII:
   6371 *mipsIV:
   6372 *mipsV:
   6373 *mips64:
   6374 *mips64r2:
   6375 *mips64r6:
   6376 *vr4100:
   6377 *vr5000:
   6378 *r3900:
   6379 {
   6380   check_fpu (SD_);
   6381   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (1, FT));
   6382 }
   6383 
   6384 
   6385 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:32,f::SDXC1
   6386 "sdxc1 f<FS>, r<INDEX>(r<BASE>)"
   6387 *mips32r2:
   6388 {
   6389   check_fpu (SD_);
   6390   do_store_double (SD_, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
   6391 }
   6392 
   6393 
   6394 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:64,f::SDXC1
   6395 "sdxc1 f<FS>, r<INDEX>(r<BASE>)"
   6396 *mipsIV:
   6397 *mipsV:
   6398 *mips64:
   6399 *mips64r2:
   6400 *vr5000:
   6401 {
   6402   check_fpu (SD_);
   6403   check_u64 (SD_, instruction_0);
   6404   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
   6405 }
   6406 
   6407 
   6408 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:32,f::SUXC1
   6409 "suxc1 f<FS>, r<INDEX>(r<BASE>)"
   6410 *mips32r2:
   6411 {
   6412   do_suxc1_32 (SD_, FS, INDEX, BASE);
   6413 }
   6414 
   6415 
   6416 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:64,f::SUXC1
   6417 "suxc1 f<FS>, r<INDEX>(r<BASE>)"
   6418 *mipsV:
   6419 *mips64:
   6420 *mips64r2:
   6421 {
   6422   check_fpu (SD_);
   6423   check_u64 (SD_, instruction_0);
   6424   do_suxc1_64 (SD_, FS, INDEX, BASE);
   6425 }
   6426 
   6427 
   6428 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,000100:COP1:32,f::SQRT.fmt
   6429 "sqrt.%s<FMT> f<FD>, f<FS>"
   6430 *mipsII:
   6431 *mipsIII:
   6432 *mipsIV:
   6433 *mipsV:
   6434 *mips32:
   6435 *mips32r2:
   6436 *mips32r6:
   6437 *mips64:
   6438 *mips64r2:
   6439 *mips64r6:
   6440 *vr4100:
   6441 *vr5000:
   6442 *r3900:
   6443 {
   6444   do_sqrt_fmt (SD_, FMT, FD, FS);
   6445 }
   6446 
   6447 
   6448 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000001:COP1:32,f::SUB.fmt
   6449 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
   6450 *mipsI:
   6451 *mipsII:
   6452 *mipsIII:
   6453 *mipsIV:
   6454 *mipsV:
   6455 *mips32:
   6456 *mips32r2:
   6457 *mips32r6:
   6458 *mips64:
   6459 *mips64r2:
   6460 *mips64r6:
   6461 *vr4100:
   6462 *vr5000:
   6463 *r3900:
   6464 {
   6465   do_sub_fmt (SD_, FMT, FD, FS, FT, instruction_0);
   6466 }
   6467 
   6468 
   6469 
   6470 111001,5.BASE,5.FT,16.OFFSET:COP1:32,f::SWC1
   6471 "swc1 f<FT>, <OFFSET>(r<BASE>)"
   6472 *mipsI:
   6473 *mipsII:
   6474 *mipsIII:
   6475 *mipsIV:
   6476 *mipsV:
   6477 *mips32:
   6478 *mips32r2:
   6479 *mips32r6:
   6480 *mips64:
   6481 *mips64r2:
   6482 *mips64r6:
   6483 *vr4100:
   6484 *vr5000:
   6485 *r3900:
   6486 {
   6487   do_swc1 (SD_, FT, OFFSET, BASE, instruction_0);
   6488 }
   6489 
   6490 
   6491 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32,f::SWXC1
   6492 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
   6493 *mipsIV:
   6494 *mipsV:
   6495 *mips32r2:
   6496 *mips64:
   6497 *mips64r2:
   6498 *vr5000:
   6499 {
   6500   do_swxc1 (SD_, FS, INDEX, BASE, instruction_0);
   6501 }
   6502 
   6503 
   6504 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001001:COP1:32,f::TRUNC.L.fmt
   6505 "trunc.l.%s<FMT> f<FD>, f<FS>"
   6506 *mipsIII:
   6507 *mipsIV:
   6508 *mipsV:
   6509 *mips32r2:
   6510 *mips32r6:
   6511 *mips64:
   6512 *mips64r2:
   6513 *mips64r6:
   6514 *vr4100:
   6515 *vr5000:
   6516 *r3900:
   6517 {
   6518   do_trunc_fmt (SD_, fmt_long, FMT, FD, FS);
   6519 }
   6520 
   6521 
   6522 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001101:COP1:32,f::TRUNC.W
   6523 "trunc.w.%s<FMT> f<FD>, f<FS>"
   6524 *mipsII:
   6525 *mipsIII:
   6526 *mipsIV:
   6527 *mipsV:
   6528 *mips32:
   6529 *mips32r2:
   6530 *mips32r6:
   6531 *mips64:
   6532 *mips64r2:
   6533 *mips64r6:
   6534 *vr4100:
   6535 *vr5000:
   6536 *r3900:
   6537 {
   6538   do_trunc_fmt (SD_, fmt_word, FMT, FD, FS);
   6539 }
   6540 
   6541 
   6542 //
   6543 // MIPS Architecture:
   6544 //
   6545 //        System Control Instruction Set (COP0)
   6546 //
   6547 
   6548 
   6549 010000,01000,00000,16.OFFSET:COP0:32::BC0F
   6550 "bc0f <OFFSET>"
   6551 *mipsI:
   6552 *mipsII:
   6553 *mipsIII:
   6554 *mipsIV:
   6555 *mipsV:
   6556 *mips32:
   6557 *mips32r2:
   6558 *mips32r6:
   6559 *mips64:
   6560 *mips64r2:
   6561 *mips64r6:
   6562 *vr4100:
   6563 *vr5000:
   6564 
   6565 010000,01000,00000,16.OFFSET:COP0:32::BC0F
   6566 "bc0f <OFFSET>"
   6567 // stub needed for eCos as tx39 hardware bug workaround
   6568 *r3900:
   6569 {
   6570   /* do nothing */
   6571 }
   6572 
   6573 
   6574 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
   6575 "bc0fl <OFFSET>"
   6576 *mipsI:
   6577 *mipsII:
   6578 *mipsIII:
   6579 *mipsIV:
   6580 *mipsV:
   6581 *mips32:
   6582 *mips32r2:
   6583 *mips32r6:
   6584 *mips64:
   6585 *mips64r2:
   6586 *mips64r6:
   6587 *vr4100:
   6588 *vr5000:
   6589 
   6590 
   6591 010000,01000,00001,16.OFFSET:COP0:32::BC0T
   6592 "bc0t <OFFSET>"
   6593 *mipsI:
   6594 *mipsII:
   6595 *mipsIII:
   6596 *mipsIV:
   6597 *mipsV:
   6598 *mips32:
   6599 *mips32r2:
   6600 *mips32r6:
   6601 *mips64:
   6602 *mips64r2:
   6603 *mips64r6:
   6604 *vr4100:
   6605 
   6606 
   6607 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
   6608 "bc0tl <OFFSET>"
   6609 *mipsI:
   6610 *mipsII:
   6611 *mipsIII:
   6612 *mipsIV:
   6613 *mipsV:
   6614 *mips32:
   6615 *mips32r2:
   6616 *mips32r6:
   6617 *mips64:
   6618 *mips64r2:
   6619 *mips64r6:
   6620 *vr4100:
   6621 *vr5000:
   6622 
   6623 :function:::void:do_cache:int op, int rbase, int roffset, address_word instruction_0
   6624 {
   6625   address_word base = GPR[rbase];
   6626   address_word offset = EXTEND16 (roffset);
   6627   {
   6628     address_word vaddr = loadstore_ea (SD_, base, offset);
   6629     address_word paddr = vaddr;
   6630     CacheOp(op, vaddr, paddr, instruction_0);
   6631   }
   6632 }
   6633 
   6634 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
   6635 "cache <OP>, <OFFSET>(r<BASE>)"
   6636 *mipsIII:
   6637 *mipsIV:
   6638 *mipsV:
   6639 *mips32:
   6640 *mips32r2:
   6641 *mips64:
   6642 *mips64r2:
   6643 *vr4100:
   6644 *vr5000:
   6645 *r3900:
   6646 {
   6647   do_cache (SD_, OP, BASE, OFFSET, instruction_0);
   6648 }
   6649 
   6650 
   6651 010000,00001,5.RT,5.RD,00000000,3.SEL:COP0:64::DMFC0
   6652 "dmfc0 r<RT>, r<RD>"
   6653 *mipsIII:
   6654 *mipsIV:
   6655 *mipsV:
   6656 *mips64:
   6657 *mips64r2:
   6658 *mips64r6:
   6659 {
   6660   check_u64 (SD_, instruction_0);
   6661   DecodeCoproc (instruction_0, 0, cp0_dmfc0, RT, RD, SEL);
   6662 }
   6663 
   6664 
   6665 010000,00101,5.RT,5.RD,00000000,3.SEL:COP0:64::DMTC0
   6666 "dmtc0 r<RT>, r<RD>"
   6667 *mipsIII:
   6668 *mipsIV:
   6669 *mipsV:
   6670 *mips64:
   6671 *mips64r2:
   6672 *mips64r6:
   6673 {
   6674   check_u64 (SD_, instruction_0);
   6675   DecodeCoproc (instruction_0, 0, cp0_dmtc0, RT, RD, SEL);
   6676 }
   6677 
   6678 
   6679 010000,1,0000000000000000000,011000:COP0:32::ERET
   6680 "eret"
   6681 *mipsIII:
   6682 *mipsIV:
   6683 *mipsV:
   6684 *mips32:
   6685 *mips32r2:
   6686 *mips32r6:
   6687 *mips64:
   6688 *mips64r2:
   6689 *mips64r6:
   6690 *vr4100:
   6691 *vr5000:
   6692 {
   6693   if (SR & status_ERL)
   6694     {
   6695       /* Oops, not yet available */
   6696       sim_io_printf (SD, "Warning: ERET when SR[ERL] set not supported");
   6697       NIA = EPC;
   6698       SR &= ~status_ERL;
   6699     }
   6700   else
   6701     {
   6702       NIA = EPC;
   6703       SR &= ~status_EXL;
   6704     }
   6705 }
   6706 
   6707 
   6708 010000,00000,5.RT,5.RD,00000000,3.SEL:COP0:32::MFC0
   6709 "mfc0 r<RT>, r<RD> # <SEL>"
   6710 *mipsI:
   6711 *mipsII:
   6712 *mipsIII:
   6713 *mipsIV:
   6714 *mipsV:
   6715 *mips32:
   6716 *mips32r2:
   6717 *mips32r6:
   6718 *mips64:
   6719 *mips64r2:
   6720 *mips64r6:
   6721 *vr4100:
   6722 *vr5000:
   6723 *r3900:
   6724 {
   6725   TRACE_ALU_INPUT0 ();
   6726   DecodeCoproc (instruction_0, 0, cp0_mfc0, RT, RD, SEL);
   6727   TRACE_ALU_RESULT (GPR[RT]);
   6728 }
   6729 
   6730 010000,00100,5.RT,5.RD,00000000,3.SEL:COP0:32::MTC0
   6731 "mtc0 r<RT>, r<RD> # <SEL>"
   6732 *mipsI:
   6733 *mipsII:
   6734 *mipsIII:
   6735 *mipsIV:
   6736 *mipsV:
   6737 *mips32:
   6738 *mips32r2:
   6739 *mips32r6:
   6740 *mips64:
   6741 *mips64r2:
   6742 *mips64r6:
   6743 *vr4100:
   6744 *vr5000:
   6745 *r3900:
   6746 {
   6747   DecodeCoproc (instruction_0, 0, cp0_mtc0, RT, RD, SEL);
   6748 }
   6749 
   6750 
   6751 010000,1,0000000000000000000,010000:COP0:32::RFE
   6752 "rfe"
   6753 *mipsI:
   6754 *mipsII:
   6755 *mipsIII:
   6756 *mipsIV:
   6757 *mipsV:
   6758 *vr4100:
   6759 *vr5000:
   6760 *r3900:
   6761 {
   6762   DecodeCoproc (instruction_0, 0, cp0_rfe, 0, 0, 0x10);
   6763 }
   6764 
   6765 
   6766 0100,ZZ!0!1!3,5.COP_FUN0!8,5.COP_FUN1,16.COP_FUN2:NORMAL:32::COPz
   6767 "cop<ZZ> <COP_FUN0><COP_FUN1><COP_FUN2>"
   6768 *mipsI:
   6769 *mipsII:
   6770 *mipsIII:
   6771 *mipsIV:
   6772 *mipsV:
   6773 *mips32:
   6774 *mips32r2:
   6775 *mips32r6:
   6776 *mips64:
   6777 *mips64r2:
   6778 *mips64r6:
   6779 *vr4100:
   6780 *r3900:
   6781 {
   6782   DecodeCoproc (instruction_0, 2, 0, 0, 0, 0);
   6783 }
   6784 
   6785 
   6786 
   6787 010000,1,0000000000000000000,001000:COP0:32::TLBP
   6788 "tlbp"
   6789 *mipsI:
   6790 *mipsII:
   6791 *mipsIII:
   6792 *mipsIV:
   6793 *mipsV:
   6794 *mips32:
   6795 *mips32r2:
   6796 *mips32r6:
   6797 *mips64:
   6798 *mips64r2:
   6799 *mips64r6:
   6800 *vr4100:
   6801 *vr5000:
   6802 
   6803 
   6804 010000,1,0000000000000000000,000001:COP0:32::TLBR
   6805 "tlbr"
   6806 *mipsI:
   6807 *mipsII:
   6808 *mipsIII:
   6809 *mipsIV:
   6810 *mipsV:
   6811 *mips32:
   6812 *mips32r2:
   6813 *mips32r6:
   6814 *mips64:
   6815 *mips64r2:
   6816 *mips64r6:
   6817 *vr4100:
   6818 *vr5000:
   6819 
   6820 
   6821 010000,1,0000000000000000000,000010:COP0:32::TLBWI
   6822 "tlbwi"
   6823 *mipsI:
   6824 *mipsII:
   6825 *mipsIII:
   6826 *mipsIV:
   6827 *mipsV:
   6828 *mips32:
   6829 *mips32r2:
   6830 *mips32r6:
   6831 *mips64:
   6832 *mips64r2:
   6833 *mips64r6:
   6834 *vr4100:
   6835 *vr5000:
   6836 
   6837 
   6838 010000,1,0000000000000000000,000110:COP0:32::TLBWR
   6839 "tlbwr"
   6840 *mipsI:
   6841 *mipsII:
   6842 *mipsIII:
   6843 *mipsIV:
   6844 *mipsV:
   6845 *mips32:
   6846 *mips32r2:
   6847 *mips32r6:
   6848 *mips64:
   6849 *mips64r2:
   6850 *mips64r6:
   6851 *vr4100:
   6852 *vr5000:
   6853 
   6854 
   6855 :include:::mips3264r2.igen
   6856 :include:::mips3264r6.igen
   6857 :include:::m16.igen
   6858 :include:::m16e.igen
   6859 :include:::mdmx.igen
   6860 :include:::mips3d.igen
   6861 :include:::sb1.igen
   6862 :include:::tx.igen
   6863 :include:::vr.igen
   6864 :include:::dsp.igen
   6865 :include:::dsp2.igen
   6866 :include:::smartmips.igen
   6867 :include:::micromips.igen
   6868 :include:::micromipsdsp.igen
   6869 
   6870