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