2 // <insn-word> { "+" <insn-word> }
14 // IGEN config - mips16
15 :option:16::insn-bit-size:16
16 :option:16::hi-bit-nr:15
17 :option:16::insn-specifying-widths:true
18 :option:16::gen-delayed-branch:false
20 // IGEN config - mips32/64..
21 :option:32::insn-bit-size:32
22 :option:32::hi-bit-nr:31
23 :option:32::insn-specifying-widths:true
24 :option:32::gen-delayed-branch:false
27 // Generate separate simulators for each target
28 // :option:::multi-sim:true
31 // Models known by this simulator
33 :model:::mipsII:mipsII:
34 :model:::mipsIII:mipsIII:
35 :model:::mipsIV:mipsIV:
36 :model:::mips16:mips16:
37 // start-sanitize-r5900
41 // start-sanitize-tx19
44 // start-sanitize-vr5400
45 :model:::vr5400:vr5400:
46 // end-sanitize-vr5400
50 // Pseudo instructions known by IGEN
53 sim_io_eprintf (SD, "Illegal instruction at address 0x%lx\n",
55 sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIGILL);
64 // CPU Instruction Set (mipsI - mipsIV)
68 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
69 "add r<RD>, r<RS>, r<RT>"
74 // start-sanitize-vr5400
76 // end-sanitize-vr5400
77 // start-sanitize-r5900
81 // start-sanitize-tx19
85 ALU32_BEGIN (GPR[RS]);
91 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
92 "addi r<RT>, r<RS>, IMMEDIATE"
97 // start-sanitize-vr5400
99 // end-sanitize-vr5400
100 // start-sanitize-r5900
102 // end-sanitize-r5900
104 // start-sanitize-tx19
108 ALU32_BEGIN (GPR[RS]);
109 ALU32_ADD (EXTEND16 (IMMEDIATE));
114 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
115 "add r<RT>, r<RS>, IMMEDIATE"
120 // start-sanitize-vr5400
122 // end-sanitize-vr5400
123 // start-sanitize-r5900
125 // end-sanitize-r5900
127 // start-sanitize-tx19
131 signed32 temp = GPR[RS] + EXTEND16 (IMMEDIATE);
132 GPR[RT] = EXTEND32 (temp);
136 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
141 // start-sanitize-vr5400
143 // end-sanitize-vr5400
144 // start-sanitize-r5900
146 // end-sanitize-r5900
148 // start-sanitize-tx19
152 signed32 temp = GPR[RS] + GPR[RT];
153 GPR[RD] = EXTEND32 (temp);
157 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
158 "and r<RD>, r<RS>, r<RT>"
163 // start-sanitize-vr5400
165 // end-sanitize-vr5400
166 // start-sanitize-r5900
168 // end-sanitize-r5900
170 // start-sanitize-tx19
174 GPR[RD] = GPR[RS] & GPR[RT];
178 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
179 "and r<RT>, r<RS>, IMMEDIATE"
183 // start-sanitize-vr5400
185 // end-sanitize-vr5400
186 // start-sanitize-r5900
188 // end-sanitize-r5900
190 // start-sanitize-tx19
194 GPR[RT] = GPR[RS] & IMMEDIATE;
198 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
199 "beq r<RS>, r<RT>, OFFSET"
204 // start-sanitize-vr5400
206 // end-sanitize-vr5400
207 // start-sanitize-r5900
209 // end-sanitize-r5900
211 // start-sanitize-tx19
215 address_word offset = EXTEND16 (OFFSET) << 2;
216 if (GPR[RS] == GPR[RT])
217 DELAY_SLOT (PC + offset);
221 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
222 "beql r<RS>, r<RT>, <OFFSET>"
226 // start-sanitize-vr5400
228 // end-sanitize-vr5400
229 // start-sanitize-r5900
231 // end-sanitize-r5900
233 // start-sanitize-tx19
237 address_word offset = EXTEND16 (OFFSET) << 2;
238 if (GPR[RS] == GPR[RT])
239 DELAY_SLOT (PC + offset);
241 NULLIFY_NEXT_INSTRUCTION ();
245 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
246 "bgez r<RS>, <OFFSET>"
251 // start-sanitize-vr5400
253 // end-sanitize-vr5400
254 // start-sanitize-r5900
256 // end-sanitize-r5900
258 // start-sanitize-tx19
262 address_word offset = EXTEND16 (OFFSET) << 2;
264 DELAY_SLOT (PC + offset);
268 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
269 "bgezal r<RS>, <OFFSET>"
274 // start-sanitize-vr5400
276 // end-sanitize-vr5400
277 // start-sanitize-r5900
279 // end-sanitize-r5900
281 // start-sanitize-tx19
285 address_word offset = EXTEND16 (OFFSET) << 2;
288 DELAY_SLOT (PC + offset);
292 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
293 "bgezall r<RS>, <OFFSET>"
297 // start-sanitize-vr5400
299 // end-sanitize-vr5400
300 // start-sanitize-r5900
302 // end-sanitize-r5900
304 // start-sanitize-tx19
308 address_word offset = EXTEND16 (OFFSET) << 2;
310 /* NOTE: The branch occurs AFTER the next instruction has been
313 DELAY_SLOT (PC + offset);
315 NULLIFY_NEXT_INSTRUCTION ();
319 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
320 "bgezl r<RS>, <OFFSET>"
324 // start-sanitize-vr5400
326 // end-sanitize-vr5400
327 // start-sanitize-r5900
329 // end-sanitize-r5900
331 // start-sanitize-tx19
335 address_word offset = EXTEND16 (OFFSET) << 2;
337 DELAY_SLOT (PC + offset);
339 NULLIFY_NEXT_INSTRUCTION ();
343 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
344 "bgtz r<RS>, <OFFSET>"
349 // start-sanitize-vr5400
351 // end-sanitize-vr5400
352 // start-sanitize-r5900
354 // end-sanitize-r5900
356 // start-sanitize-tx19
360 address_word offset = EXTEND16 (OFFSET) << 2;
362 DELAY_SLOT (PC + offset);
366 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
367 "bgtzl r<RS>, <OFFSET>"
371 // start-sanitize-vr5400
373 // end-sanitize-vr5400
374 // start-sanitize-r5900
376 // end-sanitize-r5900
378 // start-sanitize-tx19
382 address_word offset = EXTEND16 (OFFSET) << 2;
383 /* NOTE: The branch occurs AFTER the next instruction has been
386 DELAY_SLOT (PC + offset);
388 NULLIFY_NEXT_INSTRUCTION ();
392 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
393 "blez r<RS>, <OFFSET>"
398 // start-sanitize-vr5400
400 // end-sanitize-vr5400
401 // start-sanitize-r5900
403 // end-sanitize-r5900
405 // start-sanitize-tx19
409 address_word offset = EXTEND16 (OFFSET) << 2;
410 /* NOTE: The branch occurs AFTER the next instruction has been
413 DELAY_SLOT (PC + offset);
417 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
418 "bgezl r<RS>, <OFFSET>"
422 // start-sanitize-vr5400
424 // end-sanitize-vr5400
425 // start-sanitize-r5900
427 // end-sanitize-r5900
429 // start-sanitize-tx19
433 address_word offset = EXTEND16 (OFFSET) << 2;
435 DELAY_SLOT (PC + offset);
437 NULLIFY_NEXT_INSTRUCTION ();
441 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
442 "bltz r<RS>, <OFFSET>"
447 // start-sanitize-vr5400
449 // end-sanitize-vr5400
450 // start-sanitize-r5900
452 // end-sanitize-r5900
454 // start-sanitize-tx19
458 address_word offset = EXTEND16 (OFFSET) << 2;
460 DELAY_SLOT (PC + offset);
464 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
465 "bltzal r<RS>, <OFFSET>"
470 // start-sanitize-vr5400
472 // end-sanitize-vr5400
473 // start-sanitize-r5900
475 // end-sanitize-r5900
477 // start-sanitize-tx19
481 address_word offset = EXTEND16 (OFFSET) << 2;
483 /* NOTE: The branch occurs AFTER the next instruction has been
486 DELAY_SLOT (PC + offset);
490 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
491 "bltzall r<RS>, <OFFSET>"
495 // start-sanitize-vr5400
497 // end-sanitize-vr5400
498 // start-sanitize-r5900
500 // end-sanitize-r5900
502 // start-sanitize-tx19
506 address_word offset = EXTEND16 (OFFSET) << 2;
509 DELAY_SLOT (PC + offset);
511 NULLIFY_NEXT_INSTRUCTION ();
515 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
516 "bltzl r<RS>, <OFFSET>"
520 // start-sanitize-vr5400
522 // end-sanitize-vr5400
523 // start-sanitize-r5900
525 // end-sanitize-r5900
527 // start-sanitize-tx19
531 address_word offset = EXTEND16 (OFFSET) << 2;
532 /* NOTE: The branch occurs AFTER the next instruction has been
535 DELAY_SLOT (PC + offset);
537 NULLIFY_NEXT_INSTRUCTION ();
541 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
542 "bne r<RS>, r<RT>, <OFFSET>"
547 // start-sanitize-vr5400
549 // end-sanitize-vr5400
550 // start-sanitize-r5900
552 // end-sanitize-r5900
554 // start-sanitize-tx19
558 address_word offset = EXTEND16 (OFFSET) << 2;
559 if (GPR[RS] != GPR[RT])
560 DELAY_SLOT (PC + offset);
564 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
565 "bnel r<RS>, r<RT>, <OFFSET>"
569 // start-sanitize-vr5400
571 // end-sanitize-vr5400
572 // start-sanitize-r5900
574 // end-sanitize-r5900
576 // start-sanitize-tx19
580 address_word offset = EXTEND16 (OFFSET) << 2;
581 if (GPR[RS] != GPR[RT])
582 DELAY_SLOT (PC + offset);
584 NULLIFY_NEXT_INSTRUCTION ();
588 000000,20.CODE,001101:SPECIAL:32::BREAK
594 // start-sanitize-vr5400
596 // end-sanitize-vr5400
597 // start-sanitize-r5900
599 // end-sanitize-r5900
601 // start-sanitize-tx19
605 SignalException(BreakPoint, instruction_0);
609 0100,ZZ!0!1!3,26.COP_FUN:NORMAL:32::COPz
615 // start-sanitize-vr5400
617 // end-sanitize-vr5400
618 // start-sanitize-r5900
620 // end-sanitize-r5900
622 // start-sanitize-tx19
626 DecodeCoproc (instruction_0);
630 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
631 "dadd r<RD>, r<RS>, r<RT>"
634 // start-sanitize-vr5400
636 // end-sanitize-vr5400
637 // start-sanitize-r5900
639 // end-sanitize-r5900
641 // start-sanitize-tx19
645 ALU64_BEGIN (GPR[RS]);
651 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
652 "daddi r<RT>, r<RS>, <IMMEDIATE>"
655 // start-sanitize-vr5400
657 // end-sanitize-vr5400
658 // start-sanitize-r5900
660 // end-sanitize-r5900
662 // start-sanitize-tx19
666 ALU64_BEGIN (GPR[RS]);
667 ALU64_ADD (EXTEND16 (IMMEDIATE));
672 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
673 "daddu r<RT>, r<RS>, <IMMEDIATE>"
676 // start-sanitize-vr5400
678 // end-sanitize-vr5400
679 // start-sanitize-r5900
681 // end-sanitize-r5900
683 // start-sanitize-tx19
687 GPR[RT] = GPR[RS] + EXTEND16 (IMMEDIATE);
691 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
692 "daddu r<RD>, r<RS>, r<RT>"
695 // start-sanitize-vr5400
697 // end-sanitize-vr5400
698 // start-sanitize-r5900
700 // end-sanitize-r5900
702 // start-sanitize-tx19
706 GPR[RD] = GPR[RS] + GPR[RT];
710 000000,5.RS,5.RT,0000000000011110:SPECIAL:64::DDIV
714 // start-sanitize-vr5400
716 // end-sanitize-vr5400
717 // start-sanitize-r5900
719 // end-sanitize-r5900
721 // start-sanitize-tx19
725 CHECKHILO ("Division");
727 signed64 n = GPR[RS];
728 signed64 d = GPR[RT];
731 LO = SIGNED64 (0x8000000000000000);
734 else if (d == -1 && n == SIGNED64 (0x8000000000000000))
736 LO = SIGNED64 (0x8000000000000000);
749 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
754 // start-sanitize-vr5400
756 // end-sanitize-vr5400
757 // start-sanitize-tx19
761 CHECKHILO ("Division");
763 unsigned64 n = GPR[RS];
764 unsigned64 d = GPR[RT];
767 LO = SIGNED64 (0x8000000000000000);
779 000000,5.RS,5.RT,0000000000011010:SPECIAL:32::DIV
785 // start-sanitize-vr5400
787 // end-sanitize-vr5400
788 // start-sanitize-r5900
790 // end-sanitize-r5900
792 // start-sanitize-tx19
796 CHECKHILO("Division");
798 signed32 n = GPR[RS];
799 signed32 d = GPR[RT];
802 LO = EXTEND32 (0x80000000);
805 else if (d == -1 && d == 0x80000000)
807 LO = EXTEND32 (0x80000000);
812 LO = EXTEND32 (n / d);
813 HI = EXTEND32 (n % d);
819 000000,5.RS,5.RT,0000000000011011:SPECIAL:32::DIVU
825 // start-sanitize-vr5400
827 // end-sanitize-vr5400
828 // start-sanitize-r5900
830 // end-sanitize-r5900
832 // start-sanitize-tx19
836 CHECKHILO ("Division");
838 unsigned32 n = GPR[RS];
839 unsigned32 d = GPR[RT];
842 LO = EXTEND32 (0x80000000);
847 LO = EXTEND32 (n / d);
848 HI = EXTEND32 (n % d);
854 000000,5.RS,5.RT,0000000000011100:SPECIAL:64::DMULT
858 // start-sanitize-vr5400
860 // end-sanitize-vr5400
862 // start-sanitize-tx19
866 CHECKHILO ("Multiplication");
868 signed64 op1 = GPR[RS];
869 signed64 op2 = GPR[RT];
878 /* make it unsigned */
889 /* multuply out the 4 sub products */
890 m00 = (VL4_8 (op1) * VL4_8 (op2));
891 m10 = (VH4_8 (op1) * VL4_8 (op2));
892 m01 = (VL4_8 (op1) * VH4_8 (op2));
893 m11 = (VH4_8 (op1) * VH4_8 (op2));
894 /* add the products */
895 mid = VH4_8 (m00) + VL4_8 (m10) + VL4_8 (m01);
896 lo = U8_4 (mid, m00);
897 hi = m11 + VH4_8 (mid) + VH4_8 (m01) + VH4_8 (m10);
898 /* save the result */
916 000000,5.RS,5.RT,0000000000011101:SPECIAL:64::DMULTU
917 "dmultu r<RS>, r<RT>"
920 // start-sanitize-vr5400
922 // end-sanitize-vr5400
924 // start-sanitize-tx19
928 CHECKHILO ("Multiplication");
930 signed64 op1 = GPR[RS];
931 signed64 op2 = GPR[RT];
939 /* multuply out the 4 sub products */
940 m00 = (VL4_8 (op1) * VL4_8 (op2));
941 m10 = (VH4_8 (op1) * VL4_8 (op2));
942 m01 = (VL4_8 (op1) * VH4_8 (op2));
943 m11 = (VH4_8 (op1) * VH4_8 (op2));
944 /* add the products */
945 mid = VH4_8 (m00) + VL4_8 (m10) + VL4_8 (m01);
946 lo = U8_4 (mid, m00);
947 hi = m11 + VH4_8 (mid) + VH4_8 (m01) + VH4_8 (m10);
948 /* save the result */
955 00000000000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
956 "dsll r<RD>, r<RT>, <SA>"
959 // start-sanitize-vr5400
961 // end-sanitize-vr5400
962 // start-sanitize-r5900
964 // end-sanitize-r5900
966 // start-sanitize-tx19
971 GPR[RD] = GPR[RT] << s;
975 00000000000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
976 "dsll32 r<RD>, r<RT>, <SA>"
979 // start-sanitize-vr5400
981 // end-sanitize-vr5400
982 // start-sanitize-r5900
984 // end-sanitize-r5900
986 // start-sanitize-tx19
991 GPR[RD] = GPR[RT] << s;
995 000000,5.RS,5.RT,5.RD,00000010100:SPECIAL:64::DSLLV
996 "dsllv r<RD>, r<RT>, r<RS>"
999 // start-sanitize-vr5400
1001 // end-sanitize-vr5400
1002 // start-sanitize-r5900
1004 // end-sanitize-r5900
1006 // start-sanitize-tx19
1008 // end-sanitize-tx19
1010 int s = MASKED64 (GPR[RS], 5, 0);
1011 GPR[RD] = GPR[RT] << s;
1015 00000000000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
1016 "dsra r<RD>, r<RT>, <SA>"
1019 // start-sanitize-vr5400
1021 // end-sanitize-vr5400
1022 // start-sanitize-r5900
1024 // end-sanitize-r5900
1026 // start-sanitize-tx19
1028 // end-sanitize-tx19
1031 GPR[RD] = ((signed64) GPR[RT]) >> s;
1035 00000000000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
1036 "dsra32 r<RT>, r<RD>, <SA>"
1039 // start-sanitize-vr5400
1041 // end-sanitize-vr5400
1042 // start-sanitize-r5900
1044 // end-sanitize-r5900
1046 // start-sanitize-tx19
1048 // end-sanitize-tx19
1051 GPR[RD] = ((signed64) GPR[RT]) >> s;
1055 000000,5.RS,5.RT,5.RD,00000010111:SPECIAL:64::DSRAV
1056 "dsra32 r<RT>, r<RD>, r<RS>"
1059 // start-sanitize-vr5400
1061 // end-sanitize-vr5400
1062 // start-sanitize-r5900
1064 // end-sanitize-r5900
1066 // start-sanitize-tx19
1068 // end-sanitize-tx19
1070 int s = MASKED64 (GPR[RS], 5, 0);
1071 GPR[RD] = ((signed64) GPR[RT]) >> s;
1075 00000000000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
1076 "dsrav r<RD>, r<RT>, <SA>"
1079 // start-sanitize-vr5400
1081 // end-sanitize-vr5400
1082 // start-sanitize-r5900
1084 // end-sanitize-r5900
1086 // start-sanitize-tx19
1088 // end-sanitize-tx19
1091 GPR[RD] = (unsigned64) GPR[RT] >> s;
1095 00000000000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
1096 "dsrl32 r<RD>, r<RT>, <SA>"
1099 // start-sanitize-vr5400
1101 // end-sanitize-vr5400
1102 // start-sanitize-r5900
1104 // end-sanitize-r5900
1106 // start-sanitize-tx19
1108 // end-sanitize-tx19
1111 GPR[RD] = (unsigned64) GPR[RT] >> s;
1115 000000,5.RS,5.RT,5.RD,00000010110:SPECIAL:64::DSRLV
1116 "dsrl32 r<RD>, r<RT>, r<RS>"
1119 // start-sanitize-vr5400
1121 // end-sanitize-vr5400
1122 // start-sanitize-r5900
1124 // end-sanitize-r5900
1126 // start-sanitize-tx19
1128 // end-sanitize-tx19
1130 int s = MASKED64 (GPR[RS], 5, 0);
1131 GPR[RD] = (unsigned64) GPR[RT] >> s;
1135 000000,5.RS,5.RT,5.RD,00000101110:SPECIAL:64::DSUB
1136 "dsub r<RD>, r<RS>, r<RT>"
1139 // start-sanitize-vr5400
1141 // end-sanitize-vr5400
1142 // start-sanitize-r5900
1144 // end-sanitize-r5900
1146 // start-sanitize-tx19
1148 // end-sanitize-tx19
1150 ALU64_BEGIN (GPR[RS]);
1151 ALU64_SUB (GPR[RT]);
1152 ALU64_END (GPR[RD]);
1156 000000,5.RS,5.RT,5.RD,00000101111:SPECIAL:64::DSUBU
1157 "dsubu r<RD>, r<RS>, r<RT>"
1160 // start-sanitize-vr5400
1162 // end-sanitize-vr5400
1163 // start-sanitize-r5900
1165 // end-sanitize-r5900
1167 // start-sanitize-tx19
1169 // end-sanitize-tx19
1171 GPR[RD] = GPR[RS] - GPR[RT];
1175 000010,26.INSTR_INDEX:NORMAL:32::J
1181 // start-sanitize-vr5400
1183 // end-sanitize-vr5400
1184 // start-sanitize-r5900
1186 // end-sanitize-r5900
1188 // start-sanitize-tx19
1190 // end-sanitize-tx19
1192 /* NOTE: The region used is that of the delay slot NIA and NOT the
1193 current instruction */
1194 address_word region = (NIA & MASK (63, 28));
1195 DELAY_SLOT (region | (INSTR_INDEX << 2));
1199 000011,26.INSTR_INDEX:NORMAL:32::JAL
1205 // start-sanitize-vr5400
1207 // end-sanitize-vr5400
1208 // start-sanitize-r5900
1210 // end-sanitize-r5900
1212 // start-sanitize-tx19
1214 // end-sanitize-tx19
1216 /* NOTE: The region used is that of the delay slot and NOT the
1217 current instruction */
1218 address_word region = (NIA & MASK (63, 28));
1220 DELAY_SLOT (region | (INSTR_INDEX << 2));
1224 000000,5.RS,00000,5.RD,00000001001:SPECIAL:32::JALR
1225 "jalr r<RS>":RD == 31
1231 // start-sanitize-vr5400
1233 // end-sanitize-vr5400
1234 // start-sanitize-r5900
1236 // end-sanitize-r5900
1238 // start-sanitize-tx19
1240 // end-sanitize-tx19
1242 address_word temp = GPR[RS];
1248 000000,5.RS,000000000000000001000:SPECIAL:32::JR
1254 // start-sanitize-vr5400
1256 // end-sanitize-vr5400
1257 // start-sanitize-r5900
1259 // end-sanitize-r5900
1261 // start-sanitize-tx19
1263 // end-sanitize-tx19
1265 DELAY_SLOT (GPR[RS]);
1269 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
1270 "lb r<RT>, <OFFSET>(r<BASE>)"
1275 // start-sanitize-vr5400
1277 // end-sanitize-vr5400
1278 // start-sanitize-r5900
1280 // end-sanitize-r5900
1282 // start-sanitize-tx19
1284 // end-sanitize-tx19
1286 unsigned32 instruction = instruction_0;
1287 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1288 int destreg = ((instruction >> 16) & 0x0000001F);
1289 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1291 address_word vaddr = ((uword64)op1 + offset);
1295 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1298 uword64 memval1 = 0;
1300 unsigned int shift = 0;
1301 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1302 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1304 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1305 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
1306 byte = ((vaddr & mask) ^ (bigend << shift));
1307 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x000000FF),8));
1314 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
1315 "lbu r<RT>, <OFFSET>(r<BASE>)"
1320 // start-sanitize-vr5400
1322 // end-sanitize-vr5400
1323 // start-sanitize-r5900
1325 // end-sanitize-r5900
1327 // start-sanitize-tx19
1329 // end-sanitize-tx19
1331 unsigned32 instruction = instruction_0;
1332 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1333 int destreg = ((instruction >> 16) & 0x0000001F);
1334 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1336 address_word vaddr = ((unsigned64)op1 + offset);
1340 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1342 unsigned64 memval = 0;
1343 unsigned64 memval1 = 0;
1344 unsigned64 mask = 0x7;
1345 unsigned int shift = 0;
1346 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1347 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1349 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1350 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
1351 byte = ((vaddr & mask) ^ (bigend << shift));
1352 GPR[destreg] = (((memval >> (8 * byte)) & 0x000000FF));
1359 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
1360 "ld r<RT>, <OFFSET>(r<BASE>)"
1363 // start-sanitize-vr5400
1365 // end-sanitize-vr5400
1366 // start-sanitize-r5900
1368 // end-sanitize-r5900
1370 // start-sanitize-tx19
1372 // end-sanitize-tx19
1374 unsigned32 instruction = instruction_0;
1375 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1376 int destreg = ((instruction >> 16) & 0x0000001F);
1377 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1379 address_word vaddr = ((unsigned64)op1 + offset);
1382 if ((vaddr & 7) != 0)
1383 SignalExceptionAddressLoad();
1386 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1388 unsigned64 memval = 0;
1389 unsigned64 memval1 = 0;
1390 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1391 GPR[destreg] = memval;
1398 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
1399 "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
1403 // start-sanitize-vr5400
1405 // end-sanitize-vr5400
1406 // start-sanitize-r5900
1408 // end-sanitize-r5900
1410 // start-sanitize-tx19
1412 // end-sanitize-tx19
1414 unsigned32 instruction = instruction_0;
1415 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1416 int destreg = ((instruction >> 16) & 0x0000001F);
1417 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1419 address_word vaddr = ((unsigned64)op1 + offset);
1422 if ((vaddr & 7) != 0)
1423 SignalExceptionAddressLoad();
1426 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1428 unsigned64 memval = 0;
1429 unsigned64 memval1 = 0;
1430 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1431 COP_LD(((instruction >> 26) & 0x3),destreg,memval);;
1438 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
1439 "ldl r<RT>, <OFFSET>(r<BASE>)"
1442 // start-sanitize-vr5400
1444 // end-sanitize-vr5400
1445 // start-sanitize-r5900
1447 // end-sanitize-r5900
1449 // start-sanitize-tx19
1451 // end-sanitize-tx19
1453 unsigned32 instruction = instruction_0;
1454 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1455 int destreg = ((instruction >> 16) & 0x0000001F);
1456 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1458 address_word vaddr = ((unsigned64)op1 + offset);
1462 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1464 unsigned64 memval = 0;
1465 unsigned64 memval1 = 0;
1466 unsigned64 mask = 7;
1467 unsigned int reverse = (ReverseEndian ? mask : 0);
1468 unsigned int bigend = (BigEndianCPU ? mask : 0);
1470 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1471 byte = ((vaddr & mask) ^ bigend);
1474 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
1475 GPR[destreg] = ((memval << ((7 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((7 - byte) * 8)) - 1)));
1482 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
1483 "ldr r<RT>, <OFFSET>(r<BASE>)"
1486 // start-sanitize-vr5400
1488 // end-sanitize-vr5400
1489 // start-sanitize-r5900
1491 // end-sanitize-r5900
1493 // start-sanitize-tx19
1495 // end-sanitize-tx19
1497 unsigned32 instruction = instruction_0;
1498 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1499 int destreg = ((instruction >> 16) & 0x0000001F);
1500 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1502 address_word vaddr = ((unsigned64)op1 + offset);
1506 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1508 unsigned64 memval = 0;
1509 unsigned64 memval1 = 0;
1510 unsigned64 mask = 7;
1511 unsigned int reverse = (ReverseEndian ? mask : 0);
1512 unsigned int bigend = (BigEndianCPU ? mask : 0);
1514 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1515 byte = ((vaddr & mask) ^ bigend);
1518 LoadMemory(&memval,&memval1,uncached,(7 - byte),paddr,vaddr,isDATA,isREAL);
1524 srcmask = ((unsigned64)-1 << (8 * (8 - byte)));
1525 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
1533 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
1534 "lh r<RT>, <OFFSET>(r<BASE>)"
1539 // start-sanitize-vr5400
1541 // end-sanitize-vr5400
1542 // start-sanitize-r5900
1544 // end-sanitize-r5900
1546 // start-sanitize-tx19
1548 // end-sanitize-tx19
1550 unsigned32 instruction = instruction_0;
1551 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1552 int destreg = ((instruction >> 16) & 0x0000001F);
1553 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1555 address_word vaddr = ((unsigned64)op1 + offset);
1558 if ((vaddr & 1) != 0)
1559 SignalExceptionAddressLoad();
1562 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1564 unsigned64 memval = 0;
1565 unsigned64 memval1 = 0;
1566 unsigned64 mask = 0x7;
1567 unsigned int shift = 1;
1568 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1569 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1571 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1572 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1573 byte = ((vaddr & mask) ^ (bigend << shift));
1574 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x0000FFFF),16));
1581 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
1582 "lhu r<RT>, <OFFSET>(r<BASE>)"
1587 // start-sanitize-vr5400
1589 // end-sanitize-vr5400
1590 // start-sanitize-r5900
1592 // end-sanitize-r5900
1594 // start-sanitize-tx19
1596 // end-sanitize-tx19
1598 unsigned32 instruction = instruction_0;
1599 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1600 int destreg = ((instruction >> 16) & 0x0000001F);
1601 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1603 address_word vaddr = ((unsigned64)op1 + offset);
1606 if ((vaddr & 1) != 0)
1607 SignalExceptionAddressLoad();
1610 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1612 unsigned64 memval = 0;
1613 unsigned64 memval1 = 0;
1614 unsigned64 mask = 0x7;
1615 unsigned int shift = 1;
1616 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1617 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1619 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1620 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1621 byte = ((vaddr & mask) ^ (bigend << shift));
1622 GPR[destreg] = (((memval >> (8 * byte)) & 0x0000FFFF));
1629 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
1630 "ll r<RT>, <OFFSET>(r<BASE>)"
1634 // start-sanitize-vr5400
1636 // end-sanitize-vr5400
1637 // start-sanitize-r5900
1639 // end-sanitize-r5900
1641 // start-sanitize-tx19
1643 // end-sanitize-tx19
1645 unsigned32 instruction = instruction_0;
1646 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1647 int destreg = ((instruction >> 16) & 0x0000001F);
1648 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1650 address_word vaddr = ((unsigned64)op1 + offset);
1653 if ((vaddr & 3) != 0)
1654 SignalExceptionAddressLoad();
1657 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1659 unsigned64 memval = 0;
1660 unsigned64 memval1 = 0;
1661 unsigned64 mask = 0x7;
1662 unsigned int shift = 2;
1663 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1664 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1666 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1667 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1668 byte = ((vaddr & mask) ^ (bigend << shift));
1669 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
1677 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
1678 "lld r<RT>, <OFFSET>(r<BASE>)"
1681 // start-sanitize-vr5400
1683 // end-sanitize-vr5400
1684 // start-sanitize-r5900
1686 // end-sanitize-r5900
1688 // start-sanitize-tx19
1690 // end-sanitize-tx19
1692 unsigned32 instruction = instruction_0;
1693 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1694 int destreg = ((instruction >> 16) & 0x0000001F);
1695 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1697 address_word vaddr = ((unsigned64)op1 + offset);
1700 if ((vaddr & 7) != 0)
1701 SignalExceptionAddressLoad();
1704 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1706 unsigned64 memval = 0;
1707 unsigned64 memval1 = 0;
1708 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1709 GPR[destreg] = memval;
1717 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
1718 "lui r<RT>, <IMMEDIATE>"
1723 // start-sanitize-vr5400
1725 // end-sanitize-vr5400
1726 // start-sanitize-r5900
1728 // end-sanitize-r5900
1730 // start-sanitize-tx19
1732 // end-sanitize-tx19
1734 GPR[RT] = EXTEND32 (IMMEDIATE << 16);
1738 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
1739 "lw r<RT>, <OFFSET>(r<BASE>)"
1744 // start-sanitize-vr5400
1746 // end-sanitize-vr5400
1747 // start-sanitize-r5900
1749 // end-sanitize-r5900
1751 // start-sanitize-tx19
1753 // end-sanitize-tx19
1755 unsigned32 instruction = instruction_0;
1756 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1757 int destreg = ((instruction >> 16) & 0x0000001F);
1758 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1760 address_word vaddr = ((unsigned64)op1 + offset);
1763 if ((vaddr & 3) != 0)
1764 SignalExceptionAddressLoad();
1767 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1769 unsigned64 memval = 0;
1770 unsigned64 memval1 = 0;
1771 unsigned64 mask = 0x7;
1772 unsigned int shift = 2;
1773 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1774 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1776 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1777 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1778 byte = ((vaddr & mask) ^ (bigend << shift));
1779 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
1786 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
1787 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
1792 // start-sanitize-vr5400
1794 // end-sanitize-vr5400
1795 // start-sanitize-r5900
1797 // end-sanitize-r5900
1799 // start-sanitize-tx19
1801 // end-sanitize-tx19
1803 unsigned32 instruction = instruction_0;
1804 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1805 int destreg = ((instruction >> 16) & 0x0000001F);
1806 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1808 address_word vaddr = ((unsigned64)op1 + offset);
1811 if ((vaddr & 3) != 0)
1812 SignalExceptionAddressLoad();
1815 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1817 unsigned64 memval = 0;
1818 unsigned64 memval1 = 0;
1819 unsigned64 mask = 0x7;
1820 unsigned int shift = 2;
1821 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1822 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1824 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1825 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1826 byte = ((vaddr & mask) ^ (bigend << shift));
1827 COP_LW(((instruction >> 26) & 0x3),destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
1834 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
1835 "lwl r<RT>, <OFFSET>(r<BASE>)"
1840 // start-sanitize-vr5400
1842 // end-sanitize-vr5400
1843 // start-sanitize-r5900
1845 // end-sanitize-r5900
1847 // start-sanitize-tx19
1849 // end-sanitize-tx19
1851 unsigned32 instruction = instruction_0;
1852 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1853 int destreg = ((instruction >> 16) & 0x0000001F);
1854 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1856 address_word vaddr = ((unsigned64)op1 + offset);
1860 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1862 unsigned64 memval = 0;
1863 unsigned64 memval1 = 0;
1864 unsigned64 mask = 3;
1865 unsigned int reverse = (ReverseEndian ? mask : 0);
1866 unsigned int bigend = (BigEndianCPU ? mask : 0);
1868 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1869 byte = ((vaddr & mask) ^ bigend);
1872 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
1873 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
1876 GPR[destreg] = ((memval << ((3 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((3 - byte) * 8)) - 1)));
1877 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
1884 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
1885 "lwr r<RT>, <OFFSET>(r<BASE>)"
1890 // start-sanitize-vr5400
1892 // end-sanitize-vr5400
1893 // start-sanitize-r5900
1895 // end-sanitize-r5900
1897 // start-sanitize-tx19
1899 // end-sanitize-tx19
1901 unsigned32 instruction = instruction_0;
1902 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1903 int destreg = ((instruction >> 16) & 0x0000001F);
1904 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1906 address_word vaddr = ((unsigned64)op1 + offset);
1910 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1912 unsigned64 memval = 0;
1913 unsigned64 memval1 = 0;
1914 unsigned64 mask = 3;
1915 unsigned int reverse = (ReverseEndian ? mask : 0);
1916 unsigned int bigend = (BigEndianCPU ? mask : 0);
1918 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1919 byte = ((vaddr & mask) ^ bigend);
1922 LoadMemory(&memval,&memval1,uncached,(3 - byte),paddr,vaddr,isDATA,isREAL);
1923 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
1931 srcmask = ((unsigned64)-1 << (8 * (4 - byte)));
1932 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
1934 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
1941 100111,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWU
1942 "lwu r<RT>, <OFFSET>(r<BASE>)"
1945 // start-sanitize-vr5400
1947 // end-sanitize-vr5400
1948 // start-sanitize-r5900
1950 // end-sanitize-r5900
1952 // start-sanitize-tx19
1954 // end-sanitize-tx19
1956 unsigned32 instruction = instruction_0;
1957 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1958 int destreg = ((instruction >> 16) & 0x0000001F);
1959 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1961 address_word vaddr = ((unsigned64)op1 + offset);
1964 if ((vaddr & 3) != 0)
1965 SignalExceptionAddressLoad();
1968 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1970 unsigned64 memval = 0;
1971 unsigned64 memval1 = 0;
1972 unsigned64 mask = 0x7;
1973 unsigned int shift = 2;
1974 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1975 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1977 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1978 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1979 byte = ((vaddr & mask) ^ (bigend << shift));
1980 GPR[destreg] = (((memval >> (8 * byte)) & 0xFFFFFFFF));
1987 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
1993 // start-sanitize-vr5400
1995 // end-sanitize-vr5400
1996 // start-sanitize-r5900
1998 // end-sanitize-r5900
2000 // start-sanitize-tx19
2002 // end-sanitize-tx19
2009 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
2015 // start-sanitize-vr5400
2017 // end-sanitize-vr5400
2018 // start-sanitize-r5900
2020 // end-sanitize-r5900
2022 // start-sanitize-tx19
2024 // end-sanitize-tx19
2027 LOACCESS = 3; /* 3rd instruction will be safe */
2031 000000,5.RS,5.RT,5.RD,00000001011:SPECIAL:32::MOVN
2032 "movn r<RD>, r<RS>, r<RT>"
2034 // start-sanitize-vr5400
2036 // end-sanitize-vr5400
2037 // start-sanitize-r5900
2039 // end-sanitize-r5900
2046 000000,5.RS,5.RT,5.RD,00000001010:SPECIAL:32::MOVZ
2047 "movz r<RD>, r<RS>, r<RT>"
2049 // start-sanitize-vr5400
2051 // end-sanitize-vr5400
2052 // start-sanitize-r5900
2054 // end-sanitize-r5900
2061 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
2067 // start-sanitize-vr5400
2069 // end-sanitize-vr5400
2070 // start-sanitize-r5900
2072 // end-sanitize-r5900
2074 // start-sanitize-tx19
2076 // end-sanitize-tx19
2079 sim_io_eprintf (sd, "MT (move-to) over-writing HI register value\n");
2081 HIACCESS = 3; /* 3rd instruction will be safe */
2085 000000,5.RS,000000000000000010011:SPECIAL:32::MTLO
2091 // start-sanitize-vr5400
2093 // end-sanitize-vr5400
2094 // start-sanitize-r5900
2096 // end-sanitize-r5900
2098 // start-sanitize-tx19
2100 // end-sanitize-tx19
2103 sim_io_eprintf (sd, "MT (move-to) over-writing LO register value\n");
2105 LOACCESS = 3; /* 3rd instruction will be safe */
2109 000000,5.RS,5.RT,5.RD,00000011000:SPECIAL:32::MULT
2115 // start-sanitize-vr5400
2117 // end-sanitize-vr5400
2118 // start-sanitize-r5900
2120 // end-sanitize-r5900
2122 // start-sanitize-tx19
2124 // end-sanitize-tx19
2127 CHECKHILO ("Multiplication");
2128 prod = (((signed64)(signed32) GPR[RS])
2129 * ((signed64)(signed32) GPR[RT]));
2130 LO = EXTEND32 (VL4_8 (prod));
2131 HI = EXTEND32 (VH4_8 (prod));
2135 000000,5.RS,5.RT,5.RD,00000011001:SPECIAL:32::MULTU
2136 "multu r<RS>, r<RT>"
2141 // start-sanitize-vr5400
2143 // end-sanitize-vr5400
2144 // start-sanitize-r5900
2146 // end-sanitize-r5900
2148 // start-sanitize-tx19
2150 // end-sanitize-tx19
2153 CHECKHILO ("Multiplication");
2154 prod = (((unsigned64)(unsigned32) GPR[RS])
2155 * ((unsigned64)(unsigned32) GPR[RT]));
2156 LO = EXTEND32 (VL4_8 (prod));
2157 HI = EXTEND32 (VH4_8 (prod));
2161 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
2162 "nor r<RD>, r<RS>, r<RT>"
2167 // start-sanitize-vr5400
2169 // end-sanitize-vr5400
2170 // start-sanitize-r5900
2172 // end-sanitize-r5900
2174 // start-sanitize-tx19
2176 // end-sanitize-tx19
2178 GPR[RD] = ~ (GPR[RS] | GPR[RT]);
2182 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
2183 "or r<RD>, r<RS>, r<RT>"
2188 // start-sanitize-vr5400
2190 // end-sanitize-vr5400
2191 // start-sanitize-r5900
2193 // end-sanitize-r5900
2195 // start-sanitize-tx19
2197 // end-sanitize-tx19
2199 GPR[RD] = (GPR[RS] | GPR[RT]);
2203 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
2204 "ori r<RT>, r<RS>, <IMMEDIATE>"
2209 // start-sanitize-vr5400
2211 // end-sanitize-vr5400
2212 // start-sanitize-r5900
2214 // end-sanitize-r5900
2216 // start-sanitize-tx19
2218 // end-sanitize-tx19
2220 GPR[RT] = (GPR[RS] | IMMEDIATE);
2224 110011,5.RS,nnnnn,16.OFFSET:NORMAL:32::PREF
2226 // start-sanitize-vr5400
2228 // end-sanitize-vr5400
2229 // start-sanitize-r5900
2231 // end-sanitize-r5900
2233 unsigned32 instruction = instruction_0;
2234 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2235 int hint = ((instruction >> 16) & 0x0000001F);
2236 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2238 address_word vaddr = ((unsigned64)op1 + offset);
2242 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2243 Prefetch(uncached,paddr,vaddr,isDATA,hint);
2248 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
2249 "sb r<RT>, <OFFSET>(r<BASE>)"
2254 // start-sanitize-vr5400
2256 // end-sanitize-vr5400
2257 // start-sanitize-r5900
2259 // end-sanitize-r5900
2261 // start-sanitize-tx19
2263 // end-sanitize-tx19
2265 unsigned32 instruction = instruction_0;
2266 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2267 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2268 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2270 address_word vaddr = ((unsigned64)op1 + offset);
2274 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2276 unsigned64 memval = 0;
2277 unsigned64 memval1 = 0;
2278 unsigned64 mask = 0x7;
2279 unsigned int shift = 0;
2280 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2281 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2283 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2284 byte = ((vaddr & mask) ^ (bigend << shift));
2285 memval = ((unsigned64) op2 << (8 * byte));
2287 StoreMemory(uncached,AccessLength_BYTE,memval,memval1,paddr,vaddr,isREAL);
2295 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
2296 "sc r<RT>, <OFFSET>(r<BASE>)"
2300 // start-sanitize-vr5400
2302 // end-sanitize-vr5400
2303 // start-sanitize-r5900
2305 // end-sanitize-r5900
2307 // start-sanitize-tx19
2309 // end-sanitize-tx19
2311 unsigned32 instruction = instruction_0;
2312 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2313 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2314 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2316 address_word vaddr = ((unsigned64)op1 + offset);
2319 if ((vaddr & 3) != 0)
2320 SignalExceptionAddressStore();
2323 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2325 unsigned64 memval = 0;
2326 unsigned64 memval1 = 0;
2327 unsigned64 mask = 0x7;
2329 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2330 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2331 memval = ((unsigned64) op2 << (8 * byte));
2334 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2336 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2343 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
2344 "scd r<RT>, <OFFSET>(r<BASE>)"
2347 // start-sanitize-vr5400
2349 // end-sanitize-vr5400
2350 // start-sanitize-r5900
2352 // end-sanitize-r5900
2354 // start-sanitize-tx19
2356 // end-sanitize-tx19
2358 unsigned32 instruction = instruction_0;
2359 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2360 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2361 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2363 address_word vaddr = ((unsigned64)op1 + offset);
2366 if ((vaddr & 7) != 0)
2367 SignalExceptionAddressStore();
2370 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2372 unsigned64 memval = 0;
2373 unsigned64 memval1 = 0;
2377 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2379 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2386 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
2387 "sd r<RT>, <OFFSET>(r<BASE>)"
2390 // start-sanitize-vr5400
2392 // end-sanitize-vr5400
2393 // start-sanitize-r5900
2395 // end-sanitize-r5900
2397 // start-sanitize-tx19
2399 // end-sanitize-tx19
2401 unsigned32 instruction = instruction_0;
2402 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2403 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2404 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2406 address_word vaddr = ((unsigned64)op1 + offset);
2409 if ((vaddr & 7) != 0)
2410 SignalExceptionAddressStore();
2413 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2415 unsigned64 memval = 0;
2416 unsigned64 memval1 = 0;
2419 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2427 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
2428 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2432 // start-sanitize-vr5400
2434 // end-sanitize-vr5400
2435 // start-sanitize-r5900
2437 // end-sanitize-r5900
2439 // start-sanitize-tx19
2441 // end-sanitize-tx19
2443 unsigned32 instruction = instruction_0;
2444 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2445 int destreg = ((instruction >> 16) & 0x0000001F);
2446 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2448 address_word vaddr = ((unsigned64)op1 + offset);
2451 if ((vaddr & 7) != 0)
2452 SignalExceptionAddressStore();
2455 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2457 unsigned64 memval = 0;
2458 unsigned64 memval1 = 0;
2459 memval = (unsigned64)COP_SD(((instruction >> 26) & 0x3),destreg);
2461 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2469 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
2470 "sdl r<RT>, <OFFSET>(r<BASE>)"
2473 // start-sanitize-vr5400
2475 // end-sanitize-vr5400
2476 // start-sanitize-r5900
2478 // end-sanitize-r5900
2480 // start-sanitize-tx19
2482 // end-sanitize-tx19
2484 unsigned32 instruction = instruction_0;
2485 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2486 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2487 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2489 address_word vaddr = ((unsigned64)op1 + offset);
2493 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2495 unsigned64 memval = 0;
2496 unsigned64 memval1 = 0;
2497 unsigned64 mask = 7;
2498 unsigned int reverse = (ReverseEndian ? mask : 0);
2499 unsigned int bigend = (BigEndianCPU ? mask : 0);
2501 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2502 byte = ((vaddr & mask) ^ bigend);
2505 memval = (op2 >> (8 * (7 - byte)));
2506 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
2513 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
2514 "sdr r<RT>, <OFFSET>(r<BASE>)"
2517 // start-sanitize-vr5400
2519 // end-sanitize-vr5400
2520 // start-sanitize-r5900
2522 // end-sanitize-r5900
2524 // start-sanitize-tx19
2526 // end-sanitize-tx19
2528 unsigned32 instruction = instruction_0;
2529 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2530 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2531 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2533 address_word vaddr = ((unsigned64)op1 + offset);
2537 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2539 unsigned64 memval = 0;
2540 unsigned64 memval1 = 0;
2541 unsigned64 mask = 7;
2542 unsigned int reverse = (ReverseEndian ? mask : 0);
2543 unsigned int bigend = (BigEndianCPU ? mask : 0);
2545 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2546 byte = ((vaddr & mask) ^ bigend);
2549 memval = ((unsigned64) op2 << (byte * 8));
2550 StoreMemory(uncached,(AccessLength_DOUBLEWORD - byte),memval,memval1,paddr,vaddr,isREAL);
2557 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
2558 "sh r<RT>, <OFFSET>(r<BASE>)"
2563 // start-sanitize-vr5400
2565 // end-sanitize-vr5400
2566 // start-sanitize-r5900
2568 // end-sanitize-r5900
2570 // start-sanitize-tx19
2572 // end-sanitize-tx19
2574 unsigned32 instruction = instruction_0;
2575 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2576 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2577 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2579 address_word vaddr = ((unsigned64)op1 + offset);
2582 if ((vaddr & 1) != 0)
2583 SignalExceptionAddressStore();
2586 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2588 unsigned64 memval = 0;
2589 unsigned64 memval1 = 0;
2590 unsigned64 mask = 0x7;
2591 unsigned int shift = 1;
2592 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2593 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2595 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2596 byte = ((vaddr & mask) ^ (bigend << shift));
2597 memval = ((unsigned64) op2 << (8 * byte));
2599 StoreMemory(uncached,AccessLength_HALFWORD,memval,memval1,paddr,vaddr,isREAL);
2607 00000000000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLL
2608 "sll r<RD>, r<RT>, <SHIFT>"
2613 // start-sanitize-vr5400
2615 // end-sanitize-vr5400
2616 // start-sanitize-r5900
2618 // end-sanitize-r5900
2620 // start-sanitize-tx19
2622 // end-sanitize-tx19
2625 unsigned32 temp = (GPR[RT] << s);
2626 GPR[RD] = EXTEND32 (temp);
2630 000000,5.RS,5.RT,5.RD,00000000100:SPECIAL:32::SLLV
2631 "sllv r<RD>, r<RT>, r<RS>"
2636 // start-sanitize-vr5400
2638 // end-sanitize-vr5400
2639 // start-sanitize-r5900
2641 // end-sanitize-r5900
2643 // start-sanitize-tx19
2645 // end-sanitize-tx19
2647 int s = MASKED (GPR[RS], 4, 0);
2648 unsigned32 temp = (GPR[RT] << s);
2649 GPR[RD] = EXTEND32 (temp);
2653 000000,5.RS,5.RT,5.RD,00000101010:SPECIAL:32::SLT
2654 "slt r<RD>, r<RS>, r<RT>"
2659 // start-sanitize-vr5400
2661 // end-sanitize-vr5400
2662 // start-sanitize-r5900
2664 // end-sanitize-r5900
2666 // start-sanitize-tx19
2668 // end-sanitize-tx19
2670 GPR[RD] = (GPR[RS] < GPR[RT]);
2674 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
2675 "slti r<RT>, r<RS>, <IMMEDIATE>"
2680 // start-sanitize-vr5400
2682 // end-sanitize-vr5400
2683 // start-sanitize-r5900
2685 // end-sanitize-r5900
2687 // start-sanitize-tx19
2689 // end-sanitize-tx19
2691 GPR[RT] = (GPR[RS] < EXTEND16 (IMMEDIATE));
2695 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
2696 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
2701 // start-sanitize-vr5400
2703 // end-sanitize-vr5400
2704 // start-sanitize-r5900
2706 // end-sanitize-r5900
2708 // start-sanitize-tx19
2710 // end-sanitize-tx19
2712 GPR[RT] = ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE));
2715 000000,5.RS,5.RT,5.RD,00000101011:SPECIAL:32::SLTU
2716 "sltu r<RD>, r<RS>, r<RT>"
2721 // start-sanitize-vr5400
2723 // end-sanitize-vr5400
2724 // start-sanitize-r5900
2726 // end-sanitize-r5900
2728 // start-sanitize-tx19
2730 // end-sanitize-tx19
2732 GPR[RD] = ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT]);
2736 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
2737 "sra r<RD>, r<RT>, <SHIFT>"
2742 // start-sanitize-vr5400
2744 // end-sanitize-vr5400
2745 // start-sanitize-r5900
2747 // end-sanitize-r5900
2749 // start-sanitize-tx19
2751 // end-sanitize-tx19
2754 signed32 temp = (signed32) GPR[RT] >> s;
2755 GPR[RD] = EXTEND32 (temp);
2759 000000,5.RS,5.RT,5.RD,00000000111:SPECIAL:32::SRAV
2760 "srav r<RD>, r<RT>, r<RS>"
2765 // start-sanitize-vr5400
2767 // end-sanitize-vr5400
2768 // start-sanitize-r5900
2770 // end-sanitize-r5900
2772 // start-sanitize-tx19
2774 // end-sanitize-tx19
2776 int s = MASKED (GPR[RS], 4, 0);
2777 signed32 temp = (signed32) GPR[RT] >> s;
2778 GPR[RD] = EXTEND32 (temp);
2782 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
2783 "srl r<RD>, r<RT>, <SHIFT>"
2788 // start-sanitize-vr5400
2790 // end-sanitize-vr5400
2791 // start-sanitize-r5900
2793 // end-sanitize-r5900
2795 // start-sanitize-tx19
2797 // end-sanitize-tx19
2800 unsigned32 temp = (unsigned32) GPR[RT] >> s;
2801 GPR[RD] = EXTEND32 (temp);
2805 000000,5.RS,5.RT,5.RD,00000000110:SPECIAL:32::SRLV
2806 "srlv r<RD>, r<RT>, r<RS>"
2811 // start-sanitize-vr5400
2813 // end-sanitize-vr5400
2814 // start-sanitize-r5900
2816 // end-sanitize-r5900
2818 // start-sanitize-tx19
2820 // end-sanitize-tx19
2822 int s = MASKED (GPR[RS], 4, 0);
2823 unsigned32 temp = (unsigned32) GPR[RT] >> s;
2824 GPR[RD] = EXTEND32 (temp);
2828 000000,5.RS,5.RT,5.RD,00000100010:SPECIAL:32::SUB
2829 "sub r<RD>, r<RS>, r<RT>"
2834 // start-sanitize-vr5400
2836 // end-sanitize-vr5400
2837 // start-sanitize-r5900
2839 // end-sanitize-r5900
2841 // start-sanitize-tx19
2843 // end-sanitize-tx19
2845 ALU32_BEGIN (GPR[RS]);
2846 ALU32_SUB (GPR[RT]);
2847 ALU32_END (GPR[RD]);
2851 000000,5.RS,5.RT,5.RD,00000100011:SPECIAL:32::SUBU
2852 "subu r<RD>, r<RS>, r<RT>"
2857 // start-sanitize-vr5400
2859 // end-sanitize-vr5400
2860 // start-sanitize-r5900
2862 // end-sanitize-r5900
2864 // start-sanitize-tx19
2866 // end-sanitize-tx19
2868 GPR[RD] = EXTEND32 (GPR[RS] - GPR[RT]);
2872 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
2873 "sw r<RT>, <OFFSET>(r<BASE>)"
2878 // start-sanitize-vr5400
2880 // end-sanitize-vr5400
2881 // start-sanitize-r5900
2883 // end-sanitize-r5900
2885 // start-sanitize-tx19
2887 // end-sanitize-tx19
2889 unsigned32 instruction = instruction_0;
2890 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2891 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2892 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2894 address_word vaddr = ((unsigned64)op1 + offset);
2897 if ((vaddr & 3) != 0)
2898 SignalExceptionAddressStore();
2901 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2903 unsigned64 memval = 0;
2904 unsigned64 memval1 = 0;
2905 unsigned64 mask = 0x7;
2907 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2908 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2909 memval = ((unsigned64) op2 << (8 * byte));
2911 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2919 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
2920 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2925 // start-sanitize-vr5400
2927 // end-sanitize-vr5400
2928 // start-sanitize-r5900
2930 // end-sanitize-r5900
2932 // start-sanitize-tx19
2934 // end-sanitize-tx19
2936 unsigned32 instruction = instruction_0;
2937 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2938 int destreg = ((instruction >> 16) & 0x0000001F);
2939 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2941 address_word vaddr = ((unsigned64)op1 + offset);
2944 if ((vaddr & 3) != 0)
2945 SignalExceptionAddressStore();
2948 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2950 unsigned64 memval = 0;
2951 unsigned64 memval1 = 0;
2952 unsigned64 mask = 0x7;
2954 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2955 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2956 memval = (((unsigned64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
2958 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2966 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
2967 "swl r<RT>, <OFFSET>(r<BASE>)"
2972 // start-sanitize-vr5400
2974 // end-sanitize-vr5400
2975 // start-sanitize-r5900
2977 // end-sanitize-r5900
2979 // start-sanitize-tx19
2981 // end-sanitize-tx19
2983 unsigned32 instruction = instruction_0;
2984 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2985 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2986 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2988 address_word vaddr = ((unsigned64)op1 + offset);
2992 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2994 unsigned64 memval = 0;
2995 unsigned64 memval1 = 0;
2996 unsigned64 mask = 3;
2997 unsigned int reverse = (ReverseEndian ? mask : 0);
2998 unsigned int bigend = (BigEndianCPU ? mask : 0);
3000 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
3001 byte = ((vaddr & mask) ^ bigend);
3004 memval = (op2 >> (8 * (3 - byte)));
3005 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
3008 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
3015 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
3016 "swr r<RT>, <OFFSET>(r<BASE>)"
3021 // start-sanitize-vr5400
3023 // end-sanitize-vr5400
3024 // start-sanitize-r5900
3026 // end-sanitize-r5900
3028 // start-sanitize-tx19
3030 // end-sanitize-tx19
3032 unsigned32 instruction = instruction_0;
3033 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
3034 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
3035 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3037 address_word vaddr = ((unsigned64)op1 + offset);
3041 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3043 unsigned64 memval = 0;
3044 unsigned64 memval1 = 0;
3045 unsigned64 mask = 3;
3046 unsigned int reverse = (ReverseEndian ? mask : 0);
3047 unsigned int bigend = (BigEndianCPU ? mask : 0);
3049 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
3050 byte = ((vaddr & mask) ^ bigend);
3053 memval = ((unsigned64) op2 << (byte * 8));
3054 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
3057 StoreMemory(uncached,(AccessLength_WORD - byte),memval,memval1,paddr,vaddr,isREAL);
3064 000000000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
3070 // start-sanitize-vr5400
3072 // end-sanitize-vr5400
3073 // start-sanitize-r5900
3075 // end-sanitize-r5900
3077 // start-sanitize-tx19
3079 // end-sanitize-tx19
3081 SyncOperation (STYPE);
3085 000000,20.CODE,001100:SPECIAL:32::SYSCALL
3091 // start-sanitize-vr5400
3093 // end-sanitize-vr5400
3094 // start-sanitize-r5900
3096 // end-sanitize-r5900
3098 // start-sanitize-tx19
3100 // end-sanitize-tx19
3102 SignalException(SystemCall, instruction_0);
3106 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
3111 // start-sanitize-vr5400
3113 // end-sanitize-vr5400
3114 // start-sanitize-r5900
3116 // end-sanitize-r5900
3118 // start-sanitize-tx19
3120 // end-sanitize-tx19
3122 if (GPR[RS] == GPR[RT])
3123 SignalException(Trap, instruction_0);
3127 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
3128 "teqi r<RS>, <IMMEDIATE>"
3132 // start-sanitize-vr5400
3134 // end-sanitize-vr5400
3135 // start-sanitize-r5900
3137 // end-sanitize-r5900
3139 // start-sanitize-tx19
3141 // end-sanitize-tx19
3143 if (GPR[RS] == EXTEND16 (IMMEDIATE))
3144 SignalException(Trap, instruction_0);
3148 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
3153 // start-sanitize-vr5400
3155 // end-sanitize-vr5400
3156 // start-sanitize-r5900
3158 // end-sanitize-r5900
3160 // start-sanitize-tx19
3162 // end-sanitize-tx19
3164 if (GPR[RS] >= GPR[RT])
3165 SignalException(Trap, instruction_0);
3169 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
3170 "tgei r<RS>, <IMMEDIATE>"
3174 // start-sanitize-vr5400
3176 // end-sanitize-vr5400
3177 // start-sanitize-r5900
3179 // end-sanitize-r5900
3181 // start-sanitize-tx19
3183 // end-sanitize-tx19
3185 if (GPR[RS] >= EXTEND16 (IMMEDIATE))
3186 SignalException(Trap, instruction_0);
3190 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
3191 "tgeiu r<RS>, <IMMEDIATE>"
3195 // start-sanitize-vr5400
3197 // end-sanitize-vr5400
3198 // start-sanitize-r5900
3200 // end-sanitize-r5900
3202 // start-sanitize-tx19
3204 // end-sanitize-tx19
3206 if ((unsigned_word) GPR[RS] >= (unsigned_word) EXTEND16 (IMMEDIATE))
3207 SignalException(Trap, instruction_0);
3211 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
3216 // start-sanitize-vr5400
3218 // end-sanitize-vr5400
3219 // start-sanitize-r5900
3221 // end-sanitize-r5900
3223 // start-sanitize-tx19
3225 // end-sanitize-tx19
3227 if ((unsigned_word) GPR[RS] >= (unsigned_word) GPR[RT])
3228 SignalException(Trap, instruction_0);
3232 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
3237 // start-sanitize-vr5400
3239 // end-sanitize-vr5400
3240 // start-sanitize-r5900
3242 // end-sanitize-r5900
3244 // start-sanitize-tx19
3246 // end-sanitize-tx19
3248 if (GPR[RS] < GPR[RT])
3249 SignalException(Trap, instruction_0);
3253 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
3254 "tlti r<RS>, <IMMEDIATE>"
3258 // start-sanitize-vr5400
3260 // end-sanitize-vr5400
3261 // start-sanitize-r5900
3263 // end-sanitize-r5900
3265 // start-sanitize-tx19
3267 // end-sanitize-tx19
3269 if (GPR[RS] < EXTEND16 (IMMEDIATE))
3270 SignalException(Trap, instruction_0);
3274 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
3275 "tltiu r<RS>, <IMMEDIATE>"
3279 // start-sanitize-vr5400
3281 // end-sanitize-vr5400
3282 // start-sanitize-r5900
3284 // end-sanitize-r5900
3286 // start-sanitize-tx19
3288 // end-sanitize-tx19
3290 if ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE))
3291 SignalException(Trap, instruction_0);
3295 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
3300 // start-sanitize-vr5400
3302 // end-sanitize-vr5400
3303 // start-sanitize-r5900
3305 // end-sanitize-r5900
3307 // start-sanitize-tx19
3309 // end-sanitize-tx19
3311 if ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT])
3312 SignalException(Trap, instruction_0);
3316 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
3321 // start-sanitize-vr5400
3323 // end-sanitize-vr5400
3324 // start-sanitize-r5900
3326 // end-sanitize-r5900
3328 // start-sanitize-tx19
3330 // end-sanitize-tx19
3332 if (GPR[RS] != GPR[RT])
3333 SignalException(Trap, instruction_0);
3337 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
3338 "tne r<RS>, <IMMEDIATE>"
3342 // start-sanitize-vr5400
3344 // end-sanitize-vr5400
3345 // start-sanitize-r5900
3347 // end-sanitize-r5900
3349 // start-sanitize-tx19
3351 // end-sanitize-tx19
3353 if (GPR[RS] != EXTEND16 (IMMEDIATE))
3354 SignalException(Trap, instruction_0);
3358 000000,5.RS,5.RT,5.RD,00000100110:SPECIAL:32::XOR
3359 "xor r<RD>, r<RS>, r<RT>"
3364 // start-sanitize-vr5400
3366 // end-sanitize-vr5400
3367 // start-sanitize-r5900
3369 // end-sanitize-r5900
3371 // start-sanitize-tx19
3373 // end-sanitize-tx19
3375 GPR[RD] = GPR[RS] ^ GPR[RT];
3379 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
3380 "xori r<RT>, r<RS>, <IMMEDIATE>"
3385 // start-sanitize-vr5400
3387 // end-sanitize-vr5400
3388 // start-sanitize-r5900
3390 // end-sanitize-r5900
3392 // start-sanitize-tx19
3394 // end-sanitize-tx19
3396 GPR[RT] = GPR[RS] ^ IMMEDIATE;
3401 // MIPS Architecture:
3403 // FPU Instruction Set (COP1 & COP1X)
3411 case fmt_single: return "s";
3412 case fmt_double: return "d";
3413 case fmt_word: return "w";
3414 case fmt_long: return "l";
3415 default: return "?";
3435 :%s::::COND:int cond
3439 case 00: return "f";
3440 case 01: return "un";
3441 case 02: return "eq";
3442 case 03: return "ueq";
3443 case 04: return "olt";
3444 case 05: return "ult";
3445 case 06: return "ole";
3446 case 07: return "ule";
3447 case 010: return "sf";
3448 case 011: return "ngle";
3449 case 012: return "seq";
3450 case 013: return "ngl";
3451 case 014: return "lt";
3452 case 015: return "nge";
3453 case 016: return "le";
3454 case 017: return "ngt";
3455 default: return "?";
3460 010001,10,3.FMT,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
3461 "abs.%s<FMT> f<FD>, f<FS>"
3466 // start-sanitize-vr5400
3468 // end-sanitize-vr5400
3469 // start-sanitize-r5900
3471 // end-sanitize-r5900
3473 // start-sanitize-tx19
3475 // end-sanitize-tx19
3477 unsigned32 instruction = instruction_0;
3478 int destreg = ((instruction >> 6) & 0x0000001F);
3479 int fs = ((instruction >> 11) & 0x0000001F);
3480 int format = ((instruction >> 21) & 0x00000007);
3482 if ((format != fmt_single) && (format != fmt_double))
3483 SignalException(ReservedInstruction,instruction);
3485 StoreFPR(destreg,format,AbsoluteValue(ValueFPR(fs,format),format));
3492 010001,10,3.FMT,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD
3493 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
3498 // start-sanitize-vr5400
3500 // end-sanitize-vr5400
3501 // start-sanitize-r5900
3503 // end-sanitize-r5900
3505 // start-sanitize-tx19
3507 // end-sanitize-tx19
3509 unsigned32 instruction = instruction_0;
3510 int destreg = ((instruction >> 6) & 0x0000001F);
3511 int fs = ((instruction >> 11) & 0x0000001F);
3512 int ft = ((instruction >> 16) & 0x0000001F);
3513 int format = ((instruction >> 21) & 0x00000007);
3515 if ((format != fmt_single) && (format != fmt_double))
3516 SignalException(ReservedInstruction, instruction);
3518 StoreFPR(destreg,format,Add(ValueFPR(fs,format),ValueFPR(ft,format),format));
3524 // FIXME: This does not correctly resolve mipsI-mipsIV differences.
3530 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3531 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
3532 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
3537 // start-sanitize-vr5400
3539 // end-sanitize-vr5400
3540 // start-sanitize-r5900
3542 // end-sanitize-r5900
3544 // start-sanitize-tx19
3546 // end-sanitize-tx19
3548 unsigned32 instruction = instruction_0;
3549 signed_word offset = SIGNEXTEND((signed_word)(((instruction >> 0) & 0x0000FFFF) << 2),18);
3550 int boolean = ((instruction >> 16) & 0x00000001);
3551 int likely = ((instruction >> 17) & 0x00000001);
3552 int condition_code = ((instruction >> 18) & 0x00000007);
3554 if (condition_code != 0)
3555 SignalException(ReservedInstruction,instruction);
3557 int condition = (PREVCOC1() == boolean);
3558 /* NOTE: The branch occurs AFTER the next instruction has been executed */
3560 DELAY_SLOT (PC + offset);
3563 NULLIFY_NEXT_INSTRUCTION ();
3571 // FIXME: This does not correctly differentiate between mips*
3573 010001,10,3.FMT,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32::C.cond.fmt
3574 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
3575 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
3580 // start-sanitize-vr5400
3582 // end-sanitize-vr5400
3583 // start-sanitize-r5900
3585 // end-sanitize-r5900
3587 // start-sanitize-tx19
3589 // end-sanitize-tx19
3591 unsigned32 instruction = instruction_0;
3592 int cmpflags = ((instruction >> 0) & 0x0000000F);
3593 int condition_code = ((instruction >> 8) & 0x00000007);
3594 int fs = ((instruction >> 11) & 0x0000001F);
3595 int ft = ((instruction >> 16) & 0x0000001F);
3596 int format = ((instruction >> 21) & 0x00000007);
3597 if (condition_code != 0)
3599 SignalException(ReservedInstruction,instruction);
3603 if ((format != fmt_single) && (format != fmt_double))
3604 SignalException(ReservedInstruction,instruction);
3606 if (condition_code != 0)
3607 SignalException(ReservedInstruction,instruction);
3614 unsigned64 ofs = ValueFPR(fs,format);
3615 unsigned64 oft = ValueFPR(ft,format);
3616 if (NaN(ofs,format) || NaN(oft,format)) {
3617 if (FCSR & FP_ENABLE(IO)) {
3618 FCSR |= FP_CAUSE(IO);
3619 SignalExceptionFPE();
3623 less = Less(ofs,oft,format);
3624 equal = Equal(ofs,oft,format);
3628 int condition = (((cmpflags & (1 << 2)) && less) || ((cmpflags & (1 << 1)) && equal) || ((cmpflags & (1 << 0)) && unordered));
3629 SETFCC(condition_code,condition);
3637 010001,10,3.FMT,00000,5.FS,5.FD,001010:COP1:64::CEIL.L.fmt
3638 "ceil.l.%s<FMT> f<FD>, f<FS>"
3641 // start-sanitize-vr5400
3643 // end-sanitize-vr5400
3644 // start-sanitize-r5900
3646 // end-sanitize-r5900
3648 // start-sanitize-tx19
3650 // end-sanitize-tx19
3652 unsigned32 instruction = instruction_0;
3653 int destreg = ((instruction >> 6) & 0x0000001F);
3654 int fs = ((instruction >> 11) & 0x0000001F);
3655 int format = ((instruction >> 21) & 0x00000007);
3657 if ((format != fmt_single) && (format != fmt_double))
3658 SignalException(ReservedInstruction,instruction);
3660 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_long));
3665 010001,10,3.FMT,00000,5.FS,5.FD,001110:COP1:32::CEIL.W
3669 // start-sanitize-vr5400
3671 // end-sanitize-vr5400
3672 // start-sanitize-r5900
3674 // end-sanitize-r5900
3676 // start-sanitize-tx19
3678 // end-sanitize-tx19
3680 unsigned32 instruction = instruction_0;
3681 int destreg = ((instruction >> 6) & 0x0000001F);
3682 int fs = ((instruction >> 11) & 0x0000001F);
3683 int format = ((instruction >> 21) & 0x00000007);
3685 if ((format != fmt_single) && (format != fmt_double))
3686 SignalException(ReservedInstruction,instruction);
3688 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_word));
3695 01000100,x,10,kkkkk,vvvvv,00000000000:COP1S:32::CxC1
3700 // start-sanitize-vr5400
3702 // end-sanitize-vr5400
3703 // start-sanitize-r5900
3705 // end-sanitize-r5900
3707 // start-sanitize-tx19
3709 // end-sanitize-tx19
3711 unsigned32 instruction = instruction_0;
3712 int fs = ((instruction >> 11) & 0x0000001F);
3713 int ft = ((instruction >> 16) & 0x0000001F);
3714 int to = ((instruction >> 23) & 0x00000001);
3718 PENDING_FILL((fs + FCR0IDX),VL4_8(GPR[ft]));
3719 } else if (fs == 31) {
3720 PENDING_FILL((fs + FCR31IDX),VL4_8(GPR[ft]));
3722 PENDING_FILL(COCIDX,0); /* special case */
3723 } else { /* control from */
3725 PENDING_FILL(ft,SIGNEXTEND(FCR0,32));
3726 } else if (fs == 31) {
3727 PENDING_FILL(ft,SIGNEXTEND(FCR31,32));
3735 // FIXME: Does not correctly differentiate between mips*
3737 010001,10,3.FMT,00000,5.FS,5.FD,100001:COP1:32::CVT.D.fmt
3738 "cvt.d.%s<FMT> f<FD>, f<FS>"
3743 // start-sanitize-vr5400
3745 // end-sanitize-vr5400
3746 // start-sanitize-r5900
3748 // end-sanitize-r5900
3750 // start-sanitize-tx19
3752 // end-sanitize-tx19
3754 unsigned32 instruction = instruction_0;
3755 int destreg = ((instruction >> 6) & 0x0000001F);
3756 int fs = ((instruction >> 11) & 0x0000001F);
3757 int format = ((instruction >> 21) & 0x00000007);
3759 if ((format == fmt_double) | 0)
3760 SignalException(ReservedInstruction,instruction);
3762 StoreFPR(destreg,fmt_double,Convert(GETRM(),ValueFPR(fs,format),format,fmt_double));
3767 010001,10,3.FMT,00000,5.FS,5.FD,100101:COP1:64::CVT.L.fmt
3768 "cvt.l.%s<FMT> f<FD>, f<FS>"
3771 // start-sanitize-vr5400
3773 // end-sanitize-vr5400
3774 // start-sanitize-r5900
3776 // end-sanitize-r5900
3778 // start-sanitize-tx19
3780 // end-sanitize-tx19
3782 unsigned32 instruction = instruction_0;
3783 int destreg = ((instruction >> 6) & 0x0000001F);
3784 int fs = ((instruction >> 11) & 0x0000001F);
3785 int format = ((instruction >> 21) & 0x00000007);
3787 if ((format == fmt_long) | ((format == fmt_long) || (format == fmt_word)))
3788 SignalException(ReservedInstruction,instruction);
3790 StoreFPR(destreg,fmt_long,Convert(GETRM(),ValueFPR(fs,format),format,fmt_long));
3796 // FIXME: Does not correctly differentiate between mips*
3798 010001,10,3.FMT,00000,5.FS,5.FD,100000:COP1:32::CVT.S.fmt
3799 "cvt.s.%s<FMT> f<FD>, f<FS>"
3804 // start-sanitize-vr5400
3806 // end-sanitize-vr5400
3807 // start-sanitize-r5900
3809 // end-sanitize-r5900
3811 // start-sanitize-tx19
3813 // end-sanitize-tx19
3815 unsigned32 instruction = instruction_0;
3816 int destreg = ((instruction >> 6) & 0x0000001F);
3817 int fs = ((instruction >> 11) & 0x0000001F);
3818 int format = ((instruction >> 21) & 0x00000007);
3820 if ((format == fmt_single) | 0)
3821 SignalException(ReservedInstruction,instruction);
3823 StoreFPR(destreg,fmt_single,Convert(GETRM(),ValueFPR(fs,format),format,fmt_single));
3828 010001,10,3.FMT,00000,5.FS,5.FD,100100:COP1:32::CVT.W.fmt
3829 "cvt.w.%s<FMT> f<FD>, f<FS>"
3834 // start-sanitize-vr5400
3836 // end-sanitize-vr5400
3837 // start-sanitize-r5900
3839 // end-sanitize-r5900
3841 // start-sanitize-tx19
3843 // end-sanitize-tx19
3845 unsigned32 instruction = instruction_0;
3846 int destreg = ((instruction >> 6) & 0x0000001F);
3847 int fs = ((instruction >> 11) & 0x0000001F);
3848 int format = ((instruction >> 21) & 0x00000007);
3850 if ((format == fmt_word) | ((format == fmt_long) || (format == fmt_word)))
3851 SignalException(ReservedInstruction,instruction);
3853 StoreFPR(destreg,fmt_word,Convert(GETRM(),ValueFPR(fs,format),format,fmt_word));
3858 010001,10,3.FMT,5.FT,5.FS,5.FD,000011:COP1:32::DIV.fmt
3859 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
3864 // start-sanitize-vr5400
3866 // end-sanitize-vr5400
3867 // start-sanitize-r5900
3869 // end-sanitize-r5900
3871 // start-sanitize-tx19
3873 // end-sanitize-tx19
3875 unsigned32 instruction = instruction_0;
3876 int destreg = ((instruction >> 6) & 0x0000001F);
3877 int fs = ((instruction >> 11) & 0x0000001F);
3878 int ft = ((instruction >> 16) & 0x0000001F);
3879 int format = ((instruction >> 21) & 0x00000007);
3881 if ((format != fmt_single) && (format != fmt_double))
3882 SignalException(ReservedInstruction,instruction);
3884 StoreFPR(destreg,format,Divide(ValueFPR(fs,format),ValueFPR(ft,format),format));
3891 01000100,x,01,5.FT,vvvvv,00000000000:COP1S:64::DMxC1
3894 // start-sanitize-vr5400
3896 // end-sanitize-vr5400
3897 // start-sanitize-r5900
3899 // end-sanitize-r5900
3901 // start-sanitize-tx19
3903 // end-sanitize-tx19
3905 unsigned32 instruction = instruction_0;
3906 int fs = ((instruction >> 11) & 0x0000001F);
3907 int ft = ((instruction >> 16) & 0x0000001F);
3908 int to = ((instruction >> 23) & 0x00000001);
3911 if (SizeFGR() == 64) {
3912 PENDING_FILL((fs + FGRIDX),GPR[ft]);
3914 if ((fs & 0x1) == 0)
3916 PENDING_FILL(((fs + 1) + FGRIDX),VH4_8(GPR[ft]));
3917 PENDING_FILL((fs + FGRIDX),VL4_8(GPR[ft]));
3920 if (SizeFGR() == 64) {
3921 PENDING_FILL(ft,FGR[fs]);
3923 if ((fs & 0x1) == 0) {
3924 PENDING_FILL(ft,(SET64HI(FGR[fs+1]) | FGR[fs]));
3926 PENDING_FILL(ft,SET64HI(0xDEADC0DE) | 0xBAD0BAD0);
3933 010001,10,3.FMT,00000,5.FS,5.FD,001011:COP1:64::FLOOR.L.fmt
3934 "floor.l.%s<FMT> f<FD>, f<FS>"
3937 // start-sanitize-vr5400
3939 // end-sanitize-vr5400
3940 // start-sanitize-r5900
3942 // end-sanitize-r5900
3944 // start-sanitize-tx19
3946 // end-sanitize-tx19
3948 unsigned32 instruction = instruction_0;
3949 int destreg = ((instruction >> 6) & 0x0000001F);
3950 int fs = ((instruction >> 11) & 0x0000001F);
3951 int format = ((instruction >> 21) & 0x00000007);
3953 if ((format != fmt_single) && (format != fmt_double))
3954 SignalException(ReservedInstruction,instruction);
3956 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_long));
3961 010001,10,3.FMT,00000,5.FS,5.FD,001111:COP1:32::FLOOR.W.fmt
3962 "floor.w.%s<FMT> f<FD>, f<FS>"
3966 // start-sanitize-vr5400
3968 // end-sanitize-vr5400
3969 // start-sanitize-r5900
3971 // end-sanitize-r5900
3973 // start-sanitize-tx19
3975 // end-sanitize-tx19
3977 unsigned32 instruction = instruction_0;
3978 int destreg = ((instruction >> 6) & 0x0000001F);
3979 int fs = ((instruction >> 11) & 0x0000001F);
3980 int format = ((instruction >> 21) & 0x00000007);
3982 if ((format != fmt_single) && (format != fmt_double))
3983 SignalException(ReservedInstruction,instruction);
3985 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_word));
3991 110101,5.BASE,5.FT,16.OFFSET:COP1:32::LDC1
3994 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64::LDXC1
3995 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
3997 // start-sanitize-vr5400
3999 // end-sanitize-vr5400
4000 // start-sanitize-r5900
4002 // end-sanitize-r5900
4004 unsigned32 instruction = instruction_0;
4005 int destreg = ((instruction >> 6) & 0x0000001F);
4006 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4007 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4009 address_word vaddr = ((unsigned64)op1 + op2);
4012 if ((vaddr & 7) != 0)
4013 SignalExceptionAddressLoad();
4016 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4018 unsigned64 memval = 0;
4019 unsigned64 memval1 = 0;
4020 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4021 COP_LD(1,destreg,memval);;
4029 110001,5.BASE,5.FT,16.OFFSET:COP1:32::LWC1
4032 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32::LWXC1
4033 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
4035 // start-sanitize-vr5400
4037 // end-sanitize-vr5400
4038 // start-sanitize-r5900
4040 // end-sanitize-r5900
4042 unsigned32 instruction = instruction_0;
4043 int destreg = ((instruction >> 6) & 0x0000001F);
4044 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4045 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4047 address_word vaddr = ((unsigned64)op1 + op2);
4050 if ((vaddr & 3) != 0)
4051 SignalExceptionAddressLoad();
4054 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4056 unsigned64 memval = 0;
4057 unsigned64 memval1 = 0;
4058 unsigned64 mask = 0x7;
4059 unsigned int shift = 2;
4060 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4061 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4063 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4064 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4065 byte = ((vaddr & mask) ^ (bigend << shift));
4066 COP_LW(1,destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
4075 // FIXME: Not correct for mips*
4077 010011,5.FR,5.FT,5.FS,5.FD,100,001:COP1X:32::MADD.D
4078 "madd.d f<FD>, f<FR>, f<FS>, f<FT>"
4080 // start-sanitize-vr5400
4082 // end-sanitize-vr5400
4083 // start-sanitize-r5900
4085 // end-sanitize-r5900
4087 unsigned32 instruction = instruction_0;
4088 int destreg = ((instruction >> 6) & 0x0000001F);
4089 int fs = ((instruction >> 11) & 0x0000001F);
4090 int ft = ((instruction >> 16) & 0x0000001F);
4091 int fr = ((instruction >> 21) & 0x0000001F);
4093 StoreFPR(destreg,fmt_double,Add(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4098 010011,5.FR,5.FT,5.FS,5.FD,100,000:COP1X:32::MADD.S
4099 "madd.s f<FD>, f<FR>, f<FS>, f<FT>"
4101 // start-sanitize-vr5400
4103 // end-sanitize-vr5400
4104 // start-sanitize-r5900
4106 // end-sanitize-r5900
4108 unsigned32 instruction = instruction_0;
4109 int destreg = ((instruction >> 6) & 0x0000001F);
4110 int fs = ((instruction >> 11) & 0x0000001F);
4111 int ft = ((instruction >> 16) & 0x0000001F);
4112 int fr = ((instruction >> 21) & 0x0000001F);
4114 StoreFPR(destreg,fmt_single,Add(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4120 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4121 "m<X>c1 r<RT>, f<FS>"
4126 // start-sanitize-vr5400
4128 // end-sanitize-vr5400
4129 // start-sanitize-r5900
4131 // end-sanitize-r5900
4133 // start-sanitize-tx19
4135 // end-sanitize-tx19
4137 unsigned32 instruction = instruction_0;
4138 int fs = ((instruction >> 11) & 0x0000001F);
4139 int ft = ((instruction >> 16) & 0x0000001F);
4140 int to = ((instruction >> 23) & 0x00000001);
4143 if (SizeFGR() == 64) {
4144 PENDING_FILL ((fs + FGRIDX), (SET64HI(0xDEADC0DE) | VL4_8(GPR[ft])));
4146 PENDING_FILL ((fs + FGRIDX), VL4_8(GPR[ft]));
4149 PENDING_FILL (ft, SIGNEXTEND(FGR[fs],32));
4155 010001,10,3.FMT,00000,5.FS,5.FD,000110:COP1:32::MOV.fmt
4156 "mov.%s<FMT> f<FD>, f<FS>"
4161 // start-sanitize-vr5400
4163 // end-sanitize-vr5400
4164 // start-sanitize-r5900
4166 // end-sanitize-r5900
4168 // start-sanitize-tx19
4170 // end-sanitize-tx19
4172 unsigned32 instruction = instruction_0;
4173 int destreg = ((instruction >> 6) & 0x0000001F);
4174 int fs = ((instruction >> 11) & 0x0000001F);
4175 int format = ((instruction >> 21) & 0x00000007);
4177 StoreFPR(destreg,format,ValueFPR(fs,format));
4183 000000,5.RS,3.CC,0,1.TF,5.RD,00000000001:SPECIAL:32::MOVtf
4184 "mov%s<TF> r<RD>, r<RS>, <CC>"
4186 // start-sanitize-vr5400
4188 // end-sanitize-vr5400
4189 // start-sanitize-r5900
4191 // end-sanitize-r5900
4193 if (GETFCC(CC) == TF)
4199 010001,10,3.FMT,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32::MOVtf.fmt
4200 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
4202 // start-sanitize-vr5400
4204 // end-sanitize-vr5400
4205 // start-sanitize-r5900
4207 // end-sanitize-r5900
4209 unsigned32 instruction = instruction_0;
4210 int format = ((instruction >> 21) & 0x00000007);
4212 if (GETFCC(CC) == TF)
4213 StoreFPR (FD, format, ValueFPR (FS, format));
4215 StoreFPR (FD, format, ValueFPR (FD, format));
4220 010001,10,3.FMT,5.RT,5.FS,5.FD,010011:COP1:32::MOVN.fmt
4222 // start-sanitize-vr5400
4224 // end-sanitize-vr5400
4225 // start-sanitize-r5900
4227 // end-sanitize-r5900
4229 unsigned32 instruction = instruction_0;
4230 int destreg = ((instruction >> 6) & 0x0000001F);
4231 int fs = ((instruction >> 11) & 0x0000001F);
4232 int format = ((instruction >> 21) & 0x00000007);
4234 StoreFPR(destreg,format,ValueFPR(fs,format));
4242 // MOVT.fmt see MOVtf.fmt
4246 010001,10,3.FMT,5.RT,5.FS,5.FD,010010:COP1:32::MOVZ.fmt
4247 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
4249 // start-sanitize-vr5400
4251 // end-sanitize-vr5400
4252 // start-sanitize-r5900
4254 // end-sanitize-r5900
4256 unsigned32 instruction = instruction_0;
4257 int destreg = ((instruction >> 6) & 0x0000001F);
4258 int fs = ((instruction >> 11) & 0x0000001F);
4259 int format = ((instruction >> 21) & 0x00000007);
4261 StoreFPR(destreg,format,ValueFPR(fs,format));
4267 010011,5.FR,5.FT,5.FS,5.FD,101,001:COP1X:32::MSUB.D
4268 "msub.d f<FD>, f<FR>, f<FS>, f<FT>"
4270 // start-sanitize-vr5400
4272 // end-sanitize-vr5400
4273 // start-sanitize-r5900
4275 // end-sanitize-r5900
4277 unsigned32 instruction = instruction_0;
4278 int destreg = ((instruction >> 6) & 0x0000001F);
4279 int fs = ((instruction >> 11) & 0x0000001F);
4280 int ft = ((instruction >> 16) & 0x0000001F);
4281 int fr = ((instruction >> 21) & 0x0000001F);
4283 StoreFPR(destreg,fmt_double,(Sub(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double),fmt_double));
4289 010011,5.FR,5.FT,5.FS,5.FD,101000:COP1X:32::MSUB.S
4290 "msub.s f<FD>, f<FR>, f<FS>, f<FT>"
4292 // start-sanitize-vr5400
4294 // end-sanitize-vr5400
4295 // start-sanitize-r5900
4297 // end-sanitize-r5900
4299 unsigned32 instruction = instruction_0;
4300 int destreg = ((instruction >> 6) & 0x0000001F);
4301 int fs = ((instruction >> 11) & 0x0000001F);
4302 int ft = ((instruction >> 16) & 0x0000001F);
4303 int fr = ((instruction >> 21) & 0x0000001F);
4305 StoreFPR(destreg,fmt_single,(Sub(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single),fmt_single));
4313 010001,10,3.FMT,5.FT,5.FS,5.FD,000010:COP1:32::MUL.fmt
4314 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
4319 // start-sanitize-vr5400
4321 // end-sanitize-vr5400
4322 // start-sanitize-r5900
4324 // end-sanitize-r5900
4326 // start-sanitize-tx19
4328 // end-sanitize-tx19
4330 unsigned32 instruction = instruction_0;
4331 int destreg = ((instruction >> 6) & 0x0000001F);
4332 int fs = ((instruction >> 11) & 0x0000001F);
4333 int ft = ((instruction >> 16) & 0x0000001F);
4334 int format = ((instruction >> 21) & 0x00000007);
4336 if ((format != fmt_single) && (format != fmt_double))
4337 SignalException(ReservedInstruction,instruction);
4339 StoreFPR(destreg,format,Multiply(ValueFPR(fs,format),ValueFPR(ft,format),format));
4344 010001,10,3.FMT,00000,5.FS,5.FD,000111:COP1:32::NEG.fmt
4345 "neg.%s<FMT> f<FD>, f<FS>"
4350 // start-sanitize-vr5400
4352 // end-sanitize-vr5400
4353 // start-sanitize-r5900
4355 // end-sanitize-r5900
4357 // start-sanitize-tx19
4359 // end-sanitize-tx19
4361 unsigned32 instruction = instruction_0;
4362 int destreg = ((instruction >> 6) & 0x0000001F);
4363 int fs = ((instruction >> 11) & 0x0000001F);
4364 int format = ((instruction >> 21) & 0x00000007);
4366 if ((format != fmt_single) && (format != fmt_double))
4367 SignalException(ReservedInstruction,instruction);
4369 StoreFPR(destreg,format,Negate(ValueFPR(fs,format),format));
4375 010011,5.FR,5.FT,5.FS,5.FD,110001:COP1X:32::NMADD.D
4376 "nmadd.d f<FD>, f<FR>, f<FS>, f<FT>"
4378 // start-sanitize-vr5400
4380 // end-sanitize-vr5400
4382 unsigned32 instruction = instruction_0;
4383 int destreg = ((instruction >> 6) & 0x0000001F);
4384 int fs = ((instruction >> 11) & 0x0000001F);
4385 int ft = ((instruction >> 16) & 0x0000001F);
4386 int fr = ((instruction >> 21) & 0x0000001F);
4388 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));
4394 010011,5.FR,5.FT,5.FS,5.FD,110000:COP1X:32::NMADD.S
4395 "nmadd.s f<FD>, f<FR>, f<FS>, f<FT>"
4397 // start-sanitize-vr5400
4399 // end-sanitize-vr5400
4401 unsigned32 instruction = instruction_0;
4402 int destreg = ((instruction >> 6) & 0x0000001F);
4403 int fs = ((instruction >> 11) & 0x0000001F);
4404 int ft = ((instruction >> 16) & 0x0000001F);
4405 int fr = ((instruction >> 21) & 0x0000001F);
4407 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));
4413 010011,5.FR,5.FT,5.FS,5.FD,111001:COP1X:32::NMSUB.D
4414 "nmsub.d f<FD>, f<FR>, f<FS>, f<FT>"
4416 // start-sanitize-vr5400
4418 // end-sanitize-vr5400
4420 unsigned32 instruction = instruction_0;
4421 int destreg = ((instruction >> 6) & 0x0000001F);
4422 int fs = ((instruction >> 11) & 0x0000001F);
4423 int ft = ((instruction >> 16) & 0x0000001F);
4424 int fr = ((instruction >> 21) & 0x0000001F);
4426 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));
4432 010011,5.FR,5.FT,5.FS,5.FD,111000:COP1X:32::NMSUB.S
4433 "nmsub.s f<FD>, f<FR>, f<FS>, f<FT>"
4435 // start-sanitize-vr5400
4437 // end-sanitize-vr5400
4439 unsigned32 instruction = instruction_0;
4440 int destreg = ((instruction >> 6) & 0x0000001F);
4441 int fs = ((instruction >> 11) & 0x0000001F);
4442 int ft = ((instruction >> 16) & 0x0000001F);
4443 int fr = ((instruction >> 21) & 0x0000001F);
4445 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));
4450 010011,5.BASE,5.INDEX,5.HINT,00000001111:COP1X:32::PREFX
4451 "prefx <HINT>, r<INDEX>(r<BASE>)"
4453 // start-sanitize-vr5400
4455 // end-sanitize-vr5400
4457 unsigned32 instruction = instruction_0;
4458 int fs = ((instruction >> 11) & 0x0000001F);
4459 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4460 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4462 address_word vaddr = ((unsigned64)op1 + (unsigned64)op2);
4465 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4466 Prefetch(uncached,paddr,vaddr,isDATA,fs);
4470 010001,10,3.FMT,00000,5.FS,5.FD,010101:COP1:32::RECIP.fmt
4472 "recip.%s<FMT> f<FD>, f<FS>"
4473 // start-sanitize-vr5400
4475 // end-sanitize-vr5400
4477 unsigned32 instruction = instruction_0;
4478 int destreg = ((instruction >> 6) & 0x0000001F);
4479 int fs = ((instruction >> 11) & 0x0000001F);
4480 int format = ((instruction >> 21) & 0x00000007);
4482 if ((format != fmt_single) && (format != fmt_double))
4483 SignalException(ReservedInstruction,instruction);
4485 StoreFPR(destreg,format,Recip(ValueFPR(fs,format),format));
4490 010001,10,3.FMT,00000,5.FS,5.FD,001000:COP1:64::ROUND.L.fmt
4491 "round.l.%s<FMT> f<FD>, f<FS>"
4494 // start-sanitize-vr5400
4496 // end-sanitize-vr5400
4497 // start-sanitize-r5900
4499 // end-sanitize-r5900
4501 // start-sanitize-tx19
4503 // end-sanitize-tx19
4505 unsigned32 instruction = instruction_0;
4506 int destreg = ((instruction >> 6) & 0x0000001F);
4507 int fs = ((instruction >> 11) & 0x0000001F);
4508 int format = ((instruction >> 21) & 0x00000007);
4510 if ((format != fmt_single) && (format != fmt_double))
4511 SignalException(ReservedInstruction,instruction);
4513 StoreFPR(destreg,fmt_long,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_long));
4518 010001,10,3.FMT,00000,5.FS,5.FD,001100:COP1:32::ROUND.W.fmt
4519 "round.w.%s<FMT> f<FD>, f<FS>"
4523 // start-sanitize-vr5400
4525 // end-sanitize-vr5400
4526 // start-sanitize-r5900
4528 // end-sanitize-r5900
4530 // start-sanitize-tx19
4532 // end-sanitize-tx19
4534 unsigned32 instruction = instruction_0;
4535 int destreg = ((instruction >> 6) & 0x0000001F);
4536 int fs = ((instruction >> 11) & 0x0000001F);
4537 int format = ((instruction >> 21) & 0x00000007);
4539 if ((format != fmt_single) && (format != fmt_double))
4540 SignalException(ReservedInstruction,instruction);
4542 StoreFPR(destreg,fmt_word,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_word));
4547 010001,10,3.FMT,00000,5.FS,5.FD,010110:COP1:32::RSQRT.fmt
4549 "rsqrt.%s<FMT> f<FD>, f<FS>"
4550 // start-sanitize-vr5400
4552 // end-sanitize-vr5400
4554 unsigned32 instruction = instruction_0;
4555 int destreg = ((instruction >> 6) & 0x0000001F);
4556 int fs = ((instruction >> 11) & 0x0000001F);
4557 int format = ((instruction >> 21) & 0x00000007);
4559 if ((format != fmt_single) && (format != fmt_double))
4560 SignalException(ReservedInstruction,instruction);
4562 StoreFPR(destreg,format,Recip(SquareRoot(ValueFPR(fs,format),format),format));
4570 010011,5.RS,5.RT,vvvvv,00000001001:COP1X:64::SDXC1
4572 // start-sanitize-vr5400
4574 // end-sanitize-vr5400
4575 // start-sanitize-r5900
4577 // end-sanitize-r5900
4579 unsigned32 instruction = instruction_0;
4580 int fs = ((instruction >> 11) & 0x0000001F);
4581 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4582 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4584 address_word vaddr = ((unsigned64)op1 + op2);
4587 if ((vaddr & 7) != 0)
4588 SignalExceptionAddressStore();
4591 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
4593 unsigned64 memval = 0;
4594 unsigned64 memval1 = 0;
4595 memval = (unsigned64)COP_SD(1,fs);
4597 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
4605 010001,10,3.FMT,00000,5.FS,5.FD,000100:COP1:32::SQRT.fmt
4606 "sqrt.%s<FMT> f<FD>, f<FS>"
4610 // start-sanitize-vr5400
4612 // end-sanitize-vr5400
4613 // start-sanitize-r5900
4615 // end-sanitize-r5900
4617 // start-sanitize-tx19
4619 // end-sanitize-tx19
4621 unsigned32 instruction = instruction_0;
4622 int destreg = ((instruction >> 6) & 0x0000001F);
4623 int fs = ((instruction >> 11) & 0x0000001F);
4624 int format = ((instruction >> 21) & 0x00000007);
4626 if ((format != fmt_single) && (format != fmt_double))
4627 SignalException(ReservedInstruction,instruction);
4629 StoreFPR(destreg,format,(SquareRoot(ValueFPR(fs,format),format)));
4634 010001,10,3.FMT,5.FT,5.FS,5.FD,000001:COP1:32::SUB.fmt
4635 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
4640 // start-sanitize-vr5400
4642 // end-sanitize-vr5400
4643 // start-sanitize-r5900
4645 // end-sanitize-r5900
4647 // start-sanitize-tx19
4649 // end-sanitize-tx19
4651 unsigned32 instruction = instruction_0;
4652 int destreg = ((instruction >> 6) & 0x0000001F);
4653 int fs = ((instruction >> 11) & 0x0000001F);
4654 int ft = ((instruction >> 16) & 0x0000001F);
4655 int format = ((instruction >> 21) & 0x00000007);
4657 if ((format != fmt_single) && (format != fmt_double))
4658 SignalException(ReservedInstruction,instruction);
4660 StoreFPR(destreg,format,Sub(ValueFPR(fs,format),ValueFPR(ft,format),format));
4668 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32::SWXC1
4669 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
4671 // start-sanitize-vr5400
4673 // end-sanitize-vr5400
4674 // start-sanitize-r5900
4676 // end-sanitize-r5900
4678 unsigned32 instruction = instruction_0;
4679 int fs = ((instruction >> 11) & 0x0000001F);
4680 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4681 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4683 address_word vaddr = ((unsigned64)op1 + op2);
4686 if ((vaddr & 3) != 0)
4687 SignalExceptionAddressStore();
4690 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
4692 unsigned64 memval = 0;
4693 unsigned64 memval1 = 0;
4694 unsigned64 mask = 0x7;
4696 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
4697 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
4698 memval = (((unsigned64)COP_SW(1,fs)) << (8 * byte));
4700 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
4708 010001,10,3.FMT,00000,5.FS,5.FD,001001:COP1:64::TRUNC.L.fmt
4709 "trunc.l.%s<FMT> f<FD>, f<FS>"
4712 // start-sanitize-vr5400
4714 // end-sanitize-vr5400
4715 // start-sanitize-r5900
4717 // end-sanitize-r5900
4719 // start-sanitize-tx19
4721 // end-sanitize-tx19
4723 unsigned32 instruction = instruction_0;
4724 int destreg = ((instruction >> 6) & 0x0000001F);
4725 int fs = ((instruction >> 11) & 0x0000001F);
4726 int format = ((instruction >> 21) & 0x00000007);
4728 if ((format != fmt_single) && (format != fmt_double))
4729 SignalException(ReservedInstruction,instruction);
4731 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_long));
4736 010001,10,3.FMT,00000,5.FS,5.FD,001101:COP1:32::TRUNC.W
4737 "trunc.w.%s<FMT> f<FD>, f<FS>"
4741 // start-sanitize-vr5400
4743 // end-sanitize-vr5400
4744 // start-sanitize-r5900
4746 // end-sanitize-r5900
4748 // start-sanitize-tx19
4750 // end-sanitize-tx19
4752 unsigned32 instruction = instruction_0;
4753 int destreg = ((instruction >> 6) & 0x0000001F);
4754 int fs = ((instruction >> 11) & 0x0000001F);
4755 int format = ((instruction >> 21) & 0x00000007);
4757 if ((format != fmt_single) && (format != fmt_double))
4758 SignalException(ReservedInstruction,instruction);
4760 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_word));
4766 // MIPS Architecture:
4768 // System Control Instruction Set (COP0)
4772 010000,01000,00000,16.OFFSET:COP0:32::BC0F
4778 // start-sanitize-vr5400
4780 // end-sanitize-vr5400
4781 // start-sanitize-r5900
4783 // end-sanitize-r5900
4786 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
4792 // start-sanitize-vr5400
4794 // end-sanitize-vr5400
4795 // start-sanitize-r5900
4797 // end-sanitize-r5900
4800 010000,01000,00001,16.OFFSET:COP0:32::BC0T
4806 // start-sanitize-r5900
4808 // end-sanitize-r5900
4812 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
4818 // start-sanitize-vr5400
4820 // end-sanitize-vr5400
4821 // start-sanitize-r5900
4823 // end-sanitize-r5900
4826 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
4829 // start-sanitize-vr5400
4831 // end-sanitize-vr5400
4832 // start-sanitize-r5900
4834 // end-sanitize-r5900
4836 // start-sanitize-tx19
4838 // end-sanitize-tx19
4840 unsigned32 instruction = instruction_0;
4841 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
4842 int hint = ((instruction >> 16) & 0x0000001F);
4843 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4845 address_word vaddr = (op1 + offset);
4848 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4849 CacheOp(hint,vaddr,paddr,instruction);
4854 010000,10000,000000000000000,111001:COP0:32::DI
4860 // start-sanitize-vr5400
4862 // end-sanitize-vr5400
4863 // start-sanitize-r5900
4865 // end-sanitize-r5900
4868 010000,10000,000000000000000,111000:COP0:32::EI
4874 // start-sanitize-vr5400
4876 // end-sanitize-vr5400
4877 // start-sanitize-r5900
4879 // end-sanitize-r5900
4882 010000,10000,000000000000000,011000:COP0:32::ERET
4886 // start-sanitize-vr5400
4888 // end-sanitize-vr5400
4889 // start-sanitize-r5900
4891 // end-sanitize-r5900
4894 010000,00000,5.RT,5.RD,00000,6.REGX:COP0:32::MFC0
4895 "mfc0 r<RT>, r<RD> # <REGX>"
4900 // start-sanitize-vr5400
4902 // end-sanitize-vr5400
4903 // start-sanitize-r5900
4905 // end-sanitize-r5900
4908 010000,00100,5.RT,5.RD,00000,6.REGX:COP0:32::MTC0
4909 "mtc0 r<RT>, r<RD> # <REGX>"
4914 // start-sanitize-vr5400
4916 // end-sanitize-vr5400
4917 // start-sanitize-r5900
4919 // end-sanitize-r5900
4922 010000,10000,000000000000000,001000:COP0:32::TLBP
4928 // start-sanitize-vr5400
4930 // end-sanitize-vr5400
4931 // start-sanitize-r5900
4933 // end-sanitize-r5900
4936 010000,10000,000000000000000,000001:COP0:32::TLBR
4942 // start-sanitize-vr5400
4944 // end-sanitize-vr5400
4945 // start-sanitize-r5900
4947 // end-sanitize-r5900
4950 010000,10000,000000000000000,000010:COP0:32::TLBWI
4956 // start-sanitize-vr5400
4958 // end-sanitize-vr5400
4959 // start-sanitize-r5900
4961 // end-sanitize-r5900
4964 010000,10000,000000000000000,000110:COP0:32::TLBWR
4970 // start-sanitize-vr5400
4972 // end-sanitize-vr5400
4973 // start-sanitize-r5900
4975 // end-sanitize-r5900
4979 // start-sanitize-vr5400
4980 :include::vr5400:vr5400.igen
4981 // end-sanitize-vr5400
4982 // start-sanitize-r5900
4983 :include::r5900:r5900.igen
4984 // end-sanitize-r5900
4986 // start-sanitize-cygnus-never
4988 // // FIXME FIXME FIXME What is this instruction?
4989 // 111011,5.RS,5.RT,16.OFFSET:NORMAL:32::<INT>
4994 // // start-sanitize-r5900
4996 // // end-sanitize-r5900
4998 // // start-sanitize-tx19
5000 // // end-sanitize-tx19
5002 // unsigned32 instruction = instruction_0;
5003 // signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
5004 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5005 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5007 // if (CoProcPresent(3))
5008 // SignalException(CoProcessorUnusable);
5010 // SignalException(ReservedInstruction,instruction);
5014 // end-sanitize-cygnus-never
5015 // start-sanitize-cygnus-never
5017 // // FIXME FIXME FIXME What is this?
5018 // 11100,******,00001:RR:16::SDBBP
5021 // unsigned32 instruction = instruction_0;
5022 // if (have_extendval)
5023 // SignalException (ReservedInstruction, instruction);
5025 // SignalException(DebugBreakPoint,instruction);
5029 // end-sanitize-cygnus-never
5030 // start-sanitize-cygnus-never
5032 // // FIXME FIXME FIXME What is this?
5033 // 000000,********************,001110:SPECIAL:32::SDBBP
5036 // unsigned32 instruction = instruction_0;
5038 // SignalException(DebugBreakPoint,instruction);
5042 // end-sanitize-cygnus-never
5043 // start-sanitize-cygnus-never
5045 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5046 // // isn't yet reconized by this simulator.
5047 // 000000,5.RS,5.RT,0000000000101000:SPECIAL:32::MADD16
5050 // unsigned32 instruction = instruction_0;
5051 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5052 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5054 // CHECKHILO("Multiply-Add");
5056 // unsigned64 temp = (op1 * op2);
5057 // temp += (SET64HI(VL4_8(HI)) | VL4_8(LO));
5058 // LO = SIGNEXTEND((unsigned64)VL4_8(temp),32);
5059 // HI = SIGNEXTEND((unsigned64)VH4_8(temp),32);
5064 // end-sanitize-cygnus-never
5065 // start-sanitize-cygnus-never
5067 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5068 // // isn't yet reconized by this simulator.
5069 // 000000,5.RS,5.RT,0000000000101001:SPECIAL:64::DMADD16
5072 // unsigned32 instruction = instruction_0;
5073 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5074 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5076 // CHECKHILO("Multiply-Add");
5078 // unsigned64 temp = (op1 * op2);
5084 // start-sanitize-cygnus-never