arm: Support pac_key_* register operand for MRS/MSR in Armv8.1-M Mainline
[binutils-gdb.git] / sim / mips / mips.igen
blob09f82aa1dfd37220efd91ef52edf9c0f091f3270
1 // -*- C -*-
2 //
3 //    <insn> ::=
4 //        <insn-word> { "+" <insn-word> }
5 //        ":" <format-name>
6 //        ":" <filter-flags>
7 //        ":" <options>
8 //        ":" <name>
9 //        <nl>
10 //        { <insn-model> }
11 //        { <insn-mnemonic> }
12 //        <code-block>
16 // IGEN config - mips16
17 // :option:16::insn-bit-size:16
18 // :option:16::hi-bit-nr:15
19 :option:16::insn-specifying-widths:true
20 :option:16::gen-delayed-branch:false
22 // IGEN config - mips32/64..
23 // :option:32::insn-bit-size:32
24 // :option:32::hi-bit-nr:31
25 :option:32::insn-specifying-widths:true
26 :option:32::gen-delayed-branch:false
29 // Generate separate simulators for each target
30 // :option:::multi-sim:true
33 // Models known by this simulator are defined below.
35 // When placing models in the instruction descriptions, please place
36 // them one per line, in the order given here.
38 //  MIPS ISAs:
40 //  Instructions and related functions for these models are included in
41 //  this file.
42 :model:::mipsI:mips3000:
43 :model:::mipsII:mips6000:
44 :model:::mipsIII:mips4000:
45 :model:::mipsIV:mips8000:
46 :model:::mipsV:mipsisaV:
47 :model:::mips32:mipsisa32:
48 :model:::mips32r2:mipsisa32r2:
49 :model:::mips32r6:mipsisa32r6:
50 :model:::mips64:mipsisa64:
51 :model:::mips64r2:mipsisa64r2:
52 :model:::mips64r6:mipsisa64r6:
54 //  Vendor ISAs:
56 //  Standard MIPS ISA instructions used for these models are listed here,
57 //  as are functions needed by those standard instructions.  Instructions
58 //  which are model-dependent and which are not in the standard MIPS ISAs
59 //  (or which pre-date or use different encodings than the standard
60 //  instructions) are (for the most part) in separate .igen files.
61 :model:::vr4100:mips4100:               // vr.igen
62 :model:::vr4120:mips4120:
63 :model:::vr5000:mips5000:
64 :model:::vr5400:mips5400:
65 :model:::vr5500:mips5500:
66 :model:::r3900:mips3900:                // tx.igen
68 //  MIPS Application Specific Extensions (ASEs)
70 //  Instructions for the ASEs are in separate .igen files.
71 //  ASEs add instructions on to a base ISA.
72 :model:::mips16:mips16:                 // m16.igen (and m16.dc)
73 :model:::mips16e:mips16e:               // m16e.igen
74 :model:::mips3d:mips3d:                 // mips3d.igen
75 :model:::mdmx:mdmx:                     // mdmx.igen
76 :model:::dsp:dsp:                       // dsp.igen
77 :model:::dsp2:dsp2:                     // dsp2.igen
78 :model:::smartmips:smartmips:           // smartmips.igen
79 :model:::micromips32:micromips64:       // micromips.igen
80 :model:::micromips64:micromips64:       // micromips.igen
81 :model:::micromipsdsp:micromipsdsp:     // micromipsdsp.igen
83 //  Vendor Extensions
85 //  Instructions specific to these extensions are in separate .igen files.
86 //  Extensions add instructions on to a base ISA.
87 :model:::sb1:sb1:                       // sb1.igen
90 // Pseudo instructions known by IGEN
91 :internal::::illegal:
93   SignalException (ReservedInstruction, 0);
97 // Pseudo instructions known by interp.c
98 // For grep - RSVD_INSTRUCTION, RSVD_INSTRUCTION_MASK
99 000000,5.*,5.*,5.*,5.OP,111001:SPECIAL:32::RSVD
100 "rsvd <OP>"
102   SignalException (ReservedInstruction, instruction_0);
107 // Helpers:
109 // Check if given instruction is CTI, if so signal
111 :function:::void:signal_if_cti:instruction_word instr
113   uint32_t maj = (instr & 0xfc000000) >> 26;
114   uint32_t special = instr & 0x3f;
115   if ((maj & 0x3e) == 0x06 /* Branch/Jump */
116       || ((maj & 0x38) == 0 && !((maj & 0x6) == 0))
117       || maj == 0x18
118       || (maj & 0x37) == 0x32
119       || (maj & 0x37) == 0x36
120       || ((maj == 0) && (special == 0x9))
121       /* DERET/ERET/WAIT */
122       || ((maj == 0x10) && (instr & 0x02000000)
123           && (special == 0x1f || special == 0x18 || special == 0x20)))
124     {
125       SignalException (ReservedInstruction, instr);
126     }
130 // Simulate a 32 bit delayslot instruction
133 :function:::address_word:delayslot32:address_word target
135   instruction_word delay_insn;
136   sim_events_slip (SD, 1);
137   DSPC = CIA;
138   CIA = CIA + 4; /* NOTE not mips16 */
139   STATE |= simDELAYSLOT;
140   delay_insn = IMEM32 (CIA); /* NOTE not mips16 */
141   signal_if_cti (SD_, delay_insn);
142   ENGINE_ISSUE_PREFIX_HOOK();
143   idecode_issue (CPU_, delay_insn, (CIA));
144   STATE &= ~simDELAYSLOT;
145   return target;
149 // Simulate a 32 bit forbidden slot instruction
152 :function:::address_word:forbiddenslot32:
153 *mips32r6:
154 *mips64r6:
156   instruction_word delay_insn;
157   sim_events_slip (SD, 1);
158   DSPC = CIA;
159   CIA = CIA + 4;
160   STATE |= simFORBIDDENSLOT;
161   delay_insn = IMEM32 (CIA);
162   signal_if_cti (SD_, delay_insn);
163   ENGINE_ISSUE_PREFIX_HOOK ();
164   idecode_issue (CPU_, delay_insn, (CIA));
165   STATE &= ~simFORBIDDENSLOT;
166   return CIA + 4;
169 :function:::address_word:nullify_next_insn32:
171   sim_events_slip (SD, 1);
172   dotrace (SD, CPU, tracefh, 2, CIA + 4, 4, "load instruction");
173   return CIA + 8;
177 // Helper:
179 // Calculate an effective address given a base and an offset.
182 :function:::address_word:loadstore_ea:address_word base, address_word offset
183 *mipsI:
184 *mipsII:
185 *mipsIII:
186 *mipsIV:
187 *mipsV:
188 *mips32:
189 *mips32r2:
190 *mips32r6:
191 *vr4100:
192 *vr5000:
193 *r3900:
194 *micromips32:
196   return base + offset;
199 :function:::address_word:loadstore_ea:address_word base, address_word offset
200 *mips64:
201 *mips64r2:
202 *micromips64:
203 *mips64r6:
205 #if 0 /* XXX FIXME: enable this only after some additional testing.  */
206   /* If in user mode and UX is not set, use 32-bit compatibility effective
207      address computations as defined in the MIPS64 Architecture for
208      Programmers Volume III, Revision 0.95, section 4.9.  */
209   if ((SR & (status_KSU_mask|status_EXL|status_ERL|status_UX))
210       == (ksu_user << status_KSU_shift))
211     return (address_word)((int32_t)base + (int32_t)offset);
212 #endif
213   return base + offset;
217 // Helper:
219 // Check that a 32-bit register value is properly sign-extended.
220 // (See NotWordValue in ISA spec.)
223 :function:::int:not_word_value:unsigned_word value
224 *mipsI:
225 *mipsII:
226 *mipsIII:
227 *mipsIV:
228 *mipsV:
229 *vr4100:
230 *vr5000:
231 *r3900:
232 *mips32:
233 *mips32r2:
234 *mips32r6:
235 *mips64:
236 *mips64r2:
237 *micromips32:
238 *micromips64:
239 *mips64r6:
241 #if WITH_TARGET_WORD_BITSIZE == 64
242   return value != (((value & 0xffffffff) ^ 0x80000000) - 0x80000000);
243 #else
244   return 0;
245 #endif
248 // Helper:
250 // Handle UNPREDICTABLE operation behaviour.  The goal here is to prevent
251 // theoretically portable code which invokes non-portable behaviour from
252 // running with no indication of the portability issue.
253 // (See definition of UNPREDICTABLE in ISA spec.)
256 :function:::void:unpredictable:
257 *mipsI:
258 *mipsII:
259 *mipsIII:
260 *mipsIV:
261 *mipsV:
262 *vr4100:
263 *vr5000:
264 *r3900:
268 :function:::void:unpredictable:
269 *mips32:
270 *mips32r2:
271 *mips32r6:
272 *mips64:
273 *mips64r2:
274 *micromips32:
275 *micromips64:
276 *mips64r6:
278   unpredictable_action (CPU, CIA);
282 // Helpers:
284 // Check that an access to a HI/LO register meets timing requirements
286 // In all MIPS ISAs,
288 //      OP {HI and LO} followed by MT{LO or HI} (and not MT{HI or LO})
289 //      makes subsequent MF{HI or LO} UNPREDICTABLE. (1)
291 // The following restrictions exist for MIPS I - MIPS III:
293 //      MF{HI or LO} followed by MT{HI or LO} w/ less than 2 instructions
294 //      in between makes MF UNPREDICTABLE. (2)
296 //      MF{HI or LO} followed by OP {HI and LO} w/ less than 2 instructions
297 //      in between makes MF UNPREDICTABLE. (3)
299 // On the r3900, restriction (2) is not present, and restriction (3) is not
300 // present for multiplication.
302 // Unfortunately, there seems to be some confusion about whether the last
303 // two restrictions should apply to "MIPS IV" as well.  One edition of
304 // the MIPS IV ISA says they do, but references in later ISA documents
305 // suggest they don't.
307 // In reality, some MIPS IV parts, such as the VR5000 and VR5400, do have
308 // these restrictions, while others, like the VR5500, don't.  To accomodate
309 // such differences, the MIPS IV and MIPS V version of these helper functions
310 // use auxillary routines to determine whether the restriction applies.
312 // check_mf_cycles:
314 // Helper used by check_mt_hilo, check_mult_hilo, and check_div_hilo
315 // to check for restrictions (2) and (3) above.
317 :function:::int:check_mf_cycles:hilo_history *history, int64_t time, const char *new
319   if (history->mf.timestamp + 3 > time)
320     {
321       sim_engine_abort (SD, CPU, CIA, "HILO: %s: %s at 0x%08lx too close to MF at 0x%08lx\n",
322                         itable[MY_INDEX].name,
323                         new, (long) CIA,
324                         (long) history->mf.cia);
325       return 0;
326     }
327   return 1;
331 // check_mt_hilo:
333 // Check for restriction (2) above (for ISAs/processors that have it),
334 // and record timestamps for restriction (1) above.
336 :function:::int:check_mt_hilo:hilo_history *history
337 *mipsI:
338 *mipsII:
339 *mipsIII:
340 *vr4100:
341 *vr5000:
343   int64_t time = sim_events_time (SD);
344   int ok = check_mf_cycles (SD_, history, time, "MT");
345   history->mt.timestamp = time;
346   history->mt.cia = CIA;
347   return ok;
350 :function:::int:check_mt_hilo:hilo_history *history
351 *mipsIV:
352 *mipsV:
354   int64_t time = sim_events_time (SD);
355   int ok = (! MIPS_MACH_HAS_MT_HILO_HAZARD (SD)
356             || check_mf_cycles (SD_, history, time, "MT"));
357   history->mt.timestamp = time;
358   history->mt.cia = CIA;
359   return ok;
362 :function:::int:check_mt_hilo:hilo_history *history
363 *mips32:
364 *mips32r2:
365 *mips32r6:
366 *mips64:
367 *mips64r2:
368 *mips64r6:
369 *r3900:
370 *micromips32:
371 *micromips64:
373   int64_t time = sim_events_time (SD);
374   history->mt.timestamp = time;
375   history->mt.cia = CIA;
376   return 1;
380 // check_mf_hilo:
382 // Check for restriction (1) above, and record timestamps for
383 // restriction (2) and (3) above.
385 :function:::int:check_mf_hilo:hilo_history *history, hilo_history *peer
386 *mipsI:
387 *mipsII:
388 *mipsIII:
389 *mipsIV:
390 *mipsV:
391 *mips32:
392 *mips32r2:
393 *mips32r6:
394 *mips64:
395 *mips64r2:
396 *mips64r6:
397 *vr4100:
398 *vr5000:
399 *r3900:
400 *micromips32:
401 *micromips64:
403   int64_t time = sim_events_time (SD);
404   int ok = 1;
405   if (peer != NULL
406       && peer->mt.timestamp > history->op.timestamp
407       && history->mt.timestamp < history->op.timestamp
408       && ! (history->mf.timestamp > history->op.timestamp
409             && history->mf.timestamp < peer->mt.timestamp)
410       && ! (peer->mf.timestamp > history->op.timestamp
411             && peer->mf.timestamp < peer->mt.timestamp))
412     {
413       /* The peer has been written to since the last OP yet we have
414          not */
415       sim_engine_abort (SD, CPU, CIA, "HILO: %s: MF at 0x%08lx following OP at 0x%08lx corrupted by MT at 0x%08lx\n",
416                         itable[MY_INDEX].name,
417                         (long) CIA,
418                         (long) history->op.cia,
419                         (long) peer->mt.cia);
420       ok = 0;
421     }
422   history->mf.timestamp = time;
423   history->mf.cia = CIA;
424   return ok;
429 // check_mult_hilo:
431 // Check for restriction (3) above (for ISAs/processors that have it)
432 // for MULT ops, and record timestamps for restriction (1) above.
434 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
435 *mipsI:
436 *mipsII:
437 *mipsIII:
438 *vr4100:
439 *vr5000:
441   int64_t time = sim_events_time (SD);
442   int ok = (check_mf_cycles (SD_, hi, time, "OP")
443             && check_mf_cycles (SD_, lo, time, "OP"));
444   hi->op.timestamp = time;
445   lo->op.timestamp = time;
446   hi->op.cia = CIA;
447   lo->op.cia = CIA;
448   return ok;
451 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
452 *mipsIV:
453 *mipsV:
455   int64_t time = sim_events_time (SD);
456   int ok = (! MIPS_MACH_HAS_MULT_HILO_HAZARD (SD)
457             || (check_mf_cycles (SD_, hi, time, "OP")
458                 && check_mf_cycles (SD_, lo, time, "OP")));
459   hi->op.timestamp = time;
460   lo->op.timestamp = time;
461   hi->op.cia = CIA;
462   lo->op.cia = CIA;
463   return ok;
466 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
467 *mips32:
468 *mips32r2:
469 *mips32r6:
470 *mips64:
471 *mips64r2:
472 *mips64r6:
473 *r3900:
474 *micromips32:
475 *micromips64:
477   /* FIXME: could record the fact that a stall occured if we want */
478   int64_t time = sim_events_time (SD);
479   hi->op.timestamp = time;
480   lo->op.timestamp = time;
481   hi->op.cia = CIA;
482   lo->op.cia = CIA;
483   return 1;
487 // check_div_hilo:
489 // Check for restriction (3) above (for ISAs/processors that have it)
490 // for DIV ops, and record timestamps for restriction (1) above.
492 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
493 *mipsI:
494 *mipsII:
495 *mipsIII:
496 *vr4100:
497 *vr5000:
498 *r3900:
500   int64_t time = sim_events_time (SD);
501   int ok = (check_mf_cycles (SD_, hi, time, "OP")
502             && check_mf_cycles (SD_, lo, time, "OP"));
503   hi->op.timestamp = time;
504   lo->op.timestamp = time;
505   hi->op.cia = CIA;
506   lo->op.cia = CIA;
507   return ok;
510 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
511 *mipsIV:
512 *mipsV:
514   int64_t time = sim_events_time (SD);
515   int ok = (! MIPS_MACH_HAS_DIV_HILO_HAZARD (SD)
516             || (check_mf_cycles (SD_, hi, time, "OP")
517                 && check_mf_cycles (SD_, lo, time, "OP")));
518   hi->op.timestamp = time;
519   lo->op.timestamp = time;
520   hi->op.cia = CIA;
521   lo->op.cia = CIA;
522   return ok;
525 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
526 *mips32:
527 *mips32r2:
528 *mips32r6:
529 *mips64:
530 *mips64r2:
531 *micromips32:
532 *micromips64:
533 *mips64r6:
535   int64_t time = sim_events_time (SD);
536   hi->op.timestamp = time;
537   lo->op.timestamp = time;
538   hi->op.cia = CIA;
539   lo->op.cia = CIA;
540   return 1;
544 // Helper:
546 // Check that the 64-bit instruction can currently be used, and signal
547 // a ReservedInstruction exception if not.
550 :function:::void:check_u64:instruction_word insn
551 *mipsIII:
552 *mipsIV:
553 *mipsV:
554 *vr4100:
555 *vr5000:
556 *vr5400:
557 *vr5500:
558 *r3900:
560   // The check should be similar to mips64 for any with PX/UX bit equivalents.
563 :function:::void:check_u64:instruction_word insn
564 *mips16e:
565 *mips64:
566 *mips64r2:
567 *mips32:
568 *mips32r2:
569 *mips32r6:
570 *micromips64:
571 *micromips32:
572 *mips64r6:
574 #if 0 /* XXX FIXME: enable this only after some additional testing.  */
575   if (UserMode && (SR & (status_UX|status_PX)) == 0)
576     SignalException (ReservedInstruction, insn);
577 #endif
583 // MIPS Architecture:
585 //        CPU Instruction Set (mipsI - mipsV, mips32/r2, mips64/r2)
589 :function:::void:do_add:int rs, int rt, int rd
591   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
592     Unpredictable ();
593   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
594   {
595     ALU32_BEGIN (GPR[rs]);
596     ALU32_ADD (GPR[rt]);
597     ALU32_END (GPR[rd]);   /* This checks for overflow.  */
598   }
599   TRACE_ALU_RESULT (GPR[rd]);
602 :function:::void:do_addi:int rs, int rt, uint16_t immediate
604   if (NotWordValue (GPR[rs]))
605     Unpredictable ();
606   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
607   {
608     ALU32_BEGIN (GPR[rs]);
609     ALU32_ADD (EXTEND16 (immediate));
610     ALU32_END (GPR[rt]);   /* This checks for overflow.  */
611   }
612   TRACE_ALU_RESULT (GPR[rt]);
615 :function:::void:do_andi:int rs, int rt, unsigned int immediate
617   TRACE_ALU_INPUT2 (GPR[rs], immediate);
618   GPR[rt] = GPR[rs] & immediate;
619   TRACE_ALU_RESULT (GPR[rt]);
622 :function:::void:do_dadd:int rd, int rs, int rt
624   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
625   {
626     ALU64_BEGIN (GPR[rs]);
627     ALU64_ADD (GPR[rt]);
628     ALU64_END (GPR[rd]);   /* This checks for overflow.  */
629   }
630   TRACE_ALU_RESULT (GPR[rd]);
633 :function:::void:do_daddi:int rt, int rs, int immediate
635   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
636   {
637     ALU64_BEGIN (GPR[rs]);
638     ALU64_ADD (EXTEND16 (immediate));
639     ALU64_END (GPR[rt]);   /* This checks for overflow.  */
640   }
641   TRACE_ALU_RESULT (GPR[rt]);
644 :function:::void:do_dsll32:int rd, int rt, int shift
646   int s = 32 + shift;
647   TRACE_ALU_INPUT2 (GPR[rt], s);
648   GPR[rd] = GPR[rt] << s;
649   TRACE_ALU_RESULT (GPR[rd]);
652 :function:::void:do_dsra32:int rd, int rt, int shift
654   int s = 32 + shift;
655   TRACE_ALU_INPUT2 (GPR[rt], s);
656   GPR[rd] = ((int64_t) GPR[rt]) >> s;
657   TRACE_ALU_RESULT (GPR[rd]);
660 :function:::void:do_dsrl32:int rd, int rt, int shift
662   int s = 32 + shift;
663   TRACE_ALU_INPUT2 (GPR[rt], s);
664   GPR[rd] = (uint64_t) GPR[rt] >> s;
665   TRACE_ALU_RESULT (GPR[rd]);
668 :function:::void:do_dsub:int rd, int rs, int rt
670   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
671   {
672     ALU64_BEGIN (GPR[rs]);
673     ALU64_SUB (GPR[rt]);
674     ALU64_END (GPR[rd]);   /* This checks for overflow.  */
675   }
676   TRACE_ALU_RESULT (GPR[rd]);
679 :function:::void:do_break:address_word instruction_0
681   /* Check for some break instruction which are reserved for use by the
682      simulator.  */
683   unsigned int break_code = instruction_0 & HALT_INSTRUCTION_MASK;
684   if (break_code == (HALT_INSTRUCTION  & HALT_INSTRUCTION_MASK) ||
685       break_code == (HALT_INSTRUCTION2 & HALT_INSTRUCTION_MASK))
686     {
687       sim_engine_halt (SD, CPU, NULL, cia,
688                        sim_exited, (unsigned int)(A0 & 0xFFFFFFFF));
689     }
690   else if (break_code == (BREAKPOINT_INSTRUCTION  & HALT_INSTRUCTION_MASK) ||
691            break_code == (BREAKPOINT_INSTRUCTION2 & HALT_INSTRUCTION_MASK))
692     {
693       if (STATE & simDELAYSLOT)
694         PC = cia - 4; /* reference the branch instruction */
695       else
696         PC = cia;
697       SignalException (BreakPoint, instruction_0);
698     }
700   else
701     {
702       /* If we get this far, we're not an instruction reserved by the sim.  Raise
703          the exception. */
704       SignalException (BreakPoint, instruction_0);
705     }
708 :function:::void:do_break16:address_word instruction_0
710   if (STATE & simDELAYSLOT)
711     PC = cia - 2; /* reference the branch instruction */
712   else
713     PC = cia;
714   SignalException (BreakPoint, instruction_0);
717 :function:::void:do_clo:int rd, int rs
719   uint32_t temp = GPR[rs];
720   uint32_t i, mask;
721   if (NotWordValue (GPR[rs]))
722     Unpredictable ();
723   TRACE_ALU_INPUT1 (GPR[rs]);
724   for (mask = ((uint32_t)1<<31), i = 0; i < 32; ++i)
725     {
726       if ((temp & mask) == 0)
727         break;
728       mask >>= 1;
729     }
730   GPR[rd] = EXTEND32 (i);
731   TRACE_ALU_RESULT (GPR[rd]);
734 :function:::void:do_clz:int rd, int rs
736   uint32_t temp = GPR[rs];
737   uint32_t i, mask;
738   if (NotWordValue (GPR[rs]))
739     Unpredictable ();
740   TRACE_ALU_INPUT1 (GPR[rs]);
741   for (mask = ((uint32_t)1<<31), i = 0; i < 32; ++i)
742     {
743       if ((temp & mask) != 0)
744         break;
745       mask >>= 1;
746     }
747   GPR[rd] = EXTEND32 (i);
748   TRACE_ALU_RESULT (GPR[rd]);
751 :function:::void:do_dclo:int rd, int rs
753   uint64_t temp = GPR[rs];
754   uint32_t i;
755   uint64_t mask;
756   TRACE_ALU_INPUT1 (GPR[rs]);
757   for (mask = ((uint64_t)1<<63), i = 0; i < 64; ++i)
758     {
759       if ((temp & mask) == 0)
760         break;
761       mask >>= 1;
762     }
763   GPR[rd] = EXTEND32 (i);
764   TRACE_ALU_RESULT (GPR[rd]);
767 :function:::void:do_dclz:int rd, int rs
769   uint64_t temp = GPR[rs];
770   uint32_t i;
771   uint64_t mask;
772   TRACE_ALU_INPUT1 (GPR[rs]);
773   for (mask = ((uint64_t)1<<63), i = 0; i < 64; ++i)
774     {
775       if ((temp & mask) != 0)
776         break;
777       mask >>= 1;
778     }
779   GPR[rd] = EXTEND32 (i);
780   TRACE_ALU_RESULT (GPR[rd]);
783 :function:::void:do_lb:int rt, int offset, int base
785   GPR[rt] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[base],
786                               EXTEND16 (offset)));
789 :function:::void:do_lh:int rt, int offset, int base
791   GPR[rt] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[base],
792                                EXTEND16 (offset)));
795 :function:::void:do_lwr:int rt, int offset, int base
797   GPR[rt] = EXTEND32 (do_load_right (SD_, AccessLength_WORD, GPR[base],
798                                      EXTEND16 (offset), GPR[rt]));
801 :function:::void:do_lwl:int rt, int offset, int base
803   GPR[rt] = EXTEND32 (do_load_left (SD_, AccessLength_WORD, GPR[base],
804                                     EXTEND16 (offset), GPR[rt]));
807 :function:::void:do_lwc:int num, int rt, int offset, int base
809   COP_LW (num, rt, do_load (SD_, AccessLength_WORD, GPR[base],
810                             EXTEND16 (offset)));
813 :function:::void:do_lw:int rt, int offset, int base
815   GPR[rt] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[base],
816                                EXTEND16 (offset)));
819 :function:::void:do_lwu:int rt, int offset, int base, address_word instruction_0
821   check_u64 (SD_, instruction_0);
822   GPR[rt] = do_load (SD_, AccessLength_WORD, GPR[base], EXTEND16 (offset));
825 :function:::void:do_lhu:int rt, int offset, int base
827   GPR[rt] = do_load (SD_, AccessLength_HALFWORD, GPR[base], EXTEND16 (offset));
830 :function:::void:do_ldc:int num, int rt, int offset, int base
832   COP_LD (num, rt, do_load (SD_, AccessLength_DOUBLEWORD, GPR[base],
833                             EXTEND16 (offset)));
836 :function:::void:do_lbu:int rt, int offset, int base
838   GPR[rt] = do_load (SD_, AccessLength_BYTE, GPR[base], EXTEND16 (offset));
841 :function:::void:do_ll:int rt, int insn_offset, int basereg
843   address_word base = GPR[basereg];
844   address_word offset = EXTEND16 (insn_offset);
845     {
846       address_word vaddr = loadstore_ea (SD_, base, offset);
847       address_word paddr = vaddr;
848       if ((vaddr & 3) != 0)
849         {
850           SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, read_transfer,
851                            sim_core_unaligned_signal);
852         }
853       else
854         {
855           uint64_t memval = 0;
856           uint64_t memval1 = 0;
857           uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
858           unsigned int shift = 2;
859           unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
860           unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
861           unsigned int byte;
862           paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
863           LoadMemory (&memval, &memval1, AccessLength_WORD, paddr, vaddr,
864                       isDATA, isREAL);
865           byte = ((vaddr & mask) ^ (bigend << shift));
866           GPR[rt] = EXTEND32 (memval >> (8 * byte));
867           LLBIT = 1;
868         }
869     }
872 :function:::void:do_lld:int rt, int roffset, int rbase
874   address_word base = GPR[rbase];
875   address_word offset = EXTEND16 (roffset);
876   {
877     address_word vaddr = loadstore_ea (SD_, base, offset);
878     address_word paddr = vaddr;
880     if ((vaddr & 7) != 0)
881       {
882         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, read_transfer,
883                 sim_core_unaligned_signal);
884       }
885     else
886       {
887         uint64_t memval = 0;
888         uint64_t memval1 = 0;
889         LoadMemory (&memval, &memval1, AccessLength_DOUBLEWORD, paddr, vaddr,
890                     isDATA, isREAL);
891         GPR[rt] = memval;
892         LLBIT = 1;
893       }
894   }
897 :function:::void:do_lui:int rt, int immediate
899   TRACE_ALU_INPUT1 (immediate);
900   GPR[rt] = EXTEND32 (immediate << 16);
901   TRACE_ALU_RESULT (GPR[rt]);
904 :function:::void:do_madd:int rs, int rt
906   int64_t temp;
907   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
908   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
909     Unpredictable ();
910   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
911   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
912           + ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs])));
913   LO = EXTEND32 (temp);
914   HI = EXTEND32 (VH4_8 (temp));
915   TRACE_ALU_RESULT2 (HI, LO);
918 :function:::void:do_dsp_madd:int ac, int rs, int rt
920   int64_t temp;
921   if (ac == 0)
922     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
923   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
924     Unpredictable ();
925   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
926   temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac)))
927           + ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs])));
928   DSPLO(ac) = EXTEND32 (temp);
929   DSPHI(ac) = EXTEND32 (VH4_8 (temp));
930   if (ac == 0)
931     TRACE_ALU_RESULT2 (HI, LO);
934 :function:::void:do_maddu:int rs, int rt
936   uint64_t temp;
937   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
938   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
939     Unpredictable ();
940   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
941   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
942           + ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt])));
943   ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp;  /* SmartMIPS */
944   LO = EXTEND32 (temp);
945   HI = EXTEND32 (VH4_8 (temp));
946   TRACE_ALU_RESULT2 (HI, LO);
949 :function:::void:do_dsp_maddu:int ac, int rs, int rt
951   uint64_t temp;
952   if (ac == 0)
953     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
954   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
955     Unpredictable ();
956   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
957   temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac)))
958           + ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt])));
959   if (ac == 0)
960     ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp;  /* SmartMIPS */
961   DSPLO(ac) = EXTEND32 (temp);
962   DSPHI(ac) = EXTEND32 (VH4_8 (temp));
963   if (ac == 0)
964     TRACE_ALU_RESULT2 (HI, LO);
967 :function:::void:do_dsp_mfhi:int ac, int rd
969   if (ac == 0)
970     do_mfhi (SD_, rd);
971   else
972     GPR[rd] = DSPHI(ac);
975 :function:::void:do_dsp_mflo:int ac, int rd
977   if (ac == 0)
978     do_mflo (SD_, rd);
979   else
980     GPR[rd] = DSPLO(ac);
983 :function:::void:do_movn:int rd, int rs, int rt
985   if (GPR[rt] != 0)
986     {
987       GPR[rd] = GPR[rs];
988       TRACE_ALU_RESULT (GPR[rd]);
989     }
992 :function:::void:do_movz:int rd, int rs, int rt
994   if (GPR[rt] == 0)
995     {
996       GPR[rd] = GPR[rs];
997       TRACE_ALU_RESULT (GPR[rd]);
998     }
1001 :function:::void:do_msub:int rs, int rt
1003   int64_t temp;
1004   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1005   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1006     Unpredictable ();
1007   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1008   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
1009           - ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs])));
1010   LO = EXTEND32 (temp);
1011   HI = EXTEND32 (VH4_8 (temp));
1012   TRACE_ALU_RESULT2 (HI, LO);
1015 :function:::void:do_dsp_msub:int ac, int rs, int rt
1017   int64_t temp;
1018   if (ac == 0)
1019     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1020   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1021     Unpredictable ();
1022   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1023   temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac)))
1024           - ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs])));
1025   DSPLO(ac) = EXTEND32 (temp);
1026   DSPHI(ac) = EXTEND32 (VH4_8 (temp));
1027   if (ac == 0)
1028     TRACE_ALU_RESULT2 (HI, LO);
1031 :function:::void:do_msubu:int rs, int rt
1033   uint64_t temp;
1034   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1035   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1036     Unpredictable ();
1037   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1038   temp = (U8_4 (VL4_8 (HI), VL4_8 (LO))
1039           - ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt])));
1040   LO = EXTEND32 (temp);
1041   HI = EXTEND32 (VH4_8 (temp));
1042   TRACE_ALU_RESULT2 (HI, LO);
1045 :function:::void:do_dsp_msubu:int ac, int rs, int rt
1047   uint64_t temp;
1048   if (ac == 0)
1049     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1050   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1051     Unpredictable ();
1052   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1053   temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac)))
1054           - ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt])));
1055   DSPLO(ac) = EXTEND32 (temp);
1056   DSPHI(ac) = EXTEND32 (VH4_8 (temp));
1057   if (ac == 0)
1058     TRACE_ALU_RESULT2 (HI, LO);
1061 :function:::void:do_mthi:int rs
1063   check_mt_hilo (SD_, HIHISTORY);
1064   HI = GPR[rs];
1067 :function:::void:do_dsp_mthi:int ac, int rs
1069   if (ac == 0)
1070     check_mt_hilo (SD_, HIHISTORY);
1071   DSPHI(ac) = GPR[rs];
1074 :function:::void:do_mtlo:int rs
1076   check_mt_hilo (SD_, LOHISTORY);
1077   LO = GPR[rs];
1080 :function:::void:do_dsp_mtlo:int ac, int rs
1082   if (ac == 0)
1083     check_mt_hilo (SD_, LOHISTORY);
1084   DSPLO(ac) = GPR[rs];
1087 :function:::void:do_mul:int rd, int rs, int rt
1089   int64_t prod;
1090   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1091     Unpredictable ();
1092   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1093   prod = (((int64_t)(int32_t) GPR[rs])
1094           * ((int64_t)(int32_t) GPR[rt]));
1095   GPR[rd] = EXTEND32 (VL4_8 (prod));
1096   TRACE_ALU_RESULT (GPR[rd]);
1099 :function:::void:do_dsp_mult:int ac, int rs, int rt
1101   int64_t prod;
1102   if (ac == 0)
1103     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1104   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1105     Unpredictable ();
1106   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1107   prod = ((int64_t)(int32_t) GPR[rs])
1108           * ((int64_t)(int32_t) GPR[rt]);
1109   DSPLO(ac) = EXTEND32 (VL4_8 (prod));
1110   DSPHI(ac) = EXTEND32 (VH4_8 (prod));
1111   if (ac == 0)
1112   {
1113     ACX = 0;  /* SmartMIPS */
1114     TRACE_ALU_RESULT2 (HI, LO);
1115   }
1118 :function:::void:do_dsp_multu:int ac, int rs, int rt
1120   uint64_t prod;
1121   if (ac == 0)
1122     check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1123   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1124     Unpredictable ();
1125   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1126   prod = ((uint64_t)(uint32_t) GPR[rs])
1127           * ((uint64_t)(uint32_t) GPR[rt]);
1128   DSPLO(ac) = EXTEND32 (VL4_8 (prod));
1129   DSPHI(ac) = EXTEND32 (VH4_8 (prod));
1130   if (ac == 0)
1131     TRACE_ALU_RESULT2 (HI, LO);
1134 :function:::void:do_pref:int hint, int insn_offset, int insn_base
1136   /*
1137   address_word base = GPR[insn_base];
1138   address_word offset = EXTEND16 (insn_offset);
1139   address_word vaddr = loadstore_ea (SD_, base, offset);
1140   address_word paddr = vaddr;
1141   Prefetch (paddr, vaddr, isDATA, hint);
1142   */
1145 :function:::void:do_sc:int rt, int offsetarg, int basereg, address_word instruction_0, int store_ll_bit
1147   address_word base = GPR[basereg];
1148   address_word offset = EXTEND16 (offsetarg);
1149   {
1150     address_word vaddr = loadstore_ea (SD_, base, offset);
1151     address_word paddr = vaddr;
1153     if ((vaddr & 3) != 0)
1154       {
1155         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer,
1156                          sim_core_unaligned_signal);
1157       }
1158     else
1159       {
1160         uint64_t memval = 0;
1161         uint64_t memval1 = 0;
1162         uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
1163         address_word reverseendian =
1164           (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
1165         address_word bigendiancpu =
1166           (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
1167         unsigned int byte;
1168         paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
1169         byte = ((vaddr & mask) ^ bigendiancpu);
1170         memval = ((uint64_t) GPR[rt] << (8 * byte));
1171         if (LLBIT)
1172           StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr,
1173                         isREAL);
1174         if (store_ll_bit)
1175           GPR[rt] = LLBIT;
1176       }
1177   }
1180 :function:::void:do_scd:int rt, int roffset, int rbase, int store_ll_bit
1182   address_word base = GPR[rbase];
1183   address_word offset = EXTEND16 (roffset);
1184   {
1185     address_word vaddr = loadstore_ea (SD_, base, offset);
1186     address_word paddr = vaddr;
1188     if ((vaddr & 7) != 0)
1189       {
1190         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, write_transfer,
1191                          sim_core_unaligned_signal);
1192       }
1193     else
1194       {
1195         uint64_t memval = 0;
1196         uint64_t memval1 = 0;
1197         memval = GPR[rt];
1198         if (LLBIT)
1199           StoreMemory (AccessLength_DOUBLEWORD, memval, memval1, paddr, vaddr,
1200                        isREAL);
1201         if (store_ll_bit)
1202           GPR[rt] = LLBIT;
1203       }
1204   }
1207 :function:::void:do_sub:int rs, int rt, int rd
1209   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1210     Unpredictable ();
1211   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1212   {
1213     ALU32_BEGIN (GPR[rs]);
1214     ALU32_SUB (GPR[rt]);
1215     ALU32_END (GPR[rd]);   /* This checks for overflow.  */
1216   }
1217   TRACE_ALU_RESULT (GPR[rd]);
1220 :function:::void:do_sw:int rt, int offset, int base
1222   do_store (SD_, AccessLength_WORD, GPR[base], EXTEND16 (offset), GPR[rt]);
1225 :function:::void:do_teq:int rs, int rt, address_word instruction_0
1227   if ((signed_word) GPR[rs] == (signed_word) GPR[rt])
1228     SignalException (Trap, instruction_0);
1231 :function:::void:do_teqi:int rs, int immediate, address_word instruction_0
1233   if ((signed_word) GPR[rs] == (signed_word) EXTEND16 (immediate))
1234     SignalException (Trap, instruction_0);
1237 :function:::void:do_tge:int rs, int rt, address_word instruction_0
1239   if ((signed_word) GPR[rs] >= (signed_word) GPR[rt])
1240     SignalException (Trap, instruction_0);
1243 :function:::void:do_tgei:int rs, int immediate, address_word instruction_0
1245   if ((signed_word) GPR[rs] >= (signed_word) EXTEND16 (immediate))
1246     SignalException (Trap, instruction_0);
1249 :function:::void:do_tgeiu:int rs, int immediate, address_word instruction_0
1251   if ((unsigned_word) GPR[rs] >= (unsigned_word) EXTEND16 (immediate))
1252     SignalException (Trap, instruction_0);
1255 :function:::void:do_tgeu:int rs ,int rt, address_word instruction_0
1257   if ((unsigned_word) GPR[rs] >= (unsigned_word) GPR[rt])
1258     SignalException (Trap, instruction_0);
1261 :function:::void:do_tlt:int rs, int rt, address_word instruction_0
1263   if ((signed_word) GPR[rs] < (signed_word) GPR[rt])
1264     SignalException (Trap, instruction_0);
1267 :function:::void:do_tlti:int rs, int immediate, address_word instruction_0
1269   if ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate))
1270     SignalException (Trap, instruction_0);
1273 :function:::void:do_tltiu:int rs, int immediate, address_word instruction_0
1275   if ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate))
1276     SignalException (Trap, instruction_0);
1279 :function:::void:do_tltu:int rs, int rt, address_word instruction_0
1281   if ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt])
1282     SignalException (Trap, instruction_0);
1285 :function:::void:do_tne:int rs, int rt, address_word instruction_0
1287   if ((signed_word) GPR[rs] != (signed_word) GPR[rt])
1288     SignalException (Trap, instruction_0);
1291 :function:::void:do_tnei:int rs, int immediate, address_word instruction_0
1293   if ((signed_word) GPR[rs] != (signed_word) EXTEND16 (immediate))
1294     SignalException (Trap, instruction_0);
1297 :function:::void:do_abs_fmt:int fmt, int fd, int fs, address_word instruction_0
1299   check_fpu (SD_);
1300   check_fmt_p (SD_, fmt, instruction_0);
1301   StoreFPR (fd, fmt, AbsoluteValue (ValueFPR (fs, fmt), fmt));
1304 :function:::void:do_add_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0
1306   check_fpu (SD_);
1307   check_fmt_p (SD_, fmt, instruction_0);
1308   StoreFPR (fd, fmt, Add (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt));
1311 :function:::void:do_alnv_ps:int fd, int fs, int ft, int rs, address_word instruction_0
1313   uint64_t fsx;
1314   uint64_t ftx;
1315   uint64_t fdx;
1316   check_fpu (SD_);
1317   check_u64 (SD_, instruction_0);
1318   fsx = ValueFPR (fs, fmt_ps);
1319   if ((GPR[rs] & 0x3) != 0)
1320     Unpredictable ();
1321   if ((GPR[rs] & 0x4) == 0)
1322     fdx = fsx;
1323   else
1324     {
1325       ftx = ValueFPR (ft, fmt_ps);
1326       if (BigEndianCPU)
1327         fdx = PackPS (PSLower (fsx), PSUpper (ftx));
1328       else
1329         fdx = PackPS (PSLower (ftx), PSUpper (fsx));
1330     }
1331   StoreFPR (fd, fmt_ps, fdx);
1334 :function:::void:do_c_cond_fmt:int cond, int fmt, int cc, int fs, int ft, address_word instruction_0
1336   check_fpu (SD_);
1337   check_fmt_p (SD_, fmt, instruction_0);
1338   Compare (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt, cond, cc);
1339   TRACE_ALU_RESULT (ValueFCR (31));
1342 :function:::void:do_ceil_fmt:int type, int fmt, int fd, int fs, address_word instruction_0
1344   check_fpu (SD_);
1345   check_fmt_p (SD_, fmt, instruction_0);
1346   StoreFPR (fd, type, Convert (FP_RM_TOPINF, ValueFPR (fs, fmt), fmt,
1347             type));
1350 :function:::void:do_cfc1:int rt, int fs
1352   check_fpu (SD_);
1353   if (fs == 0 || fs == 25 || fs == 26 || fs == 28 || fs == 31)
1354     {
1355       unsigned_word  fcr = ValueFCR (fs);
1356       TRACE_ALU_INPUT1 (fcr);
1357       GPR[rt] = fcr;
1358     }
1359   /* else NOP */
1360   TRACE_ALU_RESULT (GPR[rt]);
1363 :function:::void:do_ctc1:int rt, int fs
1365   check_fpu (SD_);
1366   TRACE_ALU_INPUT1 (GPR[rt]);
1367   if (fs == 25 || fs == 26 || fs == 28 || fs == 31)
1368       StoreFCR (fs, GPR[rt]);
1369   /* else NOP */
1372 :function:::void:do_cvt_d_fmt:int fmt, int fd, int fs, address_word instruction_0
1374   check_fpu (SD_);
1375   if ((fmt == fmt_double) | 0)
1376     SignalException (ReservedInstruction, instruction_0);
1377   StoreFPR (fd, fmt_double, Convert (GETRM (), ValueFPR (fs, fmt), fmt,
1378             fmt_double));
1381 :function:::void:do_cvt_l_fmt:int fmt, int fd, int fs, address_word instruction_0
1383   check_fpu (SD_);
1384   if ((fmt == fmt_long) | ((fmt == fmt_long) || (fmt == fmt_word)))
1385     SignalException (ReservedInstruction, instruction_0);
1386   StoreFPR (fd, fmt_long, Convert (GETRM (), ValueFPR (fs, fmt), fmt,
1387             fmt_long));
1390 :function:::void:do_cvt_ps_s:int fd, int fs, int ft, address_word instruction_0
1392   check_fpu (SD_);
1393   check_u64 (SD_, instruction_0);
1394   StoreFPR (fd, fmt_ps, PackPS (ValueFPR (fs, fmt_single),
1395                                 ValueFPR (ft, fmt_single)));
1398 :function:::void:do_cvt_s_fmt:int fmt, int fd, int fs, address_word instruction_0
1400   check_fpu (SD_);
1401   if ((fmt == fmt_single) | 0)
1402     SignalException (ReservedInstruction, instruction_0);
1403   StoreFPR (fd, fmt_single, Convert (GETRM (), ValueFPR (fs, fmt), fmt,
1404             fmt_single));
1407 :function:::void:do_cvt_s_pl:int fd, int fs, address_word instruction_0
1409   check_fpu (SD_);
1410   check_u64 (SD_, instruction_0);
1411   StoreFPR (fd, fmt_single, PSLower (ValueFPR (fs, fmt_ps)));
1414 :function:::void:do_cvt_s_pu:int fd, int fs, address_word instruction_0
1416   check_fpu (SD_);
1417   check_u64 (SD_, instruction_0);
1418   StoreFPR (fd, fmt_single, PSUpper (ValueFPR (fs, fmt_ps)));
1421 :function:::void:do_cvt_w_fmt:int fmt, int fd, int fs, address_word instruction_0
1423   check_fpu (SD_);
1424   if ((fmt == fmt_word) | ((fmt == fmt_long) || (fmt == fmt_word)))
1425     SignalException (ReservedInstruction, instruction_0);
1426   StoreFPR (fd, fmt_word, Convert (GETRM (), ValueFPR (fs, fmt), fmt,
1427             fmt_word));
1430 :function:::void:do_div_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0
1432   check_fpu (SD_);
1433   StoreFPR (fd, fmt, Divide (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt));
1436 :function:::void:do_dmfc1b:int rt, int fs
1437 *mipsIV:
1438 *mipsV:
1439 *mips64:
1440 *mips64r2:
1441 *mips64r6:
1442 *vr4100:
1443 *vr5000:
1444 *r3900:
1445 *micromips64:
1447   if (SizeFGR () == 64)
1448     GPR[rt] = FGR[fs];
1449   else if ((fs & 0x1) == 0)
1450     GPR[rt] = SET64HI (FGR[fs+1]) | FGR[fs];
1451   else
1452     Unpredictable ();
1453   TRACE_ALU_RESULT (GPR[rt]);
1456 :function:::void:do_dmtc1b:int rt, int fs
1458   if (SizeFGR () == 64)
1459     StoreFPR (fs, fmt_uninterpreted_64, GPR[rt]);
1460   else if ((fs & 0x1) == 0)
1461     StoreFPR (fs, fmt_uninterpreted_64, GPR[rt]);
1462   else
1463     Unpredictable ();
1466 :function:::void:do_floor_fmt:int type, int fmt, int fd, int fs
1468   check_fpu (SD_);
1469   StoreFPR (fd, type, Convert (FP_RM_TOMINF, ValueFPR (fs, fmt), fmt,
1470             type));
1473 :function:::void:do_luxc1_32:int fd, int rindex, int rbase
1474 *mips32r2:
1475 *micromips32:
1477   address_word base = GPR[rbase];
1478   address_word index = GPR[rindex];
1479   address_word vaddr = base + index;
1480   check_fpu (SD_);
1481   if (SizeFGR () != 64)
1482     Unpredictable ();
1483   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
1484   if ((vaddr & 0x7) != 0)
1485     index -= (vaddr & 0x7);
1486   COP_LD (1, fd, do_load_double (SD_, base, index));
1489 :function:::void:do_luxc1_64:int fd, int rindex, int rbase
1491   address_word base = GPR[rbase];
1492   address_word index = GPR[rindex];
1493   address_word vaddr = base + index;
1494   if (SizeFGR () != 64)
1495     Unpredictable ();
1496   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
1497   if ((vaddr & 0x7) != 0)
1498     index -= (vaddr & 0x7);
1499   COP_LD (1, fd, do_load (SD_, AccessLength_DOUBLEWORD, base, index));
1503 :function:::void:do_lwc1:int ft, int offset, int base
1505   check_fpu (SD_);
1506   COP_LW (1, ft, do_load (SD_, AccessLength_WORD, GPR[base],
1507                           EXTEND16 (offset)));
1510 :function:::void:do_lwxc1:int fd, int index, int base, address_word instruction_0
1512   check_fpu (SD_);
1513   check_u64 (SD_, instruction_0);
1514   COP_LW (1, fd, do_load (SD_, AccessLength_WORD, GPR[base], GPR[index]));
1517 :function:::void:do_madd_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0
1519   check_fpu (SD_);
1520   check_u64 (SD_, instruction_0);
1521   check_fmt_p (SD_, fmt, instruction_0);
1522   StoreFPR (fd, fmt, MultiplyAdd (ValueFPR (fs, fmt), ValueFPR (ft, fmt),
1523                                   ValueFPR (fr, fmt), fmt));
1526 :function:::void:do_mfc1b:int rt, int fs
1528   check_fpu (SD_);
1529   GPR[rt] = EXTEND32 (FGR[fs]);
1530   TRACE_ALU_RESULT (GPR[rt]);
1533 :function:::void:do_mov_fmt:int fmt, int fd, int fs, address_word instruction_0
1535   check_fpu (SD_);
1536   check_fmt_p (SD_, fmt, instruction_0);
1537   StoreFPR (fd, fmt, ValueFPR (fs, fmt));
1540 :function:::void:do_movtf:int tf, int rd, int rs, int cc
1542   check_fpu (SD_);
1543   if (GETFCC(cc) == tf)
1544     GPR[rd] = GPR[rs];
1547 :function:::void:do_movtf_fmt:int tf, int fmt, int fd, int fs, int cc
1549   check_fpu (SD_);
1550   if (fmt != fmt_ps)
1551   {
1552     if (GETFCC(cc) == tf)
1553       StoreFPR (fd, fmt, ValueFPR (fs, fmt));
1554     else
1555       StoreFPR (fd, fmt, ValueFPR (fd, fmt));   /* set fmt */
1556   }
1557   else
1558   {
1559     uint64_t fdx;
1560     fdx = PackPS (PSUpper (ValueFPR ((GETFCC (cc+1) == tf) ? fs : fd,
1561                                       fmt_ps)),
1562                   PSLower (ValueFPR ((GETFCC (cc+0) == tf) ? fs : fd,
1563                                       fmt_ps)));
1564     StoreFPR (fd, fmt_ps, fdx);
1565   }
1568 :function:::void:do_movn_fmt:int fmt, int fd, int fs, int rt
1570   check_fpu (SD_);
1571   if (GPR[rt] != 0)
1572     StoreFPR (fd, fmt, ValueFPR (fs, fmt));
1573   else
1574     StoreFPR (fd, fmt, ValueFPR (fd, fmt));
1577 :function:::void:do_movz_fmt:int fmt, int fd, int fs, int rt
1579   check_fpu (SD_);
1580   if (GPR[rt] == 0)
1581     StoreFPR (fd, fmt, ValueFPR (fs, fmt));
1582   else
1583     StoreFPR (fd, fmt, ValueFPR (fd, fmt));
1586 :function:::void:do_msub_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0
1588   check_fpu (SD_);
1589   check_u64 (SD_, instruction_0);
1590   check_fmt_p (SD_, fmt, instruction_0);
1591   StoreFPR (fd, fmt, MultiplySub (ValueFPR (fs, fmt), ValueFPR (ft, fmt),
1592                                   ValueFPR (fr, fmt), fmt));
1595 :function:::void:do_mtc1b:int rt, int fs
1597   check_fpu (SD_);
1598   StoreFPR (fs, fmt_uninterpreted_32, VL4_8 (GPR[rt]));
1601 :function:::void:do_mul_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0
1603   check_fpu (SD_);
1604   check_fmt_p (SD_, fmt, instruction_0);
1605   StoreFPR (fd, fmt, Multiply (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt));
1608 :function:::void:do_neg_fmt:int fmt, int fd, int fs, address_word instruction_0
1610   check_fpu (SD_);
1611   check_fmt_p (SD_, fmt, instruction_0);
1612   StoreFPR (fd, fmt, Negate (ValueFPR (fs, fmt), fmt));
1615 :function:::void:do_nmadd_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0
1617   check_fpu (SD_);
1618   check_u64 (SD_, instruction_0);
1619   check_fmt_p (SD_, fmt, instruction_0);
1620   StoreFPR (fd, fmt, NegMultiplyAdd (ValueFPR (fs, fmt), ValueFPR (ft, fmt),
1621                                      ValueFPR (fr, fmt), fmt));
1624 :function:::void:do_nmsub_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0
1626   check_fpu (SD_);
1627   check_u64 (SD_, instruction_0);
1628   check_fmt_p (SD_, fmt, instruction_0);
1629   StoreFPR (fd, fmt, NegMultiplySub (ValueFPR (fs, fmt), ValueFPR (ft, fmt),
1630                                      ValueFPR (fr, fmt), fmt));
1633 :function:::void:do_pll_ps:int fd, int fs, int ft, address_word instruction_0
1635   check_fpu (SD_);
1636   check_u64 (SD_, instruction_0);
1637   StoreFPR (fd, fmt_ps, PackPS (PSLower (ValueFPR (fs, fmt_ps)),
1638                                 PSLower (ValueFPR (ft, fmt_ps))));
1641 :function:::void:do_plu_ps:int fd, int fs, int ft, address_word instruction_0
1643   check_fpu (SD_);
1644   check_u64 (SD_, instruction_0);
1645   StoreFPR (fd, fmt_ps, PackPS (PSLower (ValueFPR (fs, fmt_ps)),
1646                                 PSUpper (ValueFPR (ft, fmt_ps))));
1649 :function:::void:do_pul_ps:int fd, int fs, int ft, address_word instruction_0
1651   check_fpu (SD_);
1652   check_u64 (SD_, instruction_0);
1653   StoreFPR (fd, fmt_ps, PackPS (PSUpper (ValueFPR (fs, fmt_ps)),
1654                                 PSLower (ValueFPR (ft, fmt_ps))));
1657 :function:::void:do_puu_ps:int fd, int fs, int ft, address_word instruction_0
1659   check_fpu (SD_);
1660   check_u64 (SD_, instruction_0);
1661   StoreFPR (fd, fmt_ps, PackPS (PSUpper (ValueFPR (fs, fmt_ps)),
1662                                 PSUpper (ValueFPR (ft, fmt_ps))));
1665 :function:::void:do_recip_fmt:int fmt, int fd, int fs
1667   check_fpu (SD_);
1668   StoreFPR (fd, fmt, Recip (ValueFPR (fs, fmt), fmt));
1671 :function:::void:do_round_fmt:int type, int fmt, int fd, int fs
1673   check_fpu (SD_);
1674   StoreFPR (fd, type, Convert (FP_RM_NEAREST, ValueFPR (fs, fmt), fmt,
1675             type));
1678 :function:::void:do_rsqrt_fmt:int fmt, int fd, int fs
1680   check_fpu (SD_);
1681   StoreFPR (fd, fmt, RSquareRoot (ValueFPR (fs, fmt), fmt));
1684 :function:::void:do_prefx:int hint, int rindex, int rbase
1686   /*
1687   address_word base = GPR[rbase];
1688   address_word index = GPR[rindex];
1689   address_word vaddr = loadstore_ea (SD_, base, index);
1690   address_word paddr = vaddr;
1691   Prefetch (paddr, vaddr, isDATA, hint);
1692   */
1695 :function:::void:do_sdc1:int ft, int offset, int base
1696 *mipsII:
1697 *mips32:
1698 *mips32r2:
1699 *mips32r6:
1700 *micromips32:
1702   check_fpu (SD_);
1703   do_store_double (SD_, GPR[base], EXTEND16 (offset), COP_SD (1, ft));
1706 :function:::void:do_suxc1_32:int fs, int rindex, int rbase
1707 *mips32r2:
1708 *micromips32:
1710   address_word base = GPR[rbase];
1711   address_word index = GPR[rindex];
1712   address_word vaddr = base + index;
1713   check_fpu (SD_);
1714   if (SizeFGR () != 64)
1715     Unpredictable ();
1716   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
1717   if ((vaddr & 0x7) != 0)
1718     index -= (vaddr & 0x7);
1719   do_store_double (SD_, base, index, COP_SD (1, fs));
1722 :function:::void:do_suxc1_64:int fs, int rindex, int rbase
1724   address_word base = GPR[rbase];
1725   address_word index = GPR[rindex];
1726   address_word vaddr = base + index;
1727   if (SizeFGR () != 64)
1728     Unpredictable ();
1729   /* Arrange for the bottom 3 bits of (base + index) to be 0.  */
1730   if ((vaddr & 0x7) != 0)
1731     index -= (vaddr & 0x7);
1732   do_store (SD_, AccessLength_DOUBLEWORD, base, index, COP_SD (1, fs));
1735 :function:::void:do_sqrt_fmt:int fmt, int fd, int fs
1737   check_fpu (SD_);
1738   StoreFPR (fd, fmt,  (SquareRoot (ValueFPR (fs, fmt), fmt)));
1741 :function:::void:do_sub_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0
1743   check_fpu (SD_);
1744   check_fmt_p (SD_, fmt, instruction_0);
1745   StoreFPR (fd, fmt, Sub (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt));
1748 :function:::void:do_swc1:int ft, int roffset, int rbase, address_word instruction_0
1750   address_word base = GPR[rbase];
1751   address_word offset = EXTEND16 (roffset);
1752   check_fpu (SD_);
1753   {
1754     address_word vaddr = loadstore_ea (SD_, base, offset);
1755     address_word paddr = vaddr;
1757     if ((vaddr & 3) != 0)
1758       {
1759         SIM_CORE_SIGNAL (SD, CPU, cia, read_map, AccessLength_WORD+1, vaddr,
1760                          write_transfer, sim_core_unaligned_signal);
1761       }
1762     else
1763       {
1764         uword64 memval = 0;
1765         uword64 memval1 = 0;
1766         uword64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
1767         address_word reverseendian =
1768           (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
1769         address_word bigendiancpu =
1770           (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
1771         unsigned int byte;
1772         paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
1773         byte = ((vaddr & mask) ^ bigendiancpu);
1774         memval = (((uword64)COP_SW(1, ft)) << (8 * byte));
1775         StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr, isREAL);
1776       }
1777   }
1780 :function:::void:do_swxc1:int fs, int rindex, int rbase, address_word instruction_0
1782   address_word base = GPR[rbase];
1783   address_word index = GPR[rindex];
1784   check_fpu (SD_);
1785   check_u64 (SD_, instruction_0);
1786     {
1787       address_word vaddr = loadstore_ea (SD_, base, index);
1788       address_word paddr = vaddr;
1790       if ((vaddr & 3) != 0)
1791         {
1792           SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer,
1793                            sim_core_unaligned_signal);
1794         }
1795       else
1796         {
1797           uint64_t memval = 0;
1798           uint64_t memval1 = 0;
1799           uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
1800           address_word reverseendian =
1801             (ReverseEndian ? (mask ^ AccessLength_WORD) : 0);
1802           address_word bigendiancpu =
1803             (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0);
1804           unsigned int byte;
1805           paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
1806           byte = ((vaddr & mask) ^ bigendiancpu);
1807           memval = (((uint64_t)COP_SW(1,fs)) << (8 * byte));
1808           StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr,
1809                        isREAL);
1810         }
1811   }
1814 :function:::void:do_trunc_fmt:int type, int fmt, int fd, int fs
1816   check_fpu (SD_);
1817   StoreFPR (fd, type, Convert (FP_RM_TOZERO, ValueFPR (fs, fmt), fmt,
1818             type));
1821 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
1822 "add r<RD>, r<RS>, r<RT>"
1823 *mipsI:
1824 *mipsII:
1825 *mipsIII:
1826 *mipsIV:
1827 *mipsV:
1828 *mips32:
1829 *mips32r2:
1830 *mips32r6:
1831 *mips64:
1832 *mips64r2:
1833 *mips64r6:
1834 *vr4100:
1835 *vr5000:
1836 *r3900:
1838   do_add (SD_, RS, RT, RD);
1843 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
1844 "addi r<RT>, r<RS>, <IMMEDIATE>"
1845 *mipsI:
1846 *mipsII:
1847 *mipsIII:
1848 *mipsIV:
1849 *mipsV:
1850 *mips32:
1851 *mips32r2:
1852 *mips64:
1853 *mips64r2:
1854 *vr4100:
1855 *vr5000:
1856 *r3900:
1858   do_addi (SD_, RS, RT, IMMEDIATE);
1863 :function:::void:do_addiu:int rs, int rt, uint16_t immediate
1865   if (NotWordValue (GPR[rs]))
1866     Unpredictable ();
1867   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
1868   GPR[rt] = EXTEND32 (GPR[rs] + EXTEND16 (immediate));
1869   TRACE_ALU_RESULT (GPR[rt]);
1872 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
1873 "addiu r<RT>, r<RS>, <IMMEDIATE>"
1874 *mipsI:
1875 *mipsII:
1876 *mipsIII:
1877 *mipsIV:
1878 *mipsV:
1879 *mips32:
1880 *mips32r2:
1881 *mips32r6:
1882 *mips64:
1883 *mips64r2:
1884 *mips64r6:
1885 *vr4100:
1886 *vr5000:
1887 *r3900:
1889   do_addiu (SD_, RS, RT, IMMEDIATE);
1894 :function:::void:do_addu:int rs, int rt, int rd
1896   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
1897     Unpredictable ();
1898   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1899   GPR[rd] = EXTEND32 (GPR[rs] + GPR[rt]);
1900   TRACE_ALU_RESULT (GPR[rd]);
1903 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
1904 "addu r<RD>, r<RS>, r<RT>"
1905 *mipsI:
1906 *mipsII:
1907 *mipsIII:
1908 *mipsIV:
1909 *mipsV:
1910 *mips32:
1911 *mips32r2:
1912 *mips32r6:
1913 *mips64:
1914 *mips64r2:
1915 *mips64r6:
1916 *vr4100:
1917 *vr5000:
1918 *r3900:
1920   do_addu (SD_, RS, RT, RD);
1925 :function:::void:do_and:int rs, int rt, int rd
1927   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1928   GPR[rd] = GPR[rs] & GPR[rt];
1929   TRACE_ALU_RESULT (GPR[rd]);
1932 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
1933 "and r<RD>, r<RS>, r<RT>"
1934 *mipsI:
1935 *mipsII:
1936 *mipsIII:
1937 *mipsIV:
1938 *mipsV:
1939 *mips32:
1940 *mips32r2:
1941 *mips32r6:
1942 *mips64:
1943 *mips64r2:
1944 *mips64r6:
1945 *vr4100:
1946 *vr5000:
1947 *r3900:
1949   do_and (SD_, RS, RT, RD);
1954 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
1955 "andi r<RT>, r<RS>, %#lx<IMMEDIATE>"
1956 *mipsI:
1957 *mipsII:
1958 *mipsIII:
1959 *mipsIV:
1960 *mipsV:
1961 *mips32:
1962 *mips32r2:
1963 *mips32r6:
1964 *mips64:
1965 *mips64r2:
1966 *mips64r6:
1967 *vr4100:
1968 *vr5000:
1969 *r3900:
1971   do_andi (SD_,RS, RT, IMMEDIATE);
1976 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
1977 "beq r<RS>, r<RT>, <OFFSET>"
1978 *mipsI:
1979 *mipsII:
1980 *mipsIII:
1981 *mipsIV:
1982 *mipsV:
1983 *mips32:
1984 *mips32r2:
1985 *mips64:
1986 *mips64r2:
1987 *vr4100:
1988 *vr5000:
1989 *r3900:
1991   address_word offset = EXTEND16 (OFFSET) << 2;
1992   if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
1993     {
1994       DELAY_SLOT (NIA + offset);
1995     }
1999 000100,5.RS,5.RT,16.OFFSET:R6:32::BEQ
2000 "beq r<RS>, r<RT>, <OFFSET>"
2001 *mips32r6:
2002 *mips64r6:
2004   address_word offset = EXTEND16 (OFFSET) << 2;
2005   if (GPR[RS] == GPR[RT])
2006     DELAY_SLOT (NIA  + offset);
2007   else
2008     FORBIDDEN_SLOT ();
2011 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
2012 "beql r<RS>, r<RT>, <OFFSET>"
2013 *mipsII:
2014 *mipsIII:
2015 *mipsIV:
2016 *mipsV:
2017 *mips32:
2018 *mips32r2:
2019 *mips64:
2020 *mips64r2:
2021 *vr4100:
2022 *vr5000:
2023 *r3900:
2025   address_word offset = EXTEND16 (OFFSET) << 2;
2026   if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
2027     {
2028       DELAY_SLOT (NIA + offset);
2029     }
2030   else
2031     NULLIFY_NEXT_INSTRUCTION ();
2036 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
2037 "bgez r<RS>, <OFFSET>"
2038 *mipsI:
2039 *mipsII:
2040 *mipsIII:
2041 *mipsIV:
2042 *mipsV:
2043 *mips32:
2044 *mips32r2:
2045 *mips32r6:
2046 *mips64:
2047 *mips64r2:
2048 *mips64r6:
2049 *vr4100:
2050 *vr5000:
2051 *r3900:
2053   address_word offset = EXTEND16 (OFFSET) << 2;
2054   if ((signed_word) GPR[RS] >= 0)
2055     {
2056       DELAY_SLOT (NIA + offset);
2057     }
2062 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
2063 "bgezal r<RS>, <OFFSET>"
2064 *mipsI:
2065 *mipsII:
2066 *mipsIII:
2067 *mipsIV:
2068 *mipsV:
2069 *mips32:
2070 *mips32r2:
2071 *mips64:
2072 *mips64r2:
2073 *vr4100:
2074 *vr5000:
2075 *r3900:
2077   address_word offset = EXTEND16 (OFFSET) << 2;
2078   if (RS == 31)
2079     Unpredictable ();
2080   RA = (CIA + 8);
2081   if ((signed_word) GPR[RS] >= 0)
2082     {
2083       DELAY_SLOT (NIA + offset);
2084     }
2087 000001,00000,10001,16.OFFSET:REGIMM:32::BAL
2088 "bal <OFFSET>"
2089 *mips32r6:
2090 *mips64r6:
2092   address_word offset = EXTEND16 (OFFSET) << 2;
2093   RA = (CIA + 8);
2094   DELAY_SLOT (NIA + offset);
2097 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
2098 "bgezall r<RS>, <OFFSET>"
2099 *mipsII:
2100 *mipsIII:
2101 *mipsIV:
2102 *mipsV:
2103 *mips32:
2104 *mips32r2:
2105 *mips64:
2106 *mips64r2:
2107 *vr4100:
2108 *vr5000:
2109 *r3900:
2111   address_word offset = EXTEND16 (OFFSET) << 2;
2112   if (RS == 31)
2113     Unpredictable ();
2114   RA = (CIA + 8);
2115   /* NOTE: The branch occurs AFTER the next instruction has been
2116      executed */
2117   if ((signed_word) GPR[RS] >= 0)
2118     {
2119       DELAY_SLOT (NIA + offset);
2120     }
2121   else
2122     NULLIFY_NEXT_INSTRUCTION ();
2127 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
2128 "bgezl r<RS>, <OFFSET>"
2129 *mipsII:
2130 *mipsIII:
2131 *mipsIV:
2132 *mipsV:
2133 *mips32:
2134 *mips32r2:
2135 *mips64:
2136 *mips64r2:
2137 *vr4100:
2138 *vr5000:
2139 *r3900:
2141   address_word offset = EXTEND16 (OFFSET) << 2;
2142   if ((signed_word) GPR[RS] >= 0)
2143     {
2144       DELAY_SLOT (NIA + offset);
2145     }
2146   else
2147     NULLIFY_NEXT_INSTRUCTION ();
2152 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
2153 "bgtz r<RS>, <OFFSET>"
2154 *mipsI:
2155 *mipsII:
2156 *mipsIII:
2157 *mipsIV:
2158 *mipsV:
2159 *mips32:
2160 *mips32r2:
2161 *mips32r6:
2162 *mips64:
2163 *mips64r2:
2164 *mips64r6:
2165 *vr4100:
2166 *vr5000:
2167 *r3900:
2169   address_word offset = EXTEND16 (OFFSET) << 2;
2170   if ((signed_word) GPR[RS] > 0)
2171     {
2172       DELAY_SLOT (NIA + offset);
2173     }
2178 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
2179 "bgtzl r<RS>, <OFFSET>"
2180 *mipsII:
2181 *mipsIII:
2182 *mipsIV:
2183 *mipsV:
2184 *mips32:
2185 *mips32r2:
2186 *mips64:
2187 *mips64r2:
2188 *vr4100:
2189 *vr5000:
2190 *r3900:
2192   address_word offset = EXTEND16 (OFFSET) << 2;
2193   /* NOTE: The branch occurs AFTER the next instruction has been
2194      executed */
2195   if ((signed_word) GPR[RS] > 0)
2196     {
2197       DELAY_SLOT (NIA + offset);
2198     }
2199   else
2200     NULLIFY_NEXT_INSTRUCTION ();
2205 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
2206 "blez r<RS>, <OFFSET>"
2207 *mipsI:
2208 *mipsII:
2209 *mipsIII:
2210 *mipsIV:
2211 *mipsV:
2212 *mips32:
2213 *mips32r2:
2214 *mips32r6:
2215 *mips64:
2216 *mips64r2:
2217 *mips64r6:
2218 *vr4100:
2219 *vr5000:
2220 *r3900:
2222   address_word offset = EXTEND16 (OFFSET) << 2;
2223   /* NOTE: The branch occurs AFTER the next instruction has been
2224      executed */
2225   if ((signed_word) GPR[RS] <= 0)
2226     {
2227       DELAY_SLOT (NIA + offset);
2228     }
2233 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
2234 "bgezl r<RS>, <OFFSET>"
2235 *mipsII:
2236 *mipsIII:
2237 *mipsIV:
2238 *mipsV:
2239 *mips32:
2240 *mips32r2:
2241 *mips64:
2242 *mips64r2:
2243 *vr4100:
2244 *vr5000:
2245 *r3900:
2247   address_word offset = EXTEND16 (OFFSET) << 2;
2248   if ((signed_word) GPR[RS] <= 0)
2249     {
2250       DELAY_SLOT (NIA + offset);
2251     }
2252   else
2253     NULLIFY_NEXT_INSTRUCTION ();
2258 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
2259 "bltz r<RS>, <OFFSET>"
2260 *mipsI:
2261 *mipsII:
2262 *mipsIII:
2263 *mipsIV:
2264 *mipsV:
2265 *mips32:
2266 *mips32r2:
2267 *mips32r6:
2268 *mips64:
2269 *mips64r2:
2270 *mips64r6:
2271 *vr4100:
2272 *vr5000:
2273 *r3900:
2275   address_word offset = EXTEND16 (OFFSET) << 2;
2276   if ((signed_word) GPR[RS] < 0)
2277     {
2278       DELAY_SLOT (NIA + offset);
2279     }
2284 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
2285 "bltzal r<RS>, <OFFSET>"
2286 *mipsI:
2287 *mipsII:
2288 *mipsIII:
2289 *mipsIV:
2290 *mipsV:
2291 *mips32:
2292 *mips32r2:
2293 *mips64:
2294 *mips64r2:
2295 *vr4100:
2296 *vr5000:
2297 *r3900:
2299   address_word offset = EXTEND16 (OFFSET) << 2;
2300   if (RS == 31)
2301     Unpredictable ();
2302   RA = (CIA + 8);
2303   /* NOTE: The branch occurs AFTER the next instruction has been
2304      executed */
2305   if ((signed_word) GPR[RS] < 0)
2306     {
2307       DELAY_SLOT (NIA + offset);
2308     }
2313 000001,00000,10000,16.OFFSET:REGIMM:32::NAL
2314 "nal <OFFSET>"
2315 *mips32r6:
2316 *mips64r6:
2318   address_word offset = EXTEND16 (OFFSET) << 2;
2319   RA = (CIA + 8);
2320   FORBIDDEN_SLOT ();
2325 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
2326 "bltzall r<RS>, <OFFSET>"
2327 *mipsII:
2328 *mipsIII:
2329 *mipsIV:
2330 *mipsV:
2331 *mips32:
2332 *mips32r2:
2333 *mips64:
2334 *mips64r2:
2335 *vr4100:
2336 *vr5000:
2337 *r3900:
2339   address_word offset = EXTEND16 (OFFSET) << 2;
2340   if (RS == 31)
2341     Unpredictable ();
2342   RA = (CIA + 8);
2343   if ((signed_word) GPR[RS] < 0)
2344     {
2345       DELAY_SLOT (NIA + offset);
2346     }
2347   else
2348     NULLIFY_NEXT_INSTRUCTION ();
2353 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
2354 "bltzl r<RS>, <OFFSET>"
2355 *mipsII:
2356 *mipsIII:
2357 *mipsIV:
2358 *mipsV:
2359 *mips32:
2360 *mips32r2:
2361 *mips64:
2362 *mips64r2:
2363 *vr4100:
2364 *vr5000:
2365 *r3900:
2367   address_word offset = EXTEND16 (OFFSET) << 2;
2368   /* NOTE: The branch occurs AFTER the next instruction has been
2369      executed */
2370   if ((signed_word) GPR[RS] < 0)
2371     {
2372       DELAY_SLOT (NIA + offset);
2373     }
2374   else
2375     NULLIFY_NEXT_INSTRUCTION ();
2380 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
2381 "bne r<RS>, r<RT>, <OFFSET>"
2382 *mipsI:
2383 *mipsII:
2384 *mipsIII:
2385 *mipsIV:
2386 *mipsV:
2387 *mips32:
2388 *mips32r2:
2389 *mips32r6:
2390 *mips64:
2391 *mips64r2:
2392 *mips64r6:
2393 *vr4100:
2394 *vr5000:
2395 *r3900:
2397   address_word offset = EXTEND16 (OFFSET) << 2;
2398   if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
2399     {
2400       DELAY_SLOT (NIA + offset);
2401     }
2406 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
2407 "bnel r<RS>, r<RT>, <OFFSET>"
2408 *mipsII:
2409 *mipsIII:
2410 *mipsIV:
2411 *mipsV:
2412 *mips32:
2413 *mips32r2:
2414 *mips64:
2415 *mips64r2:
2416 *vr4100:
2417 *vr5000:
2418 *r3900:
2420   address_word offset = EXTEND16 (OFFSET) << 2;
2421   if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
2422     {
2423       DELAY_SLOT (NIA + offset);
2424     }
2425   else
2426     NULLIFY_NEXT_INSTRUCTION ();
2431 000000,20.CODE,001101:SPECIAL:32::BREAK
2432 "break %#lx<CODE>"
2433 *mipsI:
2434 *mipsII:
2435 *mipsIII:
2436 *mipsIV:
2437 *mipsV:
2438 *mips32:
2439 *mips32r2:
2440 *mips32r6:
2441 *mips64:
2442 *mips64r2:
2443 *mips64r6:
2444 *vr4100:
2445 *vr5000:
2446 *r3900:
2448   do_break (SD_, instruction_0);
2453 011100,5.RS,5.RT,5.RD,00000,100001:SPECIAL2:32::CLO
2454 "clo r<RD>, r<RS>"
2455 *mips32:
2456 *mips32r2:
2457 *mips64:
2458 *mips64r2:
2459 *vr5500:
2461   if (RT != RD)
2462     Unpredictable ();
2463   do_clo (SD_, RD, RS);
2468 011100,5.RS,5.RT,5.RD,00000,100000:SPECIAL2:32::CLZ
2469 "clz r<RD>, r<RS>"
2470 *mips32:
2471 *mips32r2:
2472 *mips64:
2473 *mips64r2:
2474 *vr5500:
2476   if (RT != RD)
2477     Unpredictable ();
2478   do_clz (SD_, RD, RS);
2483 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
2484 "dadd r<RD>, r<RS>, r<RT>"
2485 *mipsIII:
2486 *mipsIV:
2487 *mipsV:
2488 *mips64:
2489 *mips64r2:
2490 *mips64r6:
2491 *vr4100:
2492 *vr5000:
2494   check_u64 (SD_, instruction_0);
2495   do_dadd (SD_, RD, RS, RT);
2500 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
2501 "daddi r<RT>, r<RS>, <IMMEDIATE>"
2502 *mipsIII:
2503 *mipsIV:
2504 *mipsV:
2505 *mips64:
2506 *mips64r2:
2507 *vr4100:
2508 *vr5000:
2510   check_u64 (SD_, instruction_0);
2511   do_daddi (SD_, RT, RS, IMMEDIATE);
2516 :function:::void:do_daddiu:int rs, int rt, uint16_t immediate
2518   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
2519   GPR[rt] = GPR[rs] + EXTEND16 (immediate);
2520   TRACE_ALU_RESULT (GPR[rt]);
2523 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
2524 "daddiu r<RT>, r<RS>, <IMMEDIATE>"
2525 *mipsIII:
2526 *mipsIV:
2527 *mipsV:
2528 *mips64:
2529 *mips64r2:
2530 *mips64r6:
2531 *vr4100:
2532 *vr5000:
2534   check_u64 (SD_, instruction_0);
2535   do_daddiu (SD_, RS, RT, IMMEDIATE);
2540 :function:::void:do_daddu:int rs, int rt, int rd
2542   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2543   GPR[rd] = GPR[rs] + GPR[rt];
2544   TRACE_ALU_RESULT (GPR[rd]);
2547 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
2548 "daddu r<RD>, r<RS>, r<RT>"
2549 *mipsIII:
2550 *mipsIV:
2551 *mipsV:
2552 *mips64:
2553 *mips64r2:
2554 *mips64r6:
2555 *vr4100:
2556 *vr5000:
2558   check_u64 (SD_, instruction_0);
2559   do_daddu (SD_, RS, RT, RD);
2564 011100,5.RS,5.RT,5.RD,00000,100101:SPECIAL2:64::DCLO
2565 "dclo r<RD>, r<RS>"
2566 *mips64:
2567 *mips64r2:
2568 *vr5500:
2570   if (RT != RD)
2571     Unpredictable ();
2572   check_u64 (SD_, instruction_0);
2573   if (RT != RD)
2574     Unpredictable ();
2575   do_dclo (SD_, RD, RS);
2580 011100,5.RS,5.RT,5.RD,00000,100100:SPECIAL2:64::DCLZ
2581 "dclz r<RD>, r<RS>"
2582 *mips64:
2583 *mips64r2:
2584 *vr5500:
2586   if (RT != RD)
2587     Unpredictable ();
2588   check_u64 (SD_, instruction_0);
2589   if (RT != RD)
2590     Unpredictable ();
2591   do_dclz (SD_, RD, RS);
2596 :function:::void:do_ddiv:int rs, int rt
2598   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
2599   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2600   {
2601     int64_t n = GPR[rs];
2602     int64_t d = GPR[rt];
2603     int64_t hi;
2604     int64_t lo;
2605     if (d == 0)
2606       {
2607         lo = SIGNED64 (0x8000000000000000);
2608         hi = 0;
2609       }
2610     else if (d == -1 && n == SIGNED64 (0x8000000000000000))
2611       {
2612         lo = SIGNED64 (0x8000000000000000);
2613         hi = 0;
2614       }
2615     else
2616       {
2617         lo = (n / d);
2618         hi = (n % d);
2619       }
2620     HI = hi;
2621     LO = lo;
2622   }
2623   TRACE_ALU_RESULT2 (HI, LO);
2626 000000,5.RS,5.RT,0000000000,011110:SPECIAL:64::DDIV
2627 "ddiv r<RS>, r<RT>"
2628 *mipsIII:
2629 *mipsIV:
2630 *mipsV:
2631 *mips64:
2632 *mips64r2:
2633 *vr4100:
2634 *vr5000:
2636   check_u64 (SD_, instruction_0);
2637   do_ddiv (SD_, RS, RT);
2642 :function:::void:do_ddivu:int rs, int rt
2644   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
2645   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2646   {
2647     uint64_t n = GPR[rs];
2648     uint64_t d = GPR[rt];
2649     uint64_t hi;
2650     uint64_t lo;
2651     if (d == 0)
2652       {
2653         lo = SIGNED64 (0x8000000000000000);
2654         hi = 0;
2655       }
2656     else
2657       {
2658         lo = (n / d);
2659         hi = (n % d);
2660       }
2661     HI = hi;
2662     LO = lo;
2663   }
2664   TRACE_ALU_RESULT2 (HI, LO);
2667 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
2668 "ddivu r<RS>, r<RT>"
2669 *mipsIII:
2670 *mipsIV:
2671 *mipsV:
2672 *mips64:
2673 *mips64r2:
2674 *vr4100:
2675 *vr5000:
2677   check_u64 (SD_, instruction_0);
2678   do_ddivu (SD_, RS, RT);
2681 :function:::void:do_div:int rs, int rt
2683   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
2684   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2685   {
2686     int32_t n = GPR[rs];
2687     int32_t d = GPR[rt];
2688     if (d == 0)
2689       {
2690         LO = EXTEND32 (0x80000000);
2691         HI = EXTEND32 (0);
2692       }
2693     else if (n == SIGNED32 (0x80000000) && d == -1)
2694       {
2695         LO = EXTEND32 (0x80000000);
2696         HI = EXTEND32 (0);
2697       }
2698     else
2699       {
2700         LO = EXTEND32 (n / d);
2701         HI = EXTEND32 (n % d);
2702       }
2703   }
2704   TRACE_ALU_RESULT2 (HI, LO);
2707 000000,5.RS,5.RT,0000000000,011010:SPECIAL:32::DIV
2708 "div r<RS>, r<RT>"
2709 *mipsI:
2710 *mipsII:
2711 *mipsIII:
2712 *mipsIV:
2713 *mipsV:
2714 *mips32:
2715 *mips32r2:
2716 *mips64:
2717 *mips64r2:
2718 *vr4100:
2719 *vr5000:
2720 *r3900:
2722   do_div (SD_, RS, RT);
2727 :function:::void:do_divu:int rs, int rt
2729   check_div_hilo (SD_, HIHISTORY, LOHISTORY);
2730   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2731   {
2732     uint32_t n = GPR[rs];
2733     uint32_t d = GPR[rt];
2734     if (d == 0)
2735       {
2736         LO = EXTEND32 (0x80000000);
2737         HI = EXTEND32 (0);
2738       }
2739     else
2740       {
2741         LO = EXTEND32 (n / d);
2742         HI = EXTEND32 (n % d);
2743       }
2744   }
2745   TRACE_ALU_RESULT2 (HI, LO);
2748 000000,5.RS,5.RT,0000000000,011011:SPECIAL:32::DIVU
2749 "divu r<RS>, r<RT>"
2750 *mipsI:
2751 *mipsII:
2752 *mipsIII:
2753 *mipsIV:
2754 *mipsV:
2755 *mips32:
2756 *mips32r2:
2757 *mips64:
2758 *mips64r2:
2759 *vr4100:
2760 *vr5000:
2761 *r3900:
2763   do_divu (SD_, RS, RT);
2767 :function:::void:do_dmultx:int rs, int rt, int rd, int signed_p
2769   uint64_t lo;
2770   uint64_t hi;
2771   uint64_t m00;
2772   uint64_t m01;
2773   uint64_t m10;
2774   uint64_t m11;
2775   uint64_t mid;
2776   int sign;
2777   uint64_t op1 = GPR[rs];
2778   uint64_t op2 = GPR[rt];
2779   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2780   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2781   /* make signed multiply unsigned */
2782   sign = 0;
2783   if (signed_p)
2784     {
2785       if ((int64_t) op1 < 0)
2786         {
2787           op1 = - op1;
2788           ++sign;
2789         }
2790       if ((int64_t) op2 < 0)
2791         {
2792           op2 = - op2;
2793           ++sign;
2794         }
2795     }
2796   /* multiply out the 4 sub products */
2797   m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2));
2798   m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2));
2799   m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2));
2800   m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2));
2801   /* add the products */
2802   mid = ((uint64_t) VH4_8 (m00)
2803          + (uint64_t) VL4_8 (m10)
2804          + (uint64_t) VL4_8 (m01));
2805   lo = U8_4 (mid, m00);
2806   hi = (m11
2807         + (uint64_t) VH4_8 (mid)
2808         + (uint64_t) VH4_8 (m01)
2809         + (uint64_t) VH4_8 (m10));
2810   /* fix the sign */
2811   if (sign & 1)
2812     {
2813       lo = -lo;
2814       if (lo == 0)
2815         hi = -hi;
2816       else
2817         hi = -hi - 1;
2818     }
2819   /* save the result HI/LO (and a gpr) */
2820   LO = lo;
2821   HI = hi;
2822   if (rd != 0)
2823     GPR[rd] = lo;
2824   TRACE_ALU_RESULT2 (HI, LO);
2827 :function:::void:do_dmult:int rs, int rt, int rd
2829   do_dmultx (SD_, rs, rt, rd, 1);
2832 000000,5.RS,5.RT,0000000000,011100:SPECIAL:64::DMULT
2833 "dmult r<RS>, r<RT>"
2834 *mipsIII:
2835 *mipsIV:
2836 *mipsV:
2837 *mips64:
2838 *mips64r2:
2839 *vr4100:
2841   check_u64 (SD_, instruction_0);
2842   do_dmult (SD_, RS, RT, 0);
2845 000000,5.RS,5.RT,5.RD,00000,011100:SPECIAL:64::DMULT
2846 "dmult r<RS>, r<RT>":RD == 0
2847 "dmult r<RD>, r<RS>, r<RT>"
2848 *vr5000:
2850   check_u64 (SD_, instruction_0);
2851   do_dmult (SD_, RS, RT, RD);
2856 :function:::void:do_dmultu:int rs, int rt, int rd
2858   do_dmultx (SD_, rs, rt, rd, 0);
2861 000000,5.RS,5.RT,0000000000,011101:SPECIAL:64::DMULTU
2862 "dmultu r<RS>, r<RT>"
2863 *mipsIII:
2864 *mipsIV:
2865 *mipsV:
2866 *mips64:
2867 *mips64r2:
2868 *vr4100:
2870   check_u64 (SD_, instruction_0);
2871   do_dmultu (SD_, RS, RT, 0);
2874 000000,5.RS,5.RT,5.RD,00000,011101:SPECIAL:64::DMULTU
2875 "dmultu r<RD>, r<RS>, r<RT>":RD == 0
2876 "dmultu r<RS>, r<RT>"
2877 *vr5000:
2879   check_u64 (SD_, instruction_0);
2880   do_dmultu (SD_, RS, RT, RD);
2884 :function:::uint64_t:do_dror:uint64_t x,uint64_t y
2886   uint64_t result;
2888   y &= 63;
2889   TRACE_ALU_INPUT2 (x, y);
2890   result = ROTR64 (x, y);
2891   TRACE_ALU_RESULT (result);
2892   return result;
2895 000000,00001,5.RT,5.RD,5.SHIFT,111010::64::DROR
2896 "dror r<RD>, r<RT>, <SHIFT>"
2897 *mips64r2:
2898 *mips64r6:
2899 *vr5400:
2900 *vr5500:
2902   check_u64 (SD_, instruction_0);
2903   GPR[RD] = do_dror (SD_, GPR[RT], SHIFT);
2906 000000,00001,5.RT,5.RD,5.SHIFT,111110::64::DROR32
2907 "dror32 r<RD>, r<RT>, <SHIFT>"
2908 *mips64r2:
2909 *mips64r6:
2910 *vr5400:
2911 *vr5500:
2913   check_u64 (SD_, instruction_0);
2914   GPR[RD] = do_dror (SD_, GPR[RT], SHIFT + 32);
2917 000000,5.RS,5.RT,5.RD,00001,010110::64::DRORV
2918 "drorv r<RD>, r<RT>, r<RS>"
2919 *mips64r2:
2920 *mips64r6:
2921 *vr5400:
2922 *vr5500:
2924   check_u64 (SD_, instruction_0);
2925   GPR[RD] = do_dror (SD_, GPR[RT], GPR[RS]);
2929 :function:::void:do_dsll:int rt, int rd, int shift
2931   TRACE_ALU_INPUT2 (GPR[rt], shift);
2932   GPR[rd] = GPR[rt] << shift;
2933   TRACE_ALU_RESULT (GPR[rd]);
2936 000000,00000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
2937 "dsll r<RD>, r<RT>, <SHIFT>"
2938 *mipsIII:
2939 *mipsIV:
2940 *mipsV:
2941 *mips64:
2942 *mips64r2:
2943 *mips64r6:
2944 *vr4100:
2945 *vr5000:
2947   check_u64 (SD_, instruction_0);
2948   do_dsll (SD_, RT, RD, SHIFT);
2952 000000,00000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
2953 "dsll32 r<RD>, r<RT>, <SHIFT>"
2954 *mipsIII:
2955 *mipsIV:
2956 *mipsV:
2957 *mips64:
2958 *mips64r2:
2959 *mips64r6:
2960 *vr4100:
2961 *vr5000:
2963   check_u64 (SD_, instruction_0);
2964   do_dsll32 (SD_, RD, RT, SHIFT);
2967 :function:::void:do_dsllv:int rs, int rt, int rd
2969   int s = MASKED64 (GPR[rs], 5, 0);
2970   TRACE_ALU_INPUT2 (GPR[rt], s);
2971   GPR[rd] = GPR[rt] << s;
2972   TRACE_ALU_RESULT (GPR[rd]);
2975 000000,5.RS,5.RT,5.RD,00000,010100:SPECIAL:64::DSLLV
2976 "dsllv r<RD>, r<RT>, r<RS>"
2977 *mipsIII:
2978 *mipsIV:
2979 *mipsV:
2980 *mips64:
2981 *mips64r2:
2982 *mips64r6:
2983 *vr4100:
2984 *vr5000:
2986   check_u64 (SD_, instruction_0);
2987   do_dsllv (SD_, RS, RT, RD);
2990 :function:::void:do_dsra:int rt, int rd, int shift
2992   TRACE_ALU_INPUT2 (GPR[rt], shift);
2993   GPR[rd] = ((int64_t) GPR[rt]) >> shift;
2994   TRACE_ALU_RESULT (GPR[rd]);
2998 000000,00000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
2999 "dsra r<RD>, r<RT>, <SHIFT>"
3000 *mipsIII:
3001 *mipsIV:
3002 *mipsV:
3003 *mips64:
3004 *mips64r2:
3005 *mips64r6:
3006 *vr4100:
3007 *vr5000:
3009   check_u64 (SD_, instruction_0);
3010   do_dsra (SD_, RT, RD, SHIFT);
3014 000000,00000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
3015 "dsra32 r<RD>, r<RT>, <SHIFT>"
3016 *mipsIII:
3017 *mipsIV:
3018 *mipsV:
3019 *mips64:
3020 *mips64r2:
3021 *mips64r6:
3022 *vr4100:
3023 *vr5000:
3025   check_u64 (SD_, instruction_0);
3026   do_dsra32 (SD_, RD, RT, SHIFT);
3030 :function:::void:do_dsrav:int rs, int rt, int rd
3032   int s = MASKED64 (GPR[rs], 5, 0);
3033   TRACE_ALU_INPUT2 (GPR[rt], s);
3034   GPR[rd] = ((int64_t) GPR[rt]) >> s;
3035   TRACE_ALU_RESULT (GPR[rd]);
3038 000000,5.RS,5.RT,5.RD,00000,010111:SPECIAL:64::DSRAV
3039 "dsrav r<RD>, r<RT>, r<RS>"
3040 *mipsIII:
3041 *mipsIV:
3042 *mipsV:
3043 *mips64:
3044 *mips64r2:
3045 *mips64r6:
3046 *vr4100:
3047 *vr5000:
3049   check_u64 (SD_, instruction_0);
3050   do_dsrav (SD_, RS, RT, RD);
3053 :function:::void:do_dsrl:int rt, int rd, int shift
3055   TRACE_ALU_INPUT2 (GPR[rt], shift);
3056   GPR[rd] = (uint64_t) GPR[rt] >> shift;
3057   TRACE_ALU_RESULT (GPR[rd]);
3061 000000,00000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
3062 "dsrl r<RD>, r<RT>, <SHIFT>"
3063 *mipsIII:
3064 *mipsIV:
3065 *mipsV:
3066 *mips64:
3067 *mips64r2:
3068 *mips64r6:
3069 *vr4100:
3070 *vr5000:
3072   check_u64 (SD_, instruction_0);
3073   do_dsrl (SD_, RT, RD, SHIFT);
3077 000000,00000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
3078 "dsrl32 r<RD>, r<RT>, <SHIFT>"
3079 *mipsIII:
3080 *mipsIV:
3081 *mipsV:
3082 *mips64:
3083 *mips64r2:
3084 *mips64r6:
3085 *vr4100:
3086 *vr5000:
3088   check_u64 (SD_, instruction_0);
3089   do_dsrl32 (SD_, RD, RT, SHIFT);
3093 :function:::void:do_dsrlv:int rs, int rt, int rd
3095   int s = MASKED64 (GPR[rs], 5, 0);
3096   TRACE_ALU_INPUT2 (GPR[rt], s);
3097   GPR[rd] = (uint64_t) GPR[rt] >> s;
3098   TRACE_ALU_RESULT (GPR[rd]);
3103 000000,5.RS,5.RT,5.RD,00000,010110:SPECIAL:64::DSRLV
3104 "dsrlv r<RD>, r<RT>, r<RS>"
3105 *mipsIII:
3106 *mipsIV:
3107 *mipsV:
3108 *mips64:
3109 *mips64r2:
3110 *mips64r6:
3111 *vr4100:
3112 *vr5000:
3114   check_u64 (SD_, instruction_0);
3115   do_dsrlv (SD_, RS, RT, RD);
3119 000000,5.RS,5.RT,5.RD,00000,101110:SPECIAL:64::DSUB
3120 "dsub r<RD>, r<RS>, r<RT>"
3121 *mipsIII:
3122 *mipsIV:
3123 *mipsV:
3124 *mips64:
3125 *mips64r2:
3126 *mips64r6:
3127 *vr4100:
3128 *vr5000:
3130   check_u64 (SD_, instruction_0);
3131   do_dsub (SD_, RD, RS, RT);
3135 :function:::void:do_dsubu:int rs, int rt, int rd
3137   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3138   GPR[rd] = GPR[rs] - GPR[rt];
3139   TRACE_ALU_RESULT (GPR[rd]);
3142 000000,5.RS,5.RT,5.RD,00000,101111:SPECIAL:64::DSUBU
3143 "dsubu r<RD>, r<RS>, r<RT>"
3144 *mipsIII:
3145 *mipsIV:
3146 *mipsV:
3147 *mips64:
3148 *mips64r2:
3149 *mips64r6:
3150 *vr4100:
3151 *vr5000:
3153   check_u64 (SD_, instruction_0);
3154   do_dsubu (SD_, RS, RT, RD);
3158 000010,26.INSTR_INDEX:NORMAL:32::J
3159 "j <INSTR_INDEX>"
3160 *mipsI:
3161 *mipsII:
3162 *mipsIII:
3163 *mipsIV:
3164 *mipsV:
3165 *mips32:
3166 *mips32r2:
3167 *mips32r6:
3168 *mips64:
3169 *mips64r2:
3170 *mips64r6:
3171 *vr4100:
3172 *vr5000:
3173 *r3900:
3175   /* NOTE: The region used is that of the delay slot NIA and NOT the
3176      current instruction */
3177   address_word region = (NIA & MASK (63, 28));
3178   DELAY_SLOT (region | (INSTR_INDEX << 2));
3182 000011,26.INSTR_INDEX:NORMAL:32::JAL
3183 "jal <INSTR_INDEX>"
3184 *mipsI:
3185 *mipsII:
3186 *mipsIII:
3187 *mipsIV:
3188 *mipsV:
3189 *mips32:
3190 *mips32r2:
3191 *mips32r6:
3192 *mips64:
3193 *mips64r2:
3194 *mips64r6:
3195 *vr4100:
3196 *vr5000:
3197 *r3900:
3199   /* NOTE: The region used is that of the delay slot and NOT the
3200      current instruction */
3201   address_word region = (NIA & MASK (63, 28));
3202   GPR[31] = CIA + 8;
3203   DELAY_SLOT (region | (INSTR_INDEX << 2));
3206 000000,5.RS,00000,5.RD,00000,001001:SPECIAL:32::JALR
3207 "jalr r<RS>":RD == 31
3208 "jalr r<RD>, r<RS>"
3209 *mipsI:
3210 *mipsII:
3211 *mipsIII:
3212 *mipsIV:
3213 *mipsV:
3214 *mips32:
3215 *mips32r2:
3216 *mips32r6:
3217 *mips64:
3218 *mips64r2:
3219 *mips64r6:
3220 *vr4100:
3221 *vr5000:
3222 *r3900:
3224   address_word temp = GPR[RS];
3225   GPR[RD] = CIA + 8;
3226   DELAY_SLOT (temp);
3229 000000,5.RS,00000,5.RD,10000,001001:SPECIAL:32::JALR_HB
3230 "jalr.hb r<RS>":RD == 31
3231 "jalr.hb r<RD>, r<RS>"
3232 *mips32r2:
3233 *mips32r6:
3234 *mips64r2:
3235 *mips64r6:
3237   address_word temp = GPR[RS];
3238   GPR[RD] = CIA + 8;
3239   DELAY_SLOT (temp);
3242 000000,5.RS,0000000000,00000,001000:SPECIAL:32::JR
3243 "jr r<RS>"
3244 *mipsI:
3245 *mipsII:
3246 *mipsIII:
3247 *mipsIV:
3248 *mipsV:
3249 *mips32:
3250 *mips32r2:
3251 *mips32r6:
3252 *mips64:
3253 *mips64r2:
3254 *mips64r6:
3255 *vr4100:
3256 *vr5000:
3257 *r3900:
3259   DELAY_SLOT (GPR[RS]);
3262 000000,5.RS,0000000000,10000,001000:SPECIAL:32::JR_HB
3263 "jr.hb r<RS>"
3264 *mips32r2:
3265 *mips32r6:
3266 *mips64r2:
3267 *mips64r6:
3269   DELAY_SLOT (GPR[RS]);
3272 :function:::unsigned_word:do_load:unsigned access, address_word base, address_word offset
3274   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3275   address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
3276   address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
3277   unsigned int byte;
3278   address_word paddr;
3279   uint64_t memval;
3280   address_word vaddr;
3282   paddr = vaddr = loadstore_ea (SD_, base, offset);
3283   if ((vaddr & access) != 0)
3284     {
3285       SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, access+1, vaddr, read_transfer, sim_core_unaligned_signal);
3286     }
3287   paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
3288   LoadMemory (&memval, NULL, access, paddr, vaddr, isDATA, isREAL);
3289   byte = ((vaddr & mask) ^ bigendiancpu);
3290   return (memval >> (8 * byte));
3293 :function:::unsigned_word:do_load_left:unsigned access, address_word base, address_word offset, unsigned_word rt
3295   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3296   address_word reverseendian = (ReverseEndian ? -1 : 0);
3297   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
3298   unsigned int byte;
3299   unsigned int word;
3300   address_word paddr;
3301   uint64_t memval;
3302   address_word vaddr;
3303   int nr_lhs_bits;
3304   int nr_rhs_bits;
3305   unsigned_word lhs_mask;
3306   unsigned_word temp;
3308   paddr = vaddr = loadstore_ea (SD_, base, offset);
3309   paddr = (paddr ^ (reverseendian & mask));
3310   if (BigEndianMem == 0)
3311     paddr = paddr & ~access;
3313   /* compute where within the word/mem we are */
3314   byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
3315   word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
3316   nr_lhs_bits = 8 * byte + 8;
3317   nr_rhs_bits = 8 * access - 8 * byte;
3318   /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
3320   /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
3321            (long) ((uint64_t) vaddr >> 32), (long) vaddr,
3322            (long) ((uint64_t) paddr >> 32), (long) paddr,
3323            word, byte, nr_lhs_bits, nr_rhs_bits); */
3325   LoadMemory (&memval, NULL, byte, paddr, vaddr, isDATA, isREAL);
3326   if (word == 0)
3327     {
3328       /* GPR{31..32-NR_LHS_BITS} = memval{NR_LHS_BITS-1..0} */
3329       temp = (memval << nr_rhs_bits);
3330     }
3331   else
3332     {
3333       /* GPR{31..32-NR_LHS_BITS = memval{32+NR_LHS_BITS..32} */
3334       temp = (memval >> nr_lhs_bits);
3335     }
3336   lhs_mask = LSMASK (nr_lhs_bits + nr_rhs_bits - 1, nr_rhs_bits);
3337   rt = (rt & ~lhs_mask) | (temp & lhs_mask);
3339   /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx & 0x%08lx%08lx -> 0x%08lx%08lx\n",
3340            (long) ((uint64_t) memval >> 32), (long) memval,
3341            (long) ((uint64_t) temp >> 32), (long) temp,
3342            (long) ((uint64_t) lhs_mask >> 32), (long) lhs_mask,
3343            (long) (rt >> 32), (long) rt); */
3344   return rt;
3347 :function:::unsigned_word:do_load_right:unsigned access, address_word base, address_word offset, unsigned_word rt
3349   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3350   address_word reverseendian = (ReverseEndian ? -1 : 0);
3351   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
3352   unsigned int byte;
3353   address_word paddr;
3354   uint64_t memval;
3355   address_word vaddr;
3357   paddr = vaddr = loadstore_ea (SD_, base, offset);
3358   /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */
3359   paddr = (paddr ^ (reverseendian & mask));
3360   if (BigEndianMem != 0)
3361     paddr = paddr & ~access;
3362   byte = ((vaddr & mask) ^ (bigendiancpu & mask));
3363   /* NOTE: SPEC is wrong, had `byte' not `access - byte'.  See SW. */
3364   LoadMemory (&memval, NULL, access - (access & byte), paddr, vaddr, isDATA, isREAL);
3365   /* printf ("lr: 0x%08lx %d@0x%08lx 0x%08lx\n",
3366      (long) paddr, byte, (long) paddr, (long) memval); */
3367   {
3368     unsigned_word screen = LSMASK (8 * (access - (byte & access) + 1) - 1, 0);
3369     rt &= ~screen;
3370     rt |= (memval >> (8 * byte)) & screen;
3371   }
3372   return rt;
3376 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
3377 "lb r<RT>, <OFFSET>(r<BASE>)"
3378 *mipsI:
3379 *mipsII:
3380 *mipsIII:
3381 *mipsIV:
3382 *mipsV:
3383 *mips32:
3384 *mips32r2:
3385 *mips32r6:
3386 *mips64:
3387 *mips64r2:
3388 *mips64r6:
3389 *vr4100:
3390 *vr5000:
3391 *r3900:
3393   do_lb (SD_,RT,OFFSET,BASE);
3397 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
3398 "lbu r<RT>, <OFFSET>(r<BASE>)"
3399 *mipsI:
3400 *mipsII:
3401 *mipsIII:
3402 *mipsIV:
3403 *mipsV:
3404 *mips32:
3405 *mips32r2:
3406 *mips32r6:
3407 *mips64:
3408 *mips64r2:
3409 *mips64r6:
3410 *vr4100:
3411 *vr5000:
3412 *r3900:
3414   do_lbu (SD_, RT,OFFSET,BASE);
3418 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
3419 "ld r<RT>, <OFFSET>(r<BASE>)"
3420 *mipsIII:
3421 *mipsIV:
3422 *mipsV:
3423 *mips64:
3424 *mips64r2:
3425 *mips64r6:
3426 *vr4100:
3427 *vr5000:
3429   check_u64 (SD_, instruction_0);
3430   GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
3434 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
3435 "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3436 *mipsII:
3437 *mipsIII:
3438 *mipsIV:
3439 *mipsV:
3440 *mips32:
3441 *mips32r2:
3442 *mips64:
3443 *mips64r2:
3444 *vr4100:
3445 *vr5000:
3446 *r3900:
3448   do_ldc (SD_, ZZ, RT, OFFSET, BASE);
3454 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
3455 "ldl r<RT>, <OFFSET>(r<BASE>)"
3456 *mipsIII:
3457 *mipsIV:
3458 *mipsV:
3459 *mips64:
3460 *mips64r2:
3461 *vr4100:
3462 *vr5000:
3464   check_u64 (SD_, instruction_0);
3465   GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3469 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
3470 "ldr r<RT>, <OFFSET>(r<BASE>)"
3471 *mipsIII:
3472 *mipsIV:
3473 *mipsV:
3474 *mips64:
3475 *mips64r2:
3476 *vr4100:
3477 *vr5000:
3479   check_u64 (SD_, instruction_0);
3480   GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3484 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
3485 "lh r<RT>, <OFFSET>(r<BASE>)"
3486 *mipsI:
3487 *mipsII:
3488 *mipsIII:
3489 *mipsIV:
3490 *mipsV:
3491 *mips32:
3492 *mips32r2:
3493 *mips32r6:
3494 *mips64:
3495 *mips64r2:
3496 *mips64r6:
3497 *vr4100:
3498 *vr5000:
3499 *r3900:
3501   do_lh (SD_,RT,OFFSET,BASE);
3505 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
3506 "lhu r<RT>, <OFFSET>(r<BASE>)"
3507 *mipsI:
3508 *mipsII:
3509 *mipsIII:
3510 *mipsIV:
3511 *mipsV:
3512 *mips32:
3513 *mips32r2:
3514 *mips32r6:
3515 *mips64:
3516 *mips64r2:
3517 *mips64r6:
3518 *vr4100:
3519 *vr5000:
3520 *r3900:
3522   do_lhu (SD_,RT,OFFSET,BASE);
3526 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
3527 "ll r<RT>, <OFFSET>(r<BASE>)"
3528 *mipsII:
3529 *mipsIII:
3530 *mipsIV:
3531 *mipsV:
3532 *mips32:
3533 *mips32r2:
3534 *mips64:
3535 *mips64r2:
3536 *vr4100:
3537 *vr5000:
3539   do_ll (SD_, RT, OFFSET, BASE);
3543 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
3544 "lld r<RT>, <OFFSET>(r<BASE>)"
3545 *mipsIII:
3546 *mipsIV:
3547 *mipsV:
3548 *mips64:
3549 *mips64r2:
3550 *vr4100:
3551 *vr5000:
3553   check_u64 (SD_, instruction_0);
3554   do_lld (SD_, RT, OFFSET, BASE);
3558 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
3559 "lui r<RT>, %#lx<IMMEDIATE>"
3560 *mipsI:
3561 *mipsII:
3562 *mipsIII:
3563 *mipsIV:
3564 *mipsV:
3565 *mips32:
3566 *mips32r2:
3567 *mips32r6:
3568 *mips64:
3569 *mips64r2:
3570 *mips64r6:
3571 *vr4100:
3572 *vr5000:
3573 *r3900:
3575   do_lui (SD_, RT, IMMEDIATE);
3579 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
3580 "lw r<RT>, <OFFSET>(r<BASE>)"
3581 *mipsI:
3582 *mipsII:
3583 *mipsIII:
3584 *mipsIV:
3585 *mipsV:
3586 *mips32:
3587 *mips32r2:
3588 *mips32r6:
3589 *mips64:
3590 *mips64r2:
3591 *mips64r6:
3592 *vr4100:
3593 *vr5000:
3594 *r3900:
3596   do_lw (SD_,RT,OFFSET,BASE);
3600 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
3601 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3602 *mipsI:
3603 *mipsII:
3604 *mipsIII:
3605 *mipsIV:
3606 *mipsV:
3607 *mips32:
3608 *mips32r2:
3609 *mips64:
3610 *mips64r2:
3611 *vr4100:
3612 *vr5000:
3613 *r3900:
3615   do_lwc (SD_, ZZ, RT, OFFSET, BASE);
3619 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
3620 "lwl r<RT>, <OFFSET>(r<BASE>)"
3621 *mipsI:
3622 *mipsII:
3623 *mipsIII:
3624 *mipsIV:
3625 *mipsV:
3626 *mips32:
3627 *mips32r2:
3628 *mips64:
3629 *mips64r2:
3630 *vr4100:
3631 *vr5000:
3632 *r3900:
3634   do_lwl (SD_, RT, OFFSET, BASE);
3638 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
3639 "lwr r<RT>, <OFFSET>(r<BASE>)"
3640 *mipsI:
3641 *mipsII:
3642 *mipsIII:
3643 *mipsIV:
3644 *mipsV:
3645 *mips32:
3646 *mips32r2:
3647 *mips64:
3648 *mips64r2:
3649 *vr4100:
3650 *vr5000:
3651 *r3900:
3653   do_lwr (SD_, RT, OFFSET, BASE);
3657 100111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LWU
3658 "lwu r<RT>, <OFFSET>(r<BASE>)"
3659 *mipsIII:
3660 *mipsIV:
3661 *mipsV:
3662 *mips64:
3663 *mips64r2:
3664 *mips64r6:
3665 *vr4100:
3666 *vr5000:
3668   do_lwu (SD_, RT, OFFSET, BASE, instruction_0);
3673 011100,5.RS,5.RT,00000,00000,000000:SPECIAL2:32::MADD
3674 "madd r<RS>, r<RT>"
3675 *mips32:
3676 *mips64:
3677 *vr5500:
3679   do_madd (SD_, RS, RT);
3683 011100,5.RS,5.RT,000,2.AC,00000,000000:SPECIAL2:32::MADD
3684 "madd r<RS>, r<RT>":AC == 0
3685 "madd ac<AC>, r<RS>, r<RT>"
3686 *mips32r2:
3687 *mips64r2:
3688 *dsp2:
3690   do_dsp_madd (SD_, AC, RS, RT);
3694 011100,5.RS,5.RT,00000,00000,000001:SPECIAL2:32::MADDU
3695 "maddu r<RS>, r<RT>"
3696 *mips32:
3697 *mips64:
3698 *vr5500:
3700   do_maddu (SD_, RS, RT);
3704 011100,5.RS,5.RT,000,2.AC,00000,000001:SPECIAL2:32::MADDU
3705 "maddu r<RS>, r<RT>":AC == 0
3706 "maddu ac<AC>, r<RS>, r<RT>"
3707 *mips32r2:
3708 *mips64r2:
3709 *dsp2:
3711   do_dsp_maddu (SD_, AC, RS, RT);
3715 :function:::void:do_mfhi:int rd
3717   check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
3718   TRACE_ALU_INPUT1 (HI);
3719   GPR[rd] = HI;
3720   TRACE_ALU_RESULT (GPR[rd]);
3723 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
3724 "mfhi r<RD>"
3725 *mipsI:
3726 *mipsII:
3727 *mipsIII:
3728 *mipsIV:
3729 *mipsV:
3730 *vr4100:
3731 *vr5000:
3732 *r3900:
3733 *mips32:
3734 *mips64:
3736   do_mfhi (SD_, RD);
3740 000000,000,2.AC,00000,5.RD,00000,010000:SPECIAL:32::MFHI
3741 "mfhi r<RD>":AC == 0
3742 "mfhi r<RD>, ac<AC>"
3743 *mips32r2:
3744 *mips64r2:
3745 *dsp:
3747   do_dsp_mfhi (SD_, AC, RD);
3751 :function:::void:do_mflo:int rd
3753   check_mf_hilo (SD_, LOHISTORY, HIHISTORY);
3754   TRACE_ALU_INPUT1 (LO);
3755   GPR[rd] = LO;
3756   TRACE_ALU_RESULT (GPR[rd]);
3759 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
3760 "mflo r<RD>"
3761 *mipsI:
3762 *mipsII:
3763 *mipsIII:
3764 *mipsIV:
3765 *mipsV:
3766 *vr4100:
3767 *vr5000:
3768 *r3900:
3769 *mips32:
3770 *mips64:
3772   do_mflo (SD_, RD);
3776 000000,000,2.AC,00000,5.RD,00000,010010:SPECIAL:32::MFLO
3777 "mflo r<RD>":AC == 0
3778 "mflo r<RD>, ac<AC>"
3779 *mips32r2:
3780 *mips64r2:
3781 *dsp:
3783   do_dsp_mflo (SD_, AC, RD);
3787 000000,5.RS,5.RT,5.RD,00000,001011:SPECIAL:32::MOVN
3788 "movn r<RD>, r<RS>, r<RT>"
3789 *mipsIV:
3790 *mipsV:
3791 *mips32:
3792 *mips32r2:
3793 *mips64:
3794 *mips64r2:
3795 *vr5000:
3797   do_movn (SD_, RD, RS, RT);
3802 000000,5.RS,5.RT,5.RD,00000,001010:SPECIAL:32::MOVZ
3803 "movz r<RD>, r<RS>, r<RT>"
3804 *mipsIV:
3805 *mipsV:
3806 *mips32:
3807 *mips32r2:
3808 *mips64:
3809 *mips64r2:
3810 *vr5000:
3812   do_movz (SD_, RD, RS, RT);
3817 011100,5.RS,5.RT,00000,00000,000100:SPECIAL2:32::MSUB
3818 "msub r<RS>, r<RT>"
3819 *mips32:
3820 *mips64:
3821 *vr5500:
3823   do_msub (SD_, RS, RT);
3827 011100,5.RS,5.RT,000,2.AC,00000,000100:SPECIAL2:32::MSUB
3828 "msub r<RS>, r<RT>":AC == 0
3829 "msub ac<AC>, r<RS>, r<RT>"
3830 *mips32r2:
3831 *mips64r2:
3832 *dsp2:
3834   do_dsp_msub (SD_, AC, RS, RT);
3838 011100,5.RS,5.RT,00000,00000,000101:SPECIAL2:32::MSUBU
3839 "msubu r<RS>, r<RT>"
3840 *mips32:
3841 *mips64:
3842 *vr5500:
3844   do_msubu (SD_, RS, RT);
3848 011100,5.RS,5.RT,000,2.AC,00000,000101:SPECIAL2:32::MSUBU
3849 "msubu r<RS>, r<RT>":AC == 0
3850 "msubu ac<AC>, r<RS>, r<RT>"
3851 *mips32r2:
3852 *mips64r2:
3853 *dsp2:
3855   do_dsp_msubu (SD_, AC, RS, RT);
3859 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
3860 "mthi r<RS>"
3861 *mipsI:
3862 *mipsII:
3863 *mipsIII:
3864 *mipsIV:
3865 *mipsV:
3866 *vr4100:
3867 *vr5000:
3868 *r3900:
3869 *mips32:
3870 *mips64:
3872   do_mthi (SD_, RS);
3876 000000,5.RS,00000,000,2.AC,00000,010001:SPECIAL:32::MTHI
3877 "mthi r<RS>":AC == 0
3878 "mthi r<RS>, ac<AC>"
3879 *mips32r2:
3880 *mips64r2:
3881 *dsp:
3883   do_dsp_mthi (SD_, AC, RS);
3887 000000,5.RS,000000000000000,010011:SPECIAL:32::MTLO
3888 "mtlo r<RS>"
3889 *mipsI:
3890 *mipsII:
3891 *mipsIII:
3892 *mipsIV:
3893 *mipsV:
3894 *vr4100:
3895 *vr5000:
3896 *r3900:
3897 *mips32:
3898 *mips64:
3900   do_mtlo (SD_, RS);
3904 000000,5.RS,00000,000,2.AC,00000,010011:SPECIAL:32::MTLO
3905 "mtlo r<RS>":AC == 0
3906 "mtlo r<RS>, ac<AC>"
3907 *mips32r2:
3908 *mips64r2:
3909 *dsp:
3911   do_dsp_mtlo (SD_, AC, RS);
3915 011100,5.RS,5.RT,5.RD,00000,000010:SPECIAL2:32::MUL
3916 "mul r<RD>, r<RS>, r<RT>"
3917 *mips32:
3918 *mips32r2:
3919 *mips64:
3920 *mips64r2:
3921 *vr5500:
3923   do_mul (SD_, RD, RS, RT);
3928 :function:::void:do_mult:int rs, int rt, int rd
3930   int64_t prod;
3931   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
3932   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
3933     Unpredictable ();
3934   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3935   prod = (((int64_t)(int32_t) GPR[rs])
3936           * ((int64_t)(int32_t) GPR[rt]));
3937   LO = EXTEND32 (VL4_8 (prod));
3938   HI = EXTEND32 (VH4_8 (prod));
3939   ACX = 0;  /* SmartMIPS */
3940   if (rd != 0)
3941     GPR[rd] = LO;
3942   TRACE_ALU_RESULT2 (HI, LO);
3945 000000,5.RS,5.RT,0000000000,011000:SPECIAL:32::MULT
3946 "mult r<RS>, r<RT>"
3947 *mipsI:
3948 *mipsII:
3949 *mipsIII:
3950 *mipsIV:
3951 *mipsV:
3952 *mips32:
3953 *mips64:
3954 *vr4100:
3956   do_mult (SD_, RS, RT, 0);
3960 000000,5.RS,5.RT,000,2.AC,00000,011000:SPECIAL:32::MULT
3961 "mult r<RS>, r<RT>":AC == 0
3962 "mult ac<AC>, r<RS>, r<RT>"
3963 *mips32r2:
3964 *mips64r2:
3965 *dsp2:
3967   do_dsp_mult (SD_, AC, RS, RT);
3971 000000,5.RS,5.RT,5.RD,00000,011000:SPECIAL:32::MULT
3972 "mult r<RS>, r<RT>":RD == 0
3973 "mult r<RD>, r<RS>, r<RT>"
3974 *vr5000:
3975 *r3900:
3977   do_mult (SD_, RS, RT, RD);
3981 :function:::void:do_multu:int rs, int rt, int rd
3983   uint64_t prod;
3984   check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
3985   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
3986     Unpredictable ();
3987   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3988   prod = (((uint64_t)(uint32_t) GPR[rs])
3989           * ((uint64_t)(uint32_t) GPR[rt]));
3990   LO = EXTEND32 (VL4_8 (prod));
3991   HI = EXTEND32 (VH4_8 (prod));
3992   if (rd != 0)
3993     GPR[rd] = LO;
3994   TRACE_ALU_RESULT2 (HI, LO);
3997 000000,5.RS,5.RT,0000000000,011001:SPECIAL:32::MULTU
3998 "multu r<RS>, r<RT>"
3999 *mipsI:
4000 *mipsII:
4001 *mipsIII:
4002 *mipsIV:
4003 *mipsV:
4004 *mips32:
4005 *mips64:
4006 *vr4100:
4008   do_multu (SD_, RS, RT, 0);
4012 000000,5.RS,5.RT,000,2.AC,00000,011001:SPECIAL:32::MULTU
4013 "multu r<RS>, r<RT>":AC == 0
4014 "multu r<RS>, r<RT>"
4015 *mips32r2:
4016 *mips64r2:
4017 *dsp2:
4019   do_dsp_multu (SD_, AC, RS, RT);
4023 000000,5.RS,5.RT,5.RD,00000,011001:SPECIAL:32::MULTU
4024 "multu r<RS>, r<RT>":RD == 0
4025 "multu r<RD>, r<RS>, r<RT>"
4026 *vr5000:
4027 *r3900:
4029   do_multu (SD_, RS, RT, RD);
4033 :function:::void:do_nor:int rs, int rt, int rd
4035   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
4036   GPR[rd] = ~ (GPR[rs] | GPR[rt]);
4037   TRACE_ALU_RESULT (GPR[rd]);
4040 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
4041 "nor r<RD>, r<RS>, r<RT>"
4042 *mipsI:
4043 *mipsII:
4044 *mipsIII:
4045 *mipsIV:
4046 *mipsV:
4047 *mips32:
4048 *mips32r2:
4049 *mips32r6:
4050 *mips64:
4051 *mips64r2:
4052 *mips64r6:
4053 *vr4100:
4054 *vr5000:
4055 *r3900:
4057   do_nor (SD_, RS, RT, RD);
4061 :function:::void:do_or:int rs, int rt, int rd
4063   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
4064   GPR[rd] = (GPR[rs] | GPR[rt]);
4065   TRACE_ALU_RESULT (GPR[rd]);
4068 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
4069 "or r<RD>, r<RS>, r<RT>"
4070 *mipsI:
4071 *mipsII:
4072 *mipsIII:
4073 *mipsIV:
4074 *mipsV:
4075 *mips32:
4076 *mips32r2:
4077 *mips32r6:
4078 *mips64:
4079 *mips64r2:
4080 *mips64r6:
4081 *vr4100:
4082 *vr5000:
4083 *r3900:
4085   do_or (SD_, RS, RT, RD);
4090 :function:::void:do_ori:int rs, int rt, unsigned immediate
4092   TRACE_ALU_INPUT2 (GPR[rs], immediate);
4093   GPR[rt] = (GPR[rs] | immediate);
4094   TRACE_ALU_RESULT (GPR[rt]);
4097 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
4098 "ori r<RT>, r<RS>, %#lx<IMMEDIATE>"
4099 *mipsI:
4100 *mipsII:
4101 *mipsIII:
4102 *mipsIV:
4103 *mipsV:
4104 *mips32:
4105 *mips32r2:
4106 *mips32r6:
4107 *mips64:
4108 *mips64r2:
4109 *mips64r6:
4110 *vr4100:
4111 *vr5000:
4112 *r3900:
4114   do_ori (SD_, RS, RT, IMMEDIATE);
4118 110011,5.BASE,5.HINT,16.OFFSET:NORMAL:32::PREF
4119 "pref <HINT>, <OFFSET>(r<BASE>)"
4120 *mipsIV:
4121 *mipsV:
4122 *mips32:
4123 *mips32r2:
4124 *mips64:
4125 *mips64r2:
4126 *vr5000:
4128   do_pref (SD_, HINT, OFFSET, BASE);
4132 :function:::uint64_t:do_ror:uint32_t x,uint32_t y
4134   uint64_t result;
4136   y &= 31;
4137   TRACE_ALU_INPUT2 (x, y);
4138   result = EXTEND32 (ROTR32 (x, y));
4139   TRACE_ALU_RESULT (result);
4140   return result;
4143 000000,00001,5.RT,5.RD,5.SHIFT,000010::32::ROR
4144 "ror r<RD>, r<RT>, <SHIFT>"
4145 *mips32r2:
4146 *mips32r6:
4147 *mips64r2:
4148 *mips64r6:
4149 *smartmips:
4150 *vr5400:
4151 *vr5500:
4153   GPR[RD] = do_ror (SD_, GPR[RT], SHIFT);
4156 000000,5.RS,5.RT,5.RD,00001,000110::32::RORV
4157 "rorv r<RD>, r<RT>, r<RS>"
4158 *mips32r2:
4159 *mips32r6:
4160 *mips64r2:
4161 *mips64r6:
4162 *smartmips:
4163 *vr5400:
4164 *vr5500:
4166   GPR[RD] = do_ror (SD_, GPR[RT], GPR[RS]);
4170 :function:::void:do_store:unsigned access, address_word base, address_word offset, unsigned_word word
4172   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
4173   address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
4174   address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
4175   unsigned int byte;
4176   address_word paddr;
4177   uint64_t memval;
4178   address_word vaddr;
4180   paddr = vaddr = loadstore_ea (SD_, base, offset);
4181   if ((vaddr & access) != 0)
4182     {
4183       SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, access+1, vaddr, write_transfer, sim_core_unaligned_signal);
4184     }
4185   paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
4186   byte = ((vaddr & mask) ^ bigendiancpu);
4187   memval = (word << (8 * byte));
4188   StoreMemory (access, memval, 0, paddr, vaddr, isREAL);
4191 :function:::void:do_store_left:unsigned access, address_word base, address_word offset, unsigned_word rt
4193   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
4194   address_word reverseendian = (ReverseEndian ? -1 : 0);
4195   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
4196   unsigned int byte;
4197   unsigned int word;
4198   address_word paddr;
4199   uint64_t memval;
4200   address_word vaddr;
4201   int nr_lhs_bits;
4202   int nr_rhs_bits;
4204   paddr = vaddr = loadstore_ea (SD_, base, offset);
4205   paddr = (paddr ^ (reverseendian & mask));
4206   if (BigEndianMem == 0)
4207     paddr = paddr & ~access;
4209   /* compute where within the word/mem we are */
4210   byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
4211   word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
4212   nr_lhs_bits = 8 * byte + 8;
4213   nr_rhs_bits = 8 * access - 8 * byte;
4214   /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
4215   /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
4216            (long) ((uint64_t) vaddr >> 32), (long) vaddr,
4217            (long) ((uint64_t) paddr >> 32), (long) paddr,
4218            word, byte, nr_lhs_bits, nr_rhs_bits); */
4220   if (word == 0)
4221     {
4222       memval = (rt >> nr_rhs_bits);
4223     }
4224   else
4225     {
4226       memval = (rt << nr_lhs_bits);
4227     }
4228   /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx\n",
4229            (long) ((uint64_t) rt >> 32), (long) rt,
4230            (long) ((uint64_t) memval >> 32), (long) memval); */
4231   StoreMemory (byte, memval, 0, paddr, vaddr, isREAL);
4234 :function:::void:do_store_right:unsigned access, address_word base, address_word offset, unsigned_word rt
4236   address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
4237   address_word reverseendian = (ReverseEndian ? -1 : 0);
4238   address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
4239   unsigned int byte;
4240   address_word paddr;
4241   uint64_t memval;
4242   address_word vaddr;
4244   paddr = vaddr = loadstore_ea (SD_, base, offset);
4245   paddr = (paddr ^ (reverseendian & mask));
4246   if (BigEndianMem != 0)
4247     paddr &= ~access;
4248   byte = ((vaddr & mask) ^ (bigendiancpu & mask));
4249   memval = (rt << (byte * 8));
4250   StoreMemory (access - (access & byte), memval, 0, paddr, vaddr, isREAL);
4254 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
4255 "sb r<RT>, <OFFSET>(r<BASE>)"
4256 *mipsI:
4257 *mipsII:
4258 *mipsIII:
4259 *mipsIV:
4260 *mipsV:
4261 *mips32:
4262 *mips32r2:
4263 *mips32r6:
4264 *mips64:
4265 *mips64r2:
4266 *mips64r6:
4267 *vr4100:
4268 *vr5000:
4269 *r3900:
4271   do_store (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
4275 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
4276 "sc r<RT>, <OFFSET>(r<BASE>)"
4277 *mipsII:
4278 *mipsIII:
4279 *mipsIV:
4280 *mipsV:
4281 *mips32:
4282 *mips32r2:
4283 *mips64:
4284 *mips64r2:
4285 *vr4100:
4286 *vr5000:
4288   do_sc (SD_, RT, OFFSET, BASE, instruction_0, 1);
4292 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
4293 "scd r<RT>, <OFFSET>(r<BASE>)"
4294 *mipsIII:
4295 *mipsIV:
4296 *mipsV:
4297 *mips64:
4298 *mips64r2:
4299 *vr4100:
4300 *vr5000:
4302   check_u64 (SD_, instruction_0);
4303   do_scd (SD_, RT, OFFSET, BASE, 1);
4307 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
4308 "sd r<RT>, <OFFSET>(r<BASE>)"
4309 *mipsIII:
4310 *mipsIV:
4311 *mipsV:
4312 *mips64:
4313 *mips64r2:
4314 *mips64r6:
4315 *vr4100:
4316 *vr5000:
4318   check_u64 (SD_, instruction_0);
4319   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
4323 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
4324 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
4325 *mipsII:
4326 *mipsIII:
4327 *mipsIV:
4328 *mipsV:
4329 *mips32:
4330 *mips32r2:
4331 *mips64:
4332 *mips64r2:
4333 *vr4100:
4334 *vr5000:
4336   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (ZZ, RT));
4340 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
4341 "sdl r<RT>, <OFFSET>(r<BASE>)"
4342 *mipsIII:
4343 *mipsIV:
4344 *mipsV:
4345 *mips64:
4346 *mips64r2:
4347 *vr4100:
4348 *vr5000:
4350   check_u64 (SD_, instruction_0);
4351   do_store_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
4355 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
4356 "sdr r<RT>, <OFFSET>(r<BASE>)"
4357 *mipsIII:
4358 *mipsIV:
4359 *mipsV:
4360 *mips64:
4361 *mips64r2:
4362 *vr4100:
4363 *vr5000:
4365   check_u64 (SD_, instruction_0);
4366   do_store_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
4371 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
4372 "sh r<RT>, <OFFSET>(r<BASE>)"
4373 *mipsI:
4374 *mipsII:
4375 *mipsIII:
4376 *mipsIV:
4377 *mipsV:
4378 *mips32:
4379 *mips32r2:
4380 *mips32r6:
4381 *mips64:
4382 *mips64r2:
4383 *mips64r6:
4384 *vr4100:
4385 *vr5000:
4386 *r3900:
4388   do_store (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
4392 :function:::void:do_sll:int rt, int rd, int shift
4394   uint32_t temp = (GPR[rt] << shift);
4395   TRACE_ALU_INPUT2 (GPR[rt], shift);
4396   GPR[rd] = EXTEND32 (temp);
4397   TRACE_ALU_RESULT (GPR[rd]);
4400 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLa
4401 "nop":RD == 0 && RT == 0 && SHIFT == 0
4402 "sll r<RD>, r<RT>, <SHIFT>"
4403 *mipsI:
4404 *mipsII:
4405 *mipsIII:
4406 *mipsIV:
4407 *mipsV:
4408 *vr4100:
4409 *vr5000:
4410 *r3900:
4412   /* Skip shift for NOP, so that there won't be lots of extraneous
4413      trace output.  */
4414   if (RD != 0 || RT != 0 || SHIFT != 0)
4415     do_sll (SD_, RT, RD, SHIFT);
4418 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLb
4419 "nop":RD == 0 && RT == 0 && SHIFT == 0
4420 "ssnop":RD == 0 && RT == 0 && SHIFT == 1
4421 "ehb":RD == 0 && RT == 0 && SHIFT == 3
4422 "sll r<RD>, r<RT>, <SHIFT>"
4423 *mips32:
4424 *mips32r2:
4425 *mips32r6:
4426 *mips64:
4427 *mips64r2:
4428 *mips64r6:
4430   do_sll (SD_, RT, RD, SHIFT);
4434 :function:::void:do_sllv:int rs, int rt, int rd
4436   int s = MASKED (GPR[rs], 4, 0);
4437   uint32_t temp = (GPR[rt] << s);
4438   TRACE_ALU_INPUT2 (GPR[rt], s);
4439   GPR[rd] = EXTEND32 (temp);
4440   TRACE_ALU_RESULT (GPR[rd]);
4443 000000,5.RS,5.RT,5.RD,00000,000100:SPECIAL:32::SLLV
4444 "sllv r<RD>, r<RT>, r<RS>"
4445 *mipsI:
4446 *mipsII:
4447 *mipsIII:
4448 *mipsIV:
4449 *mipsV:
4450 *mips32:
4451 *mips32r2:
4452 *mips32r6:
4453 *mips64:
4454 *mips64r2:
4455 *mips64r6:
4456 *vr4100:
4457 *vr5000:
4458 *r3900:
4460   do_sllv (SD_, RS, RT, RD);
4464 :function:::void:do_slt:int rs, int rt, int rd
4466   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
4467   GPR[rd] = ((signed_word) GPR[rs] < (signed_word) GPR[rt]);
4468   TRACE_ALU_RESULT (GPR[rd]);
4471 000000,5.RS,5.RT,5.RD,00000,101010:SPECIAL:32::SLT
4472 "slt r<RD>, r<RS>, r<RT>"
4473 *mipsI:
4474 *mipsII:
4475 *mipsIII:
4476 *mipsIV:
4477 *mipsV:
4478 *mips32:
4479 *mips32r2:
4480 *mips32r6:
4481 *mips64:
4482 *mips64r2:
4483 *mips64r6:
4484 *vr4100:
4485 *vr5000:
4486 *r3900:
4488   do_slt (SD_, RS, RT, RD);
4492 :function:::void:do_slti:int rs, int rt, uint16_t immediate
4494   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
4495   GPR[rt] = ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate));
4496   TRACE_ALU_RESULT (GPR[rt]);
4499 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
4500 "slti r<RT>, r<RS>, <IMMEDIATE>"
4501 *mipsI:
4502 *mipsII:
4503 *mipsIII:
4504 *mipsIV:
4505 *mipsV:
4506 *mips32:
4507 *mips32r2:
4508 *mips32r6:
4509 *mips64:
4510 *mips64r2:
4511 *mips64r6:
4512 *vr4100:
4513 *vr5000:
4514 *r3900:
4516   do_slti (SD_, RS, RT, IMMEDIATE);
4520 :function:::void:do_sltiu:int rs, int rt, uint16_t immediate
4522   TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
4523   GPR[rt] = ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate));
4524   TRACE_ALU_RESULT (GPR[rt]);
4527 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
4528 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
4529 *mipsI:
4530 *mipsII:
4531 *mipsIII:
4532 *mipsIV:
4533 *mipsV:
4534 *mips32:
4535 *mips32r2:
4536 *mips32r6:
4537 *mips64:
4538 *mips64r2:
4539 *mips64r6:
4540 *vr4100:
4541 *vr5000:
4542 *r3900:
4544   do_sltiu (SD_, RS, RT, IMMEDIATE);
4549 :function:::void:do_sltu:int rs, int rt, int rd
4551   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
4552   GPR[rd] = ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt]);
4553   TRACE_ALU_RESULT (GPR[rd]);
4556 000000,5.RS,5.RT,5.RD,00000,101011:SPECIAL:32::SLTU
4557 "sltu r<RD>, r<RS>, r<RT>"
4558 *mipsI:
4559 *mipsII:
4560 *mipsIII:
4561 *mipsIV:
4562 *mipsV:
4563 *mips32:
4564 *mips32r2:
4565 *mips32r6:
4566 *mips64:
4567 *mips64r2:
4568 *mips64r6:
4569 *vr4100:
4570 *vr5000:
4571 *r3900:
4573   do_sltu (SD_, RS, RT, RD);
4577 :function:::void:do_sra:int rt, int rd, int shift
4579   int32_t temp = (int32_t) GPR[rt] >> shift;
4580   if (NotWordValue (GPR[rt]))
4581     Unpredictable ();
4582   TRACE_ALU_INPUT2 (GPR[rt], shift);
4583   GPR[rd] = EXTEND32 (temp);
4584   TRACE_ALU_RESULT (GPR[rd]);
4587 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
4588 "sra r<RD>, r<RT>, <SHIFT>"
4589 *mipsI:
4590 *mipsII:
4591 *mipsIII:
4592 *mipsIV:
4593 *mipsV:
4594 *mips32:
4595 *mips32r2:
4596 *mips32r6:
4597 *mips64:
4598 *mips64r2:
4599 *mips64r6:
4600 *vr4100:
4601 *vr5000:
4602 *r3900:
4604   do_sra (SD_, RT, RD, SHIFT);
4609 :function:::void:do_srav:int rs, int rt, int rd
4611   int s = MASKED (GPR[rs], 4, 0);
4612   int32_t temp = (int32_t) GPR[rt] >> s;
4613   if (NotWordValue (GPR[rt]))
4614     Unpredictable ();
4615   TRACE_ALU_INPUT2 (GPR[rt], s);
4616   GPR[rd] = EXTEND32 (temp);
4617   TRACE_ALU_RESULT (GPR[rd]);
4620 000000,5.RS,5.RT,5.RD,00000,000111:SPECIAL:32::SRAV
4621 "srav r<RD>, r<RT>, r<RS>"
4622 *mipsI:
4623 *mipsII:
4624 *mipsIII:
4625 *mipsIV:
4626 *mipsV:
4627 *mips32:
4628 *mips32r2:
4629 *mips32r6:
4630 *mips64:
4631 *mips64r2:
4632 *mips64r6:
4633 *vr4100:
4634 *vr5000:
4635 *r3900:
4637   do_srav (SD_, RS, RT, RD);
4642 :function:::void:do_srl:int rt, int rd, int shift
4644   uint32_t temp = (uint32_t) GPR[rt] >> shift;
4645   if (NotWordValue (GPR[rt]))
4646     Unpredictable ();
4647   TRACE_ALU_INPUT2 (GPR[rt], shift);
4648   GPR[rd] = EXTEND32 (temp);
4649   TRACE_ALU_RESULT (GPR[rd]);
4652 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
4653 "srl r<RD>, r<RT>, <SHIFT>"
4654 *mipsI:
4655 *mipsII:
4656 *mipsIII:
4657 *mipsIV:
4658 *mipsV:
4659 *mips32:
4660 *mips32r2:
4661 *mips32r6:
4662 *mips64:
4663 *mips64r2:
4664 *mips64r6:
4665 *vr4100:
4666 *vr5000:
4667 *r3900:
4669   do_srl (SD_, RT, RD, SHIFT);
4673 :function:::void:do_srlv:int rs, int rt, int rd
4675   int s = MASKED (GPR[rs], 4, 0);
4676   uint32_t temp = (uint32_t) GPR[rt] >> s;
4677   if (NotWordValue (GPR[rt]))
4678     Unpredictable ();
4679   TRACE_ALU_INPUT2 (GPR[rt], s);
4680   GPR[rd] = EXTEND32 (temp);
4681   TRACE_ALU_RESULT (GPR[rd]);
4684 000000,5.RS,5.RT,5.RD,00000,000110:SPECIAL:32::SRLV
4685 "srlv r<RD>, r<RT>, r<RS>"
4686 *mipsI:
4687 *mipsII:
4688 *mipsIII:
4689 *mipsIV:
4690 *mipsV:
4691 *mips32:
4692 *mips32r2:
4693 *mips32r6:
4694 *mips64:
4695 *mips64r2:
4696 *mips64r6:
4697 *vr4100:
4698 *vr5000:
4699 *r3900:
4701   do_srlv (SD_, RS, RT, RD);
4705 000000,5.RS,5.RT,5.RD,00000,100010:SPECIAL:32::SUB
4706 "sub r<RD>, r<RS>, r<RT>"
4707 *mipsI:
4708 *mipsII:
4709 *mipsIII:
4710 *mipsIV:
4711 *mipsV:
4712 *mips32:
4713 *mips32r2:
4714 *mips32r6:
4715 *mips64:
4716 *mips64r2:
4717 *mips64r6:
4718 *vr4100:
4719 *vr5000:
4720 *r3900:
4722   do_sub (SD_, RD, RS, RT);
4726 :function:::void:do_subu:int rs, int rt, int rd
4728   if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt]))
4729     Unpredictable ();
4730   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
4731   GPR[rd] = EXTEND32 (GPR[rs] - GPR[rt]);
4732   TRACE_ALU_RESULT (GPR[rd]);
4735 000000,5.RS,5.RT,5.RD,00000,100011:SPECIAL:32::SUBU
4736 "subu r<RD>, r<RS>, r<RT>"
4737 *mipsI:
4738 *mipsII:
4739 *mipsIII:
4740 *mipsIV:
4741 *mipsV:
4742 *mips32:
4743 *mips32r2:
4744 *mips32r6:
4745 *mips64:
4746 *mips64r2:
4747 *mips64r6:
4748 *vr4100:
4749 *vr5000:
4750 *r3900:
4752   do_subu (SD_, RS, RT, RD);
4756 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
4757 "sw r<RT>, <OFFSET>(r<BASE>)"
4758 *mipsI:
4759 *mipsII:
4760 *mipsIII:
4761 *mipsIV:
4762 *mipsV:
4763 *mips32:
4764 *mips32r2:
4765 *mips32r6:
4766 *mips64:
4767 *mips64r2:
4768 *mips64r6:
4769 *vr4100:
4770 *r3900:
4771 *vr5000:
4773   do_sw (SD_, RT, OFFSET, BASE);
4777 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
4778 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
4779 *mipsI:
4780 *mipsII:
4781 *mipsIII:
4782 *mipsIV:
4783 *mipsV:
4784 *mips32:
4785 *mips32r2:
4786 *mips64:
4787 *mips64r2:
4788 *vr4100:
4789 *vr5000:
4790 *r3900:
4792   do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), COP_SW (ZZ, RT));
4796 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
4797 "swl r<RT>, <OFFSET>(r<BASE>)"
4798 *mipsI:
4799 *mipsII:
4800 *mipsIII:
4801 *mipsIV:
4802 *mipsV:
4803 *mips32:
4804 *mips32r2:
4805 *mips64:
4806 *mips64r2:
4807 *vr4100:
4808 *vr5000:
4809 *r3900:
4811   do_store_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
4815 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
4816 "swr r<RT>, <OFFSET>(r<BASE>)"
4817 *mipsI:
4818 *mipsII:
4819 *mipsIII:
4820 *mipsIV:
4821 *mipsV:
4822 *mips32:
4823 *mips32r2:
4824 *mips64:
4825 *mips64r2:
4826 *vr4100:
4827 *vr5000:
4828 *r3900:
4830   do_store_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
4834 000000,000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
4835 "sync":STYPE == 0
4836 "sync <STYPE>"
4837 *mipsII:
4838 *mipsIII:
4839 *mipsIV:
4840 *mipsV:
4841 *mips32:
4842 *mips32r2:
4843 *mips32r6:
4844 *mips64:
4845 *mips64r2:
4846 *mips64r6:
4847 *vr4100:
4848 *vr5000:
4849 *r3900:
4851   SyncOperation (STYPE);
4855 000000,20.CODE,001100:SPECIAL:32::SYSCALL
4856 "syscall %#lx<CODE>"
4857 *mipsI:
4858 *mipsII:
4859 *mipsIII:
4860 *mipsIV:
4861 *mipsV:
4862 *mips32:
4863 *mips32r2:
4864 *mips32r6:
4865 *mips64:
4866 *mips64r2:
4867 *mips64r6:
4868 *vr4100:
4869 *vr5000:
4870 *r3900:
4872   SignalException (SystemCall, instruction_0);
4876 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
4877 "teq r<RS>, r<RT>"
4878 *mipsII:
4879 *mipsIII:
4880 *mipsIV:
4881 *mipsV:
4882 *mips32:
4883 *mips32r2:
4884 *mips32r6:
4885 *mips64:
4886 *mips64r2:
4887 *mips64r6:
4888 *vr4100:
4889 *vr5000:
4891   do_teq (SD_, RS, RT, instruction_0);
4895 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
4896 "teqi r<RS>, <IMMEDIATE>"
4897 *mipsII:
4898 *mipsIII:
4899 *mipsIV:
4900 *mipsV:
4901 *mips32:
4902 *mips32r2:
4903 *mips64:
4904 *mips64r2:
4905 *vr4100:
4906 *vr5000:
4908   do_teqi (SD_, RS, IMMEDIATE, instruction_0);
4912 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
4913 "tge r<RS>, r<RT>"
4914 *mipsII:
4915 *mipsIII:
4916 *mipsIV:
4917 *mipsV:
4918 *mips32:
4919 *mips32r2:
4920 *mips32r6:
4921 *mips64:
4922 *mips64r2:
4923 *mips64r6:
4924 *vr4100:
4925 *vr5000:
4927   do_tge (SD_, RS, RT, instruction_0);
4931 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
4932 "tgei r<RS>, <IMMEDIATE>"
4933 *mipsII:
4934 *mipsIII:
4935 *mipsIV:
4936 *mipsV:
4937 *mips32:
4938 *mips32r2:
4939 *mips64:
4940 *mips64r2:
4941 *vr4100:
4942 *vr5000:
4944   do_tgei (SD_, RS, IMMEDIATE, instruction_0);
4948 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
4949 "tgeiu r<RS>, <IMMEDIATE>"
4950 *mipsII:
4951 *mipsIII:
4952 *mipsIV:
4953 *mipsV:
4954 *mips32:
4955 *mips32r2:
4956 *mips64:
4957 *mips64r2:
4958 *vr4100:
4959 *vr5000:
4961   do_tgeiu (SD_, RS, IMMEDIATE, instruction_0);
4965 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
4966 "tgeu r<RS>, r<RT>"
4967 *mipsII:
4968 *mipsIII:
4969 *mipsIV:
4970 *mipsV:
4971 *mips32:
4972 *mips32r2:
4973 *mips32r6:
4974 *mips64:
4975 *mips64r2:
4976 *mips64r6:
4977 *vr4100:
4978 *vr5000:
4980   do_tgeu (SD_, RS, RT, instruction_0);
4984 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
4985 "tlt r<RS>, r<RT>"
4986 *mipsII:
4987 *mipsIII:
4988 *mipsIV:
4989 *mipsV:
4990 *mips32:
4991 *mips32r2:
4992 *mips32r6:
4993 *mips64:
4994 *mips64r2:
4995 *mips64r6:
4996 *vr4100:
4997 *vr5000:
4999   do_tlt (SD_, RS, RT, instruction_0);
5003 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
5004 "tlti r<RS>, <IMMEDIATE>"
5005 *mipsII:
5006 *mipsIII:
5007 *mipsIV:
5008 *mipsV:
5009 *mips32:
5010 *mips32r2:
5011 *mips64:
5012 *mips64r2:
5013 *vr4100:
5014 *vr5000:
5016   do_tlti (SD_, RS, IMMEDIATE, instruction_0);
5020 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
5021 "tltiu r<RS>, <IMMEDIATE>"
5022 *mipsII:
5023 *mipsIII:
5024 *mipsIV:
5025 *mipsV:
5026 *mips32:
5027 *mips32r2:
5028 *mips64:
5029 *mips64r2:
5030 *vr4100:
5031 *vr5000:
5033   do_tltiu (SD_, RS, IMMEDIATE, instruction_0);
5037 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
5038 "tltu r<RS>, r<RT>"
5039 *mipsII:
5040 *mipsIII:
5041 *mipsIV:
5042 *mipsV:
5043 *mips32:
5044 *mips32r2:
5045 *mips32r6:
5046 *mips64:
5047 *mips64r2:
5048 *mips64r6:
5049 *vr4100:
5050 *vr5000:
5052   do_tltu (SD_, RS, RT, instruction_0);
5056 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
5057 "tne r<RS>, r<RT>"
5058 *mipsII:
5059 *mipsIII:
5060 *mipsIV:
5061 *mipsV:
5062 *mips32:
5063 *mips32r2:
5064 *mips32r6:
5065 *mips64:
5066 *mips64r2:
5067 *mips64r6:
5068 *vr4100:
5069 *vr5000:
5071   do_tne (SD_, RS, RT, instruction_0);
5075 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
5076 "tnei r<RS>, <IMMEDIATE>"
5077 *mipsII:
5078 *mipsIII:
5079 *mipsIV:
5080 *mipsV:
5081 *mips32:
5082 *mips32r2:
5083 *mips64:
5084 *mips64r2:
5085 *vr4100:
5086 *vr5000:
5088   do_tnei (SD_, RS, IMMEDIATE, instruction_0);
5092 :function:::void:do_xor:int rs, int rt, int rd
5094   TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
5095   GPR[rd] = GPR[rs] ^ GPR[rt];
5096   TRACE_ALU_RESULT (GPR[rd]);
5099 000000,5.RS,5.RT,5.RD,00000,100110:SPECIAL:32::XOR
5100 "xor r<RD>, r<RS>, r<RT>"
5101 *mipsI:
5102 *mipsII:
5103 *mipsIII:
5104 *mipsIV:
5105 *mipsV:
5106 *mips32:
5107 *mips32r2:
5108 *mips32r6:
5109 *mips64:
5110 *mips64r2:
5111 *mips64r6:
5112 *vr4100:
5113 *vr5000:
5114 *r3900:
5116   do_xor (SD_, RS, RT, RD);
5120 :function:::void:do_xori:int rs, int rt, uint16_t immediate
5122   TRACE_ALU_INPUT2 (GPR[rs], immediate);
5123   GPR[rt] = GPR[rs] ^ immediate;
5124   TRACE_ALU_RESULT (GPR[rt]);
5127 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
5128 "xori r<RT>, r<RS>, %#lx<IMMEDIATE>"
5129 *mipsI:
5130 *mipsII:
5131 *mipsIII:
5132 *mipsIV:
5133 *mipsV:
5134 *mips32:
5135 *mips32r2:
5136 *mips32r6:
5137 *mips64:
5138 *mips64r2:
5139 *mips64r6:
5140 *vr4100:
5141 *vr5000:
5142 *r3900:
5144   do_xori (SD_, RS, RT, IMMEDIATE);
5149 // MIPS Architecture:
5151 //        FPU Instruction Set (COP1 & COP1X)
5155 :%s::::FMT:int fmt
5157   switch (fmt)
5158     {
5159     case fmt_single: return "s";
5160     case fmt_double: return "d";
5161     case fmt_word: return "w";
5162     case fmt_long: return "l";
5163     case fmt_ps: return "ps";
5164     default: return "?";
5165     }
5168 :%s::::TF:int tf
5170   if (tf)
5171     return "t";
5172   else
5173     return "f";
5176 :%s::::ND:int nd
5178   if (nd)
5179     return "l";
5180   else
5181     return "";
5184 :%s::::COND:int cond
5186   switch (cond)
5187     {
5188     case 00: return "f";
5189     case 01: return "un";
5190     case 02: return "eq";
5191     case 03: return "ueq";
5192     case 04: return "olt";
5193     case 05: return "ult";
5194     case 06: return "ole";
5195     case 07: return "ule";
5196     case 010: return "sf";
5197     case 011: return "ngle";
5198     case 012: return "seq";
5199     case 013: return "ngl";
5200     case 014: return "lt";
5201     case 015: return "nge";
5202     case 016: return "le";
5203     case 017: return "ngt";
5204     default: return "?";
5205     }
5209 // Helpers:
5211 // Check that the given FPU format is usable, and signal a
5212 // ReservedInstruction exception if not.
5215 // check_fmt_p checks that the format is single, double, or paired single.
5216 :function:::void:check_fmt_p:int fmt, instruction_word insn
5217 *mipsI:
5218 *mipsII:
5219 *mipsIII:
5220 *mipsIV:
5221 *mips32:
5222 *mips32r6:
5223 *mips64r6:
5224 *vr4100:
5225 *vr5000:
5226 *r3900:
5228   /* None of these ISAs support Paired Single, so just fall back to
5229      the single/double check.  */
5230   if ((fmt != fmt_single) && (fmt != fmt_double))
5231     SignalException (ReservedInstruction, insn);
5234 :function:::void:check_fmt_p:int fmt, instruction_word insn
5235 *mips32r2:
5236 *micromips32:
5238   if ((fmt != fmt_single) && (fmt != fmt_double) && (fmt != fmt_ps))
5239     SignalException (ReservedInstruction, insn);
5242 :function:::void:check_fmt_p:int fmt, instruction_word insn
5243 *mipsV:
5244 *mips64:
5245 *mips64r2:
5246 *micromips64:
5248   if ((fmt != fmt_single) && (fmt != fmt_double)
5249       && (fmt != fmt_ps || (UserMode && (SR & (status_UX|status_PX)) == 0)))
5250     SignalException (ReservedInstruction, insn);
5254 // Helper:
5256 // Check that the FPU is currently usable, and signal a CoProcessorUnusable
5257 // exception if not.
5260 :function:::void:check_fpu:
5261 *mipsI:
5262 *mipsII:
5263 *mipsIII:
5264 *mipsIV:
5265 *mipsV:
5266 *mips32:
5267 *mips32r2:
5268 *mips64:
5269 *mips64r2:
5270 *vr4100:
5271 *vr5000:
5272 *r3900:
5273 *micromips32:
5274 *micromips64:
5276   if (! COP_Usable (1))
5277     SignalExceptionCoProcessorUnusable (1);
5279   FCSR &= ~(fcsr_NAN2008_mask | fcsr_ABS2008_mask);
5280   sim_fpu_quiet_nan_inverted = true;
5283 // Helper:
5285 // Check that the FPU is currently usable, and signal a CoProcessorUnusable
5286 // exception if not.
5289 :function:::void:check_fpu:
5290 *mips32r6:
5291 *mips64r6:
5293   if (! COP_Usable (1))
5294     SignalExceptionCoProcessorUnusable (1);
5296   FCSR |= (fcsr_NAN2008_mask | fcsr_ABS2008_mask);
5297   sim_fpu_quiet_nan_inverted = 0;
5298   sim_fpu_set_mode (sim_fpu_ieee754_2008);
5301 // Helper:
5303 // Load a double word FP value using 2 32-bit memory cycles a la MIPS II
5304 // or MIPS32.  do_load cannot be used instead because it returns an
5305 // unsigned_word, which is limited to the size of the machine's registers.
5308 :function:::uint64_t:do_load_double:address_word base, address_word offset
5309 *mipsII:
5310 *mips32:
5311 *mips32r2:
5312 *mips32r6:
5313 *micromips32:
5315   int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian);
5316   address_word vaddr;
5317   address_word paddr;
5318   uint64_t memval;
5319   uint64_t v;
5321   paddr = vaddr = loadstore_ea (SD_, base, offset);
5322   if ((vaddr & AccessLength_DOUBLEWORD) != 0)
5323     {
5324       SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map,
5325                        AccessLength_DOUBLEWORD + 1, vaddr, read_transfer,
5326                        sim_core_unaligned_signal);
5327     }
5328   LoadMemory (&memval, NULL, AccessLength_WORD, paddr, vaddr, isDATA, isREAL);
5329   v = (uint64_t)memval;
5330   LoadMemory (&memval, NULL, AccessLength_WORD, paddr + 4, vaddr + 4, isDATA,
5331               isREAL);
5332   return (bigendian ? ((v << 32) | memval) : (v | (memval << 32)));
5336 // Helper:
5338 // Store a double word FP value using 2 32-bit memory cycles a la MIPS II
5339 // or MIPS32.  do_load cannot be used instead because it returns an
5340 // unsigned_word, which is limited to the size of the machine's registers.
5343 :function:::void:do_store_double:address_word base, address_word offset, uint64_t v
5344 *mipsII:
5345 *mips32:
5346 *mips32r2:
5347 *micromips32:
5348  *mips32r6:
5350   int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian);
5351   address_word vaddr;
5352   address_word paddr;
5353   uint64_t memval;
5355   paddr = vaddr = loadstore_ea (SD_, base, offset);
5356   if ((vaddr & AccessLength_DOUBLEWORD) != 0)
5357     {
5358       SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map,
5359                        AccessLength_DOUBLEWORD + 1, vaddr, write_transfer,
5360                        sim_core_unaligned_signal);
5361     }
5362   memval = (bigendian ? (v >> 32) : (v & 0xFFFFFFFF));
5363   StoreMemory (AccessLength_WORD, memval, 0, paddr, vaddr, isREAL);
5364   memval = (bigendian ? (v & 0xFFFFFFFF) : (v >> 32));
5365   StoreMemory (AccessLength_WORD, memval, 0, paddr + 4, vaddr + 4, isREAL);
5369 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
5370 "abs.%s<FMT> f<FD>, f<FS>"
5371 *mipsI:
5372 *mipsII:
5373 *mipsIII:
5374 *mipsIV:
5375 *mipsV:
5376 *mips32:
5377 *mips32r2:
5378 *mips32r6:
5379 *mips64:
5380 *mips64r2:
5381 *mips64r6:
5382 *vr4100:
5383 *vr5000:
5384 *r3900:
5386   do_abs_fmt (SD_, FMT, FD, FS, instruction_0);
5391 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt
5392 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
5393 *mipsI:
5394 *mipsII:
5395 *mipsIII:
5396 *mipsIV:
5397 *mipsV:
5398 *mips32:
5399 *mips32r2:
5400 *mips32r6:
5401 *mips64:
5402 *mips64r2:
5403 *mips64r6:
5404 *vr4100:
5405 *vr5000:
5406 *r3900:
5408   do_add_fmt (SD_, FMT, FD, FS, FT, instruction_0);
5412 010011,5.RS,5.FT,5.FS,5.FD,011,110:COP1X:32,f::ALNV.PS
5413 "alnv.ps f<FD>, f<FS>, f<FT>, r<RS>"
5414 *mipsV:
5415 *mips32r2:
5416 *mips64:
5417 *mips64r2:
5419   do_alnv_ps (SD_, FD, FS, FT, RS, instruction_0);
5423 // BC1F
5424 // BC1FL
5425 // BC1T
5426 // BC1TL
5428 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1a
5429 "bc1%s<TF>%s<ND> <OFFSET>"
5430 *mipsI:
5431 *mipsII:
5432 *mipsIII:
5434   check_fpu (SD_);
5435   TRACE_BRANCH_INPUT (PREVCOC1());
5436   if (PREVCOC1() == TF)
5437     {
5438       address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
5439       TRACE_BRANCH_RESULT (dest);
5440       DELAY_SLOT (dest);
5441     }
5442   else if (ND)
5443     {
5444       TRACE_BRANCH_RESULT (0);
5445       NULLIFY_NEXT_INSTRUCTION ();
5446     }
5447   else
5448     {
5449       TRACE_BRANCH_RESULT (NIA);
5450     }
5453 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1b
5454 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
5455 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
5456 *mipsIV:
5457 *mipsV:
5458 *mips32:
5459 *mips32r2:
5460 *mips64:
5461 *mips64r2:
5462 #*vr4100:
5463 *vr5000:
5464 *r3900:
5466   check_fpu (SD_);
5467   if (GETFCC(CC) == TF)
5468     {
5469       address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
5470       DELAY_SLOT (dest);
5471     }
5472   else if (ND)
5473     {
5474       NULLIFY_NEXT_INSTRUCTION ();
5475     }
5479 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,3.0,00,11,4.COND:COP1:32,f::C.cond.fmta
5480 "c.%s<COND>.%s<FMT> f<FS>, f<FT>"
5481 *mipsI:
5482 *mipsII:
5483 *mipsIII:
5485   int fmt = FMT;
5486   check_fpu (SD_);
5487   Compare (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt, COND, 0);
5488   TRACE_ALU_RESULT (ValueFCR (31));
5491 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32,f::C.cond.fmtb
5492 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
5493 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
5494 *mipsIV:
5495 *mipsV:
5496 *mips32:
5497 *mips32r2:
5498 *mips64:
5499 *mips64r2:
5500 *vr4100:
5501 *vr5000:
5502 *r3900:
5504   do_c_cond_fmt (SD_, COND, FMT, CC, FS, FT, instruction_0);
5508 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001010:COP1:32,f::CEIL.L.fmt
5509 "ceil.l.%s<FMT> f<FD>, f<FS>"
5510 *mipsIII:
5511 *mipsIV:
5512 *mipsV:
5513 *mips32r2:
5514 *mips32r6:
5515 *mips64:
5516 *mips64r2:
5517 *mips64r6:
5518 *vr4100:
5519 *vr5000:
5520 *r3900:
5522   do_ceil_fmt (SD_, fmt_long, FMT, FD, FS, instruction_0);
5526 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001110:COP1:32,f::CEIL.W
5527 "ceil.w.%s<FMT> f<FD>, f<FS>"
5528 *mipsII:
5529 *mipsIII:
5530 *mipsIV:
5531 *mipsV:
5532 *mips32:
5533 *mips32r2:
5534 *mips32r6:
5535 *mips64:
5536 *mips64r2:
5537 *mips64r6:
5538 *vr4100:
5539 *vr5000:
5540 *r3900:
5542   do_ceil_fmt (SD_, fmt_word, FMT, FD, FS, instruction_0);
5546 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1a
5547 "cfc1 r<RT>, f<FS>"
5548 *mipsI:
5549 *mipsII:
5550 *mipsIII:
5552   check_fpu (SD_);
5553   if (FS == 0)
5554     PENDING_FILL (RT, EXTEND32 (FCR0));
5555   else if (FS == 31)
5556     PENDING_FILL (RT, EXTEND32 (FCR31));
5557   /* else NOP */
5560 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1b
5561 "cfc1 r<RT>, f<FS>"
5562 *mipsIV:
5563 *vr4100:
5564 *vr5000:
5565 *r3900:
5567   check_fpu (SD_);
5568   if (FS == 0 || FS == 31)
5569     {
5570       unsigned_word  fcr = ValueFCR (FS);
5571       TRACE_ALU_INPUT1 (fcr);
5572       GPR[RT] = fcr;
5573     }
5574   /* else NOP */
5575   TRACE_ALU_RESULT (GPR[RT]);
5578 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1c
5579 "cfc1 r<RT>, f<FS>"
5580 *mipsV:
5581 *mips32:
5582 *mips32r2:
5583 *mips32r6:
5584 *mips64:
5585 *mips64r2:
5586 *mips64r6:
5588   do_cfc1 (SD_, RT, FS);
5591 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1a
5592 "ctc1 r<RT>, f<FS>"
5593 *mipsI:
5594 *mipsII:
5595 *mipsIII:
5597   check_fpu (SD_);
5598   if (FS == 31)
5599     PENDING_FILL (FCRCS_REGNUM, VL4_8 (GPR[RT]));
5600   /* else NOP */
5603 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1b
5604 "ctc1 r<RT>, f<FS>"
5605 *mipsIV:
5606 *vr4100:
5607 *vr5000:
5608 *r3900:
5610   check_fpu (SD_);
5611   TRACE_ALU_INPUT1 (GPR[RT]);
5612   if (FS == 31)
5613     StoreFCR (FS, GPR[RT]);
5614   /* else NOP */
5617 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1c
5618 "ctc1 r<RT>, f<FS>"
5619 *mipsV:
5620 *mips32:
5621 *mips32r2:
5622 *mips32r6:
5623 *mips64:
5624 *mips64r2:
5625 *mips64r6:
5627   do_ctc1 (SD_, RT, FS);
5632 // FIXME: Does not correctly differentiate between mips*
5634 010001,10,3.FMT!1!2!3!6!7,00000,5.FS,5.FD,100001:COP1:32,f::CVT.D.fmt
5635 "cvt.d.%s<FMT> f<FD>, f<FS>"
5636 *mipsI:
5637 *mipsII:
5638 *mipsIII:
5639 *mipsIV:
5640 *mipsV:
5641 *mips32:
5642 *mips32r2:
5643 *mips32r6:
5644 *mips64:
5645 *mips64r2:
5646 *mips64r6:
5647 *vr4100:
5648 *vr5000:
5649 *r3900:
5651   do_cvt_d_fmt (SD_, FMT, FD, FS, instruction_0);
5655 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100101:COP1:32,f::CVT.L.fmt
5656 "cvt.l.%s<FMT> f<FD>, f<FS>"
5657 *mipsIII:
5658 *mipsIV:
5659 *mipsV:
5660 *mips32r2:
5661 *mips32r6:
5662 *mips64:
5663 *mips64r2:
5664 *mips64r6:
5665 *vr4100:
5666 *vr5000:
5667 *r3900:
5669   do_cvt_l_fmt (SD_, FMT, FD, FS, instruction_0);
5673 010001,10,000,5.FT,5.FS,5.FD,100110:COP1:32,f::CVT.PS.S
5674 "cvt.ps.s f<FD>, f<FS>, f<FT>"
5675 *mipsV:
5676 *mips32r2:
5677 *mips64:
5678 *mips64r2:
5680   do_cvt_ps_s (SD_, FD, FS, FT, instruction_0);
5685 // FIXME: Does not correctly differentiate between mips*
5687 010001,10,3.FMT!0!2!3!6!7,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.fmt
5688 "cvt.s.%s<FMT> f<FD>, f<FS>"
5689 *mipsI:
5690 *mipsII:
5691 *mipsIII:
5692 *mipsIV:
5693 *mipsV:
5694 *mips32:
5695 *mips32r2:
5696 *mips32r6:
5697 *mips64:
5698 *mips64r2:
5699 *mips64r6:
5700 *vr4100:
5701 *vr5000:
5702 *r3900:
5704   do_cvt_s_fmt (SD_, FMT, FD, FS, instruction_0);
5708 010001,10,110,00000,5.FS,5.FD,101000:COP1:32,f::CVT.S.PL
5709 "cvt.s.pl f<FD>, f<FS>"
5710 *mipsV:
5711 *mips32r2:
5712 *mips64:
5713 *mips64r2:
5715   do_cvt_s_pl (SD_, FD, FS, instruction_0);
5719 010001,10,110,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.PU
5720 "cvt.s.pu f<FD>, f<FS>"
5721 *mipsV:
5722 *mips32r2:
5723 *mips64:
5724 *mips64r2:
5726   do_cvt_s_pu (SD_, FD, FS, instruction_0);
5730 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100100:COP1:32,f::CVT.W.fmt
5731 "cvt.w.%s<FMT> f<FD>, f<FS>"
5732 *mipsI:
5733 *mipsII:
5734 *mipsIII:
5735 *mipsIV:
5736 *mipsV:
5737 *mips32:
5738 *mips32r2:
5739 *mips32r6:
5740 *mips64:
5741 *mips64r2:
5742 *mips64r6:
5743 *vr4100:
5744 *vr5000:
5745 *r3900:
5747   do_cvt_w_fmt (SD_, FMT, FD, FS, instruction_0);
5751 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,5.FD,000011:COP1:32,f::DIV.fmt
5752 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
5753 *mipsI:
5754 *mipsII:
5755 *mipsIII:
5756 *mipsIV:
5757 *mipsV:
5758 *mips32:
5759 *mips32r2:
5760 *mips32r6:
5761 *mips64:
5762 *mips64r2:
5763 *mips64r6:
5764 *vr4100:
5765 *vr5000:
5766 *r3900:
5768   do_div_fmt (SD_, FMT, FD, FS, FT, instruction_0);
5772 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1a
5773 "dmfc1 r<RT>, f<FS>"
5774 *mipsIII:
5776   uint64_t v;
5777   check_fpu (SD_);
5778   check_u64 (SD_, instruction_0);
5779   if (SizeFGR () == 64)
5780     v = FGR[FS];
5781   else if ((FS & 0x1) == 0)
5782     v = SET64HI (FGR[FS+1]) | FGR[FS];
5783   else
5784     Unpredictable ();
5785   PENDING_FILL (RT, v);
5786   TRACE_ALU_RESULT (v);
5789 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1b
5790 "dmfc1 r<RT>, f<FS>"
5791 *mipsIV:
5792 *mipsV:
5793 *mips64:
5794 *mips64r2:
5795 *mips64r6:
5796 *vr4100:
5797 *vr5000:
5798 *r3900:
5800   check_fpu (SD_);
5801   check_u64 (SD_, instruction_0);
5802   do_dmfc1b (SD_, RT, FS);
5806 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1a
5807 "dmtc1 r<RT>, f<FS>"
5808 *mipsIII:
5810   uint64_t v;
5811   check_fpu (SD_);
5812   check_u64 (SD_, instruction_0);
5813   if (SizeFGR () == 64)
5814     PENDING_FILL ((FS + FGR_BASE), GPR[RT]);
5815   else if ((FS & 0x1) == 0)
5816     {
5817       PENDING_FILL (((FS + 1) + FGR_BASE), VH4_8 (GPR[RT]));
5818       PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT]));
5819     }
5820   else
5821     Unpredictable ();
5822   TRACE_FP_RESULT (GPR[RT]);
5825 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1b
5826 "dmtc1 r<RT>, f<FS>"
5827 *mipsIV:
5828 *mipsV:
5829 *mips64:
5830 *mips64r2:
5831 *mips64r6:
5832 *vr4100:
5833 *vr5000:
5834 *r3900:
5836   check_fpu (SD_);
5837   check_u64 (SD_, instruction_0);
5838   do_dmtc1b (SD_, RT, FS);
5842 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001011:COP1:32,f::FLOOR.L.fmt
5843 "floor.l.%s<FMT> f<FD>, f<FS>"
5844 *mipsIII:
5845 *mipsIV:
5846 *mipsV:
5847 *mips32r2:
5848 *mips32r6:
5849 *mips64:
5850 *mips64r2:
5851 *mips64r6:
5852 *vr4100:
5853 *vr5000:
5854 *r3900:
5856   do_floor_fmt (SD_, fmt_long, FMT, FD, FS);
5860 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001111:COP1:32,f::FLOOR.W.fmt
5861 "floor.w.%s<FMT> f<FD>, f<FS>"
5862 *mipsII:
5863 *mipsIII:
5864 *mipsIV:
5865 *mipsV:
5866 *mips32:
5867 *mips32r2:
5868 *mips32r6:
5869 *mips64:
5870 *mips64r2:
5871 *mips64r6:
5872 *vr4100:
5873 *vr5000:
5874 *r3900:
5876   do_floor_fmt (SD_, fmt_word, FMT, FD, FS);
5880 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1a
5881 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
5882 *mipsII:
5883 *mips32:
5884 *mips32r2:
5885 *mips32r6:
5887   check_fpu (SD_);
5888   COP_LD (1, FT, do_load_double (SD_, GPR[BASE], EXTEND16 (OFFSET)));
5892 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1b
5893 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
5894 *mipsIII:
5895 *mipsIV:
5896 *mipsV:
5897 *mips64:
5898 *mips64r2:
5899 *mips64r6:
5900 *vr4100:
5901 *vr5000:
5902 *r3900:
5904   check_fpu (SD_);
5905   COP_LD (1, FT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
5909 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:32,f::LDXC1
5910 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
5911 *mips32r2:
5913   check_fpu (SD_);
5914   COP_LD (1, FD, do_load_double (SD_, GPR[BASE], GPR[INDEX]));
5918 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64,f::LDXC1
5919 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
5920 *mipsIV:
5921 *mipsV:
5922 *mips64:
5923 *mips64r2:
5924 *vr5000:
5926   check_fpu (SD_);
5927   check_u64 (SD_, instruction_0);
5928   COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX]));
5932 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:32,f::LUXC1
5933 "luxc1 f<FD>, r<INDEX>(r<BASE>)"
5934 *mips32r2:
5936   do_luxc1_32 (SD_, FD, INDEX, BASE);
5940 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:64,f::LUXC1
5941 "luxc1 f<FD>, r<INDEX>(r<BASE>)"
5942 *mipsV:
5943 *mips64:
5944 *mips64r2:
5946   check_fpu (SD_);
5947   check_u64 (SD_, instruction_0);
5948   do_luxc1_64 (SD_, FD, INDEX, BASE);
5952 110001,5.BASE,5.FT,16.OFFSET:COP1:32,f::LWC1
5953 "lwc1 f<FT>, <OFFSET>(r<BASE>)"
5954 *mipsI:
5955 *mipsII:
5956 *mipsIII:
5957 *mipsIV:
5958 *mipsV:
5959 *mips32:
5960 *mips32r2:
5961 *mips32r6:
5962 *mips64:
5963 *mips64r2:
5964 *mips64r6:
5965 *vr4100:
5966 *vr5000:
5967 *r3900:
5969   do_lwc1 (SD_, FT, OFFSET, BASE);
5973 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32,f::LWXC1
5974 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
5975 *mipsIV:
5976 *mipsV:
5977 *mips32r2:
5978 *mips64:
5979 *mips64r2:
5980 *vr5000:
5982   do_lwxc1 (SD_, FD, INDEX, BASE, instruction_0);
5987 010011,5.FR,5.FT,5.FS,5.FD,100,3.FMT!2!3!4!5!7:COP1X:32,f::MADD.fmt
5988 "madd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
5989 *mipsIV:
5990 *mipsV:
5991 *mips32r2:
5992 *mips64:
5993 *mips64r2:
5994 *vr5000:
5996   do_madd_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0);
6000 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1a
6001 "mfc1 r<RT>, f<FS>"
6002 *mipsI:
6003 *mipsII:
6004 *mipsIII:
6006   uint64_t v;
6007   check_fpu (SD_);
6008   v = EXTEND32 (FGR[FS]);
6009   PENDING_FILL (RT, v);
6010   TRACE_ALU_RESULT (v);
6013 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1b
6014 "mfc1 r<RT>, f<FS>"
6015 *mipsIV:
6016 *mipsV:
6017 *mips32:
6018 *mips32r2:
6019 *mips32r6:
6020 *mips64:
6021 *mips64r2:
6022 *mips64r6:
6023 *vr4100:
6024 *vr5000:
6025 *r3900:
6027   do_mfc1b (SD_, RT, FS);
6031 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000110:COP1:32,f::MOV.fmt
6032 "mov.%s<FMT> f<FD>, f<FS>"
6033 *mipsI:
6034 *mipsII:
6035 *mipsIII:
6036 *mipsIV:
6037 *mipsV:
6038 *mips32:
6039 *mips32r2:
6040 *mips32r6:
6041 *mips64:
6042 *mips64r2:
6043 *mips64r6:
6044 *vr4100:
6045 *vr5000:
6046 *r3900:
6048   do_mov_fmt (SD_, FMT, FD, FS, instruction_0);
6052 // MOVF
6053 // MOVT
6054 000000,5.RS,3.CC,0,1.TF,5.RD,00000,000001:SPECIAL:32,f::MOVtf
6055 "mov%s<TF> r<RD>, r<RS>, <CC>"
6056 *mipsIV:
6057 *mipsV:
6058 *mips32:
6059 *mips32r2:
6060 *mips64:
6061 *mips64r2:
6062 *vr5000:
6064   do_movtf (SD_, TF, RD, RS, CC);
6068 // MOVF.fmt
6069 // MOVT.fmt
6070 010001,10,3.FMT!2!3!4!5!7,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32,f::MOVtf.fmt
6071 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
6072 *mipsIV:
6073 *mipsV:
6074 *mips32:
6075 *mips32r2:
6076 *mips64:
6077 *mips64r2:
6078 *vr5000:
6080   do_movtf_fmt (SD_, TF, FMT, FD, FS, CC);
6084 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010011:COP1:32,f::MOVN.fmt
6085 "movn.%s<FMT> f<FD>, f<FS>, r<RT>"
6086 *mipsIV:
6087 *mipsV:
6088 *mips32:
6089 *mips32r2:
6090 *mips64:
6091 *mips64r2:
6092 *vr5000:
6094   do_movn_fmt (SD_, FMT, FD, FS, RT);
6098 // MOVT see MOVtf
6101 // MOVT.fmt see MOVtf.fmt
6105 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010010:COP1:32,f::MOVZ.fmt
6106 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
6107 *mipsIV:
6108 *mipsV:
6109 *mips32:
6110 *mips32r2:
6111 *mips64:
6112 *mips64r2:
6113 *vr5000:
6115   do_movz_fmt (SD_, FMT, FD, FS, RT);
6119 010011,5.FR,5.FT,5.FS,5.FD,101,3.FMT!2!3!4!5!7:COP1X:32,f::MSUB.fmt
6120 "msub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
6121 *mipsIV:
6122 *mipsV:
6123 *mips32r2:
6124 *mips64:
6125 *mips64r2:
6126 *vr5000:
6128   do_msub_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0);
6132 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1a
6133 "mtc1 r<RT>, f<FS>"
6134 *mipsI:
6135 *mipsII:
6136 *mipsIII:
6138   check_fpu (SD_);
6139   if (SizeFGR () == 64)
6140     PENDING_FILL ((FS + FGR_BASE), (SET64HI (0xDEADC0DE) | VL4_8 (GPR[RT])));
6141   else
6142     PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT]));
6143   TRACE_FP_RESULT (GPR[RT]);
6146 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1b
6147 "mtc1 r<RT>, f<FS>"
6148 *mipsIV:
6149 *mipsV:
6150 *mips32:
6151 *mips32r2:
6152 *mips32r6:
6153 *mips64:
6154 *mips64r2:
6155 *mips64r6:
6156 *vr4100:
6157 *vr5000:
6158 *r3900:
6160   do_mtc1b (SD_, RT, FS);
6164 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000010:COP1:32,f::MUL.fmt
6165 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
6166 *mipsI:
6167 *mipsII:
6168 *mipsIII:
6169 *mipsIV:
6170 *mipsV:
6171 *mips32:
6172 *mips32r2:
6173 *mips32r6:
6174 *mips64:
6175 *mips64r2:
6176 *mips64r6:
6177 *vr4100:
6178 *vr5000:
6179 *r3900:
6181   do_mul_fmt (SD_, FMT, FD, FS, FT, instruction_0);
6185 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000111:COP1:32,f::NEG.fmt
6186 "neg.%s<FMT> f<FD>, f<FS>"
6187 *mipsI:
6188 *mipsII:
6189 *mipsIII:
6190 *mipsIV:
6191 *mipsV:
6192 *mips32:
6193 *mips32r2:
6194 *mips32r6:
6195 *mips64:
6196 *mips64r2:
6197 *mips64r6:
6198 *vr4100:
6199 *vr5000:
6200 *r3900:
6202   do_neg_fmt (SD_, FMT, FD, FS, instruction_0);
6206 010011,5.FR,5.FT,5.FS,5.FD,110,3.FMT!2!3!4!5!7:COP1X:32,f::NMADD.fmt
6207 "nmadd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
6208 *mipsIV:
6209 *mipsV:
6210 *mips32r2:
6211 *mips64:
6212 *mips64r2:
6213 *vr5000:
6215   do_nmadd_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0);
6219 010011,5.FR,5.FT,5.FS,5.FD,111,3.FMT!2!3!4!5!7:COP1X:32,f::NMSUB.fmt
6220 "nmsub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>"
6221 *mipsIV:
6222 *mipsV:
6223 *mips32r2:
6224 *mips64:
6225 *mips64r2:
6226 *vr5000:
6228   do_nmsub_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0);
6232 010001,10,110,5.FT,5.FS,5.FD,101100:COP1:32,f::PLL.PS
6233 "pll.ps f<FD>, f<FS>, f<FT>"
6234 *mipsV:
6235 *mips32r2:
6236 *mips64:
6237 *mips64r2:
6239   do_pll_ps (SD_, FD, FS, FT, instruction_0);
6243 010001,10,110,5.FT,5.FS,5.FD,101101:COP1:32,f::PLU.PS
6244 "plu.ps f<FD>, f<FS>, f<FT>"
6245 *mipsV:
6246 *mips32r2:
6247 *mips64:
6248 *mips64r2:
6250   do_plu_ps (SD_, FD, FS, FT, instruction_0);
6254 010011,5.BASE,5.INDEX,5.HINT,00000,001111:COP1X:32::PREFX
6255 "prefx <HINT>, r<INDEX>(r<BASE>)"
6256 *mipsIV:
6257 *mipsV:
6258 *mips32r2:
6259 *mips64:
6260 *mips64r2:
6261 *vr5000:
6263   do_prefx (SD_, HINT, INDEX, BASE);
6267 010001,10,110,5.FT,5.FS,5.FD,101110:COP1:32,f::PUL.PS
6268 "pul.ps f<FD>, f<FS>, f<FT>"
6269 *mipsV:
6270 *mips32r2:
6271 *mips64:
6272 *mips64r2:
6274   do_pul_ps (SD_, FD, FS, FT, instruction_0);
6278 010001,10,110,5.FT,5.FS,5.FD,101111:COP1:32,f::PUU.PS
6279 "puu.ps f<FD>, f<FS>, f<FT>"
6280 *mipsV:
6281 *mips32r2:
6282 *mips64:
6283 *mips64r2:
6285   do_puu_ps (SD_, FD, FS, FT, instruction_0);
6289 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010101:COP1:32,f::RECIP.fmt
6290 "recip.%s<FMT> f<FD>, f<FS>"
6291 *mipsIV:
6292 *mipsV:
6293 *mips32r2:
6294 *mips32r6:
6295 *mips64:
6296 *mips64r2:
6297 *mips64r6:
6298 *vr5000:
6300   do_recip_fmt (SD_, FMT, FD, FS);
6304 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001000:COP1:32,f::ROUND.L.fmt
6305 "round.l.%s<FMT> f<FD>, f<FS>"
6306 *mipsIII:
6307 *mipsIV:
6308 *mipsV:
6309 *mips32r2:
6310 *mips32r6:
6311 *mips64:
6312 *mips64r2:
6313 *mips64r6:
6314 *vr4100:
6315 *vr5000:
6316 *r3900:
6318   do_round_fmt (SD_, fmt_long, FMT, FD, FS);
6322 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001100:COP1:32,f::ROUND.W.fmt
6323 "round.w.%s<FMT> f<FD>, f<FS>"
6324 *mipsII:
6325 *mipsIII:
6326 *mipsIV:
6327 *mipsV:
6328 *mips32:
6329 *mips32r2:
6330 *mips32r6:
6331 *mips64:
6332 *mips64r2:
6333 *mips64r6:
6334 *vr4100:
6335 *vr5000:
6336 *r3900:
6338   do_round_fmt (SD_, fmt_word, FMT, FD, FS);
6342 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010110:COP1:32,f::RSQRT.fmt
6343 "rsqrt.%s<FMT> f<FD>, f<FS>"
6344 *mipsIV:
6345 *mipsV:
6346 *mips32r2:
6347 *mips32r6:
6348 *mips64:
6349 *mips64r2:
6350 *mips64r6:
6351 *vr5000:
6353   do_rsqrt_fmt (SD_, FMT, FD, FS);
6357 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1a
6358 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
6359 *mipsII:
6360 *mips32:
6361 *mips32r2:
6362 *mips32r6:
6364   do_sdc1 (SD_, FT, OFFSET, BASE);
6368 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1b
6369 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
6370 *mipsIII:
6371 *mipsIV:
6372 *mipsV:
6373 *mips64:
6374 *mips64r2:
6375 *mips64r6:
6376 *vr4100:
6377 *vr5000:
6378 *r3900:
6380   check_fpu (SD_);
6381   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (1, FT));
6385 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:32,f::SDXC1
6386 "sdxc1 f<FS>, r<INDEX>(r<BASE>)"
6387 *mips32r2:
6389   check_fpu (SD_);
6390   do_store_double (SD_, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
6394 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:64,f::SDXC1
6395 "sdxc1 f<FS>, r<INDEX>(r<BASE>)"
6396 *mipsIV:
6397 *mipsV:
6398 *mips64:
6399 *mips64r2:
6400 *vr5000:
6402   check_fpu (SD_);
6403   check_u64 (SD_, instruction_0);
6404   do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
6408 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:32,f::SUXC1
6409 "suxc1 f<FS>, r<INDEX>(r<BASE>)"
6410 *mips32r2:
6412   do_suxc1_32 (SD_, FS, INDEX, BASE);
6416 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:64,f::SUXC1
6417 "suxc1 f<FS>, r<INDEX>(r<BASE>)"
6418 *mipsV:
6419 *mips64:
6420 *mips64r2:
6422   check_fpu (SD_);
6423   check_u64 (SD_, instruction_0);
6424   do_suxc1_64 (SD_, FS, INDEX, BASE);
6428 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,000100:COP1:32,f::SQRT.fmt
6429 "sqrt.%s<FMT> f<FD>, f<FS>"
6430 *mipsII:
6431 *mipsIII:
6432 *mipsIV:
6433 *mipsV:
6434 *mips32:
6435 *mips32r2:
6436 *mips32r6:
6437 *mips64:
6438 *mips64r2:
6439 *mips64r6:
6440 *vr4100:
6441 *vr5000:
6442 *r3900:
6444   do_sqrt_fmt (SD_, FMT, FD, FS);
6448 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000001:COP1:32,f::SUB.fmt
6449 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
6450 *mipsI:
6451 *mipsII:
6452 *mipsIII:
6453 *mipsIV:
6454 *mipsV:
6455 *mips32:
6456 *mips32r2:
6457 *mips32r6:
6458 *mips64:
6459 *mips64r2:
6460 *mips64r6:
6461 *vr4100:
6462 *vr5000:
6463 *r3900:
6465   do_sub_fmt (SD_, FMT, FD, FS, FT, instruction_0);
6470 111001,5.BASE,5.FT,16.OFFSET:COP1:32,f::SWC1
6471 "swc1 f<FT>, <OFFSET>(r<BASE>)"
6472 *mipsI:
6473 *mipsII:
6474 *mipsIII:
6475 *mipsIV:
6476 *mipsV:
6477 *mips32:
6478 *mips32r2:
6479 *mips32r6:
6480 *mips64:
6481 *mips64r2:
6482 *mips64r6:
6483 *vr4100:
6484 *vr5000:
6485 *r3900:
6487   do_swc1 (SD_, FT, OFFSET, BASE, instruction_0);
6491 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32,f::SWXC1
6492 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
6493 *mipsIV:
6494 *mipsV:
6495 *mips32r2:
6496 *mips64:
6497 *mips64r2:
6498 *vr5000:
6500   do_swxc1 (SD_, FS, INDEX, BASE, instruction_0);
6504 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001001:COP1:32,f::TRUNC.L.fmt
6505 "trunc.l.%s<FMT> f<FD>, f<FS>"
6506 *mipsIII:
6507 *mipsIV:
6508 *mipsV:
6509 *mips32r2:
6510 *mips32r6:
6511 *mips64:
6512 *mips64r2:
6513 *mips64r6:
6514 *vr4100:
6515 *vr5000:
6516 *r3900:
6518   do_trunc_fmt (SD_, fmt_long, FMT, FD, FS);
6522 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001101:COP1:32,f::TRUNC.W
6523 "trunc.w.%s<FMT> f<FD>, f<FS>"
6524 *mipsII:
6525 *mipsIII:
6526 *mipsIV:
6527 *mipsV:
6528 *mips32:
6529 *mips32r2:
6530 *mips32r6:
6531 *mips64:
6532 *mips64r2:
6533 *mips64r6:
6534 *vr4100:
6535 *vr5000:
6536 *r3900:
6538   do_trunc_fmt (SD_, fmt_word, FMT, FD, FS);
6543 // MIPS Architecture:
6545 //        System Control Instruction Set (COP0)
6549 010000,01000,00000,16.OFFSET:COP0:32::BC0F
6550 "bc0f <OFFSET>"
6551 *mipsI:
6552 *mipsII:
6553 *mipsIII:
6554 *mipsIV:
6555 *mipsV:
6556 *mips32:
6557 *mips32r2:
6558 *mips32r6:
6559 *mips64:
6560 *mips64r2:
6561 *mips64r6:
6562 *vr4100:
6563 *vr5000:
6565 010000,01000,00000,16.OFFSET:COP0:32::BC0F
6566 "bc0f <OFFSET>"
6567 // stub needed for eCos as tx39 hardware bug workaround
6568 *r3900:
6570   /* do nothing */
6574 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
6575 "bc0fl <OFFSET>"
6576 *mipsI:
6577 *mipsII:
6578 *mipsIII:
6579 *mipsIV:
6580 *mipsV:
6581 *mips32:
6582 *mips32r2:
6583 *mips32r6:
6584 *mips64:
6585 *mips64r2:
6586 *mips64r6:
6587 *vr4100:
6588 *vr5000:
6591 010000,01000,00001,16.OFFSET:COP0:32::BC0T
6592 "bc0t <OFFSET>"
6593 *mipsI:
6594 *mipsII:
6595 *mipsIII:
6596 *mipsIV:
6597 *mipsV:
6598 *mips32:
6599 *mips32r2:
6600 *mips32r6:
6601 *mips64:
6602 *mips64r2:
6603 *mips64r6:
6604 *vr4100:
6607 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
6608 "bc0tl <OFFSET>"
6609 *mipsI:
6610 *mipsII:
6611 *mipsIII:
6612 *mipsIV:
6613 *mipsV:
6614 *mips32:
6615 *mips32r2:
6616 *mips32r6:
6617 *mips64:
6618 *mips64r2:
6619 *mips64r6:
6620 *vr4100:
6621 *vr5000:
6623 :function:::void:do_cache:int op, int rbase, int roffset, address_word instruction_0
6625   address_word base = GPR[rbase];
6626   address_word offset = EXTEND16 (roffset);
6627   {
6628     address_word vaddr = loadstore_ea (SD_, base, offset);
6629     address_word paddr = vaddr;
6630     CacheOp(op, vaddr, paddr, instruction_0);
6631   }
6634 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
6635 "cache <OP>, <OFFSET>(r<BASE>)"
6636 *mipsIII:
6637 *mipsIV:
6638 *mipsV:
6639 *mips32:
6640 *mips32r2:
6641 *mips64:
6642 *mips64r2:
6643 *vr4100:
6644 *vr5000:
6645 *r3900:
6647   do_cache (SD_, OP, BASE, OFFSET, instruction_0);
6651 010000,00001,5.RT,5.RD,00000000,3.SEL:COP0:64::DMFC0
6652 "dmfc0 r<RT>, r<RD>"
6653 *mipsIII:
6654 *mipsIV:
6655 *mipsV:
6656 *mips64:
6657 *mips64r2:
6658 *mips64r6:
6660   check_u64 (SD_, instruction_0);
6661   DecodeCoproc (instruction_0, 0, cp0_dmfc0, RT, RD, SEL);
6665 010000,00101,5.RT,5.RD,00000000,3.SEL:COP0:64::DMTC0
6666 "dmtc0 r<RT>, r<RD>"
6667 *mipsIII:
6668 *mipsIV:
6669 *mipsV:
6670 *mips64:
6671 *mips64r2:
6672 *mips64r6:
6674   check_u64 (SD_, instruction_0);
6675   DecodeCoproc (instruction_0, 0, cp0_dmtc0, RT, RD, SEL);
6679 010000,1,0000000000000000000,011000:COP0:32::ERET
6680 "eret"
6681 *mipsIII:
6682 *mipsIV:
6683 *mipsV:
6684 *mips32:
6685 *mips32r2:
6686 *mips32r6:
6687 *mips64:
6688 *mips64r2:
6689 *mips64r6:
6690 *vr4100:
6691 *vr5000:
6693   if (SR & status_ERL)
6694     {
6695       /* Oops, not yet available */
6696       sim_io_printf (SD, "Warning: ERET when SR[ERL] set not supported");
6697       NIA = EPC;
6698       SR &= ~status_ERL;
6699     }
6700   else
6701     {
6702       NIA = EPC;
6703       SR &= ~status_EXL;
6704     }
6708 010000,00000,5.RT,5.RD,00000000,3.SEL:COP0:32::MFC0
6709 "mfc0 r<RT>, r<RD> # <SEL>"
6710 *mipsI:
6711 *mipsII:
6712 *mipsIII:
6713 *mipsIV:
6714 *mipsV:
6715 *mips32:
6716 *mips32r2:
6717 *mips32r6:
6718 *mips64:
6719 *mips64r2:
6720 *mips64r6:
6721 *vr4100:
6722 *vr5000:
6723 *r3900:
6725   TRACE_ALU_INPUT0 ();
6726   DecodeCoproc (instruction_0, 0, cp0_mfc0, RT, RD, SEL);
6727   TRACE_ALU_RESULT (GPR[RT]);
6730 010000,00100,5.RT,5.RD,00000000,3.SEL:COP0:32::MTC0
6731 "mtc0 r<RT>, r<RD> # <SEL>"
6732 *mipsI:
6733 *mipsII:
6734 *mipsIII:
6735 *mipsIV:
6736 *mipsV:
6737 *mips32:
6738 *mips32r2:
6739 *mips32r6:
6740 *mips64:
6741 *mips64r2:
6742 *mips64r6:
6743 *vr4100:
6744 *vr5000:
6745 *r3900:
6747   DecodeCoproc (instruction_0, 0, cp0_mtc0, RT, RD, SEL);
6751 010000,1,0000000000000000000,010000:COP0:32::RFE
6752 "rfe"
6753 *mipsI:
6754 *mipsII:
6755 *mipsIII:
6756 *mipsIV:
6757 *mipsV:
6758 *vr4100:
6759 *vr5000:
6760 *r3900:
6762   DecodeCoproc (instruction_0, 0, cp0_rfe, 0, 0, 0x10);
6766 0100,ZZ!0!1!3,5.COP_FUN0!8,5.COP_FUN1,16.COP_FUN2:NORMAL:32::COPz
6767 "cop<ZZ> <COP_FUN0><COP_FUN1><COP_FUN2>"
6768 *mipsI:
6769 *mipsII:
6770 *mipsIII:
6771 *mipsIV:
6772 *mipsV:
6773 *mips32:
6774 *mips32r2:
6775 *mips32r6:
6776 *mips64:
6777 *mips64r2:
6778 *mips64r6:
6779 *vr4100:
6780 *r3900:
6782   DecodeCoproc (instruction_0, 2, 0, 0, 0, 0);
6787 010000,1,0000000000000000000,001000:COP0:32::TLBP
6788 "tlbp"
6789 *mipsI:
6790 *mipsII:
6791 *mipsIII:
6792 *mipsIV:
6793 *mipsV:
6794 *mips32:
6795 *mips32r2:
6796 *mips32r6:
6797 *mips64:
6798 *mips64r2:
6799 *mips64r6:
6800 *vr4100:
6801 *vr5000:
6804 010000,1,0000000000000000000,000001:COP0:32::TLBR
6805 "tlbr"
6806 *mipsI:
6807 *mipsII:
6808 *mipsIII:
6809 *mipsIV:
6810 *mipsV:
6811 *mips32:
6812 *mips32r2:
6813 *mips32r6:
6814 *mips64:
6815 *mips64r2:
6816 *mips64r6:
6817 *vr4100:
6818 *vr5000:
6821 010000,1,0000000000000000000,000010:COP0:32::TLBWI
6822 "tlbwi"
6823 *mipsI:
6824 *mipsII:
6825 *mipsIII:
6826 *mipsIV:
6827 *mipsV:
6828 *mips32:
6829 *mips32r2:
6830 *mips32r6:
6831 *mips64:
6832 *mips64r2:
6833 *mips64r6:
6834 *vr4100:
6835 *vr5000:
6838 010000,1,0000000000000000000,000110:COP0:32::TLBWR
6839 "tlbwr"
6840 *mipsI:
6841 *mipsII:
6842 *mipsIII:
6843 *mipsIV:
6844 *mipsV:
6845 *mips32:
6846 *mips32r2:
6847 *mips32r6:
6848 *mips64:
6849 *mips64r2:
6850 *mips64r6:
6851 *vr4100:
6852 *vr5000:
6855 :include:::mips3264r2.igen
6856 :include:::mips3264r6.igen
6857 :include:::m16.igen
6858 :include:::m16e.igen
6859 :include:::mdmx.igen
6860 :include:::mips3d.igen
6861 :include:::sb1.igen
6862 :include:::tx.igen
6863 :include:::vr.igen
6864 :include:::dsp.igen
6865 :include:::dsp2.igen
6866 :include:::smartmips.igen
6867 :include:::micromips.igen
6868 :include:::micromipsdsp.igen