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