4 // <insn-word> { "+" <insn-word> }
11 // { <insn-mnemonic> }
16 // IGEN config - mips16
17 // :option:16::insn-bit-size:16
18 // :option:16::hi-bit-nr:15
19 :option:16::insn-specifying-widths:true
20 :option:16::gen-delayed-branch:false
22 // IGEN config - mips32/64..
23 // :option:32::insn-bit-size:32
24 // :option:32::hi-bit-nr:31
25 :option:32::insn-specifying-widths:true
26 :option:32::gen-delayed-branch:false
29 // Generate separate simulators for each target
30 // :option:::multi-sim:true
33 // Models known by this simulator
34 :model:::mipsI:mips3000:
35 :model:::mipsII:mips6000:
36 :model:::mipsIII:mips4000:
37 :model:::mipsIV:mips8000:
38 :model:::mips16:mips16:
39 // start-sanitize-r5900
40 :model:::r5900:mips5900:
42 :model:::r3900:mips3900:
43 // start-sanitize-tx19
46 // start-sanitize-vr4320
47 :model:::vr4320:mips4320:
48 // end-sanitize-vr4320
49 // start-sanitize-vr5400
50 :model:::vr5400:mips5400:
52 // end-sanitize-vr5400
53 :model:::vr5000:mips5000:
57 // Pseudo instructions known by IGEN
60 SignalException (ReservedInstruction, 0);
64 // Pseudo instructions known by interp.c
65 // For grep - RSVD_INSTRUCTION, RSVD_INSTRUCTION_MASK
66 000000,5.*,5.*,5.*,5.OP,000101:SPECIAL:32::RSVD
69 SignalException (ReservedInstruction, instruction_0);
76 // Simulate a 32 bit delayslot instruction
79 :function:::address_word:delayslot32:address_word target
81 instruction_word delay_insn;
82 sim_events_slip (SD, 1);
84 CIA = CIA + 4; /* NOTE not mips16 */
85 STATE |= simDELAYSLOT;
86 delay_insn = IMEM32 (CIA); /* NOTE not mips16 */
87 idecode_issue (CPU_, delay_insn, (CIA));
88 STATE &= ~simDELAYSLOT;
92 :function:::address_word:nullify_next_insn32:
94 sim_events_slip (SD, 1);
95 dotrace (SD, CPU, tracefh, 2, CIA + 4, 4, "load instruction");
103 // Check that an access to a HI/LO register meets timing requirements
105 // The following requirements exist:
107 // - A MT {HI,LO} update was not immediatly preceeded by a MF {HI,LO} read
108 // - A OP {HI,LO} update was not immediatly preceeded by a MF {HI,LO} read
109 // - A MF {HI,LO} read was not corrupted by a preceeding MT{LO,HI} update
110 // corruption occures when MT{LO,HI} is preceeded by a OP {HI,LO}.
113 :function:::int:check_mf_cycles:hilo_history *history, signed64 time, const char *new
115 if (history->mf.timestamp + 3 > time)
117 sim_engine_abort (SD, CPU, CIA, "HILO: %s: %s at 0x%08lx too close to MF at 0x%08lx\n",
118 itable[MY_INDEX].name,
120 (long) history->mf.cia);
126 :function:::int:check_mt_hilo:hilo_history *history
127 *mipsI,mipsII,mipsIII,mipsIV:
129 // start-sanitize-vr4320
131 // end-sanitize-vr4320
132 // start-sanitize-vr5400
134 // end-sanitize-vr5400
136 signed64 time = sim_events_time (SD);
137 int ok = check_mf_cycles (SD_, history, time, "MT");
138 history->mt.timestamp = time;
139 history->mt.cia = CIA;
143 :function:::int:check_mt_hilo:hilo_history *history
145 // start-sanitize-tx19
148 // start-sanitize-r5900
150 // end-sanitize-r5900
152 signed64 time = sim_events_time (SD);
153 history->mt.timestamp = time;
154 history->mt.cia = CIA;
159 :function:::int:check_mf_hilo:hilo_history *history, hilo_history *peer
160 *mipsI,mipsII,mipsIII,mipsIV:
162 // start-sanitize-vr4320
164 // end-sanitize-vr4320
165 // start-sanitize-vr5400
167 // end-sanitize-vr5400
169 // start-sanitize-tx19
173 signed64 time = sim_events_time (SD);
176 && peer->mt.timestamp > history->op.timestamp
177 && history->mf.timestamp < history->op.timestamp)
179 /* The peer has been written to since the last OP yet we have
181 sim_engine_abort (SD, CPU, CIA, "HILO: %s: MF at 0x%08lx following OP at 0x%08lx corrupted by MT at 0x%08lx\n",
182 itable[MY_INDEX].name,
184 (long) history->op.cia,
185 (long) peer->mt.cia);
188 history->mf.timestamp = time;
189 history->mf.cia = CIA;
193 // start-sanitize-r5900
194 // The r5900 mfhi et.al insns _can_ be exectuted immediatly after a div
195 :function:::int:check_mf_hilo:hilo_history *history, hilo_history *peer
196 // end-sanitize-r5900
197 // start-sanitize-r5900
199 // end-sanitize-r5900
200 // start-sanitize-r5900
202 /* FIXME: could record the fact that a stall occured if we want */
203 signed64 time = sim_events_time (SD);
204 history->mf.timestamp = time;
205 history->mf.cia = CIA;
208 // end-sanitize-r5900
211 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
212 *mipsI,mipsII,mipsIII,mipsIV:
214 // start-sanitize-vr4320
216 // end-sanitize-vr4320
217 // start-sanitize-vr5400
219 // end-sanitize-vr5400
221 signed64 time = sim_events_time (SD);
222 int ok = (check_mf_cycles (SD_, hi, time, "OP")
223 && check_mf_cycles (SD_, lo, time, "OP"));
224 hi->op.timestamp = time;
225 lo->op.timestamp = time;
231 // The r3900 mult and multu insns _can_ be exectuted immediatly after
233 :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo
235 // start-sanitize-tx19
238 // start-sanitize-r5900
240 // end-sanitize-r5900
242 /* FIXME: could record the fact that a stall occured if we want */
243 signed64 time = sim_events_time (SD);
244 hi->op.timestamp = time;
245 lo->op.timestamp = time;
252 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
253 *mipsI,mipsII,mipsIII,mipsIV:
255 // start-sanitize-vr4320
257 // end-sanitize-vr4320
258 // start-sanitize-vr5400
260 // end-sanitize-vr5400
262 // start-sanitize-tx19
266 signed64 time = sim_events_time (SD);
267 int ok = (check_mf_cycles (SD_, hi, time, "OP")
268 && check_mf_cycles (SD_, lo, time, "OP"));
269 hi->op.timestamp = time;
270 lo->op.timestamp = time;
277 // start-sanitize-r5900
278 // The r5900 div et.al insns _can_ be exectuted immediatly after
280 :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo
281 // end-sanitize-r5900
282 // start-sanitize-r5900
284 // end-sanitize-r5900
285 // start-sanitize-r5900
287 /* FIXME: could record the fact that a stall occured if we want */
288 signed64 time = sim_events_time (SD);
289 hi->op.timestamp = time;
290 lo->op.timestamp = time;
295 // end-sanitize-r5900
300 // Mips Architecture:
302 // CPU Instruction Set (mipsI - mipsIV)
307 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
308 "add r<RD>, r<RS>, r<RT>"
309 *mipsI,mipsII,mipsIII,mipsIV:
311 // start-sanitize-vr4320
313 // end-sanitize-vr4320
314 // start-sanitize-vr5400
316 // end-sanitize-vr5400
317 // start-sanitize-r5900
319 // end-sanitize-r5900
321 // start-sanitize-tx19
325 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
327 ALU32_BEGIN (GPR[RS]);
331 TRACE_ALU_RESULT (GPR[RD]);
336 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
337 "addi r<RT>, r<RS>, IMMEDIATE"
338 *mipsI,mipsII,mipsIII,mipsIV:
340 // start-sanitize-vr4320
342 // end-sanitize-vr4320
343 // start-sanitize-vr5400
345 // end-sanitize-vr5400
346 // start-sanitize-r5900
348 // end-sanitize-r5900
350 // start-sanitize-tx19
354 TRACE_ALU_INPUT2 (GPR[RS], EXTEND16 (IMMEDIATE));
356 ALU32_BEGIN (GPR[RS]);
357 ALU32_ADD (EXTEND16 (IMMEDIATE));
360 TRACE_ALU_RESULT (GPR[RT]);
365 :function:::void:do_addiu:int rs, int rt, unsigned16 immediate
367 TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
368 GPR[rt] = EXTEND32 (GPR[rs] + EXTEND16 (immediate));
369 TRACE_ALU_RESULT (GPR[rt]);
372 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
373 "addiu r<RT>, r<RS>, <IMMEDIATE>"
374 *mipsI,mipsII,mipsIII,mipsIV:
376 // start-sanitize-vr4320
378 // end-sanitize-vr4320
379 // start-sanitize-vr5400
381 // end-sanitize-vr5400
382 // start-sanitize-r5900
384 // end-sanitize-r5900
386 // start-sanitize-tx19
390 do_addiu (SD_, RS, RT, IMMEDIATE);
395 :function:::void:do_addu:int rs, int rt, int rd
397 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
398 GPR[rd] = EXTEND32 (GPR[rs] + GPR[rt]);
399 TRACE_ALU_RESULT (GPR[rd]);
402 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
403 "addu r<RD>, r<RS>, r<RT>"
404 *mipsI,mipsII,mipsIII,mipsIV:
406 // start-sanitize-vr4320
408 // end-sanitize-vr4320
409 // start-sanitize-vr5400
411 // end-sanitize-vr5400
412 // start-sanitize-r5900
414 // end-sanitize-r5900
416 // start-sanitize-tx19
420 do_addu (SD_, RS, RT, RD);
425 :function:::void:do_and:int rs, int rt, int rd
427 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
428 GPR[rd] = GPR[rs] & GPR[rt];
429 TRACE_ALU_RESULT (GPR[rd]);
432 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
433 "and r<RD>, r<RS>, r<RT>"
434 *mipsI,mipsII,mipsIII,mipsIV:
436 // start-sanitize-vr4320
438 // end-sanitize-vr4320
439 // start-sanitize-vr5400
441 // end-sanitize-vr5400
442 // start-sanitize-r5900
444 // end-sanitize-r5900
446 // start-sanitize-tx19
450 do_and (SD_, RS, RT, RD);
455 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
456 "and r<RT>, r<RS>, <IMMEDIATE>"
457 *mipsI,mipsII,mipsIII,mipsIV:
459 // start-sanitize-vr4320
461 // end-sanitize-vr4320
462 // start-sanitize-vr5400
464 // end-sanitize-vr5400
465 // start-sanitize-r5900
467 // end-sanitize-r5900
469 // start-sanitize-tx19
473 TRACE_ALU_INPUT2 (GPR[RS], IMMEDIATE);
474 GPR[RT] = GPR[RS] & IMMEDIATE;
475 TRACE_ALU_RESULT (GPR[RT]);
480 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
481 "beq r<RS>, r<RT>, <OFFSET>"
482 *mipsI,mipsII,mipsIII,mipsIV:
484 // start-sanitize-vr4320
486 // end-sanitize-vr4320
487 // start-sanitize-vr5400
489 // end-sanitize-vr5400
490 // start-sanitize-r5900
492 // end-sanitize-r5900
494 // start-sanitize-tx19
498 address_word offset = EXTEND16 (OFFSET) << 2;
499 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
500 DELAY_SLOT (NIA + offset);
505 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
506 "beql r<RS>, r<RT>, <OFFSET>"
511 // start-sanitize-vr4320
513 // end-sanitize-vr4320
514 // start-sanitize-vr5400
516 // end-sanitize-vr5400
517 // start-sanitize-r5900
519 // end-sanitize-r5900
521 // start-sanitize-tx19
525 address_word offset = EXTEND16 (OFFSET) << 2;
526 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
527 DELAY_SLOT (NIA + offset);
529 NULLIFY_NEXT_INSTRUCTION ();
534 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
535 "bgez r<RS>, <OFFSET>"
536 *mipsI,mipsII,mipsIII,mipsIV:
538 // start-sanitize-vr4320
540 // end-sanitize-vr4320
541 // start-sanitize-vr5400
543 // end-sanitize-vr5400
544 // start-sanitize-r5900
546 // end-sanitize-r5900
548 // start-sanitize-tx19
552 address_word offset = EXTEND16 (OFFSET) << 2;
553 if ((signed_word) GPR[RS] >= 0)
554 DELAY_SLOT (NIA + offset);
559 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
560 "bgezal r<RS>, <OFFSET>"
561 *mipsI,mipsII,mipsIII,mipsIV:
563 // start-sanitize-vr4320
565 // end-sanitize-vr4320
566 // start-sanitize-vr5400
568 // end-sanitize-vr5400
569 // start-sanitize-r5900
571 // end-sanitize-r5900
573 // start-sanitize-tx19
577 address_word offset = EXTEND16 (OFFSET) << 2;
579 if ((signed_word) GPR[RS] >= 0)
580 DELAY_SLOT (NIA + offset);
585 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
586 "bgezall r<RS>, <OFFSET>"
591 // start-sanitize-vr4320
593 // end-sanitize-vr4320
594 // start-sanitize-vr5400
596 // end-sanitize-vr5400
597 // start-sanitize-r5900
599 // end-sanitize-r5900
601 // start-sanitize-tx19
605 address_word offset = EXTEND16 (OFFSET) << 2;
607 /* NOTE: The branch occurs AFTER the next instruction has been
609 if ((signed_word) GPR[RS] >= 0)
610 DELAY_SLOT (NIA + offset);
612 NULLIFY_NEXT_INSTRUCTION ();
617 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
618 "bgezl r<RS>, <OFFSET>"
623 // start-sanitize-vr4320
625 // end-sanitize-vr4320
626 // start-sanitize-vr5400
628 // end-sanitize-vr5400
629 // start-sanitize-r5900
631 // end-sanitize-r5900
633 // start-sanitize-tx19
637 address_word offset = EXTEND16 (OFFSET) << 2;
638 if ((signed_word) GPR[RS] >= 0)
639 DELAY_SLOT (NIA + offset);
641 NULLIFY_NEXT_INSTRUCTION ();
646 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
647 "bgtz r<RS>, <OFFSET>"
648 *mipsI,mipsII,mipsIII,mipsIV:
650 // start-sanitize-vr4320
652 // end-sanitize-vr4320
653 // start-sanitize-vr5400
655 // end-sanitize-vr5400
656 // start-sanitize-r5900
658 // end-sanitize-r5900
660 // start-sanitize-tx19
664 address_word offset = EXTEND16 (OFFSET) << 2;
665 if ((signed_word) GPR[RS] > 0)
666 DELAY_SLOT (NIA + offset);
671 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
672 "bgtzl r<RS>, <OFFSET>"
677 // start-sanitize-vr4320
679 // end-sanitize-vr4320
680 // start-sanitize-vr5400
682 // end-sanitize-vr5400
683 // start-sanitize-r5900
685 // end-sanitize-r5900
687 // start-sanitize-tx19
691 address_word offset = EXTEND16 (OFFSET) << 2;
692 /* NOTE: The branch occurs AFTER the next instruction has been
694 if ((signed_word) GPR[RS] > 0)
695 DELAY_SLOT (NIA + offset);
697 NULLIFY_NEXT_INSTRUCTION ();
702 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
703 "blez r<RS>, <OFFSET>"
704 *mipsI,mipsII,mipsIII,mipsIV:
706 // start-sanitize-vr4320
708 // end-sanitize-vr4320
709 // start-sanitize-vr5400
711 // end-sanitize-vr5400
712 // start-sanitize-r5900
714 // end-sanitize-r5900
716 // start-sanitize-tx19
720 address_word offset = EXTEND16 (OFFSET) << 2;
721 /* NOTE: The branch occurs AFTER the next instruction has been
723 if ((signed_word) GPR[RS] <= 0)
724 DELAY_SLOT (NIA + offset);
729 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
730 "bgezl r<RS>, <OFFSET>"
735 // start-sanitize-vr4320
737 // end-sanitize-vr4320
738 // start-sanitize-vr5400
740 // end-sanitize-vr5400
741 // start-sanitize-r5900
743 // end-sanitize-r5900
745 // start-sanitize-tx19
749 address_word offset = EXTEND16 (OFFSET) << 2;
750 if ((signed_word) GPR[RS] <= 0)
751 DELAY_SLOT (NIA + offset);
753 NULLIFY_NEXT_INSTRUCTION ();
758 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
759 "bltz r<RS>, <OFFSET>"
760 *mipsI,mipsII,mipsIII,mipsIV:
762 // start-sanitize-vr4320
764 // end-sanitize-vr4320
765 // start-sanitize-vr5400
767 // end-sanitize-vr5400
768 // start-sanitize-r5900
770 // end-sanitize-r5900
772 // start-sanitize-tx19
776 address_word offset = EXTEND16 (OFFSET) << 2;
777 if ((signed_word) GPR[RS] < 0)
778 DELAY_SLOT (NIA + offset);
783 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
784 "bltzal r<RS>, <OFFSET>"
785 *mipsI,mipsII,mipsIII,mipsIV:
787 // start-sanitize-vr4320
789 // end-sanitize-vr4320
790 // start-sanitize-vr5400
792 // end-sanitize-vr5400
793 // start-sanitize-r5900
795 // end-sanitize-r5900
797 // start-sanitize-tx19
801 address_word offset = EXTEND16 (OFFSET) << 2;
803 /* NOTE: The branch occurs AFTER the next instruction has been
805 if ((signed_word) GPR[RS] < 0)
806 DELAY_SLOT (NIA + offset);
811 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
812 "bltzall r<RS>, <OFFSET>"
817 // start-sanitize-vr4320
819 // end-sanitize-vr4320
820 // start-sanitize-vr5400
822 // end-sanitize-vr5400
823 // start-sanitize-r5900
825 // end-sanitize-r5900
827 // start-sanitize-tx19
831 address_word offset = EXTEND16 (OFFSET) << 2;
833 if ((signed_word) GPR[RS] < 0)
834 DELAY_SLOT (NIA + offset);
836 NULLIFY_NEXT_INSTRUCTION ();
841 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
842 "bltzl r<RS>, <OFFSET>"
847 // start-sanitize-vr4320
849 // end-sanitize-vr4320
850 // start-sanitize-vr5400
852 // end-sanitize-vr5400
853 // start-sanitize-r5900
855 // end-sanitize-r5900
857 // start-sanitize-tx19
861 address_word offset = EXTEND16 (OFFSET) << 2;
862 /* NOTE: The branch occurs AFTER the next instruction has been
864 if ((signed_word) GPR[RS] < 0)
865 DELAY_SLOT (NIA + offset);
867 NULLIFY_NEXT_INSTRUCTION ();
872 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
873 "bne r<RS>, r<RT>, <OFFSET>"
874 *mipsI,mipsII,mipsIII,mipsIV:
876 // start-sanitize-vr4320
878 // end-sanitize-vr4320
879 // start-sanitize-vr5400
881 // end-sanitize-vr5400
882 // start-sanitize-r5900
884 // end-sanitize-r5900
886 // start-sanitize-tx19
890 address_word offset = EXTEND16 (OFFSET) << 2;
891 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
892 DELAY_SLOT (NIA + offset);
897 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
898 "bnel r<RS>, r<RT>, <OFFSET>"
903 // start-sanitize-vr4320
905 // end-sanitize-vr4320
906 // start-sanitize-vr5400
908 // end-sanitize-vr5400
909 // start-sanitize-r5900
911 // end-sanitize-r5900
913 // start-sanitize-tx19
917 address_word offset = EXTEND16 (OFFSET) << 2;
918 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
919 DELAY_SLOT (NIA + offset);
921 NULLIFY_NEXT_INSTRUCTION ();
926 000000,20.CODE,001101:SPECIAL:32::BREAK
928 *mipsI,mipsII,mipsIII,mipsIV:
930 // start-sanitize-vr4320
932 // end-sanitize-vr4320
933 // start-sanitize-vr5400
935 // end-sanitize-vr5400
936 // start-sanitize-r5900
938 // end-sanitize-r5900
940 // start-sanitize-tx19
944 SignalException(BreakPoint, instruction_0);
949 0100,ZZ!0!1!3,26.COP_FUN:NORMAL:32::COPz
951 *mipsI,mipsII,mipsIII,mipsIV:
952 // start-sanitize-r5900
954 // end-sanitize-r5900
956 // start-sanitize-tx19
960 DecodeCoproc (instruction_0);
965 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
966 "dadd r<RD>, r<RS>, r<RT>"
970 // start-sanitize-vr4320
972 // end-sanitize-vr4320
973 // start-sanitize-vr5400
975 // end-sanitize-vr5400
976 // start-sanitize-r5900
978 // end-sanitize-r5900
979 // start-sanitize-tx19
983 /* this check's for overflow */
984 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
986 ALU64_BEGIN (GPR[RS]);
990 TRACE_ALU_RESULT (GPR[RD]);
995 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
996 "daddi r<RT>, r<RS>, <IMMEDIATE>"
1000 // start-sanitize-vr4320
1002 // end-sanitize-vr4320
1003 // start-sanitize-vr5400
1005 // end-sanitize-vr5400
1006 // start-sanitize-r5900
1008 // end-sanitize-r5900
1009 // start-sanitize-tx19
1011 // end-sanitize-tx19
1013 TRACE_ALU_INPUT2 (GPR[RS], EXTEND16 (IMMEDIATE));
1015 ALU64_BEGIN (GPR[RS]);
1016 ALU64_ADD (EXTEND16 (IMMEDIATE));
1017 ALU64_END (GPR[RT]);
1019 TRACE_ALU_RESULT (GPR[RT]);
1024 :function:64::void:do_daddiu:int rs, int rt, unsigned16 immediate
1026 TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
1027 GPR[rt] = GPR[rs] + EXTEND16 (immediate);
1028 TRACE_ALU_RESULT (GPR[rt]);
1031 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
1032 "daddu r<RT>, r<RS>, <IMMEDIATE>"
1036 // start-sanitize-vr4320
1038 // end-sanitize-vr4320
1039 // start-sanitize-vr5400
1041 // end-sanitize-vr5400
1042 // start-sanitize-r5900
1044 // end-sanitize-r5900
1045 // start-sanitize-tx19
1047 // end-sanitize-tx19
1049 do_daddiu (SD_, RS, RT, IMMEDIATE);
1054 :function:::void:do_daddu:int rs, int rt, int rd
1056 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1057 GPR[rd] = GPR[rs] + GPR[rt];
1058 TRACE_ALU_RESULT (GPR[rd]);
1061 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
1062 "daddu r<RD>, r<RS>, r<RT>"
1066 // start-sanitize-vr4320
1068 // end-sanitize-vr4320
1069 // start-sanitize-vr5400
1071 // end-sanitize-vr5400
1072 // start-sanitize-r5900
1074 // end-sanitize-r5900
1075 // start-sanitize-tx19
1077 // end-sanitize-tx19
1079 do_daddu (SD_, RS, RT, RD);
1084 :function:64::void:do_ddiv:int rs, int rt
1086 check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1087 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1089 signed64 n = GPR[rs];
1090 signed64 d = GPR[rt];
1093 LO = SIGNED64 (0x8000000000000000);
1096 else if (d == -1 && n == SIGNED64 (0x8000000000000000))
1098 LO = SIGNED64 (0x8000000000000000);
1107 TRACE_ALU_RESULT2 (HI, LO);
1110 000000,5.RS,5.RT,0000000000011110:SPECIAL:64::DDIV
1115 // start-sanitize-vr4320
1117 // end-sanitize-vr4320
1118 // start-sanitize-vr5400
1120 // end-sanitize-vr5400
1121 // start-sanitize-r5900
1123 // end-sanitize-r5900
1124 // start-sanitize-tx19
1126 // end-sanitize-tx19
1128 do_ddiv (SD_, RS, RT);
1133 :function:64::void:do_ddivu:int rs, int rt
1135 check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1136 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1138 unsigned64 n = GPR[rs];
1139 unsigned64 d = GPR[rt];
1142 LO = SIGNED64 (0x8000000000000000);
1151 TRACE_ALU_RESULT2 (HI, LO);
1154 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
1155 "ddivu r<RS>, r<RT>"
1159 // start-sanitize-vr4320
1161 // end-sanitize-vr4320
1162 // start-sanitize-vr5400
1164 // end-sanitize-vr5400
1165 // start-sanitize-tx19
1167 // end-sanitize-tx19
1169 do_ddivu (SD_, RS, RT);
1174 :function:::void:do_div:int rs, int rt
1176 check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1177 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1179 signed32 n = GPR[rs];
1180 signed32 d = GPR[rt];
1183 LO = EXTEND32 (0x80000000);
1186 else if (n == SIGNED32 (0x80000000) && d == -1)
1188 LO = EXTEND32 (0x80000000);
1193 LO = EXTEND32 (n / d);
1194 HI = EXTEND32 (n % d);
1197 TRACE_ALU_RESULT2 (HI, LO);
1200 000000,5.RS,5.RT,0000000000011010:SPECIAL:32::DIV
1202 *mipsI,mipsII,mipsIII,mipsIV:
1204 // start-sanitize-vr4320
1206 // end-sanitize-vr4320
1207 // start-sanitize-vr5400
1209 // end-sanitize-vr5400
1210 // start-sanitize-r5900
1212 // end-sanitize-r5900
1214 // start-sanitize-tx19
1216 // end-sanitize-tx19
1218 do_div (SD_, RS, RT);
1223 :function:::void:do_divu:int rs, int rt
1225 check_div_hilo (SD_, HIHISTORY, LOHISTORY);
1226 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1228 unsigned32 n = GPR[rs];
1229 unsigned32 d = GPR[rt];
1232 LO = EXTEND32 (0x80000000);
1237 LO = EXTEND32 (n / d);
1238 HI = EXTEND32 (n % d);
1241 TRACE_ALU_RESULT2 (HI, LO);
1244 000000,5.RS,5.RT,0000000000011011:SPECIAL:32::DIVU
1246 *mipsI,mipsII,mipsIII,mipsIV:
1248 // start-sanitize-vr4320
1250 // end-sanitize-vr4320
1251 // start-sanitize-vr5400
1253 // end-sanitize-vr5400
1254 // start-sanitize-r5900
1256 // end-sanitize-r5900
1258 // start-sanitize-tx19
1260 // end-sanitize-tx19
1262 do_divu (SD_, RS, RT);
1267 :function:::void:do_dmultx:int rs, int rt, int rd, int signed_p
1277 unsigned64 op1 = GPR[rs];
1278 unsigned64 op2 = GPR[rt];
1279 check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
1280 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1281 /* make signed multiply unsigned */
1296 /* multuply out the 4 sub products */
1297 m00 = ((unsigned64) VL4_8 (op1) * (unsigned64) VL4_8 (op2));
1298 m10 = ((unsigned64) VH4_8 (op1) * (unsigned64) VL4_8 (op2));
1299 m01 = ((unsigned64) VL4_8 (op1) * (unsigned64) VH4_8 (op2));
1300 m11 = ((unsigned64) VH4_8 (op1) * (unsigned64) VH4_8 (op2));
1301 /* add the products */
1302 mid = ((unsigned64) VH4_8 (m00)
1303 + (unsigned64) VL4_8 (m10)
1304 + (unsigned64) VL4_8 (m01));
1305 lo = U8_4 (mid, m00);
1307 + (unsigned64) VH4_8 (mid)
1308 + (unsigned64) VH4_8 (m01)
1309 + (unsigned64) VH4_8 (m10));
1319 /* save the result HI/LO (and a gpr) */
1324 TRACE_ALU_RESULT2 (HI, LO);
1327 :function:::void:do_dmult:int rs, int rt, int rd
1329 do_dmultx (SD_, rs, rt, rd, 1);
1332 000000,5.RS,5.RT,0000000000011100:SPECIAL:64::DMULT
1333 "dmult r<RS>, r<RT>"
1335 // start-sanitize-tx19
1337 // end-sanitize-tx19
1338 // start-sanitize-vr4320
1340 // end-sanitize-vr4320
1342 do_dmult (SD_, RS, RT, 0);
1345 000000,5.RS,5.RT,5.RD,00000011100:SPECIAL:64::DMULT
1346 "dmult r<RS>, r<RT>":RD == 0
1347 "dmult r<RD>, r<RS>, r<RT>"
1349 // start-sanitize-vr5400
1351 // end-sanitize-vr5400
1353 do_dmult (SD_, RS, RT, RD);
1358 :function:::void:do_dmultu:int rs, int rt, int rd
1360 do_dmultx (SD_, rs, rt, rd, 0);
1363 000000,5.RS,5.RT,0000000000011101:SPECIAL:64::DMULTU
1364 "dmultu r<RS>, r<RT>"
1366 // start-sanitize-tx19
1368 // end-sanitize-tx19
1369 // start-sanitize-vr4320
1371 // end-sanitize-vr4320
1373 do_dmultu (SD_, RS, RT, 0);
1376 000000,5.RS,5.RT,5.RD,00000011101:SPECIAL:64::DMULTU
1377 "dmultu r<RD>, r<RS>, r<RT>":RD == 0
1378 "dmultu r<RS>, r<RT>"
1380 // start-sanitize-vr5400
1382 // end-sanitize-vr5400
1384 do_dmultu (SD_, RS, RT, RD);
1389 00000000000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
1390 "dsll r<RD>, r<RT>, <SHIFT>"
1394 // start-sanitize-vr4320
1396 // end-sanitize-vr4320
1397 // start-sanitize-vr5400
1399 // end-sanitize-vr5400
1400 // start-sanitize-r5900
1402 // end-sanitize-r5900
1403 // start-sanitize-tx19
1405 // end-sanitize-tx19
1408 GPR[RD] = GPR[RT] << s;
1412 00000000000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
1413 "dsll32 r<RD>, r<RT>, <SHIFT>"
1417 // start-sanitize-vr4320
1419 // end-sanitize-vr4320
1420 // start-sanitize-vr5400
1422 // end-sanitize-vr5400
1423 // start-sanitize-r5900
1425 // end-sanitize-r5900
1426 // start-sanitize-tx19
1428 // end-sanitize-tx19
1431 GPR[RD] = GPR[RT] << s;
1436 000000,5.RS,5.RT,5.RD,00000010100:SPECIAL:64::DSLLV
1437 "dsllv r<RD>, r<RT>, r<RS>"
1441 // start-sanitize-vr4320
1443 // end-sanitize-vr4320
1444 // start-sanitize-vr5400
1446 // end-sanitize-vr5400
1447 // start-sanitize-r5900
1449 // end-sanitize-r5900
1450 // start-sanitize-tx19
1452 // end-sanitize-tx19
1454 int s = MASKED64 (GPR[RS], 5, 0);
1455 GPR[RD] = GPR[RT] << s;
1460 00000000000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
1461 "dsra r<RD>, r<RT>, <SHIFT>"
1465 // start-sanitize-vr4320
1467 // end-sanitize-vr4320
1468 // start-sanitize-vr5400
1470 // end-sanitize-vr5400
1471 // start-sanitize-r5900
1473 // end-sanitize-r5900
1474 // start-sanitize-tx19
1476 // end-sanitize-tx19
1479 GPR[RD] = ((signed64) GPR[RT]) >> s;
1483 00000000000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
1484 "dsra32 r<RT>, r<RD>, <SHIFT>"
1488 // start-sanitize-vr4320
1490 // end-sanitize-vr4320
1491 // start-sanitize-vr5400
1493 // end-sanitize-vr5400
1494 // start-sanitize-r5900
1496 // end-sanitize-r5900
1497 // start-sanitize-tx19
1499 // end-sanitize-tx19
1502 GPR[RD] = ((signed64) GPR[RT]) >> s;
1506 :function:::void:do_dsrav:int rs, int rt, int rd
1508 int s = MASKED64 (GPR[rs], 5, 0);
1509 TRACE_ALU_INPUT2 (GPR[rt], s);
1510 GPR[rd] = ((signed64) GPR[rt]) >> s;
1511 TRACE_ALU_RESULT (GPR[rd]);
1514 000000,5.RS,5.RT,5.RD,00000010111:SPECIAL:64::DSRAV
1515 "dsra32 r<RT>, r<RD>, r<RS>"
1519 // start-sanitize-vr4320
1521 // end-sanitize-vr4320
1522 // start-sanitize-vr5400
1524 // end-sanitize-vr5400
1525 // start-sanitize-r5900
1527 // end-sanitize-r5900
1528 // start-sanitize-tx19
1530 // end-sanitize-tx19
1532 do_dsrav (SD_, RS, RT, RD);
1536 00000000000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
1537 "dsrl r<RD>, r<RT>, <SHIFT>"
1541 // start-sanitize-vr4320
1543 // end-sanitize-vr4320
1544 // start-sanitize-vr5400
1546 // end-sanitize-vr5400
1547 // start-sanitize-r5900
1549 // end-sanitize-r5900
1550 // start-sanitize-tx19
1552 // end-sanitize-tx19
1555 GPR[RD] = (unsigned64) GPR[RT] >> s;
1559 00000000000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
1560 "dsrl32 r<RD>, r<RT>, <SHIFT>"
1564 // start-sanitize-vr4320
1566 // end-sanitize-vr4320
1567 // start-sanitize-vr5400
1569 // end-sanitize-vr5400
1570 // start-sanitize-r5900
1572 // end-sanitize-r5900
1573 // start-sanitize-tx19
1575 // end-sanitize-tx19
1578 GPR[RD] = (unsigned64) GPR[RT] >> s;
1582 000000,5.RS,5.RT,5.RD,00000010110:SPECIAL:64::DSRLV
1583 "dsrl32 r<RD>, r<RT>, r<RS>"
1587 // start-sanitize-vr4320
1589 // end-sanitize-vr4320
1590 // start-sanitize-vr5400
1592 // end-sanitize-vr5400
1593 // start-sanitize-r5900
1595 // end-sanitize-r5900
1596 // start-sanitize-tx19
1598 // end-sanitize-tx19
1600 int s = MASKED64 (GPR[RS], 5, 0);
1601 GPR[RD] = (unsigned64) GPR[RT] >> s;
1605 000000,5.RS,5.RT,5.RD,00000101110:SPECIAL:64::DSUB
1606 "dsub r<RD>, r<RS>, r<RT>"
1610 // start-sanitize-vr4320
1612 // end-sanitize-vr4320
1613 // start-sanitize-vr5400
1615 // end-sanitize-vr5400
1616 // start-sanitize-r5900
1618 // end-sanitize-r5900
1619 // start-sanitize-tx19
1621 // end-sanitize-tx19
1623 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
1625 ALU64_BEGIN (GPR[RS]);
1626 ALU64_SUB (GPR[RT]);
1627 ALU64_END (GPR[RD]);
1629 TRACE_ALU_RESULT (GPR[RD]);
1633 :function:::void:do_dsubu:int rs, int rt, int rd
1635 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
1636 GPR[rd] = GPR[rs] - GPR[rt];
1637 TRACE_ALU_RESULT (GPR[rd]);
1640 000000,5.RS,5.RT,5.RD,00000101111:SPECIAL:64::DSUBU
1641 "dsubu r<RD>, r<RS>, r<RT>"
1645 // start-sanitize-vr4320
1647 // end-sanitize-vr4320
1648 // start-sanitize-vr5400
1650 // end-sanitize-vr5400
1651 // start-sanitize-r5900
1653 // end-sanitize-r5900
1654 // start-sanitize-tx19
1656 // end-sanitize-tx19
1658 do_dsubu (SD_, RS, RT, RD);
1662 000010,26.INSTR_INDEX:NORMAL:32::J
1664 *mipsI,mipsII,mipsIII,mipsIV:
1666 // start-sanitize-vr4320
1668 // end-sanitize-vr4320
1669 // start-sanitize-vr5400
1671 // end-sanitize-vr5400
1672 // start-sanitize-r5900
1674 // end-sanitize-r5900
1676 // start-sanitize-tx19
1678 // end-sanitize-tx19
1680 /* NOTE: The region used is that of the delay slot NIA and NOT the
1681 current instruction */
1682 address_word region = (NIA & MASK (63, 28));
1683 DELAY_SLOT (region | (INSTR_INDEX << 2));
1687 000011,26.INSTR_INDEX:NORMAL:32::JAL
1689 *mipsI,mipsII,mipsIII,mipsIV:
1691 // start-sanitize-vr4320
1693 // end-sanitize-vr4320
1694 // start-sanitize-vr5400
1696 // end-sanitize-vr5400
1697 // start-sanitize-r5900
1699 // end-sanitize-r5900
1701 // start-sanitize-tx19
1703 // end-sanitize-tx19
1705 /* NOTE: The region used is that of the delay slot and NOT the
1706 current instruction */
1707 address_word region = (NIA & MASK (63, 28));
1709 DELAY_SLOT (region | (INSTR_INDEX << 2));
1713 000000,5.RS,00000,5.RD,00000001001:SPECIAL:32::JALR
1714 "jalr r<RS>":RD == 31
1716 *mipsI,mipsII,mipsIII,mipsIV:
1718 // start-sanitize-vr4320
1720 // end-sanitize-vr4320
1721 // start-sanitize-vr5400
1723 // end-sanitize-vr5400
1724 // start-sanitize-r5900
1726 // end-sanitize-r5900
1728 // start-sanitize-tx19
1730 // end-sanitize-tx19
1732 address_word temp = GPR[RS];
1738 000000,5.RS,000000000000000001000:SPECIAL:32::JR
1740 *mipsI,mipsII,mipsIII,mipsIV:
1742 // start-sanitize-vr4320
1744 // end-sanitize-vr4320
1745 // start-sanitize-vr5400
1747 // end-sanitize-vr5400
1748 // start-sanitize-r5900
1750 // end-sanitize-r5900
1752 // start-sanitize-tx19
1754 // end-sanitize-tx19
1756 DELAY_SLOT (GPR[RS]);
1760 :function:::unsigned_word:do_load:unsigned access, address_word base, address_word offset
1762 address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
1763 address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
1764 address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
1771 vaddr = base + offset;
1772 if ((vaddr & access) != 0)
1773 SignalExceptionAddressLoad ();
1774 AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
1775 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
1776 LoadMemory (&memval, NULL, uncached, access, paddr, vaddr, isDATA, isREAL);
1777 byte = ((vaddr & mask) ^ bigendiancpu);
1778 return (memval >> (8 * byte));
1782 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
1783 "lb r<RT>, <OFFSET>(r<BASE>)"
1784 *mipsI,mipsII,mipsIII,mipsIV:
1786 // start-sanitize-vr4320
1788 // end-sanitize-vr4320
1789 // start-sanitize-vr5400
1791 // end-sanitize-vr5400
1792 // start-sanitize-r5900
1794 // end-sanitize-r5900
1796 // start-sanitize-tx19
1798 // end-sanitize-tx19
1800 GPR[RT] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET)));
1804 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
1805 "lbu r<RT>, <OFFSET>(r<BASE>)"
1806 *mipsI,mipsII,mipsIII,mipsIV:
1808 // start-sanitize-vr4320
1810 // end-sanitize-vr4320
1811 // start-sanitize-vr5400
1813 // end-sanitize-vr5400
1814 // start-sanitize-r5900
1816 // end-sanitize-r5900
1818 // start-sanitize-tx19
1820 // end-sanitize-tx19
1822 GPR[RT] = do_load (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET));
1826 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
1827 "ld r<RT>, <OFFSET>(r<BASE>)"
1831 // start-sanitize-vr4320
1833 // end-sanitize-vr4320
1834 // start-sanitize-vr5400
1836 // end-sanitize-vr5400
1837 // start-sanitize-r5900
1839 // end-sanitize-r5900
1840 // start-sanitize-tx19
1842 // end-sanitize-tx19
1844 GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
1848 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
1849 "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
1854 // start-sanitize-vr4320
1856 // end-sanitize-vr4320
1857 // start-sanitize-vr5400
1859 // end-sanitize-vr5400
1861 // start-sanitize-tx19
1863 // end-sanitize-tx19
1865 COP_LD (ZZ, RT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
1871 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
1872 "ldl r<RT>, <OFFSET>(r<BASE>)"
1876 // start-sanitize-vr4320
1878 // end-sanitize-vr4320
1879 // start-sanitize-vr5400
1881 // end-sanitize-vr5400
1882 // start-sanitize-r5900
1884 // end-sanitize-r5900
1885 // start-sanitize-tx19
1887 // end-sanitize-tx19
1889 GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
1893 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
1894 "ldr r<RT>, <OFFSET>(r<BASE>)"
1898 // start-sanitize-vr4320
1900 // end-sanitize-vr4320
1901 // start-sanitize-vr5400
1903 // end-sanitize-vr5400
1904 // start-sanitize-r5900
1906 // end-sanitize-r5900
1907 // start-sanitize-tx19
1909 // end-sanitize-tx19
1911 GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
1915 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
1916 "lh r<RT>, <OFFSET>(r<BASE>)"
1917 *mipsI,mipsII,mipsIII,mipsIV:
1919 // start-sanitize-vr4320
1921 // end-sanitize-vr4320
1922 // start-sanitize-vr5400
1924 // end-sanitize-vr5400
1925 // start-sanitize-r5900
1927 // end-sanitize-r5900
1929 // start-sanitize-tx19
1931 // end-sanitize-tx19
1933 GPR[RT] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET)));
1937 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
1938 "lhu r<RT>, <OFFSET>(r<BASE>)"
1939 *mipsI,mipsII,mipsIII,mipsIV:
1941 // start-sanitize-vr4320
1943 // end-sanitize-vr4320
1944 // start-sanitize-vr5400
1946 // end-sanitize-vr5400
1947 // start-sanitize-r5900
1949 // end-sanitize-r5900
1951 // start-sanitize-tx19
1953 // end-sanitize-tx19
1955 GPR[RT] = do_load (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET));
1959 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
1960 "ll r<RT>, <OFFSET>(r<BASE>)"
1965 // start-sanitize-vr4320
1967 // end-sanitize-vr4320
1968 // start-sanitize-vr5400
1970 // end-sanitize-vr5400
1971 // start-sanitize-r5900
1973 // end-sanitize-r5900
1974 // start-sanitize-tx19
1976 // end-sanitize-tx19
1978 unsigned32 instruction = instruction_0;
1979 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1980 int destreg = ((instruction >> 16) & 0x0000001F);
1981 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1983 address_word vaddr = ((unsigned64)op1 + offset);
1986 if ((vaddr & 3) != 0)
1987 SignalExceptionAddressLoad();
1990 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1992 unsigned64 memval = 0;
1993 unsigned64 memval1 = 0;
1994 unsigned64 mask = 0x7;
1995 unsigned int shift = 2;
1996 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1997 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1999 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2000 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2001 byte = ((vaddr & mask) ^ (bigend << shift));
2002 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
2010 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
2011 "lld r<RT>, <OFFSET>(r<BASE>)"
2015 // start-sanitize-vr4320
2017 // end-sanitize-vr4320
2018 // start-sanitize-vr5400
2020 // end-sanitize-vr5400
2021 // start-sanitize-r5900
2023 // end-sanitize-r5900
2024 // start-sanitize-tx19
2026 // end-sanitize-tx19
2028 unsigned32 instruction = instruction_0;
2029 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2030 int destreg = ((instruction >> 16) & 0x0000001F);
2031 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2033 address_word vaddr = ((unsigned64)op1 + offset);
2036 if ((vaddr & 7) != 0)
2037 SignalExceptionAddressLoad();
2040 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2042 unsigned64 memval = 0;
2043 unsigned64 memval1 = 0;
2044 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
2045 GPR[destreg] = memval;
2053 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
2054 "lui r<RT>, <IMMEDIATE>"
2055 *mipsI,mipsII,mipsIII,mipsIV:
2057 // start-sanitize-vr4320
2059 // end-sanitize-vr4320
2060 // start-sanitize-vr5400
2062 // end-sanitize-vr5400
2063 // start-sanitize-r5900
2065 // end-sanitize-r5900
2067 // start-sanitize-tx19
2069 // end-sanitize-tx19
2071 TRACE_ALU_INPUT1 (IMMEDIATE);
2072 GPR[RT] = EXTEND32 (IMMEDIATE << 16);
2073 TRACE_ALU_RESULT (GPR[RT]);
2077 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
2078 "lw r<RT>, <OFFSET>(r<BASE>)"
2079 *mipsI,mipsII,mipsIII,mipsIV:
2081 // start-sanitize-vr4320
2083 // end-sanitize-vr4320
2084 // start-sanitize-vr5400
2086 // end-sanitize-vr5400
2087 // start-sanitize-r5900
2089 // end-sanitize-r5900
2091 // start-sanitize-tx19
2093 // end-sanitize-tx19
2095 GPR[RT] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
2099 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
2100 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2101 *mipsI,mipsII,mipsIII,mipsIV:
2103 // start-sanitize-vr4320
2105 // end-sanitize-vr4320
2106 // start-sanitize-vr5400
2108 // end-sanitize-vr5400
2109 // start-sanitize-r5900
2111 // end-sanitize-r5900
2113 // start-sanitize-tx19
2115 // end-sanitize-tx19
2117 COP_LW (ZZ, RT, do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
2121 :function:::unsigned_word:do_load_left:unsigned access, address_word base, address_word offset, unsigned_word rt
2123 address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2124 address_word reverseendian = (ReverseEndian ? -1 : 0);
2125 address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
2134 unsigned_word lhs_mask;
2137 vaddr = base + offset;
2138 AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
2139 paddr = (paddr ^ (reverseendian & mask));
2140 if (BigEndianMem == 0)
2141 paddr = paddr & ~access;
2143 /* compute where within the word/mem we are */
2144 byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
2145 word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
2146 nr_lhs_bits = 8 * byte + 8;
2147 nr_rhs_bits = 8 * access - 8 * byte;
2148 /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
2150 /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
2151 (long) ((unsigned64) vaddr >> 32), (long) vaddr,
2152 (long) ((unsigned64) paddr >> 32), (long) paddr,
2153 word, byte, nr_lhs_bits, nr_rhs_bits); */
2155 LoadMemory (&memval, NULL, uncached, byte, paddr, vaddr, isDATA, isREAL);
2158 /* GPR{31..32-NR_LHS_BITS} = memval{NR_LHS_BITS-1..0} */
2159 temp = (memval << nr_rhs_bits);
2163 /* GPR{31..32-NR_LHS_BITS = memval{32+NR_LHS_BITS..32} */
2164 temp = (memval >> nr_lhs_bits);
2166 lhs_mask = LSMASK (nr_lhs_bits + nr_rhs_bits - 1, nr_rhs_bits);
2167 rt = (rt & ~lhs_mask) | (temp & lhs_mask);
2169 /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx & 0x%08lx%08lx -> 0x%08lx%08lx\n",
2170 (long) ((unsigned64) memval >> 32), (long) memval,
2171 (long) ((unsigned64) temp >> 32), (long) temp,
2172 (long) ((unsigned64) lhs_mask >> 32), (long) lhs_mask,
2173 (long) (rt >> 32), (long) rt); */
2178 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
2179 "lwl r<RT>, <OFFSET>(r<BASE>)"
2180 *mipsI,mipsII,mipsIII,mipsIV:
2182 // start-sanitize-vr4320
2184 // end-sanitize-vr4320
2185 // start-sanitize-vr5400
2187 // end-sanitize-vr5400
2188 // start-sanitize-r5900
2190 // end-sanitize-r5900
2192 // start-sanitize-tx19
2194 // end-sanitize-tx19
2196 GPR[RT] = EXTEND32 (do_load_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND32 (OFFSET), GPR[RT]));
2200 :function:::unsigned_word:do_load_right:unsigned access, address_word base, address_word offset, unsigned_word rt
2202 address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2203 address_word reverseendian = (ReverseEndian ? -1 : 0);
2204 address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
2211 vaddr = base + offset;
2212 AddressTranslation (vaddr, isDATA, isLOAD, &paddr, &uncached, isTARGET, isREAL);
2213 /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */
2214 paddr = (paddr ^ (reverseendian & mask));
2215 if (BigEndianMem != 0)
2216 paddr = paddr & ~access;
2217 byte = ((vaddr & mask) ^ (bigendiancpu & mask));
2218 /* NOTE: SPEC is wrong, had `byte' not `access - byte'. See SW. */
2219 LoadMemory (&memval, NULL, uncached, access - (access & byte), paddr, vaddr, isDATA, isREAL);
2220 /* printf ("lr: 0x%08lx %d@0x%08lx 0x%08lx\n",
2221 (long) paddr, byte, (long) paddr, (long) memval); */
2223 unsigned_word screen = LSMASK (8 * (access - (byte & access) + 1) - 1, 0);
2225 rt |= (memval >> (8 * byte)) & screen;
2231 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
2232 "lwr r<RT>, <OFFSET>(r<BASE>)"
2233 *mipsI,mipsII,mipsIII,mipsIV:
2235 // start-sanitize-vr4320
2237 // end-sanitize-vr4320
2238 // start-sanitize-vr5400
2240 // end-sanitize-vr5400
2241 // start-sanitize-r5900
2243 // end-sanitize-r5900
2245 // start-sanitize-tx19
2247 // end-sanitize-tx19
2249 GPR[RT] = EXTEND32 (do_load_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]));
2253 100111,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWU
2254 "lwu r<RT>, <OFFSET>(r<BASE>)"
2258 // start-sanitize-vr4320
2260 // end-sanitize-vr4320
2261 // start-sanitize-vr5400
2263 // end-sanitize-vr5400
2264 // start-sanitize-r5900
2266 // end-sanitize-r5900
2267 // start-sanitize-tx19
2269 // end-sanitize-tx19
2271 GPR[RT] = do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET));
2275 :function:::void:do_mfhi:int rd
2277 check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
2278 TRACE_ALU_INPUT1 (HI);
2280 TRACE_ALU_RESULT (GPR[rd]);
2283 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
2285 *mipsI,mipsII,mipsIII,mipsIV:
2287 // start-sanitize-vr4320
2289 // end-sanitize-vr4320
2290 // start-sanitize-vr5400
2292 // end-sanitize-vr5400
2293 // start-sanitize-r5900
2295 // end-sanitize-r5900
2297 // start-sanitize-tx19
2299 // end-sanitize-tx19
2306 :function:::void:do_mflo:int rd
2308 check_mf_hilo (SD_, LOHISTORY, HIHISTORY);
2309 TRACE_ALU_INPUT1 (LO);
2311 TRACE_ALU_RESULT (GPR[rd]);
2314 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
2316 *mipsI,mipsII,mipsIII,mipsIV:
2318 // start-sanitize-vr4320
2320 // end-sanitize-vr4320
2321 // start-sanitize-vr5400
2323 // end-sanitize-vr5400
2324 // start-sanitize-r5900
2326 // end-sanitize-r5900
2328 // start-sanitize-tx19
2330 // end-sanitize-tx19
2337 000000,5.RS,5.RT,5.RD,00000001011:SPECIAL:32::MOVN
2338 "movn r<RD>, r<RS>, r<RT>"
2341 // start-sanitize-vr4320
2343 // end-sanitize-vr4320
2344 // start-sanitize-vr5400
2346 // end-sanitize-vr5400
2347 // start-sanitize-r5900
2349 // end-sanitize-r5900
2357 000000,5.RS,5.RT,5.RD,00000001010:SPECIAL:32::MOVZ
2358 "movz r<RD>, r<RS>, r<RT>"
2361 // start-sanitize-vr4320
2363 // end-sanitize-vr4320
2364 // start-sanitize-vr5400
2366 // end-sanitize-vr5400
2367 // start-sanitize-r5900
2369 // end-sanitize-r5900
2377 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
2379 *mipsI,mipsII,mipsIII,mipsIV:
2381 // start-sanitize-vr4320
2383 // end-sanitize-vr4320
2384 // start-sanitize-vr5400
2386 // end-sanitize-vr5400
2387 // start-sanitize-r5900
2389 // end-sanitize-r5900
2391 // start-sanitize-tx19
2393 // end-sanitize-tx19
2395 check_mt_hilo (SD_, HIHISTORY);
2401 000000,5.RS,000000000000000010011:SPECIAL:32::MTLO
2403 *mipsI,mipsII,mipsIII,mipsIV:
2405 // start-sanitize-vr4320
2407 // end-sanitize-vr4320
2408 // start-sanitize-vr5400
2410 // end-sanitize-vr5400
2411 // start-sanitize-r5900
2413 // end-sanitize-r5900
2415 // start-sanitize-tx19
2417 // end-sanitize-tx19
2419 check_mt_hilo (SD_, LOHISTORY);
2425 :function:::void:do_mult:int rs, int rt, int rd
2428 check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2429 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2430 prod = (((signed64)(signed32) GPR[rs])
2431 * ((signed64)(signed32) GPR[rt]));
2432 LO = EXTEND32 (VL4_8 (prod));
2433 HI = EXTEND32 (VH4_8 (prod));
2436 TRACE_ALU_RESULT2 (HI, LO);
2439 000000,5.RS,5.RT,00000,00000011000:SPECIAL:32::MULT
2441 *mipsI,mipsII,mipsIII,mipsIV:
2442 // start-sanitize-vr4320
2444 // end-sanitize-vr4320
2446 do_mult (SD_, RS, RT, 0);
2450 000000,5.RS,5.RT,5.RD,00000011000:SPECIAL:32::MULT
2451 "mult r<RD>, r<RS>, r<RT>"
2453 // start-sanitize-vr5400
2455 // end-sanitize-vr5400
2456 // start-sanitize-r5900
2458 // end-sanitize-r5900
2460 // start-sanitize-tx19
2462 // end-sanitize-tx19
2464 do_mult (SD_, RS, RT, RD);
2468 :function:::void:do_multu:int rs, int rt, int rd
2471 check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
2472 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2473 prod = (((unsigned64)(unsigned32) GPR[rs])
2474 * ((unsigned64)(unsigned32) GPR[rt]));
2475 LO = EXTEND32 (VL4_8 (prod));
2476 HI = EXTEND32 (VH4_8 (prod));
2479 TRACE_ALU_RESULT2 (HI, LO);
2482 000000,5.RS,5.RT,00000,00000011001:SPECIAL:32::MULTU
2483 "multu r<RS>, r<RT>"
2484 *mipsI,mipsII,mipsIII,mipsIV:
2485 // start-sanitize-vr4320
2487 // end-sanitize-vr4320
2489 do_multu (SD_, RS, RT, 0);
2492 000000,5.RS,5.RT,5.RD,00000011001:SPECIAL:32::MULTU
2493 "multu r<RD>, r<RS>, r<RT>"
2495 // start-sanitize-vr5400
2497 // end-sanitize-vr5400
2498 // start-sanitize-r5900
2500 // end-sanitize-r5900
2502 // start-sanitize-tx19
2504 // end-sanitize-tx19
2506 do_multu (SD_, RS, RT, 0);
2510 :function:::void:do_nor:int rs, int rt, int rd
2512 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2513 GPR[rd] = ~ (GPR[rs] | GPR[rt]);
2514 TRACE_ALU_RESULT (GPR[rd]);
2517 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
2518 "nor r<RD>, r<RS>, r<RT>"
2519 *mipsI,mipsII,mipsIII,mipsIV:
2521 // start-sanitize-vr4320
2523 // end-sanitize-vr4320
2524 // start-sanitize-vr5400
2526 // end-sanitize-vr5400
2527 // start-sanitize-r5900
2529 // end-sanitize-r5900
2531 // start-sanitize-tx19
2533 // end-sanitize-tx19
2535 do_nor (SD_, RS, RT, RD);
2539 :function:::void:do_or:int rs, int rt, int rd
2541 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2542 GPR[rd] = (GPR[rs] | GPR[rt]);
2543 TRACE_ALU_RESULT (GPR[rd]);
2546 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
2547 "or r<RD>, r<RS>, r<RT>"
2548 *mipsI,mipsII,mipsIII,mipsIV:
2550 // start-sanitize-vr4320
2552 // end-sanitize-vr4320
2553 // start-sanitize-vr5400
2555 // end-sanitize-vr5400
2556 // start-sanitize-r5900
2558 // end-sanitize-r5900
2560 // start-sanitize-tx19
2562 // end-sanitize-tx19
2564 do_or (SD_, RS, RT, RD);
2569 :function:::void:do_ori:int rs, int rt, unsigned immediate
2571 TRACE_ALU_INPUT2 (GPR[rs], immediate);
2572 GPR[rt] = (GPR[rs] | immediate);
2573 TRACE_ALU_RESULT (GPR[rt]);
2576 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
2577 "ori r<RT>, r<RS>, <IMMEDIATE>"
2578 *mipsI,mipsII,mipsIII,mipsIV:
2580 // start-sanitize-vr4320
2582 // end-sanitize-vr4320
2583 // start-sanitize-vr5400
2585 // end-sanitize-vr5400
2586 // start-sanitize-r5900
2588 // end-sanitize-r5900
2590 // start-sanitize-tx19
2592 // end-sanitize-tx19
2594 do_ori (SD_, RS, RT, IMMEDIATE);
2598 110011,5.RS,nnnnn,16.OFFSET:NORMAL:32::PREF
2601 // start-sanitize-vr4320
2603 // end-sanitize-vr4320
2604 // start-sanitize-vr5400
2606 // end-sanitize-vr5400
2607 // start-sanitize-r5900
2609 // end-sanitize-r5900
2611 unsigned32 instruction = instruction_0;
2612 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2613 int hint = ((instruction >> 16) & 0x0000001F);
2614 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2616 address_word vaddr = ((unsigned64)op1 + offset);
2620 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2621 Prefetch(uncached,paddr,vaddr,isDATA,hint);
2626 :function:::void:do_store:unsigned access, address_word base, address_word offset, unsigned_word word
2628 address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
2629 address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0);
2630 address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0);
2637 vaddr = base + offset;
2638 if ((vaddr & access) != 0)
2639 SignalExceptionAddressStore ();
2640 AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
2641 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
2642 byte = ((vaddr & mask) ^ bigendiancpu);
2643 memval = (word << (8 * byte));
2644 StoreMemory (uncached, access, memval, 0, paddr, vaddr, isREAL);
2648 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
2649 "sb r<RT>, <OFFSET>(r<BASE>)"
2650 *mipsI,mipsII,mipsIII,mipsIV:
2652 // start-sanitize-vr4320
2654 // end-sanitize-vr4320
2655 // start-sanitize-vr5400
2657 // end-sanitize-vr5400
2658 // start-sanitize-r5900
2660 // end-sanitize-r5900
2662 // start-sanitize-tx19
2664 // end-sanitize-tx19
2666 do_store (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2670 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
2671 "sc r<RT>, <OFFSET>(r<BASE>)"
2676 // start-sanitize-vr4320
2678 // end-sanitize-vr4320
2679 // start-sanitize-vr5400
2681 // end-sanitize-vr5400
2682 // start-sanitize-r5900
2684 // end-sanitize-r5900
2685 // start-sanitize-tx19
2687 // end-sanitize-tx19
2689 unsigned32 instruction = instruction_0;
2690 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2691 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2692 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2694 address_word vaddr = ((unsigned64)op1 + offset);
2697 if ((vaddr & 3) != 0)
2698 SignalExceptionAddressStore();
2701 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2703 unsigned64 memval = 0;
2704 unsigned64 memval1 = 0;
2705 unsigned64 mask = 0x7;
2707 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2708 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2709 memval = ((unsigned64) op2 << (8 * byte));
2712 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2714 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2721 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
2722 "scd r<RT>, <OFFSET>(r<BASE>)"
2726 // start-sanitize-vr4320
2728 // end-sanitize-vr4320
2729 // start-sanitize-vr5400
2731 // end-sanitize-vr5400
2732 // start-sanitize-r5900
2734 // end-sanitize-r5900
2735 // start-sanitize-tx19
2737 // end-sanitize-tx19
2739 unsigned32 instruction = instruction_0;
2740 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2741 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2742 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2744 address_word vaddr = ((unsigned64)op1 + offset);
2747 if ((vaddr & 7) != 0)
2748 SignalExceptionAddressStore();
2751 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2753 unsigned64 memval = 0;
2754 unsigned64 memval1 = 0;
2758 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2760 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2767 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
2768 "sd r<RT>, <OFFSET>(r<BASE>)"
2772 // start-sanitize-vr4320
2774 // end-sanitize-vr4320
2775 // start-sanitize-vr5400
2777 // end-sanitize-vr5400
2778 // start-sanitize-r5900
2780 // end-sanitize-r5900
2781 // start-sanitize-tx19
2783 // end-sanitize-tx19
2785 do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2789 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
2790 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2795 // start-sanitize-vr4320
2797 // end-sanitize-vr4320
2798 // start-sanitize-vr5400
2800 // end-sanitize-vr5400
2801 // start-sanitize-r5900
2803 // end-sanitize-r5900
2804 // start-sanitize-tx19
2806 // end-sanitize-tx19
2808 do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (ZZ, RT));
2812 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
2813 "sdl r<RT>, <OFFSET>(r<BASE>)"
2817 // start-sanitize-vr4320
2819 // end-sanitize-vr4320
2820 // start-sanitize-vr5400
2822 // end-sanitize-vr5400
2823 // start-sanitize-r5900
2825 // end-sanitize-r5900
2826 // start-sanitize-tx19
2828 // end-sanitize-tx19
2830 do_store_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2834 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
2835 "sdr r<RT>, <OFFSET>(r<BASE>)"
2839 // start-sanitize-vr4320
2841 // end-sanitize-vr4320
2842 // start-sanitize-vr5400
2844 // end-sanitize-vr5400
2845 // start-sanitize-r5900
2847 // end-sanitize-r5900
2848 // start-sanitize-tx19
2850 // end-sanitize-tx19
2852 do_store_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2856 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
2857 "sh r<RT>, <OFFSET>(r<BASE>)"
2858 *mipsI,mipsII,mipsIII,mipsIV:
2860 // start-sanitize-vr4320
2862 // end-sanitize-vr4320
2863 // start-sanitize-vr5400
2865 // end-sanitize-vr5400
2866 // start-sanitize-r5900
2868 // end-sanitize-r5900
2870 // start-sanitize-tx19
2872 // end-sanitize-tx19
2874 do_store (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
2878 :function:::void:do_sll:int rt, int rd, int shift
2880 unsigned32 temp = (GPR[rt] << shift);
2881 TRACE_ALU_INPUT2 (GPR[rt], shift);
2882 GPR[rd] = EXTEND32 (temp);
2883 TRACE_ALU_RESULT (GPR[rd]);
2886 00000000000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLL
2887 "sll r<RD>, r<RT>, <SHIFT>"
2888 *mipsI,mipsII,mipsIII,mipsIV:
2890 // start-sanitize-vr4320
2892 // end-sanitize-vr4320
2893 // start-sanitize-vr5400
2895 // end-sanitize-vr5400
2896 // start-sanitize-r5900
2898 // end-sanitize-r5900
2900 // start-sanitize-tx19
2902 // end-sanitize-tx19
2904 do_sll (SD_, RT, RD, SHIFT);
2908 :function:::void:do_sllv:int rs, int rt, int rd
2910 int s = MASKED (GPR[rs], 4, 0);
2911 unsigned32 temp = (GPR[rt] << s);
2912 TRACE_ALU_INPUT2 (GPR[rt], s);
2913 GPR[rd] = EXTEND32 (temp);
2914 TRACE_ALU_RESULT (GPR[rd]);
2917 000000,5.RS,5.RT,5.RD,00000000100:SPECIAL:32::SLLV
2918 "sllv r<RD>, r<RT>, r<RS>"
2919 *mipsI,mipsII,mipsIII,mipsIV:
2921 // start-sanitize-vr4320
2923 // end-sanitize-vr4320
2924 // start-sanitize-vr5400
2926 // end-sanitize-vr5400
2927 // start-sanitize-r5900
2929 // end-sanitize-r5900
2931 // start-sanitize-tx19
2933 // end-sanitize-tx19
2935 do_sllv (SD_, RS, RT, RD);
2939 :function:::void:do_slt:int rs, int rt, int rd
2941 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
2942 GPR[rd] = ((signed_word) GPR[rs] < (signed_word) GPR[rt]);
2943 TRACE_ALU_RESULT (GPR[rd]);
2946 000000,5.RS,5.RT,5.RD,00000101010:SPECIAL:32::SLT
2947 "slt r<RD>, r<RS>, r<RT>"
2948 *mipsI,mipsII,mipsIII,mipsIV:
2950 // start-sanitize-vr4320
2952 // end-sanitize-vr4320
2953 // start-sanitize-vr5400
2955 // end-sanitize-vr5400
2956 // start-sanitize-r5900
2958 // end-sanitize-r5900
2960 // start-sanitize-tx19
2962 // end-sanitize-tx19
2964 do_slt (SD_, RS, RT, RD);
2968 :function:::void:do_slti:int rs, int rt, unsigned16 immediate
2970 TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
2971 GPR[rt] = ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate));
2972 TRACE_ALU_RESULT (GPR[rt]);
2975 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
2976 "slti r<RT>, r<RS>, <IMMEDIATE>"
2977 *mipsI,mipsII,mipsIII,mipsIV:
2979 // start-sanitize-vr4320
2981 // end-sanitize-vr4320
2982 // start-sanitize-vr5400
2984 // end-sanitize-vr5400
2985 // start-sanitize-r5900
2987 // end-sanitize-r5900
2989 // start-sanitize-tx19
2991 // end-sanitize-tx19
2993 do_slti (SD_, RS, RT, IMMEDIATE);
2997 :function:::void:do_sltiu:int rs, int rt, unsigned16 immediate
2999 TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate));
3000 GPR[rt] = ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate));
3001 TRACE_ALU_RESULT (GPR[rt]);
3004 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
3005 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
3006 *mipsI,mipsII,mipsIII,mipsIV:
3008 // start-sanitize-vr4320
3010 // end-sanitize-vr4320
3011 // start-sanitize-vr5400
3013 // end-sanitize-vr5400
3014 // start-sanitize-r5900
3016 // end-sanitize-r5900
3018 // start-sanitize-tx19
3020 // end-sanitize-tx19
3022 do_sltiu (SD_, RS, RT, IMMEDIATE);
3027 :function:::void:do_sltu:int rs, int rt, int rd
3029 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3030 GPR[rd] = ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt]);
3031 TRACE_ALU_RESULT (GPR[rd]);
3034 000000,5.RS,5.RT,5.RD,00000101011:SPECIAL:32::SLTU
3035 "sltu r<RD>, r<RS>, r<RT>"
3036 *mipsI,mipsII,mipsIII,mipsIV:
3038 // start-sanitize-vr4320
3040 // end-sanitize-vr4320
3041 // start-sanitize-vr5400
3043 // end-sanitize-vr5400
3044 // start-sanitize-r5900
3046 // end-sanitize-r5900
3048 // start-sanitize-tx19
3050 // end-sanitize-tx19
3052 do_sltu (SD_, RS, RT, RD);
3056 :function:::void:do_sra:int rt, int rd, int shift
3058 signed32 temp = (signed32) GPR[rt] >> shift;
3059 TRACE_ALU_INPUT2 (GPR[rt], shift);
3060 GPR[rd] = EXTEND32 (temp);
3061 TRACE_ALU_RESULT (GPR[rd]);
3064 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
3065 "sra r<RD>, r<RT>, <SHIFT>"
3066 *mipsI,mipsII,mipsIII,mipsIV:
3068 // start-sanitize-vr4320
3070 // end-sanitize-vr4320
3071 // start-sanitize-vr5400
3073 // end-sanitize-vr5400
3074 // start-sanitize-r5900
3076 // end-sanitize-r5900
3078 // start-sanitize-tx19
3080 // end-sanitize-tx19
3082 do_sra (SD_, RT, RD, SHIFT);
3087 :function:::void:do_srav:int rs, int rt, int rd
3089 int s = MASKED (GPR[rs], 4, 0);
3090 signed32 temp = (signed32) GPR[rt] >> s;
3091 TRACE_ALU_INPUT2 (GPR[rt], s);
3092 GPR[rd] = EXTEND32 (temp);
3093 TRACE_ALU_RESULT (GPR[rd]);
3096 000000,5.RS,5.RT,5.RD,00000000111:SPECIAL:32::SRAV
3097 "srav r<RD>, r<RT>, r<RS>"
3098 *mipsI,mipsII,mipsIII,mipsIV:
3100 // start-sanitize-vr4320
3102 // end-sanitize-vr4320
3103 // start-sanitize-vr5400
3105 // end-sanitize-vr5400
3106 // start-sanitize-r5900
3108 // end-sanitize-r5900
3110 // start-sanitize-tx19
3112 // end-sanitize-tx19
3114 do_srav (SD_, RS, RT, RD);
3119 :function:::void:do_srl:int rt, int rd, int shift
3121 unsigned32 temp = (unsigned32) GPR[rt] >> shift;
3122 TRACE_ALU_INPUT2 (GPR[rt], shift);
3123 GPR[rd] = EXTEND32 (temp);
3124 TRACE_ALU_RESULT (GPR[rd]);
3127 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
3128 "srl r<RD>, r<RT>, <SHIFT>"
3129 *mipsI,mipsII,mipsIII,mipsIV:
3131 // start-sanitize-vr4320
3133 // end-sanitize-vr4320
3134 // start-sanitize-vr5400
3136 // end-sanitize-vr5400
3137 // start-sanitize-r5900
3139 // end-sanitize-r5900
3141 // start-sanitize-tx19
3143 // end-sanitize-tx19
3145 do_srl (SD_, RT, RD, SHIFT);
3149 :function:::void:do_srlv:int rs, int rt, int rd
3151 int s = MASKED (GPR[rs], 4, 0);
3152 unsigned32 temp = (unsigned32) GPR[rt] >> s;
3153 TRACE_ALU_INPUT2 (GPR[rt], s);
3154 GPR[rd] = EXTEND32 (temp);
3155 TRACE_ALU_RESULT (GPR[rd]);
3158 000000,5.RS,5.RT,5.RD,00000000110:SPECIAL:32::SRLV
3159 "srlv r<RD>, r<RT>, r<RS>"
3160 *mipsI,mipsII,mipsIII,mipsIV:
3162 // start-sanitize-vr4320
3164 // end-sanitize-vr4320
3165 // start-sanitize-vr5400
3167 // end-sanitize-vr5400
3168 // start-sanitize-r5900
3170 // end-sanitize-r5900
3172 // start-sanitize-tx19
3174 // end-sanitize-tx19
3176 do_srlv (SD_, RS, RT, RD);
3180 000000,5.RS,5.RT,5.RD,00000100010:SPECIAL:32::SUB
3181 "sub r<RD>, r<RS>, r<RT>"
3182 *mipsI,mipsII,mipsIII,mipsIV:
3184 // start-sanitize-vr4320
3186 // end-sanitize-vr4320
3187 // start-sanitize-vr5400
3189 // end-sanitize-vr5400
3190 // start-sanitize-r5900
3192 // end-sanitize-r5900
3194 // start-sanitize-tx19
3196 // end-sanitize-tx19
3198 TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
3200 ALU32_BEGIN (GPR[RS]);
3201 ALU32_SUB (GPR[RT]);
3202 ALU32_END (GPR[RD]);
3204 TRACE_ALU_RESULT (GPR[RD]);
3208 :function:::void:do_subu:int rs, int rt, int rd
3210 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3211 GPR[rd] = EXTEND32 (GPR[rs] - GPR[rt]);
3212 TRACE_ALU_RESULT (GPR[rd]);
3215 000000,5.RS,5.RT,5.RD,00000100011:SPECIAL:32::SUBU
3216 "subu r<RD>, r<RS>, r<RT>"
3217 *mipsI,mipsII,mipsIII,mipsIV:
3219 // start-sanitize-vr4320
3221 // end-sanitize-vr4320
3222 // start-sanitize-vr5400
3224 // end-sanitize-vr5400
3225 // start-sanitize-r5900
3227 // end-sanitize-r5900
3229 // start-sanitize-tx19
3231 // end-sanitize-tx19
3233 do_subu (SD_, RS, RT, RD);
3237 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
3238 "sw r<RT>, <OFFSET>(r<BASE>)"
3239 *mipsI,mipsII,mipsIII,mipsIV:
3240 // start-sanitize-tx19
3242 // end-sanitize-tx19
3244 // start-sanitize-vr4320
3246 // end-sanitize-vr4320
3248 // start-sanitize-vr5400
3250 // end-sanitize-vr5400
3251 // start-sanitize-r5900
3253 // end-sanitize-r5900
3255 do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3259 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
3260 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3261 *mipsI,mipsII,mipsIII,mipsIV:
3263 // start-sanitize-vr4320
3265 // end-sanitize-vr4320
3266 // start-sanitize-vr5400
3268 // end-sanitize-vr5400
3270 // start-sanitize-tx19
3272 // end-sanitize-tx19
3274 do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), COP_SW (ZZ, RT));
3279 :function:::void:do_store_left:unsigned access, address_word base, address_word offset, unsigned_word rt
3281 address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3282 address_word reverseendian = (ReverseEndian ? -1 : 0);
3283 address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
3293 vaddr = base + offset;
3294 AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
3295 paddr = (paddr ^ (reverseendian & mask));
3296 if (BigEndianMem == 0)
3297 paddr = paddr & ~access;
3299 /* compute where within the word/mem we are */
3300 byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */
3301 word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */
3302 nr_lhs_bits = 8 * byte + 8;
3303 nr_rhs_bits = 8 * access - 8 * byte;
3304 /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */
3305 /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n",
3306 (long) ((unsigned64) vaddr >> 32), (long) vaddr,
3307 (long) ((unsigned64) paddr >> 32), (long) paddr,
3308 word, byte, nr_lhs_bits, nr_rhs_bits); */
3312 memval = (rt >> nr_rhs_bits);
3316 memval = (rt << nr_lhs_bits);
3318 /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx\n",
3319 (long) ((unsigned64) rt >> 32), (long) rt,
3320 (long) ((unsigned64) memval >> 32), (long) memval); */
3321 StoreMemory (uncached, byte, memval, 0, paddr, vaddr, isREAL);
3325 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
3326 "swl r<RT>, <OFFSET>(r<BASE>)"
3327 *mipsI,mipsII,mipsIII,mipsIV:
3329 // start-sanitize-vr4320
3331 // end-sanitize-vr4320
3332 // start-sanitize-vr5400
3334 // end-sanitize-vr5400
3335 // start-sanitize-r5900
3337 // end-sanitize-r5900
3339 // start-sanitize-tx19
3341 // end-sanitize-tx19
3343 do_store_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3347 :function:::void:do_store_right:unsigned access, address_word base, address_word offset, unsigned_word rt
3349 address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
3350 address_word reverseendian = (ReverseEndian ? -1 : 0);
3351 address_word bigendiancpu = (BigEndianCPU ? -1 : 0);
3358 vaddr = base + offset;
3359 AddressTranslation (vaddr, isDATA, isSTORE, &paddr, &uncached, isTARGET, isREAL);
3360 paddr = (paddr ^ (reverseendian & mask));
3361 if (BigEndianMem != 0)
3363 byte = ((vaddr & mask) ^ (bigendiancpu & mask));
3364 memval = (rt << (byte * 8));
3365 StoreMemory (uncached, access - (access & byte), memval, 0, paddr, vaddr, isREAL);
3368 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
3369 "swr r<RT>, <OFFSET>(r<BASE>)"
3370 *mipsI,mipsII,mipsIII,mipsIV:
3372 // start-sanitize-vr4320
3374 // end-sanitize-vr4320
3375 // start-sanitize-vr5400
3377 // end-sanitize-vr5400
3378 // start-sanitize-r5900
3380 // end-sanitize-r5900
3382 // start-sanitize-tx19
3384 // end-sanitize-tx19
3386 do_store_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]);
3390 000000000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
3397 // start-sanitize-vr4320
3399 // end-sanitize-vr4320
3400 // start-sanitize-vr5400
3402 // end-sanitize-vr5400
3403 // start-sanitize-r5900
3405 // end-sanitize-r5900
3407 // start-sanitize-tx19
3409 // end-sanitize-tx19
3411 SyncOperation (STYPE);
3415 000000,20.CODE,001100:SPECIAL:32::SYSCALL
3417 *mipsI,mipsII,mipsIII,mipsIV:
3419 // start-sanitize-vr4320
3421 // end-sanitize-vr4320
3422 // start-sanitize-vr5400
3424 // end-sanitize-vr5400
3425 // start-sanitize-r5900
3427 // end-sanitize-r5900
3429 // start-sanitize-tx19
3431 // end-sanitize-tx19
3433 SignalException(SystemCall, instruction_0);
3437 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
3443 // start-sanitize-vr4320
3445 // end-sanitize-vr4320
3446 // start-sanitize-vr5400
3448 // end-sanitize-vr5400
3449 // start-sanitize-r5900
3451 // end-sanitize-r5900
3452 // start-sanitize-tx19
3454 // end-sanitize-tx19
3456 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
3457 SignalException(Trap, instruction_0);
3461 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
3462 "teqi r<RS>, <IMMEDIATE>"
3467 // start-sanitize-vr4320
3469 // end-sanitize-vr4320
3470 // start-sanitize-vr5400
3472 // end-sanitize-vr5400
3473 // start-sanitize-r5900
3475 // end-sanitize-r5900
3476 // start-sanitize-tx19
3478 // end-sanitize-tx19
3480 if ((signed_word) GPR[RS] == (signed_word) EXTEND16 (IMMEDIATE))
3481 SignalException(Trap, instruction_0);
3485 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
3491 // start-sanitize-vr4320
3493 // end-sanitize-vr4320
3494 // start-sanitize-vr5400
3496 // end-sanitize-vr5400
3497 // start-sanitize-r5900
3499 // end-sanitize-r5900
3500 // start-sanitize-tx19
3502 // end-sanitize-tx19
3504 if ((signed_word) GPR[RS] >= (signed_word) GPR[RT])
3505 SignalException(Trap, instruction_0);
3509 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
3510 "tgei r<RS>, <IMMEDIATE>"
3515 // start-sanitize-vr4320
3517 // end-sanitize-vr4320
3518 // start-sanitize-vr5400
3520 // end-sanitize-vr5400
3521 // start-sanitize-r5900
3523 // end-sanitize-r5900
3524 // start-sanitize-tx19
3526 // end-sanitize-tx19
3528 if ((signed_word) GPR[RS] >= (signed_word) EXTEND16 (IMMEDIATE))
3529 SignalException(Trap, instruction_0);
3533 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
3534 "tgeiu r<RS>, <IMMEDIATE>"
3539 // start-sanitize-vr4320
3541 // end-sanitize-vr4320
3542 // start-sanitize-vr5400
3544 // end-sanitize-vr5400
3545 // start-sanitize-r5900
3547 // end-sanitize-r5900
3548 // start-sanitize-tx19
3550 // end-sanitize-tx19
3552 if ((unsigned_word) GPR[RS] >= (unsigned_word) EXTEND16 (IMMEDIATE))
3553 SignalException(Trap, instruction_0);
3557 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
3563 // start-sanitize-vr4320
3565 // end-sanitize-vr4320
3566 // start-sanitize-vr5400
3568 // end-sanitize-vr5400
3569 // start-sanitize-r5900
3571 // end-sanitize-r5900
3572 // start-sanitize-tx19
3574 // end-sanitize-tx19
3576 if ((unsigned_word) GPR[RS] >= (unsigned_word) GPR[RT])
3577 SignalException(Trap, instruction_0);
3581 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
3587 // start-sanitize-vr4320
3589 // end-sanitize-vr4320
3590 // start-sanitize-vr5400
3592 // end-sanitize-vr5400
3593 // start-sanitize-r5900
3595 // end-sanitize-r5900
3596 // start-sanitize-tx19
3598 // end-sanitize-tx19
3600 if ((signed_word) GPR[RS] < (signed_word) GPR[RT])
3601 SignalException(Trap, instruction_0);
3605 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
3606 "tlti r<RS>, <IMMEDIATE>"
3611 // start-sanitize-vr4320
3613 // end-sanitize-vr4320
3614 // start-sanitize-vr5400
3616 // end-sanitize-vr5400
3617 // start-sanitize-r5900
3619 // end-sanitize-r5900
3620 // start-sanitize-tx19
3622 // end-sanitize-tx19
3624 if ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE))
3625 SignalException(Trap, instruction_0);
3629 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
3630 "tltiu r<RS>, <IMMEDIATE>"
3635 // start-sanitize-vr4320
3637 // end-sanitize-vr4320
3638 // start-sanitize-vr5400
3640 // end-sanitize-vr5400
3641 // start-sanitize-r5900
3643 // end-sanitize-r5900
3644 // start-sanitize-tx19
3646 // end-sanitize-tx19
3648 if ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE))
3649 SignalException(Trap, instruction_0);
3653 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
3659 // start-sanitize-vr4320
3661 // end-sanitize-vr4320
3662 // start-sanitize-vr5400
3664 // end-sanitize-vr5400
3665 // start-sanitize-r5900
3667 // end-sanitize-r5900
3668 // start-sanitize-tx19
3670 // end-sanitize-tx19
3672 if ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT])
3673 SignalException(Trap, instruction_0);
3677 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
3683 // start-sanitize-vr4320
3685 // end-sanitize-vr4320
3686 // start-sanitize-vr5400
3688 // end-sanitize-vr5400
3689 // start-sanitize-r5900
3691 // end-sanitize-r5900
3692 // start-sanitize-tx19
3694 // end-sanitize-tx19
3696 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
3697 SignalException(Trap, instruction_0);
3701 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
3702 "tne r<RS>, <IMMEDIATE>"
3707 // start-sanitize-vr4320
3709 // end-sanitize-vr4320
3710 // start-sanitize-vr5400
3712 // end-sanitize-vr5400
3713 // start-sanitize-r5900
3715 // end-sanitize-r5900
3716 // start-sanitize-tx19
3718 // end-sanitize-tx19
3720 if ((signed_word) GPR[RS] != (signed_word) EXTEND16 (IMMEDIATE))
3721 SignalException(Trap, instruction_0);
3725 :function:::void:do_xor:int rs, int rt, int rd
3727 TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]);
3728 GPR[rd] = GPR[rs] ^ GPR[rt];
3729 TRACE_ALU_RESULT (GPR[rd]);
3732 000000,5.RS,5.RT,5.RD,00000100110:SPECIAL:32::XOR
3733 "xor r<RD>, r<RS>, r<RT>"
3734 *mipsI,mipsII,mipsIII,mipsIV:
3736 // start-sanitize-vr4320
3738 // end-sanitize-vr4320
3739 // start-sanitize-vr5400
3741 // end-sanitize-vr5400
3742 // start-sanitize-r5900
3744 // end-sanitize-r5900
3746 // start-sanitize-tx19
3748 // end-sanitize-tx19
3750 do_xor (SD_, RS, RT, RD);
3754 :function:::void:do_xori:int rs, int rt, unsigned16 immediate
3756 TRACE_ALU_INPUT2 (GPR[rs], immediate);
3757 GPR[rt] = GPR[rs] ^ immediate;
3758 TRACE_ALU_RESULT (GPR[rt]);
3761 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
3762 "xori r<RT>, r<RS>, <IMMEDIATE>"
3763 *mipsI,mipsII,mipsIII,mipsIV:
3765 // start-sanitize-vr4320
3767 // end-sanitize-vr4320
3768 // start-sanitize-vr5400
3770 // end-sanitize-vr5400
3771 // start-sanitize-r5900
3773 // end-sanitize-r5900
3775 // start-sanitize-tx19
3777 // end-sanitize-tx19
3779 do_xori (SD_, RS, RT, IMMEDIATE);
3784 // MIPS Architecture:
3786 // FPU Instruction Set (COP1 & COP1X)
3794 case fmt_single: return "s";
3795 case fmt_double: return "d";
3796 case fmt_word: return "w";
3797 case fmt_long: return "l";
3798 default: return "?";
3808 default: return "?";
3828 :%s::::COND:int cond
3832 case 00: return "f";
3833 case 01: return "un";
3834 case 02: return "eq";
3835 case 03: return "ueq";
3836 case 04: return "olt";
3837 case 05: return "ult";
3838 case 06: return "ole";
3839 case 07: return "ule";
3840 case 010: return "sf";
3841 case 011: return "ngle";
3842 case 012: return "seq";
3843 case 013: return "ngl";
3844 case 014: return "lt";
3845 case 015: return "nge";
3846 case 016: return "le";
3847 case 017: return "ngt";
3848 default: return "?";
3853 010001,10,3.FMT,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
3854 "abs.%s<FMT> f<FD>, f<FS>"
3855 *mipsI,mipsII,mipsIII,mipsIV:
3857 // start-sanitize-vr4320
3859 // end-sanitize-vr4320
3860 // start-sanitize-vr5400
3862 // end-sanitize-vr5400
3864 // start-sanitize-tx19
3866 // end-sanitize-tx19
3868 unsigned32 instruction = instruction_0;
3869 int destreg = ((instruction >> 6) & 0x0000001F);
3870 int fs = ((instruction >> 11) & 0x0000001F);
3871 int format = ((instruction >> 21) & 0x00000007);
3873 if ((format != fmt_single) && (format != fmt_double))
3874 SignalException(ReservedInstruction,instruction);
3876 StoreFPR(destreg,format,AbsoluteValue(ValueFPR(fs,format),format));
3882 010001,10,3.FMT,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt
3883 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
3884 *mipsI,mipsII,mipsIII,mipsIV:
3886 // start-sanitize-vr4320
3888 // end-sanitize-vr4320
3889 // start-sanitize-vr5400
3891 // end-sanitize-vr5400
3893 // start-sanitize-tx19
3895 // end-sanitize-tx19
3897 unsigned32 instruction = instruction_0;
3898 int destreg = ((instruction >> 6) & 0x0000001F);
3899 int fs = ((instruction >> 11) & 0x0000001F);
3900 int ft = ((instruction >> 16) & 0x0000001F);
3901 int format = ((instruction >> 21) & 0x00000007);
3903 if ((format != fmt_single) && (format != fmt_double))
3904 SignalException(ReservedInstruction, instruction);
3906 StoreFPR(destreg,format,Add(ValueFPR(fs,format),ValueFPR(ft,format),format));
3917 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3918 "bc1%s<TF>%s<ND> <OFFSET>"
3919 *mipsI,mipsII,mipsIII:
3920 // start-sanitize-r5900
3922 // end-sanitize-r5900
3924 TRACE_BRANCH_INPUT (PREVCOC1());
3925 if (PREVCOC1() == TF)
3927 address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
3928 TRACE_BRANCH_RESULT (dest);
3933 TRACE_BRANCH_RESULT (0);
3934 NULLIFY_NEXT_INSTRUCTION ();
3938 TRACE_BRANCH_RESULT (NIA);
3942 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3943 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
3944 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
3947 // start-sanitize-vr4320
3949 // end-sanitize-vr4320
3950 // start-sanitize-vr5400
3952 // end-sanitize-vr5400
3954 // start-sanitize-tx19
3956 // end-sanitize-tx19
3958 if (GETFCC(CC) == TF)
3960 DELAY_SLOT (NIA + (EXTEND16 (OFFSET) << 2));
3964 NULLIFY_NEXT_INSTRUCTION ();
3974 :function:::void:do_c_cond_fmt:int fmt, int ft, int fs, int cc, int cond, instruction_word insn
3976 if ((fmt != fmt_single) && (fmt != fmt_double))
3977 SignalException (ReservedInstruction, insn);
3984 unsigned64 ofs = ValueFPR (fs, fmt);
3985 unsigned64 oft = ValueFPR (ft, fmt);
3986 if (NaN (ofs, fmt) || NaN (oft, fmt))
3988 if (FCSR & FP_ENABLE (IO))
3990 FCSR |= FP_CAUSE (IO);
3991 SignalExceptionFPE ();
3999 less = Less (ofs, oft, fmt);
4000 equal = Equal (ofs, oft, fmt);
4003 condition = (((cond & (1 << 2)) && less)
4004 || ((cond & (1 << 1)) && equal)
4005 || ((cond & (1 << 0)) && unordered));
4006 SETFCC (cc, condition);
4010 010001,10,3.FMT,5.FT,5.FS,3.0,00,11,4.COND:COP1:32::C.cond.fmt
4011 *mipsI,mipsII,mipsIII:
4012 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":
4014 do_c_cond_fmt (SD_, FMT, FT, FS, 0, COND, instruction_0);
4017 010001,10,3.FMT,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32::C.cond.fmt
4018 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
4019 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
4022 // start-sanitize-vr4320
4024 // end-sanitize-vr4320
4025 // start-sanitize-vr5400
4027 // end-sanitize-vr5400
4029 // start-sanitize-tx19
4031 // end-sanitize-tx19
4033 do_c_cond_fmt (SD_, FMT, FT, FS, CC, COND, instruction_0);
4037 010001,10,3.FMT,00000,5.FS,5.FD,001010:COP1:64::CEIL.L.fmt
4038 "ceil.l.%s<FMT> f<FD>, f<FS>"
4042 // start-sanitize-vr4320
4044 // end-sanitize-vr4320
4045 // start-sanitize-vr5400
4047 // end-sanitize-vr5400
4048 // start-sanitize-r5900
4050 // end-sanitize-r5900
4052 // start-sanitize-tx19
4054 // end-sanitize-tx19
4056 unsigned32 instruction = instruction_0;
4057 int destreg = ((instruction >> 6) & 0x0000001F);
4058 int fs = ((instruction >> 11) & 0x0000001F);
4059 int format = ((instruction >> 21) & 0x00000007);
4061 if ((format != fmt_single) && (format != fmt_double))
4062 SignalException(ReservedInstruction,instruction);
4064 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_long));
4069 010001,10,3.FMT,00000,5.FS,5.FD,001110:COP1:32::CEIL.W
4074 // start-sanitize-vr4320
4076 // end-sanitize-vr4320
4077 // start-sanitize-vr5400
4079 // end-sanitize-vr5400
4080 // start-sanitize-r5900
4082 // end-sanitize-r5900
4084 // start-sanitize-tx19
4086 // end-sanitize-tx19
4088 unsigned32 instruction = instruction_0;
4089 int destreg = ((instruction >> 6) & 0x0000001F);
4090 int fs = ((instruction >> 11) & 0x0000001F);
4091 int format = ((instruction >> 21) & 0x00000007);
4093 if ((format != fmt_single) && (format != fmt_double))
4094 SignalException(ReservedInstruction,instruction);
4096 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_word));
4103 010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
4104 "c%s<X>c1 r<RT>, f<FS>"
4112 PENDING_FILL((FS + FCR0IDX),VL4_8(GPR[RT]));
4114 PENDING_FILL((FS + FCR31IDX),VL4_8(GPR[RT]));
4116 PENDING_FILL(COCIDX,0); /* special case */
4119 { /* control from */
4121 PENDING_FILL(RT,SIGNEXTEND(FCR0,32));
4123 PENDING_FILL(RT,SIGNEXTEND(FCR31,32));
4127 010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
4128 "c%s<X>c1 r<RT>, f<FS>"
4131 // start-sanitize-vr4320
4133 // end-sanitize-vr4320
4134 // start-sanitize-vr5400
4136 // end-sanitize-vr5400
4138 // start-sanitize-tx19
4140 // end-sanitize-tx19
4145 TRACE_ALU_INPUT1 (GPR[RT]);
4148 FCR0 = VL4_8(GPR[RT]);
4149 TRACE_ALU_RESULT (FCR0);
4153 FCR31 = VL4_8(GPR[RT]);
4154 SETFCC(0,((FCR31 & (1 << 23)) ? 1 : 0));
4155 TRACE_ALU_RESULT (FCR31);
4159 TRACE_ALU_RESULT0 ();
4164 { /* control from */
4167 TRACE_ALU_INPUT1 (FCR0);
4168 GPR[RT] = SIGNEXTEND (FCR0, 32);
4172 TRACE_ALU_INPUT1 (FCR31);
4173 GPR[RT] = SIGNEXTEND (FCR31, 32);
4175 TRACE_ALU_RESULT (GPR[RT]);
4182 // FIXME: Does not correctly differentiate between mips*
4184 010001,10,3.FMT,00000,5.FS,5.FD,100001:COP1:32::CVT.D.fmt
4185 "cvt.d.%s<FMT> f<FD>, f<FS>"
4186 *mipsI,mipsII,mipsIII,mipsIV:
4188 // start-sanitize-vr4320
4190 // end-sanitize-vr4320
4191 // start-sanitize-vr5400
4193 // end-sanitize-vr5400
4195 // start-sanitize-tx19
4197 // end-sanitize-tx19
4199 unsigned32 instruction = instruction_0;
4200 int destreg = ((instruction >> 6) & 0x0000001F);
4201 int fs = ((instruction >> 11) & 0x0000001F);
4202 int format = ((instruction >> 21) & 0x00000007);
4204 if ((format == fmt_double) | 0)
4205 SignalException(ReservedInstruction,instruction);
4207 StoreFPR(destreg,fmt_double,Convert(GETRM(),ValueFPR(fs,format),format,fmt_double));
4212 010001,10,3.FMT,00000,5.FS,5.FD,100101:COP1:64::CVT.L.fmt
4213 "cvt.l.%s<FMT> f<FD>, f<FS>"
4217 // start-sanitize-vr4320
4219 // end-sanitize-vr4320
4220 // start-sanitize-vr5400
4222 // end-sanitize-vr5400
4224 // start-sanitize-tx19
4226 // end-sanitize-tx19
4228 unsigned32 instruction = instruction_0;
4229 int destreg = ((instruction >> 6) & 0x0000001F);
4230 int fs = ((instruction >> 11) & 0x0000001F);
4231 int format = ((instruction >> 21) & 0x00000007);
4233 if ((format == fmt_long) | ((format == fmt_long) || (format == fmt_word)))
4234 SignalException(ReservedInstruction,instruction);
4236 StoreFPR(destreg,fmt_long,Convert(GETRM(),ValueFPR(fs,format),format,fmt_long));
4242 // FIXME: Does not correctly differentiate between mips*
4244 010001,10,3.FMT,00000,5.FS,5.FD,100000:COP1:32::CVT.S.fmt
4245 "cvt.s.%s<FMT> f<FD>, f<FS>"
4246 *mipsI,mipsII,mipsIII,mipsIV:
4248 // start-sanitize-vr4320
4250 // end-sanitize-vr4320
4251 // start-sanitize-vr5400
4253 // end-sanitize-vr5400
4255 // start-sanitize-tx19
4257 // end-sanitize-tx19
4259 unsigned32 instruction = instruction_0;
4260 int destreg = ((instruction >> 6) & 0x0000001F);
4261 int fs = ((instruction >> 11) & 0x0000001F);
4262 int format = ((instruction >> 21) & 0x00000007);
4264 if ((format == fmt_single) | 0)
4265 SignalException(ReservedInstruction,instruction);
4267 StoreFPR(destreg,fmt_single,Convert(GETRM(),ValueFPR(fs,format),format,fmt_single));
4272 010001,10,3.FMT,00000,5.FS,5.FD,100100:COP1:32::CVT.W.fmt
4273 "cvt.w.%s<FMT> f<FD>, f<FS>"
4274 *mipsI,mipsII,mipsIII,mipsIV:
4276 // start-sanitize-vr4320
4278 // end-sanitize-vr4320
4279 // start-sanitize-vr5400
4281 // end-sanitize-vr5400
4283 // start-sanitize-tx19
4285 // end-sanitize-tx19
4287 unsigned32 instruction = instruction_0;
4288 int destreg = ((instruction >> 6) & 0x0000001F);
4289 int fs = ((instruction >> 11) & 0x0000001F);
4290 int format = ((instruction >> 21) & 0x00000007);
4292 if ((format == fmt_word) | ((format == fmt_long) || (format == fmt_word)))
4293 SignalException(ReservedInstruction,instruction);
4295 StoreFPR(destreg,fmt_word,Convert(GETRM(),ValueFPR(fs,format),format,fmt_word));
4300 010001,10,3.FMT,5.FT,5.FS,5.FD,000011:COP1:32::DIV.fmt
4301 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
4302 *mipsI,mipsII,mipsIII,mipsIV:
4304 // start-sanitize-vr4320
4306 // end-sanitize-vr4320
4307 // start-sanitize-vr5400
4309 // end-sanitize-vr5400
4311 // start-sanitize-tx19
4313 // end-sanitize-tx19
4315 unsigned32 instruction = instruction_0;
4316 int destreg = ((instruction >> 6) & 0x0000001F);
4317 int fs = ((instruction >> 11) & 0x0000001F);
4318 int ft = ((instruction >> 16) & 0x0000001F);
4319 int format = ((instruction >> 21) & 0x00000007);
4321 if ((format != fmt_single) && (format != fmt_double))
4322 SignalException(ReservedInstruction,instruction);
4324 StoreFPR(destreg,format,Divide(ValueFPR(fs,format),ValueFPR(ft,format),format));
4331 010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
4332 "dm%s<X>c1 r<RT>, f<FS>"
4337 if (SizeFGR() == 64)
4338 PENDING_FILL((FS + FGRIDX),GPR[RT]);
4339 else if ((FS & 0x1) == 0)
4341 PENDING_FILL(((FS + 1) + FGRIDX),VH4_8(GPR[RT]));
4342 PENDING_FILL((FS + FGRIDX),VL4_8(GPR[RT]));
4347 if (SizeFGR() == 64)
4348 PENDING_FILL(RT,FGR[FS]);
4349 else if ((FS & 0x1) == 0)
4350 PENDING_FILL(RT,(SET64HI(FGR[FS+1]) | FGR[FS]));
4352 PENDING_FILL(RT,SET64HI(0xDEADC0DE) | 0xBAD0BAD0);
4355 010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
4356 "dm%s<X>c1 r<RT>, f<FS>"
4359 // start-sanitize-vr4320
4361 // end-sanitize-vr4320
4362 // start-sanitize-vr5400
4364 // end-sanitize-vr5400
4365 // start-sanitize-r5900
4367 // end-sanitize-r5900
4369 // start-sanitize-tx19
4371 // end-sanitize-tx19
4375 if (SizeFGR() == 64)
4376 StoreFPR (FS, fmt_uninterpreted_64, GPR[RT]);
4377 else if ((FS & 0x1) == 0)
4378 StoreFPR (FS, fmt_uninterpreted_64, SET64HI (FGR[FS+1]) | FGR[FS]);
4382 if (SizeFGR() == 64)
4384 else if ((FS & 0x1) == 0)
4385 GPR[RT] = SET64HI (FGR[FS+1]) | FGR[FS];
4387 GPR[RT] = SET64HI (0xDEADC0DE) | 0xBAD0BAD0;
4392 010001,10,3.FMT,00000,5.FS,5.FD,001011:COP1:64::FLOOR.L.fmt
4393 "floor.l.%s<FMT> f<FD>, f<FS>"
4397 // start-sanitize-vr4320
4399 // end-sanitize-vr4320
4400 // start-sanitize-vr5400
4402 // end-sanitize-vr5400
4403 // start-sanitize-r5900
4405 // end-sanitize-r5900
4407 // start-sanitize-tx19
4409 // end-sanitize-tx19
4411 unsigned32 instruction = instruction_0;
4412 int destreg = ((instruction >> 6) & 0x0000001F);
4413 int fs = ((instruction >> 11) & 0x0000001F);
4414 int format = ((instruction >> 21) & 0x00000007);
4416 if ((format != fmt_single) && (format != fmt_double))
4417 SignalException(ReservedInstruction,instruction);
4419 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_long));
4424 010001,10,3.FMT,00000,5.FS,5.FD,001111:COP1:32::FLOOR.W.fmt
4425 "floor.w.%s<FMT> f<FD>, f<FS>"
4430 // start-sanitize-vr4320
4432 // end-sanitize-vr4320
4433 // start-sanitize-vr5400
4435 // end-sanitize-vr5400
4436 // start-sanitize-r5900
4438 // end-sanitize-r5900
4440 // start-sanitize-tx19
4442 // end-sanitize-tx19
4444 unsigned32 instruction = instruction_0;
4445 int destreg = ((instruction >> 6) & 0x0000001F);
4446 int fs = ((instruction >> 11) & 0x0000001F);
4447 int format = ((instruction >> 21) & 0x00000007);
4449 if ((format != fmt_single) && (format != fmt_double))
4450 SignalException(ReservedInstruction,instruction);
4452 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_word));
4457 110101,5.BASE,5.FT,16.OFFSET:COP1:64::LDC1
4458 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
4463 // start-sanitize-vr4320
4465 // end-sanitize-vr4320
4466 // start-sanitize-vr5400
4468 // end-sanitize-vr5400
4470 // start-sanitize-tx19
4472 // end-sanitize-tx19
4474 COP_LD (1, FT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET)));
4478 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64::LDXC1
4479 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
4482 // start-sanitize-vr4320
4484 // end-sanitize-vr4320
4485 // start-sanitize-vr5400
4487 // end-sanitize-vr5400
4489 COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX]));
4494 110001,5.BASE,5.FT,16.OFFSET:COP1:32::LWC1
4495 "lwc1 f<FT>, <OFFSET>(r<BASE>)"
4496 *mipsI,mipsII,mipsIII,mipsIV:
4498 // start-sanitize-vr4320
4500 // end-sanitize-vr4320
4501 // start-sanitize-vr5400
4503 // end-sanitize-vr5400
4504 // start-sanitize-r5900
4506 // end-sanitize-r5900
4508 // start-sanitize-tx19
4510 // end-sanitize-tx19
4512 COP_LW (1, FT, do_load (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET)));
4516 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32::LWXC1
4517 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
4520 // start-sanitize-vr4320
4522 // end-sanitize-vr4320
4523 // start-sanitize-vr5400
4525 // end-sanitize-vr5400
4527 COP_LW (1, FD, do_load (SD_, AccessLength_WORD, GPR[BASE], GPR[INDEX]));
4533 // FIXME: Not correct for mips*
4535 010011,5.FR,5.FT,5.FS,5.FD,100,001:COP1X:32,f::MADD.D
4536 "madd.d f<FD>, f<FR>, f<FS>, f<FT>"
4539 // start-sanitize-vr4320
4541 // end-sanitize-vr4320
4542 // start-sanitize-vr5400
4544 // end-sanitize-vr5400
4546 unsigned32 instruction = instruction_0;
4547 int destreg = ((instruction >> 6) & 0x0000001F);
4548 int fs = ((instruction >> 11) & 0x0000001F);
4549 int ft = ((instruction >> 16) & 0x0000001F);
4550 int fr = ((instruction >> 21) & 0x0000001F);
4552 StoreFPR(destreg,fmt_double,Add(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4557 010011,5.FR,5.FT,5.FS,5.FD,100,000:COP1X:32,f::MADD.S
4558 "madd.s f<FD>, f<FR>, f<FS>, f<FT>"
4561 // start-sanitize-vr4320
4563 // end-sanitize-vr4320
4564 // start-sanitize-vr5400
4566 // end-sanitize-vr5400
4568 unsigned32 instruction = instruction_0;
4569 int destreg = ((instruction >> 6) & 0x0000001F);
4570 int fs = ((instruction >> 11) & 0x0000001F);
4571 int ft = ((instruction >> 16) & 0x0000001F);
4572 int fr = ((instruction >> 21) & 0x0000001F);
4574 StoreFPR(destreg,fmt_single,Add(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4581 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4582 "m%s<X>c1 r<RT>, f<FS>"
4589 if (SizeFGR() == 64)
4590 PENDING_FILL ((FS + FGRIDX), (SET64HI(0xDEADC0DE) | VL4_8(GPR[RT])));
4592 PENDING_FILL ((FS + FGRIDX), VL4_8(GPR[RT]));
4595 PENDING_FILL (RT, SIGNEXTEND(FGR[FS],32));
4597 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4598 "m%s<X>c1 r<RT>, f<FS>"
4601 // start-sanitize-vr4320
4603 // end-sanitize-vr4320
4604 // start-sanitize-vr5400
4606 // end-sanitize-vr5400
4608 // start-sanitize-tx19
4610 // end-sanitize-tx19
4614 StoreFPR (FS, fmt_uninterpreted_32, VL4_8 (GPR[RT]));
4616 GPR[RT] = SIGNEXTEND(FGR[FS],32);
4620 010001,10,3.FMT,00000,5.FS,5.FD,000110:COP1:32::MOV.fmt
4621 "mov.%s<FMT> f<FD>, f<FS>"
4622 *mipsI,mipsII,mipsIII,mipsIV:
4624 // start-sanitize-vr4320
4626 // end-sanitize-vr4320
4627 // start-sanitize-vr5400
4629 // end-sanitize-vr5400
4631 // start-sanitize-tx19
4633 // end-sanitize-tx19
4635 unsigned32 instruction = instruction_0;
4636 int destreg = ((instruction >> 6) & 0x0000001F);
4637 int fs = ((instruction >> 11) & 0x0000001F);
4638 int format = ((instruction >> 21) & 0x00000007);
4640 StoreFPR(destreg,format,ValueFPR(fs,format));
4646 000000,5.RS,3.CC,0,1.TF,5.RD,00000000001:SPECIAL:32::MOVtf
4647 "mov%s<TF> r<RD>, r<RS>, <CC>"
4650 // start-sanitize-vr4320
4652 // end-sanitize-vr4320
4653 // start-sanitize-vr5400
4655 // end-sanitize-vr5400
4656 // start-sanitize-r5900
4658 // end-sanitize-r5900
4660 if (GETFCC(CC) == TF)
4666 010001,10,3.FMT,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32::MOVtf.fmt
4667 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
4670 // start-sanitize-vr4320
4672 // end-sanitize-vr4320
4673 // start-sanitize-vr5400
4675 // end-sanitize-vr5400
4676 // start-sanitize-r5900
4678 // end-sanitize-r5900
4680 unsigned32 instruction = instruction_0;
4681 int format = ((instruction >> 21) & 0x00000007);
4683 if (GETFCC(CC) == TF)
4684 StoreFPR (FD, format, ValueFPR (FS, format));
4686 StoreFPR (FD, format, ValueFPR (FD, format));
4691 010001,10,3.FMT,5.RT,5.FS,5.FD,010011:COP1:32::MOVN.fmt
4694 // start-sanitize-vr4320
4696 // end-sanitize-vr4320
4697 // start-sanitize-vr5400
4699 // end-sanitize-vr5400
4700 // start-sanitize-r5900
4702 // end-sanitize-r5900
4704 unsigned32 instruction = instruction_0;
4705 int destreg = ((instruction >> 6) & 0x0000001F);
4706 int fs = ((instruction >> 11) & 0x0000001F);
4707 int format = ((instruction >> 21) & 0x00000007);
4709 StoreFPR(destreg,format,ValueFPR(fs,format));
4717 // MOVT.fmt see MOVtf.fmt
4721 010001,10,3.FMT,5.RT,5.FS,5.FD,010010:COP1:32::MOVZ.fmt
4722 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
4725 // start-sanitize-vr4320
4727 // end-sanitize-vr4320
4728 // start-sanitize-vr5400
4730 // end-sanitize-vr5400
4731 // start-sanitize-r5900
4733 // end-sanitize-r5900
4735 unsigned32 instruction = instruction_0;
4736 int destreg = ((instruction >> 6) & 0x0000001F);
4737 int fs = ((instruction >> 11) & 0x0000001F);
4738 int format = ((instruction >> 21) & 0x00000007);
4740 StoreFPR(destreg,format,ValueFPR(fs,format));
4746 010011,5.FR,5.FT,5.FS,5.FD,101,001:COP1X:32::MSUB.D
4747 "msub.d f<FD>, f<FR>, f<FS>, f<FT>"
4750 // start-sanitize-vr4320
4752 // end-sanitize-vr4320
4753 // start-sanitize-vr5400
4755 // end-sanitize-vr5400
4756 // start-sanitize-r5900
4758 // end-sanitize-r5900
4760 unsigned32 instruction = instruction_0;
4761 int destreg = ((instruction >> 6) & 0x0000001F);
4762 int fs = ((instruction >> 11) & 0x0000001F);
4763 int ft = ((instruction >> 16) & 0x0000001F);
4764 int fr = ((instruction >> 21) & 0x0000001F);
4766 StoreFPR(destreg,fmt_double,Sub(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4772 010011,5.FR,5.FT,5.FS,5.FD,101000:COP1X:32::MSUB.S
4773 "msub.s f<FD>, f<FR>, f<FS>, f<FT>"
4776 // start-sanitize-vr4320
4778 // end-sanitize-vr4320
4779 // start-sanitize-vr5400
4781 // end-sanitize-vr5400
4782 // start-sanitize-r5900
4784 // end-sanitize-r5900
4786 unsigned32 instruction = instruction_0;
4787 int destreg = ((instruction >> 6) & 0x0000001F);
4788 int fs = ((instruction >> 11) & 0x0000001F);
4789 int ft = ((instruction >> 16) & 0x0000001F);
4790 int fr = ((instruction >> 21) & 0x0000001F);
4792 StoreFPR(destreg,fmt_single,Sub(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4800 010001,10,3.FMT,5.FT,5.FS,5.FD,000010:COP1:32::MUL.fmt
4801 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
4802 *mipsI,mipsII,mipsIII,mipsIV:
4804 // start-sanitize-vr4320
4806 // end-sanitize-vr4320
4807 // start-sanitize-vr5400
4809 // end-sanitize-vr5400
4811 // start-sanitize-tx19
4813 // end-sanitize-tx19
4815 unsigned32 instruction = instruction_0;
4816 int destreg = ((instruction >> 6) & 0x0000001F);
4817 int fs = ((instruction >> 11) & 0x0000001F);
4818 int ft = ((instruction >> 16) & 0x0000001F);
4819 int format = ((instruction >> 21) & 0x00000007);
4821 if ((format != fmt_single) && (format != fmt_double))
4822 SignalException(ReservedInstruction,instruction);
4824 StoreFPR(destreg,format,Multiply(ValueFPR(fs,format),ValueFPR(ft,format),format));
4829 010001,10,3.FMT,00000,5.FS,5.FD,000111:COP1:32::NEG.fmt
4830 "neg.%s<FMT> f<FD>, f<FS>"
4831 *mipsI,mipsII,mipsIII,mipsIV:
4833 // start-sanitize-vr4320
4835 // end-sanitize-vr4320
4836 // start-sanitize-vr5400
4838 // end-sanitize-vr5400
4840 // start-sanitize-tx19
4842 // end-sanitize-tx19
4844 unsigned32 instruction = instruction_0;
4845 int destreg = ((instruction >> 6) & 0x0000001F);
4846 int fs = ((instruction >> 11) & 0x0000001F);
4847 int format = ((instruction >> 21) & 0x00000007);
4849 if ((format != fmt_single) && (format != fmt_double))
4850 SignalException(ReservedInstruction,instruction);
4852 StoreFPR(destreg,format,Negate(ValueFPR(fs,format),format));
4858 010011,5.FR,5.FT,5.FS,5.FD,110001:COP1X:32::NMADD.D
4859 "nmadd.d f<FD>, f<FR>, f<FS>, f<FT>"
4862 // start-sanitize-vr4320
4864 // end-sanitize-vr4320
4865 // start-sanitize-vr5400
4867 // end-sanitize-vr5400
4869 unsigned32 instruction = instruction_0;
4870 int destreg = ((instruction >> 6) & 0x0000001F);
4871 int fs = ((instruction >> 11) & 0x0000001F);
4872 int ft = ((instruction >> 16) & 0x0000001F);
4873 int fr = ((instruction >> 21) & 0x0000001F);
4875 StoreFPR(destreg,fmt_double,Negate(Add(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double),fmt_double));
4881 010011,5.FR,5.FT,5.FS,5.FD,110000:COP1X:32::NMADD.S
4882 "nmadd.s f<FD>, f<FR>, f<FS>, f<FT>"
4885 // start-sanitize-vr4320
4887 // end-sanitize-vr4320
4888 // start-sanitize-vr5400
4890 // end-sanitize-vr5400
4892 unsigned32 instruction = instruction_0;
4893 int destreg = ((instruction >> 6) & 0x0000001F);
4894 int fs = ((instruction >> 11) & 0x0000001F);
4895 int ft = ((instruction >> 16) & 0x0000001F);
4896 int fr = ((instruction >> 21) & 0x0000001F);
4898 StoreFPR(destreg,fmt_single,Negate(Add(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single),fmt_single));
4904 010011,5.FR,5.FT,5.FS,5.FD,111001:COP1X:32::NMSUB.D
4905 "nmsub.d f<FD>, f<FR>, f<FS>, f<FT>"
4908 // start-sanitize-vr4320
4910 // end-sanitize-vr4320
4911 // start-sanitize-vr5400
4913 // end-sanitize-vr5400
4915 unsigned32 instruction = instruction_0;
4916 int destreg = ((instruction >> 6) & 0x0000001F);
4917 int fs = ((instruction >> 11) & 0x0000001F);
4918 int ft = ((instruction >> 16) & 0x0000001F);
4919 int fr = ((instruction >> 21) & 0x0000001F);
4921 StoreFPR(destreg,fmt_double,Negate(Sub(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double),fmt_double));
4927 010011,5.FR,5.FT,5.FS,5.FD,111000:COP1X:32::NMSUB.S
4928 "nmsub.s f<FD>, f<FR>, f<FS>, f<FT>"
4931 // start-sanitize-vr4320
4933 // end-sanitize-vr4320
4934 // start-sanitize-vr5400
4936 // end-sanitize-vr5400
4938 unsigned32 instruction = instruction_0;
4939 int destreg = ((instruction >> 6) & 0x0000001F);
4940 int fs = ((instruction >> 11) & 0x0000001F);
4941 int ft = ((instruction >> 16) & 0x0000001F);
4942 int fr = ((instruction >> 21) & 0x0000001F);
4944 StoreFPR(destreg,fmt_single,Negate(Sub(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single),fmt_single));
4949 010011,5.BASE,5.INDEX,5.HINT,00000001111:COP1X:32::PREFX
4950 "prefx <HINT>, r<INDEX>(r<BASE>)"
4953 // start-sanitize-vr4320
4955 // end-sanitize-vr4320
4956 // start-sanitize-vr5400
4958 // end-sanitize-vr5400
4960 unsigned32 instruction = instruction_0;
4961 int fs = ((instruction >> 11) & 0x0000001F);
4962 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4963 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4965 address_word vaddr = ((unsigned64)op1 + (unsigned64)op2);
4968 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4969 Prefetch(uncached,paddr,vaddr,isDATA,fs);
4973 010001,10,3.FMT,00000,5.FS,5.FD,010101:COP1:32::RECIP.fmt
4975 "recip.%s<FMT> f<FD>, f<FS>"
4977 // start-sanitize-vr4320
4979 // end-sanitize-vr4320
4980 // start-sanitize-vr5400
4982 // end-sanitize-vr5400
4984 unsigned32 instruction = instruction_0;
4985 int destreg = ((instruction >> 6) & 0x0000001F);
4986 int fs = ((instruction >> 11) & 0x0000001F);
4987 int format = ((instruction >> 21) & 0x00000007);
4989 if ((format != fmt_single) && (format != fmt_double))
4990 SignalException(ReservedInstruction,instruction);
4992 StoreFPR(destreg,format,Recip(ValueFPR(fs,format),format));
4997 010001,10,3.FMT,00000,5.FS,5.FD,001000:COP1:64::ROUND.L.fmt
4998 "round.l.%s<FMT> f<FD>, f<FS>"
5002 // start-sanitize-vr4320
5004 // end-sanitize-vr4320
5005 // start-sanitize-vr5400
5007 // end-sanitize-vr5400
5008 // start-sanitize-r5900
5010 // end-sanitize-r5900
5012 // start-sanitize-tx19
5014 // end-sanitize-tx19
5016 unsigned32 instruction = instruction_0;
5017 int destreg = ((instruction >> 6) & 0x0000001F);
5018 int fs = ((instruction >> 11) & 0x0000001F);
5019 int format = ((instruction >> 21) & 0x00000007);
5021 if ((format != fmt_single) && (format != fmt_double))
5022 SignalException(ReservedInstruction,instruction);
5024 StoreFPR(destreg,fmt_long,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_long));
5029 010001,10,3.FMT,00000,5.FS,5.FD,001100:COP1:32::ROUND.W.fmt
5030 "round.w.%s<FMT> f<FD>, f<FS>"
5035 // start-sanitize-vr4320
5037 // end-sanitize-vr4320
5038 // start-sanitize-vr5400
5040 // end-sanitize-vr5400
5041 // start-sanitize-r5900
5043 // end-sanitize-r5900
5045 // start-sanitize-tx19
5047 // end-sanitize-tx19
5049 unsigned32 instruction = instruction_0;
5050 int destreg = ((instruction >> 6) & 0x0000001F);
5051 int fs = ((instruction >> 11) & 0x0000001F);
5052 int format = ((instruction >> 21) & 0x00000007);
5054 if ((format != fmt_single) && (format != fmt_double))
5055 SignalException(ReservedInstruction,instruction);
5057 StoreFPR(destreg,fmt_word,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_word));
5062 010001,10,3.FMT,00000,5.FS,5.FD,010110:COP1:32::RSQRT.fmt
5064 "rsqrt.%s<FMT> f<FD>, f<FS>"
5066 // start-sanitize-vr4320
5068 // end-sanitize-vr4320
5069 // start-sanitize-vr5400
5071 // end-sanitize-vr5400
5073 unsigned32 instruction = instruction_0;
5074 int destreg = ((instruction >> 6) & 0x0000001F);
5075 int fs = ((instruction >> 11) & 0x0000001F);
5076 int format = ((instruction >> 21) & 0x00000007);
5078 if ((format != fmt_single) && (format != fmt_double))
5079 SignalException(ReservedInstruction,instruction);
5081 StoreFPR(destreg,format,Recip(SquareRoot(ValueFPR(fs,format),format),format));
5086 111101,5.BASE,5.FT,16.OFFSET:COP1:64::SDC1
5087 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
5092 // start-sanitize-vr4320
5094 // end-sanitize-vr4320
5095 // start-sanitize-vr5400
5097 // end-sanitize-vr5400
5099 // start-sanitize-tx19
5101 // end-sanitize-tx19
5103 do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (1, FT));
5107 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:64::SDXC1
5108 "ldxc1 f<FS>, r<INDEX>(r<BASE>)"
5111 // start-sanitize-vr4320
5113 // end-sanitize-vr4320
5114 // start-sanitize-vr5400
5116 // end-sanitize-vr5400
5118 do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX], COP_SD (1, FS));
5122 010001,10,3.FMT,00000,5.FS,5.FD,000100:COP1:32::SQRT.fmt
5123 "sqrt.%s<FMT> f<FD>, f<FS>"
5128 // start-sanitize-vr4320
5130 // end-sanitize-vr4320
5131 // start-sanitize-vr5400
5133 // end-sanitize-vr5400
5135 // start-sanitize-tx19
5137 // end-sanitize-tx19
5139 unsigned32 instruction = instruction_0;
5140 int destreg = ((instruction >> 6) & 0x0000001F);
5141 int fs = ((instruction >> 11) & 0x0000001F);
5142 int format = ((instruction >> 21) & 0x00000007);
5144 if ((format != fmt_single) && (format != fmt_double))
5145 SignalException(ReservedInstruction,instruction);
5147 StoreFPR(destreg,format,(SquareRoot(ValueFPR(fs,format),format)));
5152 010001,10,3.FMT,5.FT,5.FS,5.FD,000001:COP1:32::SUB.fmt
5153 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
5154 *mipsI,mipsII,mipsIII,mipsIV:
5156 // start-sanitize-vr4320
5158 // end-sanitize-vr4320
5159 // start-sanitize-vr5400
5161 // end-sanitize-vr5400
5163 // start-sanitize-tx19
5165 // end-sanitize-tx19
5167 unsigned32 instruction = instruction_0;
5168 int destreg = ((instruction >> 6) & 0x0000001F);
5169 int fs = ((instruction >> 11) & 0x0000001F);
5170 int ft = ((instruction >> 16) & 0x0000001F);
5171 int format = ((instruction >> 21) & 0x00000007);
5173 if ((format != fmt_single) && (format != fmt_double))
5174 SignalException(ReservedInstruction,instruction);
5176 StoreFPR(destreg,format,Sub(ValueFPR(fs,format),ValueFPR(ft,format),format));
5182 111001,5.BASE,5.FT,16.OFFSET:COP1:32::SWC1
5183 "swc1 f<FT>, <OFFSET>(r<BASE>)"
5184 *mipsI,mipsII,mipsIII,mipsIV:
5186 // start-sanitize-vr4320
5188 // end-sanitize-vr4320
5189 // start-sanitize-vr5400
5191 // end-sanitize-vr5400
5192 // start-sanitize-r5900
5194 // end-sanitize-r5900
5196 // start-sanitize-tx19
5198 // end-sanitize-tx19
5200 unsigned32 instruction = instruction_0;
5201 signed_word offset = EXTEND16 (OFFSET);
5202 int destreg UNUSED = ((instruction >> 16) & 0x0000001F);
5203 signed_word op1 UNUSED = GPR[((instruction >> 21) & 0x0000001F)];
5205 address_word vaddr = ((uword64)op1 + offset);
5208 if ((vaddr & 3) != 0)
5209 SignalExceptionAddressStore();
5212 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5215 uword64 memval1 = 0;
5216 uword64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
5217 address_word reverseendian = (ReverseEndian ?(mask ^ AccessLength_WORD): 0);
5218 address_word bigendiancpu = (BigEndianCPU ?(mask ^ AccessLength_WORD): 0);
5220 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian));
5221 byte = ((vaddr & mask) ^ bigendiancpu);
5222 memval = (((uword64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
5223 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5230 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32::SWXC1
5231 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
5234 // start-sanitize-vr4320
5236 // end-sanitize-vr4320
5237 // start-sanitize-vr5400
5239 // end-sanitize-vr5400
5241 unsigned32 instruction = instruction_0;
5242 int fs = ((instruction >> 11) & 0x0000001F);
5243 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5244 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5246 address_word vaddr = ((unsigned64)op1 + op2);
5249 if ((vaddr & 3) != 0)
5250 SignalExceptionAddressStore();
5253 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5255 unsigned64 memval = 0;
5256 unsigned64 memval1 = 0;
5257 unsigned64 mask = 0x7;
5259 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
5260 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
5261 memval = (((unsigned64)COP_SW(1,fs)) << (8 * byte));
5263 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5271 010001,10,3.FMT,00000,5.FS,5.FD,001001:COP1:64::TRUNC.L.fmt
5272 "trunc.l.%s<FMT> f<FD>, f<FS>"
5276 // start-sanitize-vr4320
5278 // end-sanitize-vr4320
5279 // start-sanitize-vr5400
5281 // end-sanitize-vr5400
5282 // start-sanitize-r5900
5284 // end-sanitize-r5900
5286 // start-sanitize-tx19
5288 // end-sanitize-tx19
5290 unsigned32 instruction = instruction_0;
5291 int destreg = ((instruction >> 6) & 0x0000001F);
5292 int fs = ((instruction >> 11) & 0x0000001F);
5293 int format = ((instruction >> 21) & 0x00000007);
5295 if ((format != fmt_single) && (format != fmt_double))
5296 SignalException(ReservedInstruction,instruction);
5298 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_long));
5303 010001,10,3.FMT,00000,5.FS,5.FD,001101:COP1:32::TRUNC.W
5304 "trunc.w.%s<FMT> f<FD>, f<FS>"
5309 // start-sanitize-vr4320
5311 // end-sanitize-vr4320
5312 // start-sanitize-vr5400
5314 // end-sanitize-vr5400
5315 // start-sanitize-r5900
5317 // end-sanitize-r5900
5319 // start-sanitize-tx19
5321 // end-sanitize-tx19
5323 unsigned32 instruction = instruction_0;
5324 int destreg = ((instruction >> 6) & 0x0000001F);
5325 int fs = ((instruction >> 11) & 0x0000001F);
5326 int format = ((instruction >> 21) & 0x00000007);
5328 if ((format != fmt_single) && (format != fmt_double))
5329 SignalException(ReservedInstruction,instruction);
5331 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_word));
5337 // MIPS Architecture:
5339 // System Control Instruction Set (COP0)
5343 010000,01000,00000,16.OFFSET:COP0:32::BC0F
5345 *mipsI,mipsII,mipsIII,mipsIV:
5347 // start-sanitize-vr4320
5349 // end-sanitize-vr4320
5350 // start-sanitize-vr5400
5352 // end-sanitize-vr5400
5353 // start-sanitize-r5900
5355 // end-sanitize-r5900
5358 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
5360 *mipsI,mipsII,mipsIII,mipsIV:
5362 // start-sanitize-vr4320
5364 // end-sanitize-vr4320
5365 // start-sanitize-vr5400
5367 // end-sanitize-vr5400
5368 // start-sanitize-r5900
5370 // end-sanitize-r5900
5373 010000,01000,00001,16.OFFSET:COP0:32::BC0T
5375 *mipsI,mipsII,mipsIII,mipsIV:
5376 // start-sanitize-r5900
5378 // end-sanitize-r5900
5382 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
5384 *mipsI,mipsII,mipsIII,mipsIV:
5386 // start-sanitize-vr4320
5388 // end-sanitize-vr4320
5389 // start-sanitize-vr5400
5391 // end-sanitize-vr5400
5392 // start-sanitize-r5900
5394 // end-sanitize-r5900
5397 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
5401 // start-sanitize-vr4320
5403 // end-sanitize-vr4320
5404 // start-sanitize-vr5400
5406 // end-sanitize-vr5400
5407 // start-sanitize-r5900
5409 // end-sanitize-r5900
5411 // start-sanitize-tx19
5413 // end-sanitize-tx19
5415 unsigned32 instruction = instruction_0;
5416 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
5417 int hint = ((instruction >> 16) & 0x0000001F);
5418 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5420 address_word vaddr = (op1 + offset);
5423 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5424 CacheOp(hint,vaddr,paddr,instruction);
5429 010000,10000,000000000000000,111001:COP0:32::DI
5431 *mipsI,mipsII,mipsIII,mipsIV:
5433 // start-sanitize-vr4320
5435 // end-sanitize-vr4320
5436 // start-sanitize-vr5400
5438 // end-sanitize-vr5400
5439 // start-sanitize-r5900
5441 // end-sanitize-r5900
5444 010000,10000,000000000000000,111000:COP0:32::EI
5446 *mipsI,mipsII,mipsIII,mipsIV:
5448 // start-sanitize-vr4320
5450 // end-sanitize-vr4320
5451 // start-sanitize-vr5400
5453 // end-sanitize-vr5400
5454 // start-sanitize-r5900
5456 // end-sanitize-r5900
5459 010000,10000,000000000000000,011000:COP0:32::ERET
5464 // start-sanitize-vr4320
5466 // end-sanitize-vr4320
5467 // start-sanitize-vr5400
5469 // end-sanitize-vr5400
5470 // start-sanitize-r5900
5472 // end-sanitize-r5900
5474 if (SR & status_ERL)
5476 /* Oops, not yet available */
5477 sim_io_printf (SD, "Warning: ERET when SR[ERL] set not supported");
5489 010000,00000,5.RT,5.RD,00000,6.REGX:COP0:32::MFC0
5490 "mfc0 r<RT>, r<RD> # <REGX>"
5491 *mipsI,mipsII,mipsIII,mipsIV:
5494 // start-sanitize-vr4320
5496 // end-sanitize-vr4320
5497 // start-sanitize-vr5400
5499 // end-sanitize-vr5400
5500 // start-sanitize-r5900
5502 // end-sanitize-r5900
5504 TRACE_ALU_INPUT0 ();
5505 DecodeCoproc (instruction_0);
5506 TRACE_ALU_RESULT (GPR[RT]);
5509 010000,00100,5.RT,5.RD,00000,6.REGX:COP0:32::MTC0
5510 "mtc0 r<RT>, r<RD> # <REGX>"
5511 *mipsI,mipsII,mipsIII,mipsIV:
5512 // start-sanitize-tx19
5514 // end-sanitize-tx19
5516 // start-sanitize-vr4320
5518 // end-sanitize-vr4320
5520 // start-sanitize-vr5400
5522 // end-sanitize-vr5400
5523 // start-sanitize-r5900
5525 // end-sanitize-r5900
5527 DecodeCoproc (instruction_0);
5531 010000,10000,000000000000000,010000:COP0:32::RFE
5533 *mipsI,mipsII,mipsIII,mipsIV:
5534 // start-sanitize-tx19
5536 // end-sanitize-tx19
5538 // start-sanitize-vr4320
5540 // end-sanitize-vr4320
5542 // start-sanitize-vr5400
5544 // end-sanitize-vr5400
5545 // start-sanitize-r5900
5547 // end-sanitize-r5900
5549 DecodeCoproc (instruction_0);
5553 010000,10000,000000000000000,001000:COP0:32::TLBP
5555 *mipsI,mipsII,mipsIII,mipsIV:
5557 // start-sanitize-vr4320
5559 // end-sanitize-vr4320
5560 // start-sanitize-vr5400
5562 // end-sanitize-vr5400
5563 // start-sanitize-r5900
5565 // end-sanitize-r5900
5568 010000,10000,000000000000000,000001:COP0:32::TLBR
5570 *mipsI,mipsII,mipsIII,mipsIV:
5572 // start-sanitize-vr4320
5574 // end-sanitize-vr4320
5575 // start-sanitize-vr5400
5577 // end-sanitize-vr5400
5578 // start-sanitize-r5900
5580 // end-sanitize-r5900
5583 010000,10000,000000000000000,000010:COP0:32::TLBWI
5585 *mipsI,mipsII,mipsIII,mipsIV:
5587 // start-sanitize-vr4320
5589 // end-sanitize-vr4320
5590 // start-sanitize-vr5400
5592 // end-sanitize-vr5400
5593 // start-sanitize-r5900
5595 // end-sanitize-r5900
5598 010000,10000,000000000000000,000110:COP0:32::TLBWR
5600 *mipsI,mipsII,mipsIII,mipsIV:
5602 // start-sanitize-vr4320
5604 // end-sanitize-vr4320
5605 // start-sanitize-vr5400
5607 // end-sanitize-vr5400
5608 // start-sanitize-r5900
5610 // end-sanitize-r5900
5614 // start-sanitize-vr4320
5615 :include::vr4320:vr4320.igen
5616 // end-sanitize-vr4320
5617 // start-sanitize-vr5400
5618 :include::vr5400:vr5400.igen
5619 :include:64,f::mdmx.igen
5620 // end-sanitize-vr5400
5621 // start-sanitize-r5900
5622 :include::r5900:r5900.igen
5623 // end-sanitize-r5900
5626 // start-sanitize-cygnus-never
5628 // // FIXME FIXME FIXME What is this instruction?
5629 // 111011,5.RS,5.RT,16.OFFSET:NORMAL:32::<INT>
5634 // // start-sanitize-r5900
5636 // // end-sanitize-r5900
5638 // // start-sanitize-tx19
5640 // // end-sanitize-tx19
5642 // unsigned32 instruction = instruction_0;
5643 // signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
5644 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5645 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5647 // if (CoProcPresent(3))
5648 // SignalException(CoProcessorUnusable);
5650 // SignalException(ReservedInstruction,instruction);
5654 // end-sanitize-cygnus-never
5655 // start-sanitize-cygnus-never
5657 // // FIXME FIXME FIXME What is this?
5658 // 11100,******,00001:RR:16::SDBBP
5661 // unsigned32 instruction = instruction_0;
5662 // if (have_extendval)
5663 // SignalException (ReservedInstruction, instruction);
5665 // SignalException(DebugBreakPoint,instruction);
5669 // end-sanitize-cygnus-never
5670 // start-sanitize-cygnus-never
5672 // // FIXME FIXME FIXME What is this?
5673 // 000000,********************,001110:SPECIAL:32::SDBBP
5676 // unsigned32 instruction = instruction_0;
5678 // SignalException(DebugBreakPoint,instruction);
5682 // end-sanitize-cygnus-never
5683 // start-sanitize-cygnus-never
5685 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5686 // // isn't yet reconized by this simulator.
5687 // 000000,5.RS,5.RT,0000000000101000:SPECIAL:32::MADD16
5690 // unsigned32 instruction = instruction_0;
5691 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5692 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5694 // CHECKHILO("Multiply-Add");
5696 // unsigned64 temp = (op1 * op2);
5697 // temp += (SET64HI(VL4_8(HI)) | VL4_8(LO));
5698 // LO = SIGNEXTEND((unsigned64)VL4_8(temp),32);
5699 // HI = SIGNEXTEND((unsigned64)VH4_8(temp),32);
5704 // end-sanitize-cygnus-never
5705 // start-sanitize-cygnus-never
5707 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5708 // // isn't yet reconized by this simulator.
5709 // 000000,5.RS,5.RT,0000000000101001:SPECIAL:64::DMADD16
5712 // unsigned32 instruction = instruction_0;
5713 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5714 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5716 // CHECKHILO("Multiply-Add");
5718 // unsigned64 temp = (op1 * op2);
5724 // end-sanitize-cygnus-never