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