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 - mipsI..
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
47 // Pseudo instructions known by IGEN
50 sim_io_eprintf (SD, "Illegal instruction at address 0x%lx\n",
52 sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIGILL);
61 // CPU Instruction Set (mipsI - mipsIV)
65 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
66 "add r<RD>, r<RS>, r<RT>"
71 // start-sanitize-r5900
75 // start-sanitize-tx19
79 ALU32_BEGIN (GPR[RS]);
85 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
86 "addi r<RT>, r<RS>, IMMEDIATE"
91 // start-sanitize-r5900
95 // start-sanitize-tx19
99 ALU32_BEGIN (GPR[RS]);
100 ALU32_ADD (EXTEND16 (IMMEDIATE));
105 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
106 "add r<RT>, r<RS>, IMMEDIATE"
111 // start-sanitize-r5900
113 // end-sanitize-r5900
115 // start-sanitize-tx19
119 signed32 temp = GPR[RS] + EXTEND16 (IMMEDIATE);
120 GPR[RT] = EXTEND32 (temp);
124 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
129 // start-sanitize-r5900
131 // end-sanitize-r5900
133 // start-sanitize-tx19
137 signed32 temp = GPR[RS] + GPR[RT];
138 GPR[RD] = EXTEND32 (temp);
142 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
143 "and r<RD>, r<RS>, r<RT>"
148 // start-sanitize-r5900
150 // end-sanitize-r5900
152 // start-sanitize-tx19
156 GPR[RD] = GPR[RS] & GPR[RT];
160 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
161 "and r<RT>, r<RS>, IMMEDIATE"
165 // start-sanitize-r5900
167 // end-sanitize-r5900
169 // start-sanitize-tx19
173 GPR[RT] = GPR[RS] & IMMEDIATE;
177 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
178 "beq r<RS>, r<RT>, OFFSET"
183 // start-sanitize-r5900
185 // end-sanitize-r5900
187 // start-sanitize-tx19
191 address_word offset = EXTEND16 (OFFSET) << 2;
192 if (GPR[RS] == GPR[RT])
193 DELAY_SLOT (PC + offset);
197 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
198 "beql r<RS>, r<RT>, <OFFSET>"
202 // start-sanitize-r5900
204 // end-sanitize-r5900
206 // start-sanitize-tx19
210 address_word offset = EXTEND16 (OFFSET) << 2;
211 if (GPR[RS] == GPR[RT])
212 DELAY_SLOT (PC + offset);
214 NULLIFY_NEXT_INSTRUCTION ();
218 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
219 "bgez r<RS>, <OFFSET>"
224 // start-sanitize-r5900
226 // end-sanitize-r5900
228 // start-sanitize-tx19
232 address_word offset = EXTEND16 (OFFSET) << 2;
234 DELAY_SLOT (PC + offset);
238 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
239 "bgezal r<RS>, <OFFSET>"
244 // start-sanitize-r5900
246 // end-sanitize-r5900
248 // start-sanitize-tx19
252 address_word offset = EXTEND16 (OFFSET) << 2;
255 DELAY_SLOT (PC + offset);
259 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
260 "bgezall r<RS>, <OFFSET>"
264 // start-sanitize-r5900
266 // end-sanitize-r5900
268 // start-sanitize-tx19
272 address_word offset = EXTEND16 (OFFSET) << 2;
274 /* NOTE: The branch occurs AFTER the next instruction has been
277 DELAY_SLOT (PC + offset);
279 NULLIFY_NEXT_INSTRUCTION ();
283 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
284 "bgezl r<RS>, <OFFSET>"
288 // start-sanitize-r5900
290 // end-sanitize-r5900
292 // start-sanitize-tx19
296 address_word offset = EXTEND16 (OFFSET) << 2;
298 DELAY_SLOT (PC + offset);
300 NULLIFY_NEXT_INSTRUCTION ();
304 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
305 "bgtz r<RS>, <OFFSET>"
310 // start-sanitize-r5900
312 // end-sanitize-r5900
314 // start-sanitize-tx19
318 address_word offset = EXTEND16 (OFFSET) << 2;
320 DELAY_SLOT (PC + offset);
324 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
325 "bgtzl r<RS>, <OFFSET>"
329 // start-sanitize-r5900
331 // end-sanitize-r5900
333 // start-sanitize-tx19
337 address_word offset = EXTEND16 (OFFSET) << 2;
338 /* NOTE: The branch occurs AFTER the next instruction has been
341 DELAY_SLOT (PC + offset);
343 NULLIFY_NEXT_INSTRUCTION ();
347 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
348 "blez r<RS>, <OFFSET>"
353 // start-sanitize-r5900
355 // end-sanitize-r5900
357 // start-sanitize-tx19
361 address_word offset = EXTEND16 (OFFSET) << 2;
362 /* NOTE: The branch occurs AFTER the next instruction has been
365 DELAY_SLOT (PC + offset);
369 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
370 "bgezl r<RS>, <OFFSET>"
374 // start-sanitize-r5900
376 // end-sanitize-r5900
378 // start-sanitize-tx19
382 address_word offset = EXTEND16 (OFFSET) << 2;
384 DELAY_SLOT (PC + offset);
386 NULLIFY_NEXT_INSTRUCTION ();
390 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
391 "bltz r<RS>, <OFFSET>"
396 // start-sanitize-r5900
398 // end-sanitize-r5900
400 // start-sanitize-tx19
404 address_word offset = EXTEND16 (OFFSET) << 2;
406 DELAY_SLOT (PC + offset);
410 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
411 "bltzal r<RS>, <OFFSET>"
416 // start-sanitize-r5900
418 // end-sanitize-r5900
420 // start-sanitize-tx19
424 address_word offset = EXTEND16 (OFFSET) << 2;
426 /* NOTE: The branch occurs AFTER the next instruction has been
429 DELAY_SLOT (PC + offset);
433 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
434 "bltzall r<RS>, <OFFSET>"
438 // start-sanitize-r5900
440 // end-sanitize-r5900
442 // start-sanitize-tx19
446 address_word offset = EXTEND16 (OFFSET) << 2;
449 DELAY_SLOT (PC + offset);
451 NULLIFY_NEXT_INSTRUCTION ();
455 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
456 "bltzl r<RS>, <OFFSET>"
460 // start-sanitize-r5900
462 // end-sanitize-r5900
464 // start-sanitize-tx19
468 address_word offset = EXTEND16 (OFFSET) << 2;
469 /* NOTE: The branch occurs AFTER the next instruction has been
472 DELAY_SLOT (PC + offset);
474 NULLIFY_NEXT_INSTRUCTION ();
478 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
479 "bne r<RS>, r<RT>, <OFFSET>"
484 // start-sanitize-r5900
486 // end-sanitize-r5900
488 // start-sanitize-tx19
492 address_word offset = EXTEND16 (OFFSET) << 2;
493 if (GPR[RS] != GPR[RT])
494 DELAY_SLOT (PC + offset);
498 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
499 "bnel r<RS>, r<RT>, <OFFSET>"
503 // start-sanitize-r5900
505 // end-sanitize-r5900
507 // start-sanitize-tx19
511 address_word offset = EXTEND16 (OFFSET) << 2;
512 if (GPR[RS] != GPR[RT])
513 DELAY_SLOT (PC + offset);
515 NULLIFY_NEXT_INSTRUCTION ();
519 000000,20.CODE,001101:SPECIAL:32::BREAK
525 // start-sanitize-r5900
527 // end-sanitize-r5900
529 // start-sanitize-tx19
533 SignalException(BreakPoint, instruction_0);
537 0100,ZZ!0!1!3,26.COP_FUN:NORMAL:32::COPz
543 // start-sanitize-r5900
545 // end-sanitize-r5900
547 // start-sanitize-tx19
551 DecodeCoproc (instruction_0);
555 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
556 "dadd r<RD>, r<RS>, r<RT>"
559 // start-sanitize-r5900
561 // end-sanitize-r5900
563 // start-sanitize-tx19
567 ALU64_BEGIN (GPR[RS]);
573 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
574 "daddi r<RT>, r<RS>, <IMMEDIATE>"
577 // start-sanitize-r5900
579 // end-sanitize-r5900
581 // start-sanitize-tx19
585 ALU64_BEGIN (GPR[RS]);
586 ALU64_ADD (EXTEND16 (IMMEDIATE));
591 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
592 "daddu r<RT>, r<RS>, <IMMEDIATE>"
595 // start-sanitize-r5900
597 // end-sanitize-r5900
599 // start-sanitize-tx19
603 GPR[RT] = GPR[RS] + EXTEND16 (IMMEDIATE);
607 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
608 "daddu r<RD>, r<RS>, r<RT>"
611 // start-sanitize-r5900
613 // end-sanitize-r5900
615 // start-sanitize-tx19
619 GPR[RD] = GPR[RS] + GPR[RT];
623 000000,5.RS,5.RT,0000000000011110:SPECIAL:64::DDIV
627 // start-sanitize-r5900
629 // end-sanitize-r5900
631 // start-sanitize-tx19
635 CHECKHILO ("Division");
637 signed64 n = GPR[RS];
638 signed64 d = GPR[RT];
641 LO = SIGNED64 (0x8000000000000000);
644 else if (d == -1 && n == SIGNED64 (0x8000000000000000))
646 LO = SIGNED64 (0x8000000000000000);
659 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
664 // start-sanitize-tx19
668 CHECKHILO ("Division");
670 unsigned64 n = GPR[RS];
671 unsigned64 d = GPR[RT];
674 LO = SIGNED64 (0x8000000000000000);
686 000000,5.RS,5.RT,0000000000011010:SPECIAL:32::DIV
692 // start-sanitize-r5900
694 // end-sanitize-r5900
696 // start-sanitize-tx19
700 CHECKHILO("Division");
702 signed32 n = GPR[RS];
703 signed32 d = GPR[RT];
706 LO = EXTEND32 (0x80000000);
709 else if (d == -1 && d == 0x80000000)
711 LO = EXTEND32 (0x80000000);
716 LO = EXTEND32 (n / d);
717 HI = EXTEND32 (n % d);
723 000000,5.RS,5.RT,0000000000011011:SPECIAL:32::DIVU
729 // start-sanitize-r5900
731 // end-sanitize-r5900
733 // start-sanitize-tx19
737 CHECKHILO ("Division");
739 unsigned32 n = GPR[RS];
740 unsigned32 d = GPR[RT];
743 LO = EXTEND32 (0x80000000);
748 LO = EXTEND32 (n / d);
749 HI = EXTEND32 (n % d);
755 000000,5.RS,5.RT,0000000000011100:SPECIAL:64::DMULT
760 // start-sanitize-tx19
764 CHECKHILO ("Multiplication");
766 signed64 op1 = GPR[RS];
767 signed64 op2 = GPR[RT];
776 /* make it unsigned */
787 /* multuply out the 4 sub products */
788 m00 = (VL4_8 (op1) * VL4_8 (op2));
789 m10 = (VH4_8 (op1) * VL4_8 (op2));
790 m01 = (VL4_8 (op1) * VH4_8 (op2));
791 m11 = (VH4_8 (op1) * VH4_8 (op2));
792 /* add the products */
793 mid = VH4_8 (m00) + VL4_8 (m10) + VL4_8 (m01);
794 lo = U8_4 (mid, m00);
795 hi = m11 + VH4_8 (mid) + VH4_8 (m01) + VH4_8 (m10);
796 /* save the result */
814 000000,5.RS,5.RT,0000000000011101:SPECIAL:64::DMULTU
815 "dmultu r<RS>, r<RT>"
819 // start-sanitize-tx19
823 CHECKHILO ("Multiplication");
825 signed64 op1 = GPR[RS];
826 signed64 op2 = GPR[RT];
834 /* multuply out the 4 sub products */
835 m00 = (VL4_8 (op1) * VL4_8 (op2));
836 m10 = (VH4_8 (op1) * VL4_8 (op2));
837 m01 = (VL4_8 (op1) * VH4_8 (op2));
838 m11 = (VH4_8 (op1) * VH4_8 (op2));
839 /* add the products */
840 mid = VH4_8 (m00) + VL4_8 (m10) + VL4_8 (m01);
841 lo = U8_4 (mid, m00);
842 hi = m11 + VH4_8 (mid) + VH4_8 (m01) + VH4_8 (m10);
843 /* save the result */
850 00000000000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
851 "dsll r<RD>, r<RT>, <SA>"
854 // start-sanitize-r5900
856 // end-sanitize-r5900
858 // start-sanitize-tx19
863 GPR[RD] = GPR[RT] << s;
867 00000000000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
868 "dsll32 r<RD>, r<RT>, <SA>"
871 // start-sanitize-r5900
873 // end-sanitize-r5900
875 // start-sanitize-tx19
880 GPR[RD] = GPR[RT] << s;
884 000000,5.RS,5.RT,5.RD,00000010100:SPECIAL:64::DSLLV
885 "dsllv r<RD>, r<RT>, r<RS>"
888 // start-sanitize-r5900
890 // end-sanitize-r5900
892 // start-sanitize-tx19
896 int s = MASKED64 (GPR[RS], 5, 0);
897 GPR[RD] = GPR[RT] << s;
901 00000000000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
902 "dsra r<RD>, r<RT>, <SA>"
905 // start-sanitize-r5900
907 // end-sanitize-r5900
909 // start-sanitize-tx19
914 GPR[RD] = ((signed64) GPR[RT]) >> s;
918 00000000000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
919 "dsra32 r<RT>, r<RD>, <SA>"
922 // start-sanitize-r5900
924 // end-sanitize-r5900
926 // start-sanitize-tx19
931 GPR[RD] = ((signed64) GPR[RT]) >> s;
935 000000,5.RS,5.RT,5.RD,00000010111:SPECIAL:64::DSRAV
936 "dsra32 r<RT>, r<RD>, r<RS>"
939 // start-sanitize-r5900
941 // end-sanitize-r5900
943 // start-sanitize-tx19
947 int s = MASKED64 (GPR[RS], 5, 0);
948 GPR[RD] = ((signed64) GPR[RT]) >> s;
952 00000000000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
953 "dsrav r<RD>, r<RT>, <SA>"
956 // start-sanitize-r5900
958 // end-sanitize-r5900
960 // start-sanitize-tx19
965 GPR[RD] = (unsigned64) GPR[RT] >> s;
969 00000000000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
970 "dsrl32 r<RD>, r<RT>, <SA>"
973 // start-sanitize-r5900
975 // end-sanitize-r5900
977 // start-sanitize-tx19
982 GPR[RD] = (unsigned64) GPR[RT] >> s;
986 000000,5.RS,5.RT,5.RD,00000010110:SPECIAL:64::DSRLV
987 "dsrl32 r<RD>, r<RT>, r<RS>"
990 // start-sanitize-r5900
992 // end-sanitize-r5900
994 // start-sanitize-tx19
998 int s = MASKED64 (GPR[RS], 5, 0);
999 GPR[RD] = (unsigned64) GPR[RT] >> s;
1003 000000,5.RS,5.RT,5.RD,00000101110:SPECIAL:64::DSUB
1004 "dsub r<RD>, r<RS>, r<RT>"
1007 // start-sanitize-r5900
1009 // end-sanitize-r5900
1011 // start-sanitize-tx19
1013 // end-sanitize-tx19
1015 ALU64_BEGIN (GPR[RS]);
1016 ALU64_SUB (GPR[RT]);
1017 ALU64_END (GPR[RD]);
1021 000000,5.RS,5.RT,5.RD,00000101111:SPECIAL:64::DSUBU
1022 "dsubu r<RD>, r<RS>, r<RT>"
1025 // start-sanitize-r5900
1027 // end-sanitize-r5900
1029 // start-sanitize-tx19
1031 // end-sanitize-tx19
1033 GPR[RD] = GPR[RS] - GPR[RT];
1037 000010,26.INSTR_INDEX:NORMAL:32::J
1043 // start-sanitize-r5900
1045 // end-sanitize-r5900
1047 // start-sanitize-tx19
1049 // end-sanitize-tx19
1051 /* NOTE: The region used is that of the delay slot NIA and NOT the
1052 current instruction */
1053 address_word region = (NIA & MASK (63, 28));
1054 DELAY_SLOT (region | (INSTR_INDEX << 2));
1058 000011,26.INSTR_INDEX:NORMAL:32::JAL
1064 // start-sanitize-r5900
1066 // end-sanitize-r5900
1068 // start-sanitize-tx19
1070 // end-sanitize-tx19
1072 /* NOTE: The region used is that of the delay slot and NOT the
1073 current instruction */
1074 address_word region = (NIA & MASK (63, 28));
1076 DELAY_SLOT (region | (INSTR_INDEX << 2));
1080 000000,5.RS,00000,5.RD,00000001001:SPECIAL:32::JALR
1081 "jalr r<RS>":RD == 31
1087 // start-sanitize-r5900
1089 // end-sanitize-r5900
1091 // start-sanitize-tx19
1093 // end-sanitize-tx19
1095 address_word temp = GPR[RS];
1101 000000,5.RS,000000000000000001000:SPECIAL:32::JR
1107 // start-sanitize-r5900
1109 // end-sanitize-r5900
1111 // start-sanitize-tx19
1113 // end-sanitize-tx19
1115 DELAY_SLOT (GPR[RS]);
1119 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
1120 "lb r<RT>, <OFFSET>(r<BASE>)"
1125 // start-sanitize-r5900
1127 // end-sanitize-r5900
1129 // start-sanitize-tx19
1131 // end-sanitize-tx19
1133 unsigned32 instruction = instruction_0;
1134 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1135 int destreg = ((instruction >> 16) & 0x0000001F);
1136 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1138 address_word vaddr = ((uword64)op1 + offset);
1142 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1145 uword64 memval1 = 0;
1147 unsigned int shift = 0;
1148 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1149 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1151 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1152 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
1153 byte = ((vaddr & mask) ^ (bigend << shift));
1154 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x000000FF),8));
1161 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
1162 "lbu r<RT>, <OFFSET>(r<BASE>)"
1167 // start-sanitize-r5900
1169 // end-sanitize-r5900
1171 // start-sanitize-tx19
1173 // end-sanitize-tx19
1175 unsigned32 instruction = instruction_0;
1176 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1177 int destreg = ((instruction >> 16) & 0x0000001F);
1178 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1180 address_word vaddr = ((unsigned64)op1 + offset);
1184 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1186 unsigned64 memval = 0;
1187 unsigned64 memval1 = 0;
1188 unsigned64 mask = 0x7;
1189 unsigned int shift = 0;
1190 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1191 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1193 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1194 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
1195 byte = ((vaddr & mask) ^ (bigend << shift));
1196 GPR[destreg] = (((memval >> (8 * byte)) & 0x000000FF));
1203 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
1204 "ld r<RT>, <OFFSET>(r<BASE>)"
1207 // start-sanitize-r5900
1209 // end-sanitize-r5900
1211 // start-sanitize-tx19
1213 // end-sanitize-tx19
1215 unsigned32 instruction = instruction_0;
1216 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1217 int destreg = ((instruction >> 16) & 0x0000001F);
1218 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1220 address_word vaddr = ((unsigned64)op1 + offset);
1223 if ((vaddr & 7) != 0)
1224 SignalExceptionAddressLoad();
1227 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1229 unsigned64 memval = 0;
1230 unsigned64 memval1 = 0;
1231 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1232 GPR[destreg] = memval;
1239 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
1240 "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
1244 // start-sanitize-r5900
1246 // end-sanitize-r5900
1248 // start-sanitize-tx19
1250 // end-sanitize-tx19
1252 unsigned32 instruction = instruction_0;
1253 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1254 int destreg = ((instruction >> 16) & 0x0000001F);
1255 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1257 address_word vaddr = ((unsigned64)op1 + offset);
1260 if ((vaddr & 7) != 0)
1261 SignalExceptionAddressLoad();
1264 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1266 unsigned64 memval = 0;
1267 unsigned64 memval1 = 0;
1268 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1269 COP_LD(((instruction >> 26) & 0x3),destreg,memval);;
1276 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
1277 "ldl r<RT>, <OFFSET>(r<BASE>)"
1280 // start-sanitize-r5900
1282 // end-sanitize-r5900
1284 // start-sanitize-tx19
1286 // end-sanitize-tx19
1288 unsigned32 instruction = instruction_0;
1289 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1290 int destreg = ((instruction >> 16) & 0x0000001F);
1291 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1293 address_word vaddr = ((unsigned64)op1 + offset);
1297 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1299 unsigned64 memval = 0;
1300 unsigned64 memval1 = 0;
1301 unsigned64 mask = 7;
1302 unsigned int reverse = (ReverseEndian ? mask : 0);
1303 unsigned int bigend = (BigEndianCPU ? mask : 0);
1305 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1306 byte = ((vaddr & mask) ^ bigend);
1309 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
1310 GPR[destreg] = ((memval << ((7 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((7 - byte) * 8)) - 1)));
1317 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
1318 "ldr r<RT>, <OFFSET>(r<BASE>)"
1321 // start-sanitize-r5900
1323 // end-sanitize-r5900
1325 // start-sanitize-tx19
1327 // end-sanitize-tx19
1329 unsigned32 instruction = instruction_0;
1330 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1331 int destreg = ((instruction >> 16) & 0x0000001F);
1332 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1334 address_word vaddr = ((unsigned64)op1 + offset);
1338 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1340 unsigned64 memval = 0;
1341 unsigned64 memval1 = 0;
1342 unsigned64 mask = 7;
1343 unsigned int reverse = (ReverseEndian ? mask : 0);
1344 unsigned int bigend = (BigEndianCPU ? mask : 0);
1346 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1347 byte = ((vaddr & mask) ^ bigend);
1350 LoadMemory(&memval,&memval1,uncached,(7 - byte),paddr,vaddr,isDATA,isREAL);
1356 srcmask = ((unsigned64)-1 << (8 * (8 - byte)));
1357 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
1365 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
1366 "lh r<RT>, <OFFSET>(r<BASE>)"
1371 // start-sanitize-r5900
1373 // end-sanitize-r5900
1375 // start-sanitize-tx19
1377 // end-sanitize-tx19
1379 unsigned32 instruction = instruction_0;
1380 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1381 int destreg = ((instruction >> 16) & 0x0000001F);
1382 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1384 address_word vaddr = ((unsigned64)op1 + offset);
1387 if ((vaddr & 1) != 0)
1388 SignalExceptionAddressLoad();
1391 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1393 unsigned64 memval = 0;
1394 unsigned64 memval1 = 0;
1395 unsigned64 mask = 0x7;
1396 unsigned int shift = 1;
1397 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1398 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1400 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1401 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1402 byte = ((vaddr & mask) ^ (bigend << shift));
1403 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x0000FFFF),16));
1410 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
1411 "lhu r<RT>, <OFFSET>(r<BASE>)"
1416 // start-sanitize-r5900
1418 // end-sanitize-r5900
1420 // start-sanitize-tx19
1422 // end-sanitize-tx19
1424 unsigned32 instruction = instruction_0;
1425 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1426 int destreg = ((instruction >> 16) & 0x0000001F);
1427 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1429 address_word vaddr = ((unsigned64)op1 + offset);
1432 if ((vaddr & 1) != 0)
1433 SignalExceptionAddressLoad();
1436 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1438 unsigned64 memval = 0;
1439 unsigned64 memval1 = 0;
1440 unsigned64 mask = 0x7;
1441 unsigned int shift = 1;
1442 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1443 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1445 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1446 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1447 byte = ((vaddr & mask) ^ (bigend << shift));
1448 GPR[destreg] = (((memval >> (8 * byte)) & 0x0000FFFF));
1455 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
1456 "ll r<RT>, <OFFSET>(r<BASE>)"
1460 // start-sanitize-r5900
1462 // end-sanitize-r5900
1464 // start-sanitize-tx19
1466 // end-sanitize-tx19
1468 unsigned32 instruction = instruction_0;
1469 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1470 int destreg = ((instruction >> 16) & 0x0000001F);
1471 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1473 address_word vaddr = ((unsigned64)op1 + offset);
1476 if ((vaddr & 3) != 0)
1477 SignalExceptionAddressLoad();
1480 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1482 unsigned64 memval = 0;
1483 unsigned64 memval1 = 0;
1484 unsigned64 mask = 0x7;
1485 unsigned int shift = 2;
1486 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1487 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1489 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1490 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1491 byte = ((vaddr & mask) ^ (bigend << shift));
1492 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
1500 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
1501 "lld r<RT>, <OFFSET>(r<BASE>)"
1504 // start-sanitize-r5900
1506 // end-sanitize-r5900
1508 // start-sanitize-tx19
1510 // end-sanitize-tx19
1512 unsigned32 instruction = instruction_0;
1513 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1514 int destreg = ((instruction >> 16) & 0x0000001F);
1515 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1517 address_word vaddr = ((unsigned64)op1 + offset);
1520 if ((vaddr & 7) != 0)
1521 SignalExceptionAddressLoad();
1524 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1526 unsigned64 memval = 0;
1527 unsigned64 memval1 = 0;
1528 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1529 GPR[destreg] = memval;
1537 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
1538 "lui r<RT>, <IMMEDIATE>"
1543 // start-sanitize-r5900
1545 // end-sanitize-r5900
1547 // start-sanitize-tx19
1549 // end-sanitize-tx19
1551 GPR[RT] = EXTEND32 (IMMEDIATE << 16);
1555 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
1556 "lw r<RT>, <OFFSET>(r<BASE>)"
1561 // start-sanitize-r5900
1563 // end-sanitize-r5900
1565 // start-sanitize-tx19
1567 // end-sanitize-tx19
1569 unsigned32 instruction = instruction_0;
1570 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1571 int destreg = ((instruction >> 16) & 0x0000001F);
1572 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1574 address_word vaddr = ((unsigned64)op1 + offset);
1577 if ((vaddr & 3) != 0)
1578 SignalExceptionAddressLoad();
1581 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1583 unsigned64 memval = 0;
1584 unsigned64 memval1 = 0;
1585 unsigned64 mask = 0x7;
1586 unsigned int shift = 2;
1587 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1588 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1590 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1591 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1592 byte = ((vaddr & mask) ^ (bigend << shift));
1593 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
1600 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
1601 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
1606 // start-sanitize-r5900
1608 // end-sanitize-r5900
1610 // start-sanitize-tx19
1612 // end-sanitize-tx19
1614 unsigned32 instruction = instruction_0;
1615 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1616 int destreg = ((instruction >> 16) & 0x0000001F);
1617 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1619 address_word vaddr = ((unsigned64)op1 + offset);
1622 if ((vaddr & 3) != 0)
1623 SignalExceptionAddressLoad();
1626 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1628 unsigned64 memval = 0;
1629 unsigned64 memval1 = 0;
1630 unsigned64 mask = 0x7;
1631 unsigned int shift = 2;
1632 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1633 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1635 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1636 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1637 byte = ((vaddr & mask) ^ (bigend << shift));
1638 COP_LW(((instruction >> 26) & 0x3),destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
1645 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
1646 "lwl r<RT>, <OFFSET>(r<BASE>)"
1651 // start-sanitize-r5900
1653 // end-sanitize-r5900
1655 // start-sanitize-tx19
1657 // end-sanitize-tx19
1659 unsigned32 instruction = instruction_0;
1660 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1661 int destreg = ((instruction >> 16) & 0x0000001F);
1662 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1664 address_word vaddr = ((unsigned64)op1 + offset);
1668 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1670 unsigned64 memval = 0;
1671 unsigned64 memval1 = 0;
1672 unsigned64 mask = 3;
1673 unsigned int reverse = (ReverseEndian ? mask : 0);
1674 unsigned int bigend = (BigEndianCPU ? mask : 0);
1676 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1677 byte = ((vaddr & mask) ^ bigend);
1680 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
1681 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
1684 GPR[destreg] = ((memval << ((3 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((3 - byte) * 8)) - 1)));
1685 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
1692 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
1693 "lwr r<RT>, <OFFSET>(r<BASE>)"
1698 // start-sanitize-r5900
1700 // end-sanitize-r5900
1702 // start-sanitize-tx19
1704 // end-sanitize-tx19
1706 unsigned32 instruction = instruction_0;
1707 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1708 int destreg = ((instruction >> 16) & 0x0000001F);
1709 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1711 address_word vaddr = ((unsigned64)op1 + offset);
1715 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1717 unsigned64 memval = 0;
1718 unsigned64 memval1 = 0;
1719 unsigned64 mask = 3;
1720 unsigned int reverse = (ReverseEndian ? mask : 0);
1721 unsigned int bigend = (BigEndianCPU ? mask : 0);
1723 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1724 byte = ((vaddr & mask) ^ bigend);
1727 LoadMemory(&memval,&memval1,uncached,(3 - byte),paddr,vaddr,isDATA,isREAL);
1728 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
1736 srcmask = ((unsigned64)-1 << (8 * (4 - byte)));
1737 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
1739 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
1746 100111,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWU
1747 "lwu r<RT>, <OFFSET>(r<BASE>)"
1750 // start-sanitize-r5900
1752 // end-sanitize-r5900
1754 // start-sanitize-tx19
1756 // end-sanitize-tx19
1758 unsigned32 instruction = instruction_0;
1759 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1760 int destreg = ((instruction >> 16) & 0x0000001F);
1761 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1763 address_word vaddr = ((unsigned64)op1 + offset);
1766 if ((vaddr & 3) != 0)
1767 SignalExceptionAddressLoad();
1770 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1772 unsigned64 memval = 0;
1773 unsigned64 memval1 = 0;
1774 unsigned64 mask = 0x7;
1775 unsigned int shift = 2;
1776 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1777 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1779 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1780 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1781 byte = ((vaddr & mask) ^ (bigend << shift));
1782 GPR[destreg] = (((memval >> (8 * byte)) & 0xFFFFFFFF));
1789 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
1795 // start-sanitize-r5900
1797 // end-sanitize-r5900
1799 // start-sanitize-tx19
1801 // end-sanitize-tx19
1808 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
1814 // start-sanitize-r5900
1816 // end-sanitize-r5900
1818 // start-sanitize-tx19
1820 // end-sanitize-tx19
1823 LOACCESS = 3; /* 3rd instruction will be safe */
1827 000000,5.RS,5.RT,5.RD,00000001011:SPECIAL:32::MOVN
1828 "movn r<RD>, r<RS>, r<RT>"
1830 // start-sanitize-r5900
1832 // end-sanitize-r5900
1839 000000,5.RS,5.RT,5.RD,00000001010:SPECIAL:32::MOVZ
1840 "movz r<RD>, r<RS>, r<RT>"
1842 // start-sanitize-r5900
1844 // end-sanitize-r5900
1851 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
1857 // start-sanitize-r5900
1859 // end-sanitize-r5900
1861 // start-sanitize-tx19
1863 // end-sanitize-tx19
1866 sim_io_eprintf (sd, "MT (move-to) over-writing HI register value\n");
1868 HIACCESS = 3; /* 3rd instruction will be safe */
1872 000000,5.RS,000000000000000010011:SPECIAL:32::MTLO
1878 // start-sanitize-r5900
1880 // end-sanitize-r5900
1882 // start-sanitize-tx19
1884 // end-sanitize-tx19
1887 sim_io_eprintf (sd, "MT (move-to) over-writing LO register value\n");
1889 LOACCESS = 3; /* 3rd instruction will be safe */
1893 000000,5.RS,5.RT,5.RD,00000011000:SPECIAL:32::MULT
1899 // start-sanitize-r5900
1901 // end-sanitize-r5900
1903 // start-sanitize-tx19
1905 // end-sanitize-tx19
1908 CHECKHILO ("Multiplication");
1909 prod = (((signed64)(signed32) GPR[RS])
1910 * ((signed64)(signed32) GPR[RT]));
1911 LO = EXTEND32 (VL4_8 (prod));
1912 HI = EXTEND32 (VH4_8 (prod));
1916 000000,5.RS,5.RT,5.RD,00000011001:SPECIAL:32::MULTU
1917 "multu r<RS>, r<RT>"
1922 // start-sanitize-r5900
1924 // end-sanitize-r5900
1926 // start-sanitize-tx19
1928 // end-sanitize-tx19
1931 CHECKHILO ("Multiplication");
1932 prod = (((unsigned64)(unsigned32) GPR[RS])
1933 * ((unsigned64)(unsigned32) GPR[RT]));
1934 LO = EXTEND32 (VL4_8 (prod));
1935 HI = EXTEND32 (VH4_8 (prod));
1939 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
1940 "nor r<RD>, r<RS>, r<RT>"
1945 // start-sanitize-r5900
1947 // end-sanitize-r5900
1949 // start-sanitize-tx19
1951 // end-sanitize-tx19
1953 GPR[RD] = ~ (GPR[RS] | GPR[RT]);
1957 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
1958 "or r<RD>, r<RS>, r<RT>"
1963 // start-sanitize-r5900
1965 // end-sanitize-r5900
1967 // start-sanitize-tx19
1969 // end-sanitize-tx19
1971 GPR[RD] = (GPR[RS] | GPR[RT]);
1975 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
1976 "ori r<RT>, r<RS>, <IMMEDIATE>"
1981 // start-sanitize-r5900
1983 // end-sanitize-r5900
1985 // start-sanitize-tx19
1987 // end-sanitize-tx19
1989 GPR[RT] = (GPR[RS] | IMMEDIATE);
1993 110011,5.RS,nnnnn,16.OFFSET:NORMAL:32::PREF
1995 // start-sanitize-r5900
1997 // end-sanitize-r5900
1999 unsigned32 instruction = instruction_0;
2000 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2001 int hint = ((instruction >> 16) & 0x0000001F);
2002 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2004 address_word vaddr = ((unsigned64)op1 + offset);
2008 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2009 Prefetch(uncached,paddr,vaddr,isDATA,hint);
2014 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
2015 "sb r<RT>, <OFFSET>(r<BASE>)"
2020 // start-sanitize-r5900
2022 // end-sanitize-r5900
2024 // start-sanitize-tx19
2026 // end-sanitize-tx19
2028 unsigned32 instruction = instruction_0;
2029 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2030 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2031 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2033 address_word vaddr = ((unsigned64)op1 + offset);
2037 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2039 unsigned64 memval = 0;
2040 unsigned64 memval1 = 0;
2041 unsigned64 mask = 0x7;
2042 unsigned int shift = 0;
2043 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2044 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2046 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2047 byte = ((vaddr & mask) ^ (bigend << shift));
2048 memval = ((unsigned64) op2 << (8 * byte));
2050 StoreMemory(uncached,AccessLength_BYTE,memval,memval1,paddr,vaddr,isREAL);
2058 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
2059 "sc r<RT>, <OFFSET>(r<BASE>)"
2063 // start-sanitize-r5900
2065 // end-sanitize-r5900
2067 // start-sanitize-tx19
2069 // end-sanitize-tx19
2071 unsigned32 instruction = instruction_0;
2072 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2073 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2074 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2076 address_word vaddr = ((unsigned64)op1 + offset);
2079 if ((vaddr & 3) != 0)
2080 SignalExceptionAddressStore();
2083 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2085 unsigned64 memval = 0;
2086 unsigned64 memval1 = 0;
2087 unsigned64 mask = 0x7;
2089 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2090 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2091 memval = ((unsigned64) op2 << (8 * byte));
2094 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2096 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2103 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
2104 "scd r<RT>, <OFFSET>(r<BASE>)"
2107 // start-sanitize-r5900
2109 // end-sanitize-r5900
2111 // start-sanitize-tx19
2113 // end-sanitize-tx19
2115 unsigned32 instruction = instruction_0;
2116 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2117 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2118 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2120 address_word vaddr = ((unsigned64)op1 + offset);
2123 if ((vaddr & 7) != 0)
2124 SignalExceptionAddressStore();
2127 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2129 unsigned64 memval = 0;
2130 unsigned64 memval1 = 0;
2134 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2136 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2143 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
2144 "sd r<RT>, <OFFSET>(r<BASE>)"
2147 // start-sanitize-r5900
2149 // end-sanitize-r5900
2151 // start-sanitize-tx19
2153 // end-sanitize-tx19
2155 unsigned32 instruction = instruction_0;
2156 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2157 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2158 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2160 address_word vaddr = ((unsigned64)op1 + offset);
2163 if ((vaddr & 7) != 0)
2164 SignalExceptionAddressStore();
2167 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2169 unsigned64 memval = 0;
2170 unsigned64 memval1 = 0;
2173 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2181 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
2182 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2186 // start-sanitize-r5900
2188 // end-sanitize-r5900
2190 // start-sanitize-tx19
2192 // end-sanitize-tx19
2194 unsigned32 instruction = instruction_0;
2195 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2196 int destreg = ((instruction >> 16) & 0x0000001F);
2197 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2199 address_word vaddr = ((unsigned64)op1 + offset);
2202 if ((vaddr & 7) != 0)
2203 SignalExceptionAddressStore();
2206 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2208 unsigned64 memval = 0;
2209 unsigned64 memval1 = 0;
2210 memval = (unsigned64)COP_SD(((instruction >> 26) & 0x3),destreg);
2212 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2220 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
2221 "sdl r<RT>, <OFFSET>(r<BASE>)"
2224 // start-sanitize-r5900
2226 // end-sanitize-r5900
2228 // start-sanitize-tx19
2230 // end-sanitize-tx19
2232 unsigned32 instruction = instruction_0;
2233 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2234 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2235 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2237 address_word vaddr = ((unsigned64)op1 + offset);
2241 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2243 unsigned64 memval = 0;
2244 unsigned64 memval1 = 0;
2245 unsigned64 mask = 7;
2246 unsigned int reverse = (ReverseEndian ? mask : 0);
2247 unsigned int bigend = (BigEndianCPU ? mask : 0);
2249 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2250 byte = ((vaddr & mask) ^ bigend);
2253 memval = (op2 >> (8 * (7 - byte)));
2254 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
2261 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
2262 "sdr r<RT>, <OFFSET>(r<BASE>)"
2265 // start-sanitize-r5900
2267 // end-sanitize-r5900
2269 // start-sanitize-tx19
2271 // end-sanitize-tx19
2273 unsigned32 instruction = instruction_0;
2274 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2275 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2276 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2278 address_word vaddr = ((unsigned64)op1 + offset);
2282 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2284 unsigned64 memval = 0;
2285 unsigned64 memval1 = 0;
2286 unsigned64 mask = 7;
2287 unsigned int reverse = (ReverseEndian ? mask : 0);
2288 unsigned int bigend = (BigEndianCPU ? mask : 0);
2290 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2291 byte = ((vaddr & mask) ^ bigend);
2294 memval = ((unsigned64) op2 << (byte * 8));
2295 StoreMemory(uncached,(AccessLength_DOUBLEWORD - byte),memval,memval1,paddr,vaddr,isREAL);
2302 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
2303 "sh r<RT>, <OFFSET>(r<BASE>)"
2308 // start-sanitize-r5900
2310 // end-sanitize-r5900
2312 // start-sanitize-tx19
2314 // end-sanitize-tx19
2316 unsigned32 instruction = instruction_0;
2317 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2318 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2319 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2321 address_word vaddr = ((unsigned64)op1 + offset);
2324 if ((vaddr & 1) != 0)
2325 SignalExceptionAddressStore();
2328 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2330 unsigned64 memval = 0;
2331 unsigned64 memval1 = 0;
2332 unsigned64 mask = 0x7;
2333 unsigned int shift = 1;
2334 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2335 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2337 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2338 byte = ((vaddr & mask) ^ (bigend << shift));
2339 memval = ((unsigned64) op2 << (8 * byte));
2341 StoreMemory(uncached,AccessLength_HALFWORD,memval,memval1,paddr,vaddr,isREAL);
2349 00000000000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLL
2350 "sll r<RD>, r<RT>, <SHIFT>"
2355 // start-sanitize-r5900
2357 // end-sanitize-r5900
2359 // start-sanitize-tx19
2361 // end-sanitize-tx19
2364 unsigned32 temp = (GPR[RT] << s);
2365 GPR[RD] = EXTEND32 (temp);
2369 000000,5.RS,5.RT,5.RD,00000000100:SPECIAL:32::SLLV
2370 "sllv r<RD>, r<RT>, r<RS>"
2375 // start-sanitize-r5900
2377 // end-sanitize-r5900
2379 // start-sanitize-tx19
2381 // end-sanitize-tx19
2383 int s = MASKED (GPR[RS], 4, 0);
2384 unsigned32 temp = (GPR[RT] << s);
2385 GPR[RD] = EXTEND32 (temp);
2389 000000,5.RS,5.RT,5.RD,00000101010:SPECIAL:32::SLT
2390 "slt r<RD>, r<RS>, r<RT>"
2395 // start-sanitize-r5900
2397 // end-sanitize-r5900
2399 // start-sanitize-tx19
2401 // end-sanitize-tx19
2403 GPR[RD] = (GPR[RS] < GPR[RT]);
2407 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
2408 "slti r<RT>, r<RS>, <IMMEDIATE>"
2413 // start-sanitize-r5900
2415 // end-sanitize-r5900
2417 // start-sanitize-tx19
2419 // end-sanitize-tx19
2421 GPR[RT] = (GPR[RS] < EXTEND16 (IMMEDIATE));
2425 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
2426 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
2431 // start-sanitize-r5900
2433 // end-sanitize-r5900
2435 // start-sanitize-tx19
2437 // end-sanitize-tx19
2439 GPR[RT] = ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE));
2442 000000,5.RS,5.RT,5.RD,00000101011:SPECIAL:32::SLTU
2443 "sltu r<RD>, r<RS>, r<RT>"
2448 // start-sanitize-r5900
2450 // end-sanitize-r5900
2452 // start-sanitize-tx19
2454 // end-sanitize-tx19
2456 GPR[RD] = ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT]);
2460 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
2461 "sra r<RD>, r<RT>, <SHIFT>"
2466 // start-sanitize-r5900
2468 // end-sanitize-r5900
2470 // start-sanitize-tx19
2472 // end-sanitize-tx19
2475 signed32 temp = (signed32) GPR[RT] >> s;
2476 GPR[RD] = EXTEND32 (temp);
2480 000000,5.RS,5.RT,5.RD,00000000111:SPECIAL:32::SRAV
2481 "srav r<RD>, r<RT>, r<RS>"
2486 // start-sanitize-r5900
2488 // end-sanitize-r5900
2490 // start-sanitize-tx19
2492 // end-sanitize-tx19
2494 int s = MASKED (GPR[RS], 4, 0);
2495 signed32 temp = (signed32) GPR[RT] >> s;
2496 GPR[RD] = EXTEND32 (temp);
2500 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
2501 "srl r<RD>, r<RT>, <SHIFT>"
2506 // start-sanitize-r5900
2508 // end-sanitize-r5900
2510 // start-sanitize-tx19
2512 // end-sanitize-tx19
2515 unsigned32 temp = (unsigned32) GPR[RT] >> s;
2516 GPR[RD] = EXTEND32 (temp);
2520 000000,5.RS,5.RT,5.RD,00000000110:SPECIAL:32::SRLV
2521 "srlv r<RD>, r<RT>, r<RS>"
2526 // start-sanitize-r5900
2528 // end-sanitize-r5900
2530 // start-sanitize-tx19
2532 // end-sanitize-tx19
2534 int s = MASKED (GPR[RS], 4, 0);
2535 unsigned32 temp = (unsigned32) GPR[RT] >> s;
2536 GPR[RD] = EXTEND32 (temp);
2540 000000,5.RS,5.RT,5.RD,00000100010:SPECIAL:32::SUB
2541 "sub r<RD>, r<RS>, r<RT>"
2546 // start-sanitize-r5900
2548 // end-sanitize-r5900
2550 // start-sanitize-tx19
2552 // end-sanitize-tx19
2554 ALU32_BEGIN (GPR[RS]);
2555 ALU32_SUB (GPR[RT]);
2556 ALU32_END (GPR[RD]);
2560 000000,5.RS,5.RT,5.RD,00000100011:SPECIAL:32::SUBU
2561 "subu r<RD>, r<RS>, r<RT>"
2566 // start-sanitize-r5900
2568 // end-sanitize-r5900
2570 // start-sanitize-tx19
2572 // end-sanitize-tx19
2574 GPR[RD] = EXTEND32 (GPR[RS] - GPR[RT]);
2578 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
2579 "sw r<RT>, <OFFSET>(r<BASE>)"
2584 // start-sanitize-r5900
2586 // end-sanitize-r5900
2588 // start-sanitize-tx19
2590 // end-sanitize-tx19
2592 unsigned32 instruction = instruction_0;
2593 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2594 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2595 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2597 address_word vaddr = ((unsigned64)op1 + offset);
2600 if ((vaddr & 3) != 0)
2601 SignalExceptionAddressStore();
2604 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2606 unsigned64 memval = 0;
2607 unsigned64 memval1 = 0;
2608 unsigned64 mask = 0x7;
2610 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2611 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2612 memval = ((unsigned64) op2 << (8 * byte));
2614 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2622 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
2623 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2628 // start-sanitize-r5900
2630 // end-sanitize-r5900
2632 // start-sanitize-tx19
2634 // end-sanitize-tx19
2636 unsigned32 instruction = instruction_0;
2637 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2638 int destreg = ((instruction >> 16) & 0x0000001F);
2639 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2641 address_word vaddr = ((unsigned64)op1 + offset);
2644 if ((vaddr & 3) != 0)
2645 SignalExceptionAddressStore();
2648 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2650 unsigned64 memval = 0;
2651 unsigned64 memval1 = 0;
2652 unsigned64 mask = 0x7;
2654 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2655 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2656 memval = (((unsigned64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
2658 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2666 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
2667 "swl r<RT>, <OFFSET>(r<BASE>)"
2672 // start-sanitize-r5900
2674 // end-sanitize-r5900
2676 // start-sanitize-tx19
2678 // end-sanitize-tx19
2680 unsigned32 instruction = instruction_0;
2681 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2682 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2683 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2685 address_word vaddr = ((unsigned64)op1 + offset);
2689 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2691 unsigned64 memval = 0;
2692 unsigned64 memval1 = 0;
2693 unsigned64 mask = 3;
2694 unsigned int reverse = (ReverseEndian ? mask : 0);
2695 unsigned int bigend = (BigEndianCPU ? mask : 0);
2697 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2698 byte = ((vaddr & mask) ^ bigend);
2701 memval = (op2 >> (8 * (3 - byte)));
2702 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
2705 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
2712 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
2713 "swr r<RT>, <OFFSET>(r<BASE>)"
2718 // start-sanitize-r5900
2720 // end-sanitize-r5900
2722 // start-sanitize-tx19
2724 // end-sanitize-tx19
2726 unsigned32 instruction = instruction_0;
2727 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2728 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2729 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2731 address_word vaddr = ((unsigned64)op1 + offset);
2735 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2737 unsigned64 memval = 0;
2738 unsigned64 memval1 = 0;
2739 unsigned64 mask = 3;
2740 unsigned int reverse = (ReverseEndian ? mask : 0);
2741 unsigned int bigend = (BigEndianCPU ? mask : 0);
2743 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2744 byte = ((vaddr & mask) ^ bigend);
2747 memval = ((unsigned64) op2 << (byte * 8));
2748 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
2751 StoreMemory(uncached,(AccessLength_WORD - byte),memval,memval1,paddr,vaddr,isREAL);
2758 000000000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
2764 // start-sanitize-r5900
2766 // end-sanitize-r5900
2768 // start-sanitize-tx19
2770 // end-sanitize-tx19
2772 SyncOperation (STYPE);
2776 000000,20.CODE,001100:SPECIAL:32::SYSCALL
2782 // start-sanitize-r5900
2784 // end-sanitize-r5900
2786 // start-sanitize-tx19
2788 // end-sanitize-tx19
2790 SignalException(SystemCall, instruction_0);
2794 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
2799 // start-sanitize-r5900
2801 // end-sanitize-r5900
2803 // start-sanitize-tx19
2805 // end-sanitize-tx19
2807 if (GPR[RS] == GPR[RT])
2808 SignalException(Trap, instruction_0);
2812 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
2813 "teqi r<RS>, <IMMEDIATE>"
2817 // start-sanitize-r5900
2819 // end-sanitize-r5900
2821 // start-sanitize-tx19
2823 // end-sanitize-tx19
2825 if (GPR[RS] == EXTEND16 (IMMEDIATE))
2826 SignalException(Trap, instruction_0);
2830 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
2835 // start-sanitize-r5900
2837 // end-sanitize-r5900
2839 // start-sanitize-tx19
2841 // end-sanitize-tx19
2843 if (GPR[RS] >= GPR[RT])
2844 SignalException(Trap, instruction_0);
2848 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
2849 "tgei r<RS>, <IMMEDIATE>"
2853 // start-sanitize-r5900
2855 // end-sanitize-r5900
2857 // start-sanitize-tx19
2859 // end-sanitize-tx19
2861 if (GPR[RS] >= EXTEND16 (IMMEDIATE))
2862 SignalException(Trap, instruction_0);
2866 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
2867 "tgeiu r<RS>, <IMMEDIATE>"
2871 // start-sanitize-r5900
2873 // end-sanitize-r5900
2875 // start-sanitize-tx19
2877 // end-sanitize-tx19
2879 if ((unsigned_word) GPR[RS] >= (unsigned_word) EXTEND16 (IMMEDIATE))
2880 SignalException(Trap, instruction_0);
2884 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
2889 // start-sanitize-r5900
2891 // end-sanitize-r5900
2893 // start-sanitize-tx19
2895 // end-sanitize-tx19
2897 if ((unsigned_word) GPR[RS] >= (unsigned_word) GPR[RT])
2898 SignalException(Trap, instruction_0);
2902 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
2907 // start-sanitize-r5900
2909 // end-sanitize-r5900
2911 // start-sanitize-tx19
2913 // end-sanitize-tx19
2915 if (GPR[RS] < GPR[RT])
2916 SignalException(Trap, instruction_0);
2920 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
2921 "tlti r<RS>, <IMMEDIATE>"
2925 // start-sanitize-r5900
2927 // end-sanitize-r5900
2929 // start-sanitize-tx19
2931 // end-sanitize-tx19
2933 if (GPR[RS] < EXTEND16 (IMMEDIATE))
2934 SignalException(Trap, instruction_0);
2938 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
2939 "tltiu r<RS>, <IMMEDIATE>"
2943 // start-sanitize-r5900
2945 // end-sanitize-r5900
2947 // start-sanitize-tx19
2949 // end-sanitize-tx19
2951 if ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE))
2952 SignalException(Trap, instruction_0);
2956 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
2961 // start-sanitize-r5900
2963 // end-sanitize-r5900
2965 // start-sanitize-tx19
2967 // end-sanitize-tx19
2969 if ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT])
2970 SignalException(Trap, instruction_0);
2974 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
2979 // start-sanitize-r5900
2981 // end-sanitize-r5900
2983 // start-sanitize-tx19
2985 // end-sanitize-tx19
2987 if (GPR[RS] != GPR[RT])
2988 SignalException(Trap, instruction_0);
2992 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
2993 "tne r<RS>, <IMMEDIATE>"
2997 // start-sanitize-r5900
2999 // end-sanitize-r5900
3001 // start-sanitize-tx19
3003 // end-sanitize-tx19
3005 if (GPR[RS] != EXTEND16 (IMMEDIATE))
3006 SignalException(Trap, instruction_0);
3010 000000,5.RS,5.RT,5.RD,00000100110:SPECIAL:32::XOR
3011 "xor r<RD>, r<RS>, r<RT>"
3016 // start-sanitize-r5900
3018 // end-sanitize-r5900
3020 // start-sanitize-tx19
3022 // end-sanitize-tx19
3024 GPR[RD] = GPR[RS] ^ GPR[RT];
3028 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
3029 "xori r<RT>, r<RS>, <IMMEDIATE>"
3034 // start-sanitize-r5900
3036 // end-sanitize-r5900
3038 // start-sanitize-tx19
3040 // end-sanitize-tx19
3042 GPR[RT] = GPR[RS] ^ IMMEDIATE;
3047 // MIPS Architecture:
3049 // FPU Instruction Set (COP1 & COP1X)
3057 case fmt_single: return "s";
3058 case fmt_double: return "d";
3059 case fmt_word: return "w";
3060 case fmt_long: return "l";
3061 default: return "?";
3085 case 00: return "f";
3086 case 01: return "un";
3087 case 02: return "eq";
3088 case 03: return "ueq";
3089 case 04: return "olt";
3090 case 05: return "ult";
3091 case 06: return "ole";
3092 case 07: return "ule";
3093 case 010: return "sf";
3094 case 011: return "ngle";
3095 case 012: return "seq";
3096 case 013: return "ngl";
3097 case 014: return "lt";
3098 case 015: return "nge";
3099 case 016: return "le";
3100 case 017: return "ngt";
3101 default: return "?";
3106 010001,10,3.FMT,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
3107 "abs.%s<FMT> f<FD>, f<FS>"
3112 // start-sanitize-r5900
3114 // end-sanitize-r5900
3116 // start-sanitize-tx19
3118 // end-sanitize-tx19
3120 unsigned32 instruction = instruction_0;
3121 int destreg = ((instruction >> 6) & 0x0000001F);
3122 int fs = ((instruction >> 11) & 0x0000001F);
3123 int format = ((instruction >> 21) & 0x00000007);
3125 if ((format != fmt_single) && (format != fmt_double))
3126 SignalException(ReservedInstruction,instruction);
3128 StoreFPR(destreg,format,AbsoluteValue(ValueFPR(fs,format),format));
3135 010001,10,3.FMT,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD
3136 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
3141 // start-sanitize-r5900
3143 // end-sanitize-r5900
3145 // start-sanitize-tx19
3147 // end-sanitize-tx19
3149 unsigned32 instruction = instruction_0;
3150 int destreg = ((instruction >> 6) & 0x0000001F);
3151 int fs = ((instruction >> 11) & 0x0000001F);
3152 int ft = ((instruction >> 16) & 0x0000001F);
3153 int format = ((instruction >> 21) & 0x00000007);
3155 if ((format != fmt_single) && (format != fmt_double))
3156 SignalException(ReservedInstruction, instruction);
3158 StoreFPR(destreg,format,Add(ValueFPR(fs,format),ValueFPR(ft,format),format));
3164 // FIXME: This does not correctly resolve mipsI-mipsIV differences.
3170 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3171 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
3172 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
3177 // start-sanitize-r5900
3179 // end-sanitize-r5900
3181 // start-sanitize-tx19
3183 // end-sanitize-tx19
3185 unsigned32 instruction = instruction_0;
3186 signed_word offset = SIGNEXTEND((signed_word)(((instruction >> 0) & 0x0000FFFF) << 2),18);
3187 int boolean = ((instruction >> 16) & 0x00000001);
3188 int likely = ((instruction >> 17) & 0x00000001);
3189 int condition_code = ((instruction >> 18) & 0x00000007);
3191 if (condition_code != 0)
3192 SignalException(ReservedInstruction,instruction);
3194 int condition = (PREVCOC1() == boolean);
3195 /* NOTE: The branch occurs AFTER the next instruction has been executed */
3197 DELAY_SLOT (PC + offset);
3200 NULLIFY_NEXT_INSTRUCTION ();
3208 // FIXME: This does not correctly differentiate between mips*
3210 010001,10,3.FMT,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32::C.cond.fmt
3211 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
3212 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
3217 // start-sanitize-r5900
3219 // end-sanitize-r5900
3221 // start-sanitize-tx19
3223 // end-sanitize-tx19
3225 unsigned32 instruction = instruction_0;
3226 int cmpflags = ((instruction >> 0) & 0x0000000F);
3227 int condition_code = ((instruction >> 8) & 0x00000007);
3228 int fs = ((instruction >> 11) & 0x0000001F);
3229 int ft = ((instruction >> 16) & 0x0000001F);
3230 int format = ((instruction >> 21) & 0x00000007);
3231 if (condition_code != 0)
3233 SignalException(ReservedInstruction,instruction);
3237 if ((format != fmt_single) && (format != fmt_double))
3238 SignalException(ReservedInstruction,instruction);
3240 if (condition_code != 0)
3241 SignalException(ReservedInstruction,instruction);
3248 unsigned64 ofs = ValueFPR(fs,format);
3249 unsigned64 oft = ValueFPR(ft,format);
3250 if (NaN(ofs,format) || NaN(oft,format)) {
3251 if (FCSR & FP_ENABLE(IO)) {
3252 FCSR |= FP_CAUSE(IO);
3253 SignalExceptionFPE();
3257 less = Less(ofs,oft,format);
3258 equal = Equal(ofs,oft,format);
3262 int condition = (((cmpflags & (1 << 2)) && less) || ((cmpflags & (1 << 1)) && equal) || ((cmpflags & (1 << 0)) && unordered));
3263 SETFCC(condition_code,condition);
3271 010001,10,3.FMT,00000,5.FS,5.FD,001010:COP1:64::CEIL.L.fmt
3272 "ceil.l.%s<FMT> f<FD>, f<FS>"
3275 // start-sanitize-r5900
3277 // end-sanitize-r5900
3279 // start-sanitize-tx19
3281 // end-sanitize-tx19
3283 unsigned32 instruction = instruction_0;
3284 int destreg = ((instruction >> 6) & 0x0000001F);
3285 int fs = ((instruction >> 11) & 0x0000001F);
3286 int format = ((instruction >> 21) & 0x00000007);
3288 if ((format != fmt_single) && (format != fmt_double))
3289 SignalException(ReservedInstruction,instruction);
3291 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_long));
3296 010001,10,3.FMT,00000,5.FS,5.FD,001110:COP1:32::CEIL.W
3300 // start-sanitize-r5900
3302 // end-sanitize-r5900
3304 // start-sanitize-tx19
3306 // end-sanitize-tx19
3308 unsigned32 instruction = instruction_0;
3309 int destreg = ((instruction >> 6) & 0x0000001F);
3310 int fs = ((instruction >> 11) & 0x0000001F);
3311 int format = ((instruction >> 21) & 0x00000007);
3313 if ((format != fmt_single) && (format != fmt_double))
3314 SignalException(ReservedInstruction,instruction);
3316 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_word));
3323 01000100,x,10,kkkkk,vvvvv,00000000000:COP1S:32::CxC1
3328 // start-sanitize-r5900
3330 // end-sanitize-r5900
3332 // start-sanitize-tx19
3334 // end-sanitize-tx19
3336 unsigned32 instruction = instruction_0;
3337 int fs = ((instruction >> 11) & 0x0000001F);
3338 int ft = ((instruction >> 16) & 0x0000001F);
3339 int to = ((instruction >> 23) & 0x00000001);
3343 PENDING_FILL((fs + FCR0IDX),VL4_8(GPR[ft]));
3344 } else if (fs == 31) {
3345 PENDING_FILL((fs + FCR31IDX),VL4_8(GPR[ft]));
3347 PENDING_FILL(COCIDX,0); /* special case */
3348 } else { /* control from */
3350 PENDING_FILL(ft,SIGNEXTEND(FCR0,32));
3351 } else if (fs == 31) {
3352 PENDING_FILL(ft,SIGNEXTEND(FCR31,32));
3360 // FIXME: Does not correctly differentiate between mips*
3362 010001,10,3.FMT,00000,5.FS,5.FD,100001:COP1:32::CVT.D.fmt
3363 "cvt.d.%s<FMT> f<FD>, f<FS>"
3368 // start-sanitize-r5900
3370 // end-sanitize-r5900
3372 // start-sanitize-tx19
3374 // end-sanitize-tx19
3376 unsigned32 instruction = instruction_0;
3377 int destreg = ((instruction >> 6) & 0x0000001F);
3378 int fs = ((instruction >> 11) & 0x0000001F);
3379 int format = ((instruction >> 21) & 0x00000007);
3381 if ((format == fmt_double) | 0)
3382 SignalException(ReservedInstruction,instruction);
3384 StoreFPR(destreg,fmt_double,Convert(GETRM(),ValueFPR(fs,format),format,fmt_double));
3389 010001,10,3.FMT,00000,5.FS,5.FD,100101:COP1:64::CVT.L.fmt
3390 "cvt.l.%s<FMT> f<FD>, f<FS>"
3393 // start-sanitize-r5900
3395 // end-sanitize-r5900
3397 // start-sanitize-tx19
3399 // end-sanitize-tx19
3401 unsigned32 instruction = instruction_0;
3402 int destreg = ((instruction >> 6) & 0x0000001F);
3403 int fs = ((instruction >> 11) & 0x0000001F);
3404 int format = ((instruction >> 21) & 0x00000007);
3406 if ((format == fmt_long) | ((format == fmt_long) || (format == fmt_word)))
3407 SignalException(ReservedInstruction,instruction);
3409 StoreFPR(destreg,fmt_long,Convert(GETRM(),ValueFPR(fs,format),format,fmt_long));
3415 // FIXME: Does not correctly differentiate between mips*
3417 010001,10,3.FMT,00000,5.FS,5.FD,100000:COP1:32::CVT.S.fmt
3418 "cvt.s.%s<FMT> f<FD>, f<FS>"
3423 // start-sanitize-r5900
3425 // end-sanitize-r5900
3427 // start-sanitize-tx19
3429 // end-sanitize-tx19
3431 unsigned32 instruction = instruction_0;
3432 int destreg = ((instruction >> 6) & 0x0000001F);
3433 int fs = ((instruction >> 11) & 0x0000001F);
3434 int format = ((instruction >> 21) & 0x00000007);
3436 if ((format == fmt_single) | 0)
3437 SignalException(ReservedInstruction,instruction);
3439 StoreFPR(destreg,fmt_single,Convert(GETRM(),ValueFPR(fs,format),format,fmt_single));
3444 010001,10,3.FMT,00000,5.FS,5.FD,100100:COP1:32::CVT.W.fmt
3445 "cvt.w.%s<FMT> f<FD>, f<FS>"
3450 // start-sanitize-r5900
3452 // end-sanitize-r5900
3454 // start-sanitize-tx19
3456 // end-sanitize-tx19
3458 unsigned32 instruction = instruction_0;
3459 int destreg = ((instruction >> 6) & 0x0000001F);
3460 int fs = ((instruction >> 11) & 0x0000001F);
3461 int format = ((instruction >> 21) & 0x00000007);
3463 if ((format == fmt_word) | ((format == fmt_long) || (format == fmt_word)))
3464 SignalException(ReservedInstruction,instruction);
3466 StoreFPR(destreg,fmt_word,Convert(GETRM(),ValueFPR(fs,format),format,fmt_word));
3471 010001,10,3.FMT,5.FT,5.FS,5.FD,000011:COP1:32::DIV.fmt
3472 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
3477 // start-sanitize-r5900
3479 // end-sanitize-r5900
3481 // start-sanitize-tx19
3483 // end-sanitize-tx19
3485 unsigned32 instruction = instruction_0;
3486 int destreg = ((instruction >> 6) & 0x0000001F);
3487 int fs = ((instruction >> 11) & 0x0000001F);
3488 int ft = ((instruction >> 16) & 0x0000001F);
3489 int format = ((instruction >> 21) & 0x00000007);
3491 if ((format != fmt_single) && (format != fmt_double))
3492 SignalException(ReservedInstruction,instruction);
3494 StoreFPR(destreg,format,Divide(ValueFPR(fs,format),ValueFPR(ft,format),format));
3501 01000100,x,01,5.FT,vvvvv,00000000000:COP1S:64::DMxC1
3504 // start-sanitize-r5900
3506 // end-sanitize-r5900
3508 // start-sanitize-tx19
3510 // end-sanitize-tx19
3512 unsigned32 instruction = instruction_0;
3513 int fs = ((instruction >> 11) & 0x0000001F);
3514 int ft = ((instruction >> 16) & 0x0000001F);
3515 int to = ((instruction >> 23) & 0x00000001);
3518 if (SizeFGR() == 64) {
3519 PENDING_FILL((fs + FGRIDX),GPR[ft]);
3521 if ((fs & 0x1) == 0)
3523 PENDING_FILL(((fs + 1) + FGRIDX),VH4_8(GPR[ft]));
3524 PENDING_FILL((fs + FGRIDX),VL4_8(GPR[ft]));
3527 if (SizeFGR() == 64) {
3528 PENDING_FILL(ft,FGR[fs]);
3530 if ((fs & 0x1) == 0) {
3531 PENDING_FILL(ft,(SET64HI(FGR[fs+1]) | FGR[fs]));
3533 PENDING_FILL(ft,SET64HI(0xDEADC0DE) | 0xBAD0BAD0);
3540 010001,10,3.FMT,00000,5.FS,5.FD,001011:COP1:64::FLOOR.L.fmt
3541 "floor.l.%s<FMT> f<FD>, f<FS>"
3544 // start-sanitize-r5900
3546 // end-sanitize-r5900
3548 // start-sanitize-tx19
3550 // end-sanitize-tx19
3552 unsigned32 instruction = instruction_0;
3553 int destreg = ((instruction >> 6) & 0x0000001F);
3554 int fs = ((instruction >> 11) & 0x0000001F);
3555 int format = ((instruction >> 21) & 0x00000007);
3557 if ((format != fmt_single) && (format != fmt_double))
3558 SignalException(ReservedInstruction,instruction);
3560 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_long));
3565 010001,10,3.FMT,00000,5.FS,5.FD,001111:COP1:32::FLOOR.W.fmt
3566 "floor.w.%s<FMT> f<FD>, f<FS>"
3570 // start-sanitize-r5900
3572 // end-sanitize-r5900
3574 // start-sanitize-tx19
3576 // end-sanitize-tx19
3578 unsigned32 instruction = instruction_0;
3579 int destreg = ((instruction >> 6) & 0x0000001F);
3580 int fs = ((instruction >> 11) & 0x0000001F);
3581 int format = ((instruction >> 21) & 0x00000007);
3583 if ((format != fmt_single) && (format != fmt_double))
3584 SignalException(ReservedInstruction,instruction);
3586 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_word));
3592 110101,5.BASE,5.FT,16.OFFSET:COP1:32::LDC1
3595 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64::LDXC1
3596 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
3598 // start-sanitize-r5900
3600 // end-sanitize-r5900
3602 unsigned32 instruction = instruction_0;
3603 int destreg = ((instruction >> 6) & 0x0000001F);
3604 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
3605 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3607 address_word vaddr = ((unsigned64)op1 + op2);
3610 if ((vaddr & 7) != 0)
3611 SignalExceptionAddressLoad();
3614 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
3616 unsigned64 memval = 0;
3617 unsigned64 memval1 = 0;
3618 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
3619 COP_LD(1,destreg,memval);;
3627 110001,5.BASE,5.FT,16.OFFSET:COP1:32::LWC1
3630 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32::LWXC1
3631 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
3633 // start-sanitize-r5900
3635 // end-sanitize-r5900
3637 unsigned32 instruction = instruction_0;
3638 int destreg = ((instruction >> 6) & 0x0000001F);
3639 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
3640 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3642 address_word vaddr = ((unsigned64)op1 + op2);
3645 if ((vaddr & 3) != 0)
3646 SignalExceptionAddressLoad();
3649 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
3651 unsigned64 memval = 0;
3652 unsigned64 memval1 = 0;
3653 unsigned64 mask = 0x7;
3654 unsigned int shift = 2;
3655 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
3656 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
3658 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
3659 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
3660 byte = ((vaddr & mask) ^ (bigend << shift));
3661 COP_LW(1,destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
3670 // FIXME: Not correct for mips*
3672 010011,5.FR,5.FT,5.FS,5.FD,100,001:COP1X:32::MADD.D
3673 "madd.d f<FD>, f<FR>, f<FS>, f<FT>"
3675 // start-sanitize-r5900
3677 // end-sanitize-r5900
3679 unsigned32 instruction = instruction_0;
3680 int destreg = ((instruction >> 6) & 0x0000001F);
3681 int fs = ((instruction >> 11) & 0x0000001F);
3682 int ft = ((instruction >> 16) & 0x0000001F);
3683 int fr = ((instruction >> 21) & 0x0000001F);
3685 StoreFPR(destreg,fmt_double,Add(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
3690 010011,5.FR,5.FT,5.FS,5.FD,100,000:COP1X:32::MADD.S
3691 "madd.s f<FD>, f<FR>, f<FS>, f<FT>"
3693 // start-sanitize-r5900
3695 // end-sanitize-r5900
3697 unsigned32 instruction = instruction_0;
3698 int destreg = ((instruction >> 6) & 0x0000001F);
3699 int fs = ((instruction >> 11) & 0x0000001F);
3700 int ft = ((instruction >> 16) & 0x0000001F);
3701 int fr = ((instruction >> 21) & 0x0000001F);
3703 StoreFPR(destreg,fmt_single,Add(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
3709 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
3710 "m<X>c1 r<RT>, f<FS>"
3715 // start-sanitize-r5900
3717 // end-sanitize-r5900
3719 // start-sanitize-tx19
3721 // end-sanitize-tx19
3723 unsigned32 instruction = instruction_0;
3724 int fs = ((instruction >> 11) & 0x0000001F);
3725 int ft = ((instruction >> 16) & 0x0000001F);
3726 int to = ((instruction >> 23) & 0x00000001);
3729 if (SizeFGR() == 64) {
3730 PENDING_FILL ((fs + FGRIDX), (SET64HI(0xDEADC0DE) | VL4_8(GPR[ft])));
3732 PENDING_FILL ((fs + FGRIDX), VL4_8(GPR[ft]));
3735 PENDING_FILL (ft, SIGNEXTEND(FGR[fs],32));
3741 010001,10,3.FMT,00000,5.FS,5.FD,000110:COP1:32::MOV.fmt
3742 "mov.%s<FMT> f<FD>, f<FS>"
3747 // start-sanitize-r5900
3749 // end-sanitize-r5900
3751 // start-sanitize-tx19
3753 // end-sanitize-tx19
3755 unsigned32 instruction = instruction_0;
3756 int destreg = ((instruction >> 6) & 0x0000001F);
3757 int fs = ((instruction >> 11) & 0x0000001F);
3758 int format = ((instruction >> 21) & 0x00000007);
3760 StoreFPR(destreg,format,ValueFPR(fs,format));
3766 000000,5.RS,3.CC,0,1.TF,5.RD,00000000001:SPECIAL:32::MOVtf
3767 "mov%s<TF> r<RD>, r<RS>, <CC>"
3769 // start-sanitize-r5900
3771 // end-sanitize-r5900
3773 if (GETFCC(CC) == TF)
3779 010001,10,3.FMT,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32::MOVtf.fmt
3780 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
3782 // start-sanitize-r5900
3784 // end-sanitize-r5900
3786 unsigned32 instruction = instruction_0;
3787 int format = ((instruction >> 21) & 0x00000007);
3789 if (GETFCC(CC) == TF)
3790 StoreFPR (FD, format, ValueFPR (FS, format));
3792 StoreFPR (FD, format, ValueFPR (FD, format));
3797 010001,10,3.FMT,5.RT,5.FS,5.FD,010011:COP1:32::MOVN.fmt
3799 // start-sanitize-r5900
3801 // end-sanitize-r5900
3803 unsigned32 instruction = instruction_0;
3804 int destreg = ((instruction >> 6) & 0x0000001F);
3805 int fs = ((instruction >> 11) & 0x0000001F);
3806 int format = ((instruction >> 21) & 0x00000007);
3808 StoreFPR(destreg,format,ValueFPR(fs,format));
3816 // MOVT.fmt see MOVtf.fmt
3820 010001,10,3.FMT,5.RT,5.FS,5.FD,010010:COP1:32::MOVZ.fmt
3821 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
3823 // start-sanitize-r5900
3825 // end-sanitize-r5900
3827 unsigned32 instruction = instruction_0;
3828 int destreg = ((instruction >> 6) & 0x0000001F);
3829 int fs = ((instruction >> 11) & 0x0000001F);
3830 int format = ((instruction >> 21) & 0x00000007);
3832 StoreFPR(destreg,format,ValueFPR(fs,format));
3838 010011,5.FR,5.FT,5.FS,5.FD,101,001:COP1X:32::MSUB.D
3839 "msub.d f<FD>, f<FR>, f<FS>, f<FT>"
3841 // start-sanitize-r5900
3843 // end-sanitize-r5900
3845 unsigned32 instruction = instruction_0;
3846 int destreg = ((instruction >> 6) & 0x0000001F);
3847 int fs = ((instruction >> 11) & 0x0000001F);
3848 int ft = ((instruction >> 16) & 0x0000001F);
3849 int fr = ((instruction >> 21) & 0x0000001F);
3851 StoreFPR(destreg,fmt_double,(Sub(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double),fmt_double));
3857 010011,5.FR,5.FT,5.FS,5.FD,101000:COP1X:32::MSUB.S
3858 "msub.s f<FD>, f<FR>, f<FS>, f<FT>"
3860 // start-sanitize-r5900
3862 // end-sanitize-r5900
3864 unsigned32 instruction = instruction_0;
3865 int destreg = ((instruction >> 6) & 0x0000001F);
3866 int fs = ((instruction >> 11) & 0x0000001F);
3867 int ft = ((instruction >> 16) & 0x0000001F);
3868 int fr = ((instruction >> 21) & 0x0000001F);
3870 StoreFPR(destreg,fmt_single,(Sub(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single),fmt_single));
3878 010001,10,3.FMT,5.FT,5.FS,5.FD,000010:COP1:32::MUL.fmt
3879 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
3884 // start-sanitize-r5900
3886 // end-sanitize-r5900
3888 // start-sanitize-tx19
3890 // end-sanitize-tx19
3892 unsigned32 instruction = instruction_0;
3893 int destreg = ((instruction >> 6) & 0x0000001F);
3894 int fs = ((instruction >> 11) & 0x0000001F);
3895 int ft = ((instruction >> 16) & 0x0000001F);
3896 int format = ((instruction >> 21) & 0x00000007);
3898 if ((format != fmt_single) && (format != fmt_double))
3899 SignalException(ReservedInstruction,instruction);
3901 StoreFPR(destreg,format,Multiply(ValueFPR(fs,format),ValueFPR(ft,format),format));
3906 010001,10,3.FMT,00000,5.FS,5.FD,000111:COP1:32::NEG.fmt
3907 "neg.%s<FMT> f<FD>, f<FS>"
3912 // start-sanitize-r5900
3914 // end-sanitize-r5900
3916 // start-sanitize-tx19
3918 // end-sanitize-tx19
3920 unsigned32 instruction = instruction_0;
3921 int destreg = ((instruction >> 6) & 0x0000001F);
3922 int fs = ((instruction >> 11) & 0x0000001F);
3923 int format = ((instruction >> 21) & 0x00000007);
3925 if ((format != fmt_single) && (format != fmt_double))
3926 SignalException(ReservedInstruction,instruction);
3928 StoreFPR(destreg,format,Negate(ValueFPR(fs,format),format));
3934 010011,5.FR,5.FT,5.FS,5.FD,110001:COP1X:32::NMADD.D
3935 "nmadd.d f<FD>, f<FR>, f<FS>, f<FT>"
3938 unsigned32 instruction = instruction_0;
3939 int destreg = ((instruction >> 6) & 0x0000001F);
3940 int fs = ((instruction >> 11) & 0x0000001F);
3941 int ft = ((instruction >> 16) & 0x0000001F);
3942 int fr = ((instruction >> 21) & 0x0000001F);
3944 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));
3950 010011,5.FR,5.FT,5.FS,5.FD,110000:COP1X:32::NMADD.S
3951 "nmadd.s f<FD>, f<FR>, f<FS>, f<FT>"
3954 unsigned32 instruction = instruction_0;
3955 int destreg = ((instruction >> 6) & 0x0000001F);
3956 int fs = ((instruction >> 11) & 0x0000001F);
3957 int ft = ((instruction >> 16) & 0x0000001F);
3958 int fr = ((instruction >> 21) & 0x0000001F);
3960 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));
3966 010011,5.FR,5.FT,5.FS,5.FD,111001:COP1X:32::NMSUB.D
3967 "nmsub.d f<FD>, f<FR>, f<FS>, f<FT>"
3970 unsigned32 instruction = instruction_0;
3971 int destreg = ((instruction >> 6) & 0x0000001F);
3972 int fs = ((instruction >> 11) & 0x0000001F);
3973 int ft = ((instruction >> 16) & 0x0000001F);
3974 int fr = ((instruction >> 21) & 0x0000001F);
3976 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));
3982 010011,5.FR,5.FT,5.FS,5.FD,111000:COP1X:32::NMSUB.S
3983 "nmsub.s f<FD>, f<FR>, f<FS>, f<FT>"
3986 unsigned32 instruction = instruction_0;
3987 int destreg = ((instruction >> 6) & 0x0000001F);
3988 int fs = ((instruction >> 11) & 0x0000001F);
3989 int ft = ((instruction >> 16) & 0x0000001F);
3990 int fr = ((instruction >> 21) & 0x0000001F);
3992 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));
3997 010011,5.BASE,5.INDEX,5.HINT,00000001111:COP1X:32::PREFX
3998 "prefx <HINT>, r<INDEX>(r<BASE>)"
4001 unsigned32 instruction = instruction_0;
4002 int fs = ((instruction >> 11) & 0x0000001F);
4003 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4004 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4006 address_word vaddr = ((unsigned64)op1 + (unsigned64)op2);
4009 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4010 Prefetch(uncached,paddr,vaddr,isDATA,fs);
4014 010001,10,3.FMT,00000,5.FS,5.FD,010101:COP1:32::RECIP.fmt
4016 "recip.%s<FMT> f<FD>, f<FS>"
4018 unsigned32 instruction = instruction_0;
4019 int destreg = ((instruction >> 6) & 0x0000001F);
4020 int fs = ((instruction >> 11) & 0x0000001F);
4021 int format = ((instruction >> 21) & 0x00000007);
4023 if ((format != fmt_single) && (format != fmt_double))
4024 SignalException(ReservedInstruction,instruction);
4026 StoreFPR(destreg,format,Recip(ValueFPR(fs,format),format));
4031 010001,10,3.FMT,00000,5.FS,5.FD,001000:COP1:64::ROUND.L.fmt
4032 "round.l.%s<FMT> f<FD>, f<FS>"
4035 // start-sanitize-r5900
4037 // end-sanitize-r5900
4039 // start-sanitize-tx19
4041 // end-sanitize-tx19
4043 unsigned32 instruction = instruction_0;
4044 int destreg = ((instruction >> 6) & 0x0000001F);
4045 int fs = ((instruction >> 11) & 0x0000001F);
4046 int format = ((instruction >> 21) & 0x00000007);
4048 if ((format != fmt_single) && (format != fmt_double))
4049 SignalException(ReservedInstruction,instruction);
4051 StoreFPR(destreg,fmt_long,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_long));
4056 010001,10,3.FMT,00000,5.FS,5.FD,001100:COP1:32::ROUND.W.fmt
4057 "round.w.%s<FMT> f<FD>, f<FS>"
4061 // start-sanitize-r5900
4063 // end-sanitize-r5900
4065 // start-sanitize-tx19
4067 // end-sanitize-tx19
4069 unsigned32 instruction = instruction_0;
4070 int destreg = ((instruction >> 6) & 0x0000001F);
4071 int fs = ((instruction >> 11) & 0x0000001F);
4072 int format = ((instruction >> 21) & 0x00000007);
4074 if ((format != fmt_single) && (format != fmt_double))
4075 SignalException(ReservedInstruction,instruction);
4077 StoreFPR(destreg,fmt_word,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_word));
4082 010001,10,3.FMT,00000,5.FS,5.FD,010110:COP1:32::RSQRT.fmt
4084 "rsqrt.%s<FMT> f<FD>, f<FS>"
4086 unsigned32 instruction = instruction_0;
4087 int destreg = ((instruction >> 6) & 0x0000001F);
4088 int fs = ((instruction >> 11) & 0x0000001F);
4089 int format = ((instruction >> 21) & 0x00000007);
4091 if ((format != fmt_single) && (format != fmt_double))
4092 SignalException(ReservedInstruction,instruction);
4094 StoreFPR(destreg,format,Recip(SquareRoot(ValueFPR(fs,format),format),format));
4102 010011,5.RS,5.RT,vvvvv,00000001001:COP1X:64::SDXC1
4104 // start-sanitize-r5900
4106 // end-sanitize-r5900
4108 unsigned32 instruction = instruction_0;
4109 int fs = ((instruction >> 11) & 0x0000001F);
4110 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4111 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4113 address_word vaddr = ((unsigned64)op1 + op2);
4116 if ((vaddr & 7) != 0)
4117 SignalExceptionAddressStore();
4120 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
4122 unsigned64 memval = 0;
4123 unsigned64 memval1 = 0;
4124 memval = (unsigned64)COP_SD(1,fs);
4126 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
4134 010001,10,3.FMT,00000,5.FS,5.FD,000100:COP1:32::SQRT.fmt
4135 "sqrt.%s<FMT> f<FD>, f<FS>"
4139 // start-sanitize-r5900
4141 // end-sanitize-r5900
4143 // start-sanitize-tx19
4145 // end-sanitize-tx19
4147 unsigned32 instruction = instruction_0;
4148 int destreg = ((instruction >> 6) & 0x0000001F);
4149 int fs = ((instruction >> 11) & 0x0000001F);
4150 int format = ((instruction >> 21) & 0x00000007);
4152 if ((format != fmt_single) && (format != fmt_double))
4153 SignalException(ReservedInstruction,instruction);
4155 StoreFPR(destreg,format,(SquareRoot(ValueFPR(fs,format),format)));
4160 010001,10,3.FMT,5.FT,5.FS,5.FD,000001:COP1:32::SUB.fmt
4161 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
4166 // start-sanitize-r5900
4168 // end-sanitize-r5900
4170 // start-sanitize-tx19
4172 // end-sanitize-tx19
4174 unsigned32 instruction = instruction_0;
4175 int destreg = ((instruction >> 6) & 0x0000001F);
4176 int fs = ((instruction >> 11) & 0x0000001F);
4177 int ft = ((instruction >> 16) & 0x0000001F);
4178 int format = ((instruction >> 21) & 0x00000007);
4180 if ((format != fmt_single) && (format != fmt_double))
4181 SignalException(ReservedInstruction,instruction);
4183 StoreFPR(destreg,format,Sub(ValueFPR(fs,format),ValueFPR(ft,format),format));
4191 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32::SWXC1
4192 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
4194 // start-sanitize-r5900
4196 // end-sanitize-r5900
4198 unsigned32 instruction = instruction_0;
4199 int fs = ((instruction >> 11) & 0x0000001F);
4200 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4201 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4203 address_word vaddr = ((unsigned64)op1 + op2);
4206 if ((vaddr & 3) != 0)
4207 SignalExceptionAddressStore();
4210 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
4212 unsigned64 memval = 0;
4213 unsigned64 memval1 = 0;
4214 unsigned64 mask = 0x7;
4216 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
4217 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
4218 memval = (((unsigned64)COP_SW(1,fs)) << (8 * byte));
4220 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
4228 010001,10,3.FMT,00000,5.FS,5.FD,001001:COP1:64::TRUNC.L.fmt
4229 "trunc.l.%s<FMT> f<FD>, f<FS>"
4232 // start-sanitize-r5900
4234 // end-sanitize-r5900
4236 // start-sanitize-tx19
4238 // end-sanitize-tx19
4240 unsigned32 instruction = instruction_0;
4241 int destreg = ((instruction >> 6) & 0x0000001F);
4242 int fs = ((instruction >> 11) & 0x0000001F);
4243 int format = ((instruction >> 21) & 0x00000007);
4245 if ((format != fmt_single) && (format != fmt_double))
4246 SignalException(ReservedInstruction,instruction);
4248 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_long));
4253 010001,10,3.FMT,00000,5.FS,5.FD,001101:COP1:32::TRUNC.W
4254 "trunc.w.%s<FMT> f<FD>, f<FS>"
4258 // start-sanitize-r5900
4260 // end-sanitize-r5900
4262 // start-sanitize-tx19
4264 // end-sanitize-tx19
4266 unsigned32 instruction = instruction_0;
4267 int destreg = ((instruction >> 6) & 0x0000001F);
4268 int fs = ((instruction >> 11) & 0x0000001F);
4269 int format = ((instruction >> 21) & 0x00000007);
4271 if ((format != fmt_single) && (format != fmt_double))
4272 SignalException(ReservedInstruction,instruction);
4274 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_word));
4280 // MIPS Architecture:
4282 // System Control Instruction Set (COP0)
4286 010000,01000,00000,16.OFFSET:COP0:32::BC0F
4292 // start-sanitize-r5900
4294 // end-sanitize-r5900
4297 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
4303 // start-sanitize-r5900
4305 // end-sanitize-r5900
4308 010000,01000,00001,16.OFFSET:COP0:32::BC0T
4314 // start-sanitize-r5900
4316 // end-sanitize-r5900
4320 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
4326 // start-sanitize-r5900
4328 // end-sanitize-r5900
4331 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
4334 // start-sanitize-r5900
4336 // end-sanitize-r5900
4338 // start-sanitize-tx19
4340 // end-sanitize-tx19
4342 unsigned32 instruction = instruction_0;
4343 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
4344 int hint = ((instruction >> 16) & 0x0000001F);
4345 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4347 address_word vaddr = (op1 + offset);
4350 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4351 CacheOp(hint,vaddr,paddr,instruction);
4356 010000,10000,000000000000000,111001:COP0:32::DI
4362 // start-sanitize-r5900
4364 // end-sanitize-r5900
4367 010000,10000,000000000000000,111000:COP0:32::EI
4373 // start-sanitize-r5900
4375 // end-sanitize-r5900
4378 010000,10000,000000000000000,011000:COP0:32::ERET
4382 // start-sanitize-r5900
4384 // end-sanitize-r5900
4387 010000,00000,5.RT,5.RD,00000,6.REGX:COP0:32::MFC0
4388 "mfc0 r<RT>, r<RD> # <REGX>"
4393 // start-sanitize-r5900
4395 // end-sanitize-r5900
4398 010000,00100,5.RT,5.RD,00000,6.REGX:COP0:32::MTC0
4399 "mtc0 r<RT>, r<RD> # <REGX>"
4404 // start-sanitize-r5900
4406 // end-sanitize-r5900
4409 010000,10000,000000000000000,001000:COP0:32::TLBP
4415 // start-sanitize-r5900
4417 // end-sanitize-r5900
4420 010000,10000,000000000000000,000001:COP0:32::TLBR
4426 // start-sanitize-r5900
4428 // end-sanitize-r5900
4431 010000,10000,000000000000000,000010:COP0:32::TLBWI
4437 // start-sanitize-r5900
4439 // end-sanitize-r5900
4442 010000,10000,000000000000000,000110:COP0:32::TLBWR
4448 // start-sanitize-r5900
4450 // end-sanitize-r5900
4454 // MIPS Architecture:
4456 // CPU Instruction Set (mips16)
4459 // The instructions in this section are ordered according
4460 // to http://www.sgi.com/MIPS/arch/MIPS16/mips16.pdf.
4463 // FIXME: Instead of having the code for mips16 instructions here.
4464 // these instructions should instead call the corresponding 32bit
4465 // instruction (or a function implementing that instructions code).
4468 // Load and Store Instructions
4471 10000,xxx,ddd,55555:RRI:16::LB
4474 unsigned32 instruction = instruction_0;
4475 signed_word op1 = (instruction >> 8) & 0x7;
4476 int destreg = (instruction >> 5) & 0x7;
4477 int offset = (instruction >> 0) & 0x1f;
4485 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4486 if (offset >= 0x8000)
4494 SignalException (ReservedInstruction, instruction);
4496 address_word vaddr = ((unsigned64)op1 + offset);
4500 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4502 unsigned64 memval = 0;
4503 unsigned64 memval1 = 0;
4504 unsigned64 mask = 0x7;
4505 unsigned int shift = 0;
4506 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4507 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4509 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4510 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
4511 byte = ((vaddr & mask) ^ (bigend << shift));
4512 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x000000FF),8));
4519 10100,xxx,ddd,55555:RRI:16::LBU
4522 unsigned32 instruction = instruction_0;
4523 signed_word op1 = (instruction >> 8) & 0x7;
4524 int destreg = (instruction >> 5) & 0x7;
4525 int offset = (instruction >> 0) & 0x1f;
4533 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4534 if (offset >= 0x8000)
4542 SignalException (ReservedInstruction, instruction);
4544 address_word vaddr = ((unsigned64)op1 + offset);
4548 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4550 unsigned64 memval = 0;
4551 unsigned64 memval1 = 0;
4552 unsigned64 mask = 0x7;
4553 unsigned int shift = 0;
4554 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4555 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4557 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4558 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
4559 byte = ((vaddr & mask) ^ (bigend << shift));
4560 GPR[destreg] = (((memval >> (8 * byte)) & 0x000000FF));
4567 10001,xxx,ddd,HHHHH:RRI:16::LH
4570 unsigned32 instruction = instruction_0;
4571 signed_word op1 = (instruction >> 8) & 0x7;
4572 int destreg = (instruction >> 5) & 0x7;
4573 int offset = (instruction >> 0) & 0x1f;
4581 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4582 if (offset >= 0x8000)
4591 SignalException (ReservedInstruction, instruction);
4593 address_word vaddr = ((unsigned64)op1 + offset);
4596 if ((vaddr & 1) != 0)
4597 SignalExceptionAddressLoad();
4600 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4602 unsigned64 memval = 0;
4603 unsigned64 memval1 = 0;
4604 unsigned64 mask = 0x7;
4605 unsigned int shift = 1;
4606 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4607 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4609 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4610 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
4611 byte = ((vaddr & mask) ^ (bigend << shift));
4612 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x0000FFFF),16));
4619 10101,xxx,ddd,HHHHH:RRI:16::LHU
4622 unsigned32 instruction = instruction_0;
4623 signed_word op1 = (instruction >> 8) & 0x7;
4624 int destreg = (instruction >> 5) & 0x7;
4625 int offset = (instruction >> 0) & 0x1f;
4633 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4634 if (offset >= 0x8000)
4643 SignalException (ReservedInstruction, instruction);
4645 address_word vaddr = ((unsigned64)op1 + offset);
4648 if ((vaddr & 1) != 0)
4649 SignalExceptionAddressLoad();
4652 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4654 unsigned64 memval = 0;
4655 unsigned64 memval1 = 0;
4656 unsigned64 mask = 0x7;
4657 unsigned int shift = 1;
4658 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4659 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4661 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4662 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
4663 byte = ((vaddr & mask) ^ (bigend << shift));
4664 GPR[destreg] = (((memval >> (8 * byte)) & 0x0000FFFF));
4671 10011,xxx,ddd,WWWWW:RRI:16::LW
4674 unsigned32 instruction = instruction_0;
4675 signed_word op1 = (instruction >> 8) & 0x7;
4676 int destreg = (instruction >> 5) & 0x7;
4677 int offset = (instruction >> 0) & 0x1f;
4685 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4686 if (offset >= 0x8000)
4695 SignalException (ReservedInstruction, instruction);
4697 address_word vaddr = ((unsigned64)op1 + offset);
4700 if ((vaddr & 3) != 0)
4701 SignalExceptionAddressLoad();
4704 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4706 unsigned64 memval = 0;
4707 unsigned64 memval1 = 0;
4708 unsigned64 mask = 0x7;
4709 unsigned int shift = 2;
4710 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4711 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4713 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4714 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4715 byte = ((vaddr & mask) ^ (bigend << shift));
4716 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
4723 10110,ddd,VVVVVVVV,P:RI:16::LWPC
4726 unsigned32 instruction = instruction_0;
4727 int destreg = (instruction >> 8) & 0x7;
4728 int offset = (instruction >> 0) & 0xff;
4729 signed_word op1 = ((INDELAYSLOT () ? (INJALDELAYSLOT () ? IPC - 4 : IPC - 2) : (have_extendval ? IPC - 2 : IPC)) & ~ (unsigned64) 1) & ~ (unsigned64) 0x3;
4734 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4735 if (offset >= 0x8000)
4744 SignalException (ReservedInstruction, instruction);
4746 address_word vaddr = ((unsigned64)op1 + offset);
4749 if ((vaddr & 3) != 0)
4750 SignalExceptionAddressLoad();
4753 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4755 unsigned64 memval = 0;
4756 unsigned64 memval1 = 0;
4757 unsigned64 mask = 0x7;
4758 unsigned int shift = 2;
4759 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4760 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4762 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4763 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4764 byte = ((vaddr & mask) ^ (bigend << shift));
4765 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
4772 10010,ddd,VVVVVVVV,s:RI:16::LWSP
4775 unsigned32 instruction = instruction_0;
4776 int destreg = (instruction >> 8) & 0x7;
4777 int offset = (instruction >> 0) & 0xff;
4778 signed_word op1 = 29;
4783 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4784 if (offset >= 0x8000)
4794 SignalException (ReservedInstruction, instruction);
4796 address_word vaddr = ((unsigned64)op1 + offset);
4799 if ((vaddr & 3) != 0)
4800 SignalExceptionAddressLoad();
4803 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4805 unsigned64 memval = 0;
4806 unsigned64 memval1 = 0;
4807 unsigned64 mask = 0x7;
4808 unsigned int shift = 2;
4809 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4810 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4812 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4813 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4814 byte = ((vaddr & mask) ^ (bigend << shift));
4815 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
4822 10111,xxx,ddd,WWWWW:RRI:16::LWU
4825 unsigned32 instruction = instruction_0;
4826 signed_word op1 = (instruction >> 8) & 0x7;
4827 int destreg = (instruction >> 5) & 0x7;
4828 int offset = (instruction >> 0) & 0x1f;
4836 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4837 if (offset >= 0x8000)
4846 SignalException (ReservedInstruction, instruction);
4848 address_word vaddr = ((unsigned64)op1 + offset);
4851 if ((vaddr & 3) != 0)
4852 SignalExceptionAddressLoad();
4855 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4857 unsigned64 memval = 0;
4858 unsigned64 memval1 = 0;
4859 unsigned64 mask = 0x7;
4860 unsigned int shift = 2;
4861 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4862 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4864 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4865 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4866 byte = ((vaddr & mask) ^ (bigend << shift));
4867 GPR[destreg] = (((memval >> (8 * byte)) & 0xFFFFFFFF));
4874 00111,xxx,ddd,DDDDD:RRI:16::LD
4877 unsigned32 instruction = instruction_0;
4878 signed_word op1 = (instruction >> 8) & 0x7;
4879 int destreg = (instruction >> 5) & 0x7;
4880 int offset = (instruction >> 0) & 0x1f;
4888 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4889 if (offset >= 0x8000)
4898 SignalException (ReservedInstruction, instruction);
4900 address_word vaddr = ((unsigned64)op1 + offset);
4903 if ((vaddr & 7) != 0)
4904 SignalExceptionAddressLoad();
4907 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4909 unsigned64 memval = 0;
4910 unsigned64 memval1 = 0;
4911 unsigned64 mask = 0x7;
4912 unsigned int shift = 4;
4913 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4914 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4916 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4917 GPR[destreg] = memval;
4924 11111100,ddd,5.RD,P:RI64:16::LDPC
4927 unsigned32 instruction = instruction_0;
4928 int destreg = (instruction >> 5) & 0x7;
4929 int offset = (instruction >> 0) & 0x1f;
4930 signed_word op1 = ((INDELAYSLOT () ? (INJALDELAYSLOT () ? IPC - 4 : IPC - 2) : (have_extendval ? IPC - 2 : IPC)) & ~ (unsigned64) 1) & ~ (unsigned64) 0x7;
4935 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4936 if (offset >= 0x8000)
4945 SignalException (ReservedInstruction, instruction);
4947 address_word vaddr = ((unsigned64)op1 + offset);
4950 if ((vaddr & 7) != 0)
4951 SignalExceptionAddressLoad();
4954 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4956 unsigned64 memval = 0;
4957 unsigned64 memval1 = 0;
4958 unsigned64 mask = 0x7;
4959 unsigned int shift = 4;
4960 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4961 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4963 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4964 GPR[destreg] = memval;
4971 11111000,ddd,5.RD,s:RI64:16::LDSP
4974 unsigned32 instruction = instruction_0;
4975 int destreg = (instruction >> 5) & 0x7;
4976 int offset = (instruction >> 0) & 0x1f;
4977 signed_word op1 = 29;
4982 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
4983 if (offset >= 0x8000)
4993 SignalException (ReservedInstruction, instruction);
4995 address_word vaddr = ((unsigned64)op1 + offset);
4998 if ((vaddr & 7) != 0)
4999 SignalExceptionAddressLoad();
5002 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5004 unsigned64 memval = 0;
5005 unsigned64 memval1 = 0;
5006 unsigned64 mask = 0x7;
5007 unsigned int shift = 4;
5008 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
5009 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
5011 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
5012 GPR[destreg] = memval;
5019 11000,xxx,yyy,55555:RRI:16::SB
5022 unsigned32 instruction = instruction_0;
5023 signed_word op1 = (instruction >> 8) & 0x7;
5024 signed_word op2 = (instruction >> 5) & 0x7;
5025 int offset = (instruction >> 0) & 0x1f;
5034 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5035 if (offset >= 0x8000)
5043 SignalException (ReservedInstruction, instruction);
5045 address_word vaddr = ((unsigned64)op1 + offset);
5049 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5051 unsigned64 memval = 0;
5052 unsigned64 memval1 = 0;
5053 unsigned64 mask = 0x7;
5054 unsigned int shift = 0;
5055 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
5056 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
5058 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
5059 byte = ((vaddr & mask) ^ (bigend << shift));
5060 memval = ((unsigned64) op2 << (8 * byte));
5062 StoreMemory(uncached,AccessLength_BYTE,memval,memval1,paddr,vaddr,isREAL);
5070 11001,xxx,yyy,HHHHH:RRI:16::SH
5073 unsigned32 instruction = instruction_0;
5074 signed_word op1 = (instruction >> 8) & 0x7;
5075 signed_word op2 = (instruction >> 5) & 0x7;
5076 int offset = (instruction >> 0) & 0x1f;
5085 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5086 if (offset >= 0x8000)
5095 SignalException (ReservedInstruction, instruction);
5097 address_word vaddr = ((unsigned64)op1 + offset);
5100 if ((vaddr & 1) != 0)
5101 SignalExceptionAddressStore();
5104 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5106 unsigned64 memval = 0;
5107 unsigned64 memval1 = 0;
5108 unsigned64 mask = 0x7;
5109 unsigned int shift = 1;
5110 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
5111 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
5113 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
5114 byte = ((vaddr & mask) ^ (bigend << shift));
5115 memval = ((unsigned64) op2 << (8 * byte));
5117 StoreMemory(uncached,AccessLength_HALFWORD,memval,memval1,paddr,vaddr,isREAL);
5125 11011,xxx,yyy,WWWWW:RRI:16::SW
5128 unsigned32 instruction = instruction_0;
5129 signed_word op1 = (instruction >> 8) & 0x7;
5130 signed_word op2 = (instruction >> 5) & 0x7;
5131 int offset = (instruction >> 0) & 0x1f;
5140 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5141 if (offset >= 0x8000)
5150 SignalException (ReservedInstruction, instruction);
5152 address_word vaddr = ((unsigned64)op1 + offset);
5155 if ((vaddr & 3) != 0)
5156 SignalExceptionAddressStore();
5159 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5161 unsigned64 memval = 0;
5162 unsigned64 memval1 = 0;
5163 unsigned64 mask = 0x7;
5165 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
5166 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
5167 memval = ((unsigned64) op2 << (8 * byte));
5169 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5177 11010,yyy,VVVVVVVV,s:RI:16::SWSP
5180 unsigned32 instruction = instruction_0;
5181 signed_word op2 = (instruction >> 8) & 0x7;
5182 int offset = (instruction >> 0) & 0xff;
5183 signed_word op1 = 29;
5189 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5190 if (offset >= 0x8000)
5200 SignalException (ReservedInstruction, instruction);
5202 address_word vaddr = ((unsigned64)op1 + offset);
5205 if ((vaddr & 3) != 0)
5206 SignalExceptionAddressStore();
5209 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5211 unsigned64 memval = 0;
5212 unsigned64 memval1 = 0;
5213 unsigned64 mask = 0x7;
5215 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
5216 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
5217 memval = ((unsigned64) op2 << (8 * byte));
5219 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5227 01100010,VVVVVVVV,Q,s:I8:16::SWRASP
5230 unsigned32 instruction = instruction_0;
5231 int offset = (instruction >> 0) & 0xff;
5232 signed_word op2 = 31;
5233 signed_word op1 = 29;
5236 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5237 if (offset >= 0x8000)
5248 SignalException (ReservedInstruction, instruction);
5250 address_word vaddr = ((unsigned64)op1 + offset);
5253 if ((vaddr & 3) != 0)
5254 SignalExceptionAddressStore();
5257 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5259 unsigned64 memval = 0;
5260 unsigned64 memval1 = 0;
5261 unsigned64 mask = 0x7;
5263 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
5264 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
5265 memval = ((unsigned64) op2 << (8 * byte));
5267 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5275 01111,xxx,yyy,DDDDD:RRI:16::SD
5278 unsigned32 instruction = instruction_0;
5279 signed_word op1 = (instruction >> 8) & 0x7;
5280 signed_word op2 = (instruction >> 5) & 0x7;
5281 int offset = (instruction >> 0) & 0x1f;
5290 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5291 if (offset >= 0x8000)
5300 SignalException (ReservedInstruction, instruction);
5302 address_word vaddr = ((unsigned64)op1 + offset);
5305 if ((vaddr & 7) != 0)
5306 SignalExceptionAddressStore();
5309 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5311 unsigned64 memval = 0;
5312 unsigned64 memval1 = 0;
5315 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
5323 11111001,yyy,5.RD,s:RI64:16::SDSP
5326 unsigned32 instruction = instruction_0;
5327 signed_word op2 = (instruction >> 5) & 0x7;
5328 int offset = (instruction >> 0) & 0x1f;
5329 signed_word op1 = 29;
5335 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5336 if (offset >= 0x8000)
5346 SignalException (ReservedInstruction, instruction);
5348 address_word vaddr = ((unsigned64)op1 + offset);
5351 if ((vaddr & 7) != 0)
5352 SignalExceptionAddressStore();
5355 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5357 unsigned64 memval = 0;
5358 unsigned64 memval1 = 0;
5361 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
5369 11111010,CCCCCCCC,s,Q:I64:16::SDRASP
5372 unsigned32 instruction = instruction_0;
5373 int offset = (instruction >> 0) & 0xff;
5374 signed_word op1 = 29;
5375 signed_word op2 = 31;
5378 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5379 if (offset >= 0x8000)
5390 SignalException (ReservedInstruction, instruction);
5392 address_word vaddr = ((unsigned64)op1 + offset);
5395 if ((vaddr & 7) != 0)
5396 SignalExceptionAddressStore();
5399 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5401 unsigned64 memval = 0;
5402 unsigned64 memval1 = 0;
5405 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
5413 // ALU Immediate Instructions
5416 01101,ddd,UUUUUUUU,Z:RI:16::LI
5419 unsigned32 instruction = instruction_0;
5420 int destreg = (instruction >> 8) & 0x7;
5421 int op2 = (instruction >> 0) & 0xff;
5422 signed_word op1 = 0;
5427 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5434 SignalException (ReservedInstruction, instruction);
5437 GPR[destreg] = (op1 | op2);
5442 01000,xxx,ddd,04444:RRI_A:16::ADDIU
5445 unsigned32 instruction = instruction_0;
5446 signed_word op1 = (instruction >> 8) & 0x7;
5447 int destreg = (instruction >> 5) & 0x7;
5448 int op2 = (instruction >> 0) & 0xf;
5456 op2 |= ((extendval & 0xf) << 11) | (extendval & 0x7f0);
5467 SignalException (ReservedInstruction, instruction);
5469 unsigned int temp = (unsigned int)(op1 + op2);
5470 signed int tempS = (signed int)temp;
5471 GPR[destreg] = SIGNEXTEND(((unsigned64)temp),32);
5476 01001,www,kkkkkkkk:RI:16::ADDIU8
5479 unsigned32 instruction = instruction_0;
5480 signed_word op1 = (instruction >> 8) & 0x7;
5482 int op2 = (instruction >> 0) & 0xff;
5489 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5500 SignalException (ReservedInstruction, instruction);
5502 unsigned int temp = (unsigned int)(op1 + op2);
5503 signed int tempS = (signed int)temp;
5504 GPR[destreg] = SIGNEXTEND(((unsigned64)temp),32);
5509 01100011,KKKKKKKK,S:I8:16::ADJSP
5512 unsigned32 instruction = instruction_0;
5513 int op2 = (instruction >> 0) & 0xff;
5514 signed_word op1 = 29;
5518 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5532 SignalException (ReservedInstruction, instruction);
5534 unsigned int temp = (unsigned int)(op1 + op2);
5535 signed int tempS = (signed int)temp;
5536 GPR[destreg] = SIGNEXTEND(((unsigned64)temp),32);
5541 00001,ddd,AAAAAAAA,P:RI:16::ADDIUPC
5544 unsigned32 instruction = instruction_0;
5545 int destreg = (instruction >> 8) & 0x7;
5546 int op2 = (instruction >> 0) & 0xff;
5547 signed_word op1 = ((INDELAYSLOT () ? (INJALDELAYSLOT () ? IPC - 4 : IPC - 2) : (have_extendval ? IPC - 2 : IPC)) & ~ (unsigned64) 1) & ~ (unsigned64) 0x3;
5552 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5562 SignalException (ReservedInstruction, instruction);
5564 unsigned int temp = (unsigned int)(op1 + op2);
5565 signed int tempS = (signed int)temp;
5566 GPR[destreg] = SIGNEXTEND(((unsigned64)temp),32);
5571 00000,ddd,AAAAAAAA,s:RI:16::ADDIUSP
5574 unsigned32 instruction = instruction_0;
5575 int destreg = (instruction >> 8) & 0x7;
5576 int op2 = (instruction >> 0) & 0xff;
5577 signed_word op1 = 29;
5582 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5593 SignalException (ReservedInstruction, instruction);
5595 unsigned int temp = (unsigned int)(op1 + op2);
5596 signed int tempS = (signed int)temp;
5597 GPR[destreg] = SIGNEXTEND(((unsigned64)temp),32);
5602 01000,xxx,ddd,14444:RRI_A:16::DADDIU
5605 unsigned32 instruction = instruction_0;
5606 signed_word op1 = (instruction >> 8) & 0x7;
5607 int destreg = (instruction >> 5) & 0x7;
5608 int op2 = (instruction >> 0) & 0xf;
5616 op2 |= ((extendval & 0xf) << 11) | (extendval & 0x7f0);
5627 SignalException (ReservedInstruction, instruction);
5629 unsigned64 temp = (unsigned64)(op1 + op2);
5630 word64 tempS = (word64)temp;
5631 GPR[destreg] = (unsigned64)temp;
5636 11111101,www,jjjjj:RI64:16::DADDIU5
5639 unsigned32 instruction = instruction_0;
5640 signed_word op1 = (instruction >> 5) & 0x7;
5642 int op2 = (instruction >> 0) & 0x1f;
5649 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5660 SignalException (ReservedInstruction, instruction);
5662 unsigned64 temp = (unsigned64)(op1 + op2);
5663 word64 tempS = (word64)temp;
5664 GPR[destreg] = (unsigned64)temp;
5669 11111011,KKKKKKKK,S:I64:16::DADJSP
5672 unsigned32 instruction = instruction_0;
5673 int op2 = (instruction >> 0) & 0xff;
5674 signed_word op1 = 29;
5678 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5692 SignalException (ReservedInstruction, instruction);
5694 unsigned64 temp = (unsigned64)(op1 + op2);
5695 word64 tempS = (word64)temp;
5696 GPR[destreg] = (unsigned64)temp;
5701 11111110,ddd,EEEEE,P:RI64:16::DADDIUPC
5704 unsigned32 instruction = instruction_0;
5705 int destreg = (instruction >> 5) & 0x7;
5706 int op2 = (instruction >> 0) & 0x1f;
5707 signed_word op1 = ((INDELAYSLOT () ? (INJALDELAYSLOT () ? IPC - 4 : IPC - 2) : (have_extendval ? IPC - 2 : IPC)) & ~ (unsigned64) 1) & ~ (unsigned64) 0x3;
5712 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5722 SignalException (ReservedInstruction, instruction);
5724 unsigned64 temp = (unsigned64)(op1 + op2);
5725 word64 tempS = (word64)temp;
5726 GPR[destreg] = (unsigned64)temp;
5731 11111111,ddd,EEEEE,s:RI64:16::DADDIUSP
5734 unsigned32 instruction = instruction_0;
5735 int destreg = (instruction >> 5) & 0x7;
5736 int op2 = (instruction >> 0) & 0x1f;
5737 signed_word op1 = 29;
5742 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5753 SignalException (ReservedInstruction, instruction);
5755 unsigned64 temp = (unsigned64)(op1 + op2);
5756 word64 tempS = (word64)temp;
5757 GPR[destreg] = (unsigned64)temp;
5762 01010,xxx,88888888,T:RI:16::SLTI
5765 unsigned32 instruction = instruction_0;
5766 signed_word op1 = (instruction >> 8) & 0x7;
5767 int op2 = (instruction >> 0) & 0xff;
5774 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5783 SignalException (ReservedInstruction, instruction);
5785 if ((word64)op1 < (word64)op2)
5793 01011,xxx,88888888,T:RI:16::SLTIU
5796 unsigned32 instruction = instruction_0;
5797 signed_word op1 = (instruction >> 8) & 0x7;
5798 int op2 = (instruction >> 0) & 0xff;
5805 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5814 SignalException (ReservedInstruction, instruction);
5816 if ((unsigned64)op1 < (unsigned64)op2)
5824 11101,xxx,yyy,01010,T:RR:16::CMP
5827 unsigned32 instruction = instruction_0;
5828 signed_word op1 = (instruction >> 8) & 0x7;
5829 signed_word op2 = (instruction >> 5) & 0x7;
5838 SignalException (ReservedInstruction, instruction);
5840 GPR[destreg] = (op1 ^ op2);
5845 01110,xxx,UUUUUUUU,T:RI:16::CMPI
5848 unsigned32 instruction = instruction_0;
5849 signed_word op1 = (instruction >> 8) & 0x7;
5850 int op2 = (instruction >> 0) & 0xff;
5857 op2 |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
5864 SignalException (ReservedInstruction, instruction);
5866 GPR[destreg] = (op1 ^ op2);
5871 // Two/Three Operand, Register-Type
5874 11100,xxx,yyy,ddd,01:RRR:16::ADDU
5877 unsigned32 instruction = instruction_0;
5878 signed_word op1 = (instruction >> 8) & 0x7;
5879 signed_word op2 = (instruction >> 5) & 0x7;
5880 int destreg = (instruction >> 2) & 0x7;
5890 SignalException (ReservedInstruction, instruction);
5892 unsigned int temp = (unsigned int)(op1 + op2);
5893 signed int tempS = (signed int)temp;
5894 GPR[destreg] = SIGNEXTEND(((unsigned64)temp),32);
5899 11100,xxx,yyy,ddd,11:RRR:16::SUBU
5902 unsigned32 instruction = instruction_0;
5903 signed_word op1 = (instruction >> 8) & 0x7;
5904 signed_word op2 = (instruction >> 5) & 0x7;
5905 int destreg = (instruction >> 2) & 0x7;
5915 SignalException (ReservedInstruction, instruction);
5917 unsigned int temp = (unsigned int)(op1 - op2);
5918 signed int tempS = (signed int)temp;
5919 GPR[destreg] = SIGNEXTEND(((unsigned64)temp),32);
5924 11100,xxx,yyy,ddd,00:RRR:16::DADDU
5927 unsigned32 instruction = instruction_0;
5928 signed_word op1 = (instruction >> 8) & 0x7;
5929 signed_word op2 = (instruction >> 5) & 0x7;
5930 int destreg = (instruction >> 2) & 0x7;
5940 SignalException (ReservedInstruction, instruction);
5942 unsigned64 temp = (unsigned64)(op1 + op2);
5943 word64 tempS = (word64)temp;
5944 GPR[destreg] = (unsigned64)temp;
5949 11100,xxx,yyy,ddd,10:RRR:16::DSUBU
5952 unsigned32 instruction = instruction_0;
5953 signed_word op1 = (instruction >> 8) & 0x7;
5954 signed_word op2 = (instruction >> 5) & 0x7;
5955 int destreg = (instruction >> 2) & 0x7;
5965 SignalException (ReservedInstruction, instruction);
5967 unsigned64 temp = (unsigned64)(op1 - op2);
5968 word64 tempS = (word64)temp;
5969 GPR[destreg] = (unsigned64)temp;
5974 11101,xxx,yyy,00010,T:RR:16::SLT
5977 unsigned32 instruction = instruction_0;
5978 signed_word op1 = (instruction >> 8) & 0x7;
5979 signed_word op2 = (instruction >> 5) & 0x7;
5988 SignalException (ReservedInstruction, instruction);
5990 if ((word64)op1 < (word64)op2)
5998 11101,xxx,yyy,00011,T:RR:16::SLTU
6001 unsigned32 instruction = instruction_0;
6002 signed_word op1 = (instruction >> 8) & 0x7;
6003 signed_word op2 = (instruction >> 5) & 0x7;
6012 SignalException (ReservedInstruction, instruction);
6014 if ((unsigned64)op1 < (unsigned64)op2)
6022 11101,ddd,yyy,01011,Z:RR:16::NEG
6025 unsigned32 instruction = instruction_0;
6026 int destreg = (instruction >> 8) & 0x7;
6027 signed_word op2 = (instruction >> 5) & 0x7;
6028 signed_word op1 = 0;
6035 SignalException (ReservedInstruction, instruction);
6037 unsigned int temp = (unsigned int)(op1 - op2);
6038 signed int tempS = (signed int)temp;
6039 GPR[destreg] = SIGNEXTEND(((unsigned64)temp),32);
6044 11101,www,yyy,01100:RR:16::AND
6047 unsigned32 instruction = instruction_0;
6048 signed_word op1 = (instruction >> 8) & 0x7;
6050 signed_word op2 = (instruction >> 5) & 0x7;
6059 SignalException (ReservedInstruction, instruction);
6061 GPR[destreg] = (op1 & op2);
6066 11101,www,yyy,01101:RR:16::OR
6069 unsigned32 instruction = instruction_0;
6070 signed_word op1 = (instruction >> 8) & 0x7;
6072 signed_word op2 = (instruction >> 5) & 0x7;
6081 SignalException (ReservedInstruction, instruction);
6084 GPR[destreg] = (op1 | op2);
6089 11101,www,yyy,01110:RR:16::XOR
6092 unsigned32 instruction = instruction_0;
6093 signed_word op1 = (instruction >> 8) & 0x7;
6095 signed_word op2 = (instruction >> 5) & 0x7;
6104 SignalException (ReservedInstruction, instruction);
6106 GPR[destreg] = (op1 ^ op2);
6111 11101,ddd,yyy,01111,Z:RR:16::NOT
6114 unsigned32 instruction = instruction_0;
6115 int destreg = (instruction >> 8) & 0x7;
6116 signed_word op2 = (instruction >> 5) & 0x7;
6117 signed_word op1 = 0;
6124 SignalException (ReservedInstruction, instruction);
6127 GPR[destreg] = ~(op1 | op2);
6132 01100111,ddd,XXXXX,z:I8_MOVR32:16::MOVR32
6135 unsigned32 instruction = instruction_0;
6136 int destreg = (instruction >> 5) & 0x7;
6137 signed_word op1 = (instruction >> 0) & 0x1f;
6138 signed_word op2 = 0;
6143 SignalException (ReservedInstruction, instruction);
6146 GPR[destreg] = (op1 | op2);
6151 01100101,YYYYY,xxx,z:I8_MOV32R:16::MOV32R
6154 unsigned32 instruction = instruction_0;
6155 int destreg = (instruction >> 3) & 0x1f;
6156 signed_word op1 = (instruction >> 0) & 0x7;
6157 signed_word op2 = 0;
6158 destreg = (destreg >> 2) | ((destreg & 3) << 3);
6163 SignalException (ReservedInstruction, instruction);
6166 GPR[destreg] = (op1 | op2);
6171 00110,ddd,yyy,sss,00:ISHIFT:16::SLL
6174 unsigned32 instruction = instruction_0;
6175 int destreg = (instruction >> 8) & 0x7;
6176 signed_word op2 = (instruction >> 5) & 0x7;
6177 int op1 = (instruction >> 2) & 0x7;
6185 op1 = (extendval >> 6) & 0x1f;
6194 SignalException (ReservedInstruction, instruction);
6196 GPR[destreg] = ((unsigned64)op2 << op1);
6197 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
6202 00110,ddd,yyy,sss,10:ISHIFT:16::SRL
6205 unsigned32 instruction = instruction_0;
6206 int destreg = (instruction >> 8) & 0x7;
6207 signed_word op2 = (instruction >> 5) & 0x7;
6208 int op1 = (instruction >> 2) & 0x7;
6216 op1 = (extendval >> 6) & 0x1f;
6225 SignalException (ReservedInstruction, instruction);
6227 GPR[destreg] = ((unsigned64)(op2 & 0xFFFFFFFF) >> op1);
6228 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
6233 00110,ddd,yyy,sss,11:ISHIFT:16::SRA
6236 unsigned32 instruction = instruction_0;
6237 int destreg = (instruction >> 8) & 0x7;
6238 signed_word op2 = (instruction >> 5) & 0x7;
6239 int op1 = (instruction >> 2) & 0x7;
6247 op1 = (extendval >> 6) & 0x1f;
6256 SignalException (ReservedInstruction, instruction);
6258 unsigned int highbit = (unsigned int)1 << 31;
6259 GPR[destreg] = ((unsigned64)(op2 & 0xFFFFFFFF) >> op1);
6260 GPR[destreg] |= (op1 != 0 && (op2 & highbit) ? ((((unsigned int)1 << op1) - 1) << (32 - op1)) : 0);
6261 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
6266 11101,xxx,vvv,00100:RR:16::SLLV
6269 unsigned32 instruction = instruction_0;
6270 signed_word op1 = (instruction >> 8) & 0x7;
6271 signed_word op2 = (instruction >> 5) & 0x7;
6281 SignalException (ReservedInstruction, instruction);
6284 GPR[destreg] = ((unsigned64)op2 << op1);
6285 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
6290 11101,xxx,vvv,00110:RR:16::SRLV
6293 unsigned32 instruction = instruction_0;
6294 signed_word op1 = (instruction >> 8) & 0x7;
6295 signed_word op2 = (instruction >> 5) & 0x7;
6305 SignalException (ReservedInstruction, instruction);
6308 GPR[destreg] = ((unsigned64)(op2 & 0xFFFFFFFF) >> op1);
6309 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
6314 11101,xxx,vvv,00111:RR:16::SRAV
6317 unsigned32 instruction = instruction_0;
6318 signed_word op1 = (instruction >> 8) & 0x7;
6319 signed_word op2 = (instruction >> 5) & 0x7;
6329 SignalException (ReservedInstruction, instruction);
6331 unsigned int highbit = (unsigned int)1 << 31;
6333 GPR[destreg] = ((unsigned64)(op2 & 0xFFFFFFFF) >> op1);
6334 GPR[destreg] |= (op1 != 0 && (op2 & highbit) ? ((((unsigned int)1 << op1) - 1) << (32 - op1)) : 0);
6335 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
6340 00110,ddd,yyy,[[[,01:ISHIFT:16::DSLL
6343 unsigned32 instruction = instruction_0;
6344 int destreg = (instruction >> 8) & 0x7;
6345 signed_word op2 = (instruction >> 5) & 0x7;
6346 int op1 = (instruction >> 2) & 0x7;
6354 op1 = ((extendval >> 6) & 0x1f) | (extendval & 0x20);
6363 SignalException (ReservedInstruction, instruction);
6365 GPR[destreg] = ((unsigned64)op2 << op1);
6370 11101,XXX,vvv,01000:RR:16::DSRL
6373 unsigned32 instruction = instruction_0;
6374 int op1 = (instruction >> 8) & 0x7;
6375 signed_word op2 = (instruction >> 5) & 0x7;
6379 op1 = ((extendval >> 6) & 0x1f) | (extendval & 0x20);
6392 SignalException (ReservedInstruction, instruction);
6394 GPR[destreg] = ((unsigned64)(op2) >> op1);
6399 11101,xxx,vvv,10011:RR:16::DSRA
6402 unsigned32 instruction = instruction_0;
6403 int op1 = (instruction >> 8) & 0x7;
6404 signed_word op2 = (instruction >> 5) & 0x7;
6408 op1 = ((extendval >> 6) & 0x1f) | (extendval & 0x20);
6421 SignalException (ReservedInstruction, instruction);
6423 unsigned64 highbit = (unsigned64)1 << 63;
6424 GPR[destreg] = ((unsigned64)(op2) >> op1);
6425 GPR[destreg] |= (op1 != 0 && (op2 & highbit) ? ((((unsigned64)1 << op1) - 1) << (64 - op1)) : 0);
6430 11101,xxx,vvv,10100:RR:16::DSLLV
6433 unsigned32 instruction = instruction_0;
6434 signed_word op1 = (instruction >> 8) & 0x7;
6435 signed_word op2 = (instruction >> 5) & 0x7;
6445 SignalException (ReservedInstruction, instruction);
6448 GPR[destreg] = ((unsigned64)op2 << op1);
6453 11101,xxx,vvv,10110:RR:16::DSRLV
6456 unsigned32 instruction = instruction_0;
6457 signed_word op1 = (instruction >> 8) & 0x7;
6458 signed_word op2 = (instruction >> 5) & 0x7;
6468 SignalException (ReservedInstruction, instruction);
6471 GPR[destreg] = ((unsigned64)(op2) >> op1);
6476 11101,xxx,vvv,10111:RR:16::DSRAV
6479 unsigned32 instruction = instruction_0;
6480 signed_word op1 = (instruction >> 8) & 0x7;
6481 signed_word op2 = (instruction >> 5) & 0x7;
6491 SignalException (ReservedInstruction, instruction);
6493 unsigned64 highbit = (unsigned64)1 << 63;
6495 GPR[destreg] = ((unsigned64)(op2) >> op1);
6496 GPR[destreg] |= (op1 != 0 && (op2 & highbit) ? ((((unsigned64)1 << op1) - 1) << (64 - op1)) : 0);
6501 // Multiply /Divide Instructions
6504 11101,xxx,yyy,11000:RR:16::MULT
6507 unsigned32 instruction = instruction_0;
6508 signed_word op1 = (instruction >> 8) & 0x7;
6509 signed_word op2 = (instruction >> 5) & 0x7;
6517 SignalException (ReservedInstruction, instruction);
6519 CHECKHILO("Multiplication");
6521 unsigned64 temp = ((word64) op1 * (word64) op2);
6522 LO = SIGNEXTEND((unsigned64)VL4_8(temp),32);
6523 HI = SIGNEXTEND((unsigned64)VH4_8(temp),32);
6529 11101,xxx,yyy,11001:RR:16::MULTU
6532 unsigned32 instruction = instruction_0;
6533 signed_word op1 = (instruction >> 8) & 0x7;
6534 signed_word op2 = (instruction >> 5) & 0x7;
6542 SignalException (ReservedInstruction, instruction);
6544 CHECKHILO("Multiplication");
6546 unsigned64 temp = ((unsigned64)(op1 & 0xffffffff) * (unsigned64)(op2 & 0xffffffff));
6547 LO = SIGNEXTEND((unsigned64)VL4_8(temp),32);
6548 HI = SIGNEXTEND((unsigned64)VH4_8(temp),32);
6554 11101,xxx,yyy,11010:RR:16::DIV
6557 unsigned32 instruction = instruction_0;
6558 signed_word op1 = (instruction >> 8) & 0x7;
6559 signed_word op2 = (instruction >> 5) & 0x7;
6567 SignalException (ReservedInstruction, instruction);
6569 CHECKHILO("Division");
6575 LO = SIGNEXTEND(0x80000000,32);
6576 HI = SIGNEXTEND(0,32);
6578 else if (d2 == -1 && d1 == 0x80000000)
6580 LO = SIGNEXTEND(0x80000000,32);
6581 HI = SIGNEXTEND(0,32);
6585 LO = SIGNEXTEND((d1 / d2),32);
6586 HI = SIGNEXTEND((d1 % d2),32);
6593 11101,xxx,yyy,11011:RR:16::DIVU
6596 unsigned32 instruction = instruction_0;
6597 signed_word op1 = (instruction >> 8) & 0x7;
6598 signed_word op2 = (instruction >> 5) & 0x7;
6606 SignalException (ReservedInstruction, instruction);
6608 CHECKHILO("Division");
6610 unsigned int d1 = op1;
6611 unsigned int d2 = op2;
6614 LO = SIGNEXTEND(0x80000000,32);
6615 HI = SIGNEXTEND(0,32);
6617 else if (d2 == -1 && d1 == 0x80000000)
6619 LO = SIGNEXTEND(0x80000000,32);
6620 HI = SIGNEXTEND(0,32);
6624 LO = SIGNEXTEND((d1 / d2),32);
6625 HI = SIGNEXTEND((d1 % d2),32);
6632 11101,ddd,00010000:RR:16::MFHI
6635 unsigned32 instruction = instruction_0;
6636 int destreg = (instruction >> 8) & 0x7;
6640 SignalException (ReservedInstruction, instruction);
6643 HIACCESS = 3; /* 3rd instruction will be safe */
6648 11101,ddd,00010010:RR:16::MFLO
6651 unsigned32 instruction = instruction_0;
6652 int destreg = (instruction >> 8) & 0x7;
6656 SignalException (ReservedInstruction, instruction);
6659 LOACCESS = 3; /* 3rd instruction will be safe */
6664 11101,xxx,yyy,11100:RR:16::DMULT
6667 unsigned32 instruction = instruction_0;
6668 signed_word op1 = (instruction >> 8) & 0x7;
6669 signed_word op2 = (instruction >> 5) & 0x7;
6677 SignalException (ReservedInstruction, instruction);
6679 CHECKHILO("Multiplication");
6685 if (op1 < 0) { op1 = - op1; ++sign; }
6686 if (op2 < 0) { op2 = - op2; ++sign; }
6687 LO = ((unsigned64)VL4_8(op1) * VL4_8(op2));
6688 HI = ((unsigned64)VH4_8(op1) * VH4_8(op2));
6689 mid = ((unsigned64)VH4_8(op1) * VL4_8(op2));
6690 midhi = SET64HI(VL4_8(mid));
6691 temp = (LO + midhi);
6692 if ((temp == midhi) ? (LO != 0) : (temp < midhi))
6695 mid = ((unsigned64)VL4_8(op1) * VH4_8(op2));
6696 midhi = SET64HI(VL4_8(mid));
6697 LO = (temp + midhi);
6698 if ((LO == midhi) ? (temp != 0) : (LO < midhi))
6701 if (sign & 1) { LO = - LO; HI = (LO == 0 ? 0 : -1) - HI; }
6707 11101,xxx,yyy,11101:RR:16::DMULTU
6710 unsigned32 instruction = instruction_0;
6711 signed_word op1 = (instruction >> 8) & 0x7;
6712 signed_word op2 = (instruction >> 5) & 0x7;
6720 SignalException (ReservedInstruction, instruction);
6722 CHECKHILO("Multiplication");
6727 LO = ((unsigned64)VL4_8(op1) * VL4_8(op2));
6728 HI = ((unsigned64)VH4_8(op1) * VH4_8(op2));
6729 mid = ((unsigned64)VH4_8(op1) * VL4_8(op2));
6730 midhi = SET64HI(VL4_8(mid));
6731 temp = (LO + midhi);
6732 if ((temp == midhi) ? (LO != 0) : (temp < midhi))
6735 mid = ((unsigned64)VL4_8(op1) * VH4_8(op2));
6736 midhi = SET64HI(VL4_8(mid));
6737 LO = (temp + midhi);
6738 if ((LO == midhi) ? (temp != 0) : (LO < midhi))
6746 11101,xxx,yyy,11110:RR:16::DDIV
6749 unsigned32 instruction = instruction_0;
6750 signed_word op1 = (instruction >> 8) & 0x7;
6751 signed_word op2 = (instruction >> 5) & 0x7;
6759 SignalException (ReservedInstruction, instruction);
6761 CHECKHILO("Division");
6767 LO = SIGNED64 (0x8000000000000000);
6770 else if (d2 == -1 && d1 == SIGNED64 (0x8000000000000000))
6772 LO = SIGNED64 (0x8000000000000000);
6785 11101,xxx,yyy,11111:RR:16::DDIVU
6788 unsigned32 instruction = instruction_0;
6789 signed_word op1 = (instruction >> 8) & 0x7;
6790 signed_word op2 = (instruction >> 5) & 0x7;
6798 SignalException (ReservedInstruction, instruction);
6800 CHECKHILO("Division");
6802 unsigned64 d1 = op1;
6803 unsigned64 d2 = op2;
6806 LO = SIGNED64 (0x8000000000000000);
6809 else if (d2 == -1 && d1 == SIGNED64 (0x8000000000000000))
6811 LO = SIGNED64 (0x8000000000000000);
6824 // Jump and Branch Instructions
6829 00011,aaaaaaaaaaa:I:16::JAL
6832 unsigned32 instruction = instruction_0;
6833 unsigned_word op1 = (instruction >> 0) & 0x7ff;
6837 if (AddressTranslation (PC &~ (unsigned64) 1, isINSTRUCTION, isLOAD, &paddr, &uncached, isTARGET, isREAL))
6840 unsigned int reverse = (ReverseEndian ? 3 : 0);
6841 unsigned int bigend = (BigEndianCPU ? 3 : 0);
6843 paddr = ((paddr & ~0x7) | ((paddr & 0x7) ^ (reverse << 1)));
6844 LoadMemory (&memval,0,uncached, AccessLength_HALFWORD, paddr, PC, isINSTRUCTION, isREAL);
6845 byte = (((PC &~ (unsigned64) 1) & 0x7) ^ (bigend << 1));
6846 memval = (memval >> (8 * byte)) & 0xffff;
6847 op1 = (((op1 & 0x1f) << 23)
6848 | ((op1 & 0x3e0) << 13)
6850 if ((instruction & 0x400) == 0)
6855 op1 |= PC & ~ (unsigned64) 0x0fffffff;
6857 SignalException (ReservedInstruction, instruction);
6860 GPR[destreg] = (PC + 2); /* NOTE: The PC is already 2 ahead within the simulator */
6861 /* NOTE: ??? Gdb gets confused if the PC is sign-extended,
6862 so we just truncate it to 32 bits here. */
6864 /* NOTE: The jump occurs AFTER the next instruction has been executed */
6871 11101,xxx,00000000:RR:16::JR
6874 unsigned32 instruction = instruction_0;
6875 signed_word op1 = (instruction >> 8) & 0x7;
6880 SignalException (ReservedInstruction, instruction);
6882 /* NOTE: ??? Gdb gets confused if the PC is sign-extended,
6883 so we just truncate it to 32 bits here. */
6885 /* NOTE: The jump occurs AFTER the next instruction has been executed */
6892 1110100000100000,r:RR:16::JRRA
6895 unsigned32 instruction = instruction_0;
6896 signed_word op1 = 31;
6899 SignalException (ReservedInstruction, instruction);
6901 /* NOTE: ??? Gdb gets confused if the PC is sign-extended,
6902 so we just truncate it to 32 bits here. */
6904 /* NOTE: The jump occurs AFTER the next instruction has been executed */
6911 11101,xxx,01000000,R:RR:16::JALR
6914 unsigned32 instruction = instruction_0;
6915 signed_word op1 = (instruction >> 8) & 0x7;
6921 SignalException (ReservedInstruction, instruction);
6923 GPR[destreg] = (PC + 2); /* NOTE: The PC is already 2 ahead within the simulator */
6924 /* NOTE: ??? Gdb gets confused if the PC is sign-extended,
6925 so we just truncate it to 32 bits here. */
6927 /* NOTE: The jump occurs AFTER the next instruction has been executed */
6934 00100,xxx,pppppppp,z:RI:16::BEQZ
6937 unsigned32 instruction = instruction_0;
6938 signed_word op1 = (instruction >> 8) & 0x7;
6939 int offset = (instruction >> 0) & 0xff;
6940 signed_word op2 = 0;
6946 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
6947 if (offset >= 0x8000)
6958 SignalException (ReservedInstruction, instruction);
6960 int condition = (op1 == op2);
6967 00101,xxx,pppppppp,z:RI:16::BNEZ
6970 unsigned32 instruction = instruction_0;
6971 signed_word op1 = (instruction >> 8) & 0x7;
6972 int offset = (instruction >> 0) & 0xff;
6973 signed_word op2 = 0;
6979 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
6980 if (offset >= 0x8000)
6991 SignalException (ReservedInstruction, instruction);
6993 int condition = (op1 != op2);
7000 01100000,pppppppp,t,z:I8:16::BTEQZ
7003 unsigned32 instruction = instruction_0;
7004 int offset = (instruction >> 0) & 0xff;
7005 signed_word op1 = 24;
7006 signed_word op2 = 0;
7009 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
7010 if (offset >= 0x8000)
7022 SignalException (ReservedInstruction, instruction);
7024 int condition = (op1 == op2);
7031 01100001,pppppppp,t,z:I8:16::BTNEZ
7034 unsigned32 instruction = instruction_0;
7035 int offset = (instruction >> 0) & 0xff;
7036 signed_word op1 = 24;
7037 signed_word op2 = 0;
7040 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
7041 if (offset >= 0x8000)
7053 SignalException (ReservedInstruction, instruction);
7055 int condition = (op1 != op2);
7062 00010,qqqqqqqqqqq,z,Z:I:16::B
7065 unsigned32 instruction = instruction_0;
7066 int offset = (instruction >> 0) & 0x7ff;
7067 signed_word op2 = 0;
7068 signed_word op1 = 0;
7071 offset |= ((extendval & 0x1f) << 11) | (extendval & 0x7e0);
7072 if (offset >= 0x8000)
7078 if (offset >= 0x400)
7083 SignalException (ReservedInstruction, instruction);
7085 int condition = (op1 == op2);
7092 // Special Instructions
7095 // See the front of the mips16 doc
7096 11110,eeeeeeeeeee:I:16::EXTEND
7099 unsigned32 instruction = instruction_0;
7100 int ext = (instruction >> 0) & 0x7ff;
7102 SignalException (ReservedInstruction, instruction);
7110 01100,******,00101:RR:16::BREAK
7113 unsigned32 instruction = instruction_0;
7115 SignalException (ReservedInstruction, instruction);
7117 SignalException(BreakPoint,instruction);
7122 // start-sanitize-r5900
7124 // FIXME: The instructions below which are typically r5900 specific
7125 // need to be merged back into the above.
7127 // end-sanitize-r5900
7128 // start-sanitize-r5900
7130 011100,5.RS,5.RT,0000000000011010:MMINORM:32::DIV1
7133 unsigned32 instruction = instruction_0;
7134 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
7135 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7137 CHECKHILO("Division");
7143 LO1 = SIGNEXTEND(0x80000000,32);
7144 HI1 = SIGNEXTEND(0,32);
7146 else if (d2 == -1 && d1 == 0x80000000)
7148 LO1 = SIGNEXTEND(0x80000000,32);
7149 HI1 = SIGNEXTEND(0,32);
7153 LO1 = SIGNEXTEND((d1 / d2),32);
7154 HI1 = SIGNEXTEND((d1 % d2),32);
7160 // end-sanitize-r5900
7161 // start-sanitize-r5900
7163 011100,5.RS,5.RT,0000000000011011:MMINORM:32::DIVU1
7166 unsigned32 instruction = instruction_0;
7167 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
7168 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7170 CHECKHILO("Division");
7172 unsigned int d1 = op1;
7173 unsigned int d2 = op2;
7176 LO1 = SIGNEXTEND(0x80000000,32);
7177 HI1 = SIGNEXTEND(0,32);
7179 else if (d2 == -1 && d1 == 0x80000000)
7181 LO1 = SIGNEXTEND(0x80000000,32);
7182 HI1 = SIGNEXTEND(0,32);
7186 LO1 = SIGNEXTEND((d1 / d2),32);
7187 HI1 = SIGNEXTEND((d1 % d2),32);
7193 // end-sanitize-r5900
7195 011101,26.INSTR_INDEX:NORMAL:32::JALX
7196 // start-sanitize-r5900
7198 // end-sanitize-r5900
7200 // start-sanitize-tx19
7202 // end-sanitize-tx19
7204 unsigned32 instruction = instruction_0;
7205 unsigned_word op1 = (((instruction >> 0) & 0x03FFFFFF) << 2);
7206 op1 |= (PC & ~0x0FFFFFFF); /* address of instruction in delay slot for the jump */
7209 GPR[destreg] = (PC + 4); /* NOTE: The PC is already 4 ahead within the simulator */
7211 /* NOTE: ??? Gdb gets confused if the PC is sign-extended,
7212 so we just truncate it to 32 bits here. */
7214 /* NOTE: The jump occurs AFTER the next instruction has been executed */
7216 /* JALDELAYSLOT(); FIXME */
7220 // start-sanitize-r5900
7222 011110,5.RS,5.RT,16.OFFSET:NORMAL:128::LQ
7225 unsigned32 instruction = instruction_0;
7226 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
7227 int destreg = ((instruction >> 16) & 0x0000001F);
7228 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7230 address_word vaddr = ((unsigned64)op1 + offset);
7233 if ((vaddr & 15) != 0)
7234 SignalExceptionAddressLoad();
7237 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
7239 unsigned64 memval = 0;
7240 unsigned64 memval1 = 0;
7241 unsigned64 mask = 0x7;
7242 unsigned int shift = 8;
7243 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
7244 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
7246 LoadMemory(&memval,&memval1,uncached,AccessLength_QUADWORD,paddr,vaddr,isDATA,isREAL);
7247 GPR[destreg] = memval;
7248 GPR1[destreg] = memval1;
7254 // end-sanitize-r5900
7255 // start-sanitize-r5900
7257 011100,5.RS,5.RT,5.RD,00000000000:MMINORM:32::MADD
7261 unsigned32 instruction = instruction_0;
7262 int destreg = ((instruction >> 11) & 0x0000001F);
7263 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
7264 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7266 word64 prod = (word64)WORD64(VL4_8(HI),VL4_8(LO)) + ((word64)SIGNEXTEND(op1,32) * (word64)SIGNEXTEND(op2,32));
7267 LO = SIGNEXTEND(prod,32);
7268 HI = SIGNEXTEND( VH4_8(prod), 32);
7269 if( destreg != 0 ) GPR[destreg] = LO;
7273 // end-sanitize-r5900
7274 // start-sanitize-r5900
7276 011100,5.RS,5.RT,5.RD,00000000001:MMINORM:32::MADDU
7280 unsigned32 instruction = instruction_0;
7281 int destreg = ((instruction >> 11) & 0x0000001F);
7282 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
7283 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7285 unsigned64 prod = (unsigned64)WORD64(VL4_8(HI),VL4_8(LO)) + ((unsigned64)VL4_8(op1) * (unsigned64)VL4_8(op2));
7286 LO = SIGNEXTEND(prod,32);
7287 HI = SIGNEXTEND( VH4_8(prod), 32);
7288 if( destreg != 0 ) GPR[destreg] = LO;
7292 // end-sanitize-r5900
7293 // start-sanitize-r5900
7295 011100,5.RS,5.RT,5.RD,00000100000:MMINORM:32::MADD1
7298 unsigned32 instruction = instruction_0;
7299 int destreg = ((instruction >> 11) & 0x0000001F);
7300 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
7301 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7303 word64 prod = (word64)WORD64(VL4_8(HI1),VL4_8(LO1)) + ((word64)SIGNEXTEND(op1,32) * (word64)SIGNEXTEND(op2,32));
7304 LO1 = SIGNEXTEND(prod,32);
7305 HI1 = SIGNEXTEND( VH4_8(prod), 32);
7306 if( destreg != 0 ) GPR[destreg] = LO1;
7310 // end-sanitize-r5900
7311 // start-sanitize-r5900
7313 011100,5.RS,5.RT,5.RD,00000100001:MMINORM:32::MADDU1
7316 unsigned32 instruction = instruction_0;
7317 int destreg = ((instruction >> 11) & 0x0000001F);
7318 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
7319 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7321 unsigned64 prod = (unsigned64)WORD64(VL4_8(HI1),VL4_8(LO1)) + ((unsigned64)VL4_8(op1) * (unsigned64)VL4_8(op2));
7322 LO1 = SIGNEXTEND(prod,32);
7323 HI1 = SIGNEXTEND( VH4_8(prod), 32);
7324 if( destreg != 0 ) GPR[destreg] = LO1;
7328 // end-sanitize-r5900
7329 // start-sanitize-r5900
7331 0111000000000000,5.RD,00000010000:MMINORM:32::MFHI1
7334 unsigned32 instruction = instruction_0;
7335 int destreg = ((instruction >> 11) & 0x0000001F);
7338 HI1ACCESS = 3; /* 3rd instruction will be safe */
7342 // end-sanitize-r5900
7343 // start-sanitize-r5900
7345 0111000000000000,5.RD,00000010010:MMINORM:32::MFLO1
7348 unsigned32 instruction = instruction_0;
7349 int destreg = ((instruction >> 11) & 0x0000001F);
7352 LO1ACCESS = 3; /* 3rd instruction will be safe */
7356 // end-sanitize-r5900
7357 // start-sanitize-r5900
7359 0000000000000000,5.RD,00000101000:SPECIAL:32::MFSA
7362 unsigned32 instruction = instruction_0;
7363 int destreg = ((instruction >> 11) & 0x0000001F);
7369 // end-sanitize-r5900
7370 // start-sanitize-r5900
7372 011100,5.RS,000000000000000010001:MMINORM:32::MTHI1
7375 unsigned32 instruction = instruction_0;
7376 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7379 sim_io_error(sd,"MT (move-to) over-writing HI register value\n");
7381 HI1ACCESS = 3; /* 3rd instruction will be safe */
7385 // end-sanitize-r5900
7386 // start-sanitize-r5900
7388 011100,5.RS,000000000000000010011:MMINORM:32::MTLO1
7391 unsigned32 instruction = instruction_0;
7392 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7395 sim_io_error(sd,"MT (move-to) over-writing LO register value");
7397 LO1ACCESS = 3; /* 3rd instruction will be safe */
7401 // end-sanitize-r5900
7402 // start-sanitize-r5900
7404 000000,5.RS,000000000000000101001:SPECIAL:32::MTSA
7407 unsigned32 instruction = instruction_0;
7408 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7414 // end-sanitize-r5900
7415 // start-sanitize-r5900
7417 000001,5.RS,11000,16.IMMEDIATE:REGIMM:32::MTSAB
7420 SA = ((GPR[RA] & 0xF) ^ (IMMEDIATE & 0xF)) * 8;
7423 // end-sanitize-r5900
7424 // start-sanitize-r5900
7426 000001,5.RS,11001,16.IMMEDIATE:REGIMM:32::MTSAH
7429 SA = ((GPR[RS] & 0x7) ^ (IMMEDIATE & 0x7)) * 16;
7432 // end-sanitize-r5900
7433 // start-sanitize-r5900
7435 011100,5.RS,5.RT,5.RD,00000011000:MMINORM:32::MULT1
7438 unsigned32 instruction = instruction_0;
7439 int destreg = ((instruction >> 11) & 0x0000001F);
7440 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
7441 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7443 CHECKHILO("Multiplication");
7445 unsigned64 temp = ((word64) op1 * (word64) op2);
7446 LO1 = SIGNEXTEND((unsigned64)VL4_8(temp),32);
7447 HI1 = SIGNEXTEND((unsigned64)VH4_8(temp),32);
7454 // end-sanitize-r5900
7455 // start-sanitize-r5900
7457 011100,5.RS,5.RT,5.RD,00000011001:MMINORM:32::MULTU1
7460 unsigned32 instruction = instruction_0;
7461 int destreg = ((instruction >> 11) & 0x0000001F);
7462 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
7463 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
7465 CHECKHILO("Multiplication");
7467 unsigned64 temp = ((unsigned64)(op1 & 0xffffffff) * (unsigned64)(op2 & 0xffffffff));
7468 LO1 = SIGNEXTEND((unsigned64)VL4_8(temp),32);
7469 HI1 = SIGNEXTEND((unsigned64)VH4_8(temp),32);
7476 // end-sanitize-r5900
7477 // start-sanitize-r5900
7479 01110000000,5.RT,5.RD,00101101000:MMI1:32::PABSH
7482 unsigned32 instruction = instruction_0;
7483 int destreg = ((instruction >> 11) & 0x0000001F);
7484 signed_word rt_reg = GPR[RT];
7485 signed_word rt_reg1 = GPR1[RT];
7488 for(i=0;i<HALFWORDS_IN_MMI_REGS;i++)
7491 GPR_SH(destreg,i) = RT_SH(i);
7492 else if (RT_SH(i) == -32768)
7493 GPR_SH(destreg,i) = 32767;
7495 GPR_SH(destreg,i) = -RT_SH(i);
7500 // end-sanitize-r5900
7501 // start-sanitize-r5900
7503 01110000000,5.RT,5.RD,00001101000:MMI1:32::PABSW
7506 unsigned32 instruction = instruction_0;
7507 int destreg = ((instruction >> 11) & 0x0000001F);
7508 signed_word rt_reg = GPR[RT];
7509 signed_word rt_reg1 = GPR1[RT];
7512 for(i=0;i<WORDS_IN_MMI_REGS;i++)
7515 GPR_SW(destreg,i) = RT_SW(i);
7516 else if (RT_SW(i) == (int)0x80000000)
7517 GPR_SW(destreg,i) = (int)0x7FFFFFFF;
7519 GPR_SW(destreg,i) = -RT_SW(i);
7524 // end-sanitize-r5900
7525 // start-sanitize-r5900
7527 011100,5.RS,5.RT,5.RD,01000001000:MMI0:32::PADDB
7530 unsigned32 instruction = instruction_0;
7531 int destreg = ((instruction >> 11) & 0x0000001F);
7532 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
7533 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
7534 signed_word rt_reg = GPR[RT];
7535 signed_word rt_reg1 = GPR1[RT];
7538 for (i=0; i < BYTES_IN_MMI_REGS; i++)
7543 GPR_SB(destreg,i) = r;
7548 // end-sanitize-r5900
7549 // start-sanitize-r5900
7551 011100,5.RS,5.RT,5.RD,00100001000:MMI0:32::PADDH
7554 unsigned32 instruction = instruction_0;
7555 int destreg = ((instruction >> 11) & 0x0000001F);
7556 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
7557 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
7558 signed_word rt_reg = GPR[RT];
7559 signed_word rt_reg1 = GPR1[RT];
7562 for (i=0; i < HALFWORDS_IN_MMI_REGS; i++)
7567 GPR_SH(destreg,i) = r;
7572 // end-sanitize-r5900
7573 // start-sanitize-r5900
7575 011100,5.RS,5.RT,5.RD,00000001000:MMI0:32::PADDW
7578 unsigned32 instruction = instruction_0;
7579 int destreg = ((instruction >> 11) & 0x0000001F);
7580 signed_word rs_reg = GPR[RS];
7581 signed_word rs_reg1 = GPR1[RS];
7582 signed_word rt_reg = GPR[RT];
7583 signed_word rt_reg1 = GPR1[RT];
7586 for (i=0; i < WORDS_IN_MMI_REGS; i++)
7588 signed64 s = RS_SW(i);
7589 signed64 t = RT_SW(i);
7591 GPR_SW(destreg,i) = r;
7596 // end-sanitize-r5900
7597 // start-sanitize-r5900
7599 011100,5.RS,5.RT,5.RD,11000001000:MMI0:32::PADDSB
7602 unsigned32 instruction = instruction_0;
7603 int destreg = ((instruction >> 11) & 0x0000001F);
7604 signed_word rs_reg = GPR[RS];
7605 signed_word rs_reg1 = GPR1[RS];
7606 signed_word rt_reg = GPR[RT];
7607 signed_word rt_reg1 = GPR1[RT];
7610 for (i=0; i < BYTES_IN_MMI_REGS; i++)
7616 GPR_SB(destreg,i) = 127;
7618 GPR_SB(destreg,i) = -128;
7620 GPR_SB(destreg,i) = r;
7625 // end-sanitize-r5900
7626 // start-sanitize-r5900
7628 011100,5.RS,5.RT,5.RD,10100001000:MMI0:32::PADDSH
7631 unsigned32 instruction = instruction_0;
7632 int destreg = ((instruction >> 11) & 0x0000001F);
7633 signed_word rs_reg = GPR[RS];
7634 signed_word rs_reg1 = GPR1[RS];
7635 signed_word rt_reg = GPR[RT];
7636 signed_word rt_reg1 = GPR1[RT];
7639 for (i=0; i < HALFWORDS_IN_MMI_REGS; i++)
7645 GPR_SH(destreg,i) = 32767;
7646 else if (r < -32768)
7647 GPR_SH(destreg,i) = -32768;
7649 GPR_SH(destreg,i) = r;
7654 // end-sanitize-r5900
7655 // start-sanitize-r5900
7657 011100,5.RS,5.RT,5.RD,10000001000:MMI0:32::PADDSW
7660 unsigned32 instruction = instruction_0;
7661 int destreg = ((instruction >> 11) & 0x0000001F);
7662 signed_word rs_reg = GPR[RS];
7663 signed_word rs_reg1 = GPR1[RS];
7664 signed_word rt_reg = GPR[RT];
7665 signed_word rt_reg1 = GPR1[RT];
7668 for (i=0; i < WORDS_IN_MMI_REGS; i++)
7670 signed64 s = RS_SW(i);
7671 signed64 t = RT_SW(i);
7673 if (r > (int)0x7FFFFFFF)
7674 GPR_SW(destreg,i) = (int)0x7FFFFFFF;
7675 else if (r < (int)0x80000000)
7676 GPR_SW(destreg,i) = (int)0x80000000;
7678 GPR_SW(destreg,i) = r;
7683 // end-sanitize-r5900
7684 // start-sanitize-r5900
7686 011100,5.RS,5.RT,5.RD,11000101000:MMI1:32::PADDUB
7689 unsigned32 instruction = instruction_0;
7690 int destreg = ((instruction >> 11) & 0x0000001F);
7691 signed_word rs_reg = GPR[RS];
7692 signed_word rs_reg1 = GPR1[RS];
7693 signed_word rt_reg = GPR[RT];
7694 signed_word rt_reg1 = GPR1[RT];
7697 for (i=0; i < BYTES_IN_MMI_REGS; i++)
7699 unsigned int s = RS_UB(i);
7700 unsigned int t = RT_UB(i);
7701 unsigned int r = s + t;
7703 GPR_UB(destreg,i) = 0xFF;
7705 GPR_UB(destreg,i) = r;
7710 // end-sanitize-r5900
7711 // start-sanitize-r5900
7713 011100,5.RS,5.RT,5.RD,10100101000:MMI1:32::PADDUH
7716 unsigned32 instruction = instruction_0;
7717 int destreg = ((instruction >> 11) & 0x0000001F);
7718 signed_word rs_reg = GPR[RS];
7719 signed_word rs_reg1 = GPR1[RS];
7720 signed_word rt_reg = GPR[RT];
7721 signed_word rt_reg1 = GPR1[RT];
7724 for (i=0; i < HALFWORDS_IN_MMI_REGS; i++)
7726 unsigned int s = RS_UH(i);
7727 unsigned int t = RT_UH(i);
7728 unsigned int r = s + t;
7730 GPR_UH(destreg,i) = 0xFFFF;
7732 GPR_UH(destreg,i) = r;
7737 // end-sanitize-r5900
7738 // start-sanitize-r5900
7740 011100,5.RS,5.RT,5.RD,10000101000:MMI1:32::PADDUW
7743 unsigned32 instruction = instruction_0;
7744 int destreg = ((instruction >> 11) & 0x0000001F);
7745 signed_word rs_reg = GPR[RS];
7746 signed_word rs_reg1 = GPR1[RS];
7747 signed_word rt_reg = GPR[RT];
7748 signed_word rt_reg1 = GPR1[RT];
7751 for (i=0; i < WORDS_IN_MMI_REGS; i++)
7753 unsigned64 s = RS_UW(i);
7754 unsigned64 t = RT_UW(i);
7755 unsigned64 r = s + t;
7757 GPR_UW(destreg,i) = 0xFFFFFFFF;
7759 GPR_UW(destreg,i) = r;
7764 // end-sanitize-r5900
7765 // start-sanitize-r5900
7767 011100,5.RS,5.RT,5.RD,00100101000:MMI1:32::PADSBH
7770 unsigned32 instruction = instruction_0;
7771 int destreg = ((instruction >> 11) & 0x0000001F);
7772 signed_word rs_reg = GPR[RS];
7773 signed_word rs_reg1 = GPR1[RS];
7774 signed_word rt_reg = GPR[RT];
7775 signed_word rt_reg1 = GPR1[RT];
7778 for(i=0;i<HALFWORDS_IN_MMI_REGS/2;i++)
7779 GPR_SH(destreg,i) = RS_SH(i) - RT_SH(i);
7780 for(;i<HALFWORDS_IN_MMI_REGS;i++)
7781 GPR_SH(destreg,i) = RS_SH(i) + RT_SH(i);
7785 // end-sanitize-r5900
7786 // start-sanitize-r5900
7788 011100,5.RS,5.RT,5.RD,10010001001:MMI2:32::PAND
7791 unsigned32 instruction = instruction_0;
7792 int destreg = ((instruction >> 11) & 0x0000001F);
7793 signed_word rs_reg = GPR[RS];
7794 signed_word rs_reg1 = GPR1[RS];
7795 signed_word rt_reg = GPR[RT];
7796 signed_word rt_reg1 = GPR1[RT];
7799 for(i=0;i<WORDS_IN_MMI_REGS;i++)
7800 GPR_UW(destreg,i) = (RS_UW(i) & RT_UW(i));
7804 // end-sanitize-r5900
7805 // start-sanitize-r5900
7807 011100,5.RS,5.RT,5.RD,01010101000:MMI1:32::PCEQB
7810 unsigned32 instruction = instruction_0;
7811 int destreg = ((instruction >> 11) & 0x0000001F);
7812 signed_word rs_reg = GPR[RS];
7813 signed_word rs_reg1 = GPR1[RS];
7814 signed_word rt_reg = GPR[RT];
7815 signed_word rt_reg1 = GPR1[RT];
7818 for(i=0;i<BYTES_IN_MMI_REGS;i++)
7820 if (RS_SB(i) == RT_SB(i)) GPR_SB(destreg,i) = 0xFF;
7821 else GPR_SB(destreg,i) = 0;
7826 // end-sanitize-r5900
7827 // start-sanitize-r5900
7829 011100,5.RS,5.RT,5.RD,00110101000:MMI1:32::PCEQH
7832 unsigned32 instruction = instruction_0;
7833 int destreg = ((instruction >> 11) & 0x0000001F);
7834 signed_word rs_reg = GPR[RS];
7835 signed_word rs_reg1 = GPR1[RS];
7836 signed_word rt_reg = GPR[RT];
7837 signed_word rt_reg1 = GPR1[RT];
7840 for(i=0;i<HALFWORDS_IN_MMI_REGS;i++)
7842 if (RS_SH(i) == RT_SH(i)) GPR_SH(destreg,i) = 0xFFFF;
7843 else GPR_SH(destreg,i) = 0;
7848 // end-sanitize-r5900
7849 // start-sanitize-r5900
7851 011100,5.RS,5.RT,5.RD,00010101000:MMI1:32::PCEQW
7854 unsigned32 instruction = instruction_0;
7855 int destreg = ((instruction >> 11) & 0x0000001F);
7856 signed_word rs_reg = GPR[RS];
7857 signed_word rs_reg1 = GPR1[RS];
7858 signed_word rt_reg = GPR[RT];
7859 signed_word rt_reg1 = GPR1[RT];
7862 for(i=0;i<WORDS_IN_MMI_REGS;i++)
7864 if (RS_SW(i) == RT_SW(i)) GPR_SW(destreg,i) = 0xFFFFFFFF;
7865 else GPR_SW(destreg,i) = 0;
7870 // end-sanitize-r5900
7871 // start-sanitize-r5900
7873 011100,5.RS,5.RT,5.RD,01010001000:MMI0:32::PCGTB
7876 unsigned32 instruction = instruction_0;
7877 int destreg = ((instruction >> 11) & 0x0000001F);
7878 signed_word rs_reg = GPR[RS];
7879 signed_word rs_reg1 = GPR1[RS];
7880 signed_word rt_reg = GPR[RT];
7881 signed_word rt_reg1 = GPR1[RT];
7884 for(i=0;i<BYTES_IN_MMI_REGS;i++)
7886 if (RS_SB(i) > RT_SB(i)) GPR_SB(destreg,i) = 0xFF;
7887 else GPR_SB(destreg,i) = 0;
7892 // end-sanitize-r5900
7893 // start-sanitize-r5900
7895 011100,5.RS,5.RT,5.RD,00110001000:MMI0:32::PCGTH
7898 unsigned32 instruction = instruction_0;
7899 int destreg = ((instruction >> 11) & 0x0000001F);
7900 signed_word rs_reg = GPR[RS];
7901 signed_word rs_reg1 = GPR1[RS];
7902 signed_word rt_reg = GPR[RT];
7903 signed_word rt_reg1 = GPR1[RT];
7906 for(i=0;i<HALFWORDS_IN_MMI_REGS;i++)
7908 if (RS_SH(i) > RT_SH(i)) GPR_SH(destreg,i) = 0xFFFF;
7909 else GPR_SH(destreg,i) = 0;
7914 // end-sanitize-r5900
7915 // start-sanitize-r5900
7917 011100,5.RS,5.RT,5.RD,00010001000:MMI0:32::PCGTW
7920 unsigned32 instruction = instruction_0;
7921 int destreg = ((instruction >> 11) & 0x0000001F);
7922 signed_word rs_reg = GPR[RS];
7923 signed_word rs_reg1 = GPR1[RS];
7924 signed_word rt_reg = GPR[RT];
7925 signed_word rt_reg1 = GPR1[RT];
7928 for(i=0;i<WORDS_IN_MMI_REGS;i++)
7930 if (RS_SW(i) > RT_SW(i)) GPR_SW(destreg,i) = 0xFFFFFFFF;
7931 else GPR_SW(destreg,i) = 0;
7936 // end-sanitize-r5900
7937 // start-sanitize-r5900
7939 01110000000,5.RT,5.RD,11011101001:MMI3:32::PCPYH
7942 unsigned32 instruction = instruction_0;
7943 int destreg = ((instruction >> 11) & 0x0000001F);
7944 signed_word rt_reg = GPR[RT];
7945 signed_word rt_reg1 = GPR1[RT];
7947 GPR_UH(destreg,7) = GPR_UH(destreg,6) = GPR_UH(destreg,5) = GPR_UH(destreg,4) = RT_UH(4);
7948 GPR_UH(destreg,3) = GPR_UH(destreg,2) = GPR_UH(destreg,1) = GPR_UH(destreg,0) = RT_UH(0);
7952 // end-sanitize-r5900
7953 // start-sanitize-r5900
7955 011100,5.RS,5.RT,5.RD,01110001001:MMI2:32::PCPYLD
7958 unsigned32 instruction = instruction_0;
7959 int destreg = ((instruction >> 11) & 0x0000001F);
7960 signed_word rs_reg = GPR[RS];
7961 signed_word rs_reg1 = GPR1[RS];
7962 signed_word rt_reg = GPR[RT];
7963 signed_word rt_reg1 = GPR1[RT];
7965 GPR_UD(destreg,0) = RT_UD(0);
7966 GPR_UD(destreg,1) = RS_UD(0);
7970 // end-sanitize-r5900
7971 // start-sanitize-r5900
7973 011100,5.RS,5.RT,5.RD,01110101001:MMI3:32::PCPYUD
7976 unsigned32 instruction = instruction_0;
7977 int destreg = ((instruction >> 11) & 0x0000001F);
7978 signed_word rs_reg = GPR[RS];
7979 signed_word rs_reg1 = GPR1[RS];
7980 signed_word rt_reg = GPR[RT];
7981 signed_word rt_reg1 = GPR1[RT];
7983 GPR_UD(destreg,0) = RS_UD(1);
7984 GPR_UD(destreg,1) = RT_UD(1);
7988 // end-sanitize-r5900
7989 // start-sanitize-r5900
7991 011100,5.RS,5.RT,0000011101001001:MMI2:32::PDIVBW
7994 signed_word rs_reg = GPR[RS];
7995 signed_word rs_reg1 = GPR1[RS];
7996 signed_word rt_reg = GPR[RT];
7997 signed_word rt_reg1 = GPR1[RT];
7999 signed32 devisor = RT_SH(0);
8002 LO_SW(0) = -RS_SW(0);
8004 LO_SW(1) = -RS_SW(1);
8006 LO_SW(2) = -RS_SW(2);
8008 LO_SW(3) = -RS_SW(3);
8011 else if (devisor != 0)
8013 LO_SW(0) = RS_SW(0) / devisor;
8014 HI_SW(0) = SIGNEXTEND( (RS_SW(0) % devisor), 16 );
8015 LO_SW(1) = RS_SW(1) / devisor;
8016 HI_SW(1) = SIGNEXTEND( (RS_SW(1) % devisor), 16 );
8017 LO_SW(2) = RS_SW(2) / devisor;
8018 HI_SW(2) = SIGNEXTEND( (RS_SW(2) % devisor), 16 );
8019 LO_SW(3) = RS_SW(3) / devisor;
8020 HI_SW(3) = SIGNEXTEND( (RS_SW(3) % devisor), 16 );
8025 // end-sanitize-r5900
8026 // start-sanitize-r5900
8028 011100,5.RS,5.RT,0000001101101001:MMI3:32::PDIVUW
8031 signed_word rs_reg = GPR[RS];
8032 signed_word rs_reg1 = GPR1[RS];
8033 signed_word rt_reg = GPR[RT];
8034 signed_word rt_reg1 = GPR1[RT];
8038 LO = (signed32)(RS_UW(0) / RT_UW(0));
8039 HI = (signed32)(RS_UW(0) % RT_UW(0));
8043 LO1 = (signed32)(RS_UW(2) / RT_UW(2));
8044 HI1 = (signed32)(RS_UW(2) % RT_UW(2));
8049 // end-sanitize-r5900
8050 // start-sanitize-r5900
8052 011100,5.RS,5.RT,0000001101001001:MMI2:32::PDIVW
8055 signed_word rs_reg = GPR[RS];
8056 signed_word rs_reg1 = GPR1[RS];
8057 signed_word rt_reg = GPR[RT];
8058 signed_word rt_reg1 = GPR1[RT];
8065 else if (RT_UW(0) != 0)
8067 LO = (signed32)(RS_SW(0) / RT_SW(0));
8068 HI = (signed32)(RS_SW(0) % RT_SW(0));
8075 else if (RT_UW(2) != 0)
8077 LO1 = (signed32)(RS_SW(2) / RT_SW(2));
8078 HI1 = (signed32)(RS_SW(2) % RT_SW(2));
8083 // end-sanitize-r5900
8084 // start-sanitize-r5900
8086 01110000000,5.RT,5.RD,11010101001:MMI3:32::PEXCH
8089 unsigned32 instruction = instruction_0;
8090 int destreg = ((instruction >> 11) & 0x0000001F);
8091 signed_word rt_reg = GPR[RT];
8092 signed_word rt_reg1 = GPR1[RT];
8094 GPR_UH(destreg,0) = RT_UH(0);
8095 GPR_UH(destreg,1) = RT_UH(2);
8096 GPR_UH(destreg,2) = RT_UH(1);
8097 GPR_UH(destreg,3) = RT_UH(3);
8098 GPR_UH(destreg,4) = RT_UH(4);
8099 GPR_UH(destreg,5) = RT_UH(6);
8100 GPR_UH(destreg,6) = RT_UH(5);
8101 GPR_UH(destreg,7) = RT_UH(7);
8105 // end-sanitize-r5900
8106 // start-sanitize-r5900
8108 01110000000,5.RT,5.RD,11110101001:MMI3:32::PEXCW
8111 unsigned32 instruction = instruction_0;
8112 int destreg = ((instruction >> 11) & 0x0000001F);
8113 signed_word rt_reg = GPR[RT];
8114 signed_word rt_reg1 = GPR1[RT];
8116 GPR_UW(destreg,0) = RT_UW(0);
8117 GPR_UW(destreg,1) = RT_UW(2);
8118 GPR_UW(destreg,2) = RT_UW(1);
8119 GPR_UW(destreg,3) = RT_UW(3);
8123 // end-sanitize-r5900
8124 // start-sanitize-r5900
8126 01110000000,5.RT,5.RD,11010001001:MMI2:32::PEXOH
8129 unsigned32 instruction = instruction_0;
8130 int destreg = ((instruction >> 11) & 0x0000001F);
8131 signed_word rt_reg = GPR[RT];
8132 signed_word rt_reg1 = GPR1[RT];
8134 GPR_UH(destreg,0) = RT_UH(2);
8135 GPR_UH(destreg,1) = RT_UH(1);
8136 GPR_UH(destreg,2) = RT_UH(0);
8137 GPR_UH(destreg,3) = RT_UH(3);
8138 GPR_UH(destreg,4) = RT_UH(6);
8139 GPR_UH(destreg,5) = RT_UH(5);
8140 GPR_UH(destreg,6) = RT_UH(4);
8141 GPR_UH(destreg,7) = RT_UH(7);
8145 // end-sanitize-r5900
8146 // start-sanitize-r5900
8148 01110000000,5.RT,5.RD,11110001001:MMI2:32::PEXOW
8151 unsigned32 instruction = instruction_0;
8152 int destreg = ((instruction >> 11) & 0x0000001F);
8153 signed_word rt_reg = GPR[RT];
8154 signed_word rt_reg1 = GPR1[RT];
8156 GPR_UW(destreg,0) = RT_UW(2);
8157 GPR_UW(destreg,1) = RT_UW(1);
8158 GPR_UW(destreg,2) = RT_UW(0);
8159 GPR_UW(destreg,3) = RT_UW(3);
8163 // end-sanitize-r5900
8164 // start-sanitize-r5900
8166 01110000000,5.RT,5.RD,11110001000:MMI0:32::PEXT5
8169 unsigned32 instruction = instruction_0;
8170 int destreg = ((instruction >> 11) & 0x0000001F);
8171 signed_word rt_reg = GPR[RT];
8172 signed_word rt_reg1 = GPR1[RT];
8175 for(i=0;i<WORDS_IN_MMI_REGS;i++)
8177 unsigned32 x = RT_UW(i);
8178 GPR_UW(destreg,i) = ((x & (1 << 15)) << (31 - 15))
8179 | ((x & (31 << 10)) << (19 - 10))
8180 | ((x & (31 << 5)) << (11 - 5))
8181 | ((x & (31 << 0)) << (3 - 0));
8186 // end-sanitize-r5900
8187 // start-sanitize-r5900
8189 011100,5.RS,5.RT,5.RD,11010001000:MMI0:32::PEXTLB
8192 unsigned32 instruction = instruction_0;
8193 int destreg = ((instruction >> 11) & 0x0000001F);
8194 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8195 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8196 signed_word rt_reg = GPR[RT];
8197 signed_word rt_reg1 = GPR1[RT];
8199 GPR_UB(destreg,0) = RT_UB(0);
8200 GPR_UB(destreg,1) = RS_UB(0);
8201 GPR_UB(destreg,2) = RT_UB(1);
8202 GPR_UB(destreg,3) = RS_UB(1);
8203 GPR_UB(destreg,4) = RT_UB(2);
8204 GPR_UB(destreg,5) = RS_UB(2);
8205 GPR_UB(destreg,6) = RT_UB(3);
8206 GPR_UB(destreg,7) = RS_UB(3);
8207 GPR_UB(destreg,8) = RT_UB(4);
8208 GPR_UB(destreg,9) = RS_UB(4);
8209 GPR_UB(destreg,10) = RT_UB(5);
8210 GPR_UB(destreg,11) = RS_UB(5);
8211 GPR_UB(destreg,12) = RT_UB(6);
8212 GPR_UB(destreg,13) = RS_UB(6);
8213 GPR_UB(destreg,14) = RT_UB(7);
8214 GPR_UB(destreg,15) = RS_UB(7);
8218 // end-sanitize-r5900
8219 // start-sanitize-r5900
8221 011100,5.RS,5.RT,5.RD,10110001000:MMI0:32::PEXTLH
8224 unsigned32 instruction = instruction_0;
8225 int destreg = ((instruction >> 11) & 0x0000001F);
8226 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8227 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8228 signed_word rt_reg = GPR[RT];
8229 signed_word rt_reg1 = GPR1[RT];
8231 GPR_UH(destreg,0) = RT_UH(0);
8232 GPR_UH(destreg,1) = RS_UH(0);
8233 GPR_UH(destreg,2) = RT_UH(1);
8234 GPR_UH(destreg,3) = RS_UH(1);
8235 GPR_UH(destreg,4) = RT_UH(2);
8236 GPR_UH(destreg,5) = RS_UH(2);
8237 GPR_UH(destreg,6) = RT_UH(3);
8238 GPR_UH(destreg,7) = RS_UH(3);
8242 // end-sanitize-r5900
8243 // start-sanitize-r5900
8245 011100,5.RS,5.RT,5.RD,10010001000:MMI0:32::PEXTLW
8248 unsigned32 instruction = instruction_0;
8249 int destreg = ((instruction >> 11) & 0x0000001F);
8250 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8251 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8252 signed_word rt_reg = GPR[RT];
8253 signed_word rt_reg1 = GPR1[RT];
8255 GPR_UW(destreg,0) = RT_UW(0);
8256 GPR_UW(destreg,1) = RS_UW(0);
8257 GPR_UW(destreg,2) = RT_UW(1);
8258 GPR_UW(destreg,3) = RS_UW(1);
8262 // end-sanitize-r5900
8263 // start-sanitize-r5900
8265 011100,5.RS,5.RT,5.RD,11010101000:MMI1:32::PEXTUB
8268 unsigned32 instruction = instruction_0;
8269 int destreg = ((instruction >> 11) & 0x0000001F);
8270 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8271 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8272 signed_word rt_reg = GPR[RT];
8273 signed_word rt_reg1 = GPR1[RT];
8275 GPR_UB(destreg,0) = RT_UB(8);
8276 GPR_UB(destreg,1) = RS_UB(8);
8277 GPR_UB(destreg,2) = RT_UB(9);
8278 GPR_UB(destreg,3) = RS_UB(9);
8279 GPR_UB(destreg,4) = RT_UB(10);
8280 GPR_UB(destreg,5) = RS_UB(10);
8281 GPR_UB(destreg,6) = RT_UB(11);
8282 GPR_UB(destreg,7) = RS_UB(11);
8283 GPR_UB(destreg,8) = RT_UB(12);
8284 GPR_UB(destreg,9) = RS_UB(12);
8285 GPR_UB(destreg,10) = RT_UB(13);
8286 GPR_UB(destreg,11) = RS_UB(13);
8287 GPR_UB(destreg,12) = RT_UB(14);
8288 GPR_UB(destreg,13) = RS_UB(14);
8289 GPR_UB(destreg,14) = RT_UB(15);
8290 GPR_UB(destreg,15) = RS_UB(15);
8294 // end-sanitize-r5900
8295 // start-sanitize-r5900
8297 011100,5.RS,5.RT,5.RD,10110101000:MMI1:32::PEXTUH
8300 unsigned32 instruction = instruction_0;
8301 int destreg = ((instruction >> 11) & 0x0000001F);
8302 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8303 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8304 signed_word rt_reg = GPR[RT];
8305 signed_word rt_reg1 = GPR1[RT];
8307 GPR_UH(destreg,0) = RT_UH(4);
8308 GPR_UH(destreg,1) = RS_UH(4);
8309 GPR_UH(destreg,2) = RT_UH(5);
8310 GPR_UH(destreg,3) = RS_UH(5);
8311 GPR_UH(destreg,4) = RT_UH(6);
8312 GPR_UH(destreg,5) = RS_UH(6);
8313 GPR_UH(destreg,6) = RT_UH(7);
8314 GPR_UH(destreg,7) = RS_UH(7);
8318 // end-sanitize-r5900
8319 // start-sanitize-r5900
8321 011100,5.RS,5.RT,5.RD,10010101000:MMI1:32::PEXTUW
8324 unsigned32 instruction = instruction_0;
8325 int destreg = ((instruction >> 11) & 0x0000001F);
8326 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8327 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8328 signed_word rt_reg = GPR[RT];
8329 signed_word rt_reg1 = GPR1[RT];
8331 GPR_UW(destreg,0) = RT_UW(2);
8332 GPR_UW(destreg,1) = RS_UW(2);
8333 GPR_UW(destreg,2) = RT_UW(3);
8334 GPR_UW(destreg,3) = RS_UW(3);
8338 // end-sanitize-r5900
8339 // start-sanitize-r5900
8341 011100,5.RS,5.RT,5.RD,10001001001:MMI2:32::PHMADDH
8344 unsigned32 instruction = instruction_0;
8345 int destreg = ((instruction >> 11) & 0x0000001F);
8346 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8347 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8348 signed_word rt_reg = GPR[RT];
8349 signed_word rt_reg1 = GPR1[RT];
8351 GPR_SW(destreg,0) = LO_SW(0) = (RS_SH(1) * RT_SH(1)) + (RS_SH(0) * RT_SH(0));
8352 GPR_SW(destreg,1) = HI_SW(0) = (RS_SH(3) * RT_SH(3)) + (RS_SH(2) * RT_SH(2));
8353 GPR_SW(destreg,2) = LO_SW(2) = (RS_SH(5) * RT_SH(5)) + (RS_SH(4) * RT_SH(4));
8354 GPR_SW(destreg,3) = HI_SW(2) = (RS_SH(7) * RT_SH(7)) + (RS_SH(6) * RT_SH(6));
8358 // end-sanitize-r5900
8359 // start-sanitize-r5900
8361 011100,5.RS,5.RT,5.RD,10101001001:MMI2:32::PHMSUBH
8364 unsigned32 instruction = instruction_0;
8365 int destreg = ((instruction >> 11) & 0x0000001F);
8366 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8367 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8368 signed_word rt_reg = GPR[RT];
8369 signed_word rt_reg1 = GPR1[RT];
8371 GPR_SW(destreg,0) = LO_SW(0) = (RS_SH(1) * RT_SH(1)) - (RS_SH(0) * RT_SH(0));
8372 GPR_SW(destreg,1) = HI_SW(0) = (RS_SH(3) * RT_SH(3)) - (RS_SH(2) * RT_SH(2));
8373 GPR_SW(destreg,2) = LO_SW(2) = (RS_SH(5) * RT_SH(5)) - (RS_SH(4) * RT_SH(4));
8374 GPR_SW(destreg,3) = HI_SW(2) = (RS_SH(7) * RT_SH(7)) - (RS_SH(6) * RT_SH(6));
8378 // end-sanitize-r5900
8379 // start-sanitize-r5900
8381 011100,5.RS,5.RT,5.RD,01010001001:MMI2:32::PINTH
8384 unsigned32 instruction = instruction_0;
8385 int destreg = ((instruction >> 11) & 0x0000001F);
8386 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8387 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8388 signed_word rt_reg = GPR[RT];
8389 signed_word rt_reg1 = GPR1[RT];
8391 GPR_UH(destreg,0) = RT_UH(0);
8392 GPR_UH(destreg,1) = RS_UH(4);
8393 GPR_UH(destreg,2) = RT_UH(1);
8394 GPR_UH(destreg,3) = RS_UH(5);
8395 GPR_UH(destreg,4) = RT_UH(2);
8396 GPR_UH(destreg,5) = RS_UH(6);
8397 GPR_UH(destreg,6) = RT_UH(3);
8398 GPR_UH(destreg,7) = RS_UH(7);
8402 // end-sanitize-r5900
8403 // start-sanitize-r5900
8405 011100,5.RS,5.RT,5.RD,01010101001:MMI3:32::PINTOH
8408 unsigned32 instruction = instruction_0;
8409 int destreg = ((instruction >> 11) & 0x0000001F);
8410 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8411 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8412 signed_word rt_reg = GPR[RT];
8413 signed_word rt_reg1 = GPR1[RT];
8415 GPR_UH(destreg,0) = RT_UH(0);
8416 GPR_UH(destreg,1) = RS_UH(0);
8417 GPR_UH(destreg,2) = RT_UH(2);
8418 GPR_UH(destreg,3) = RS_UH(2);
8419 GPR_UH(destreg,4) = RT_UH(4);
8420 GPR_UH(destreg,5) = RS_UH(4);
8421 GPR_UH(destreg,6) = RT_UH(6);
8422 GPR_UH(destreg,7) = RS_UH(6);
8426 // end-sanitize-r5900
8427 // start-sanitize-r5900
8429 011100,5.RS,00000,5.RD,00000000100:MMINORM:32::PLZCW
8432 unsigned32 instruction = instruction_0;
8433 int destreg = ((instruction >> 11) & 0x0000001F);
8434 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8435 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8437 unsigned long value;
8443 test = !!(value & (1 << 31));
8444 for(i=30; i>=0 && (test == !!(value & (1 << i))); i--)
8446 GPR_UW(destreg,0) = count;
8449 test = !!(value & (1 << 31));
8450 for(i=30; i>=0 && (test == !!(value & (1 << i))); i--)
8452 GPR_UW(destreg,1) = count;
8456 // end-sanitize-r5900
8457 // start-sanitize-r5900
8459 011100,5.RS,5.RT,5.RD,10000001001:MMI2:32::PMADDH
8462 unsigned32 instruction = instruction_0;
8463 int destreg = ((instruction >> 11) & 0x0000001F);
8464 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8465 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8466 signed_word rt_reg = GPR[RT];
8467 signed_word rt_reg1 = GPR1[RT];
8469 GPR_SW(destreg,0) = LO_SW(0) += (RS_SH(0) * RT_SH(0));
8470 LO_SW(1) += (RS_SH(1) * RT_SH(1));
8471 GPR_SW(destreg,1) = HI_SW(0) += (RS_SH(2) * RT_SH(2));
8472 HI_SW(1) += (RS_SH(3) * RT_SH(3));
8473 GPR_SW(destreg,2) = LO_SW(2) += (RS_SH(4) * RT_SH(4));
8474 LO_SW(3) += (RS_SH(5) * RT_SH(5));
8475 GPR_SW(destreg,3) = HI_SW(2) += (RS_SH(6) * RT_SH(6));
8476 HI_SW(3) += (RS_SH(7) * RT_SH(7));
8480 // end-sanitize-r5900
8481 // start-sanitize-r5900
8483 011100,5.RS,5.RT,5.RD,00000101001:MMI3:32::PMADDUW
8486 unsigned32 instruction = instruction_0;
8487 int destreg = ((instruction >> 11) & 0x0000001F);
8488 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8489 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8490 signed_word rt_reg = GPR[RT];
8491 signed_word rt_reg1 = GPR1[RT];
8493 unsigned64 sum0 = U8_4 (HI_SW(0), LO_SW(0));
8494 unsigned64 sum1 = U8_4 (HI_SW(2), LO_SW(2));
8495 unsigned64 prod0 = (unsigned64)RS_UW(0) * (unsigned64)RT_UW(0);
8496 unsigned64 prod1 = (unsigned64)RS_UW(2) * (unsigned64)RT_UW(2);
8499 GPR_UD(destreg,0) = sum0;
8500 GPR_UD(destreg,1) = sum1;
8501 LO = SIGNEXTEND( sum0, 32 );
8502 HI = SIGNEXTEND( VH4_8(sum0), 32 );
8503 LO1 = SIGNEXTEND( sum1, 32 );
8504 HI1 = SIGNEXTEND( VH4_8(sum1), 32 );
8508 // end-sanitize-r5900
8509 // start-sanitize-r5900
8511 011100,5.RS,5.RT,5.RD,00000001001:MMI2:32::PMADDW
8514 unsigned32 instruction = instruction_0;
8515 int destreg = ((instruction >> 11) & 0x0000001F);
8516 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8517 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8518 signed_word rt_reg = GPR[RT];
8519 signed_word rt_reg1 = GPR1[RT];
8521 signed64 sum0 = WORD64( HI_SW(0), LO_SW(0) );
8522 signed64 sum1 = WORD64( HI_SW(2), LO_SW(2) );
8523 signed64 prod0 = (signed64)RS_SW(0) * (signed64)RT_SW(0);
8524 signed64 prod1 = (signed64)RS_SW(2) * (signed64)RT_SW(2);
8527 GPR_SD(destreg,0) = sum0;
8528 GPR_SD(destreg,1) = sum1;
8529 LO = SIGNEXTEND( sum0, 32 );
8530 HI = SIGNEXTEND( VH4_8(sum0), 32 );
8531 LO1 = SIGNEXTEND( sum1, 32 );
8532 HI1 = SIGNEXTEND( VH4_8(sum1), 32 );
8536 // end-sanitize-r5900
8537 // start-sanitize-r5900
8539 011100,5.RS,5.RT,5.RD,00111001000:MMI0:32::PMAXH
8542 unsigned32 instruction = instruction_0;
8543 int destreg = ((instruction >> 11) & 0x0000001F);
8544 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8545 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8546 signed_word rt_reg = GPR[RT];
8547 signed_word rt_reg1 = GPR1[RT];
8550 for(i=0;i<HALFWORDS_IN_MMI_REGS;i++)
8552 if (RS_SH(i) > RT_SH(i)) GPR_SH(destreg,i) = RS_SH(i);
8553 else GPR_SH(destreg,i) = RT_SH(i);
8558 // end-sanitize-r5900
8559 // start-sanitize-r5900
8561 011100,5.RS,5.RT,5.RD,00011001000:MMI0:32::PMAXW
8564 unsigned32 instruction = instruction_0;
8565 int destreg = ((instruction >> 11) & 0x0000001F);
8566 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8567 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8568 signed_word rt_reg = GPR[RT];
8569 signed_word rt_reg1 = GPR1[RT];
8572 for(i=0;i<WORDS_IN_MMI_REGS;i++)
8574 if (RS_SW(i) > RT_SW(i)) GPR_SW(destreg,i) = RS_SW(i);
8575 else GPR_SW(destreg,i) = RT_SW(i);
8580 // end-sanitize-r5900
8581 // start-sanitize-r5900
8583 0111000000000000,5.RD,01000001001:MMI2:32::PMFHI
8586 unsigned32 instruction = instruction_0;
8587 int destreg = ((instruction >> 11) & 0x0000001F);
8589 GPR_SD(destreg,0) = HI;
8590 GPR_SD(destreg,1) = HI1;
8594 // end-sanitize-r5900
8595 // start-sanitize-r5900
8597 0111000000000000,5.RD,01001001001:MMI2:32::PMFLO
8600 unsigned32 instruction = instruction_0;
8601 int destreg = ((instruction >> 11) & 0x0000001F);
8603 GPR_SD(destreg,0) = LO;
8604 GPR_SD(destreg,1) = LO1;
8608 // end-sanitize-r5900
8609 // start-sanitize-r5900
8611 0111000000000000,5.RD,5.SHIFT,110000:MMINORM:32::PMFHL
8614 unsigned32 instruction = instruction_0;
8615 int op1 = ((instruction >> 6) & 0x0000001F);
8616 int destreg = ((instruction >> 11) & 0x0000001F);
8620 GPR_UW(destreg,0) = LO_UW(0);
8621 GPR_UW(destreg,1) = HI_UW(0);
8622 GPR_UW(destreg,2) = LO_UW(2);
8623 GPR_UW(destreg,3) = HI_UW(2);
8627 GPR_UW(destreg,0) = LO_UW(1);
8628 GPR_UW(destreg,1) = HI_UW(1);
8629 GPR_UW(destreg,2) = LO_UW(3);
8630 GPR_UW(destreg,3) = HI_UW(3);
8634 /* NOTE: This code implements a saturate according to the
8635 figure on page B-115 and not according to the
8636 definition on page B-113 */
8637 signed64 t = ((unsigned64)HI_UW(0) << 32) | (unsigned64)LO_UW(0);
8638 signed64 u = ((unsigned64)HI_UW(2) << 32) | (unsigned64)LO_UW(2);
8639 if ( t > SIGNED64 (0x000000007FFFFFFF) )
8640 GPR_SD(destreg,0) = SIGNED64 (0x000000007FFFFFFF);
8641 else if ( t < - SIGNED64 (0x0000000080000000) )
8642 GPR_SD(destreg,0) = - SIGNED64 (0x0000000080000000);
8644 GPR_SD(destreg,0) = t;
8645 if ( u > SIGNED64 (0x000000007FFFFFFF) )
8646 GPR_SD(destreg,1) = SIGNED64 (0x000000007FFFFFFF);
8647 else if ( u < - SIGNED64 (0x0000000080000000) )
8648 GPR_SD(destreg,1) = - SIGNED64 (0x0000000080000000);
8650 GPR_SD(destreg,1) = u;
8654 GPR_UH(destreg,0) = LO_UH(0);
8655 GPR_UH(destreg,1) = LO_UH(2);
8656 GPR_UH(destreg,2) = HI_UH(0);
8657 GPR_UH(destreg,3) = HI_UH(2);
8658 GPR_UH(destreg,4) = LO_UH(4);
8659 GPR_UH(destreg,5) = LO_UH(6);
8660 GPR_UH(destreg,6) = HI_UH(4);
8661 GPR_UH(destreg,7) = HI_UH(6);
8665 if (LO_SW(0) > 0x7FFF)
8666 GPR_UH(destreg,0) = 0x7FFF;
8667 else if (LO_SW(0) < -0x8000)
8668 GPR_UH(destreg,0) = 0x8000;
8670 GPR_UH(destreg,0) = LO_UH(0);
8671 if (LO_SW(1) > 0x7FFF)
8672 GPR_UH(destreg,1) = 0x7FFF;
8673 else if (LO_SW(1) < -0x8000)
8674 GPR_UH(destreg,1) = 0x8000;
8676 GPR_UH(destreg,1) = LO_UH(2);
8677 if (HI_SW(0) > 0x7FFF)
8678 GPR_UH(destreg,2) = 0x7FFF;
8679 else if (HI_SW(0) < -0x8000)
8680 GPR_UH(destreg,2) = 0x8000;
8682 GPR_UH(destreg,2) = HI_UH(0);
8683 if (HI_SW(1) > 0x7FFF)
8684 GPR_UH(destreg,3) = 0x7FFF;
8685 else if (HI_SW(1) < -0x8000)
8686 GPR_UH(destreg,3) = 0x8000;
8688 GPR_UH(destreg,3) = HI_UH(2);
8689 if (LO_SW(2) > 0x7FFF)
8690 GPR_UH(destreg,4) = 0x7FFF;
8691 else if (LO_SW(2) < -0x8000)
8692 GPR_UH(destreg,4) = 0x8000;
8694 GPR_UH(destreg,4) = LO_UH(4);
8695 if (LO_SW(3) > 0x7FFF)
8696 GPR_UH(destreg,5) = 0x7FFF;
8697 else if (LO_SW(3) < -0x8000)
8698 GPR_UH(destreg,5) = 0x8000;
8700 GPR_UH(destreg,5) = LO_UH(6);
8701 if (HI_SW(2) > 0x7FFF)
8702 GPR_UH(destreg,6) = 0x7FFF;
8703 else if (HI_SW(2) < -0x8000)
8704 GPR_UH(destreg,6) = 0x8000;
8706 GPR_UH(destreg,6) = HI_UH(4);
8707 if (HI_SW(3) > 0x7FFF)
8708 GPR_UH(destreg,7) = 0x7FFF;
8709 else if (HI_SW(3) < -0x8000)
8710 GPR_UH(destreg,7) = 0x8000;
8712 GPR_UH(destreg,7) = HI_UH(6);
8717 // end-sanitize-r5900
8718 // start-sanitize-r5900
8720 011100,5.RS,5.RT,5.RD,00111101000:MMI1:32::PMINH
8723 unsigned32 instruction = instruction_0;
8724 int destreg = ((instruction >> 11) & 0x0000001F);
8725 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8726 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8727 signed_word rt_reg = GPR[RT];
8728 signed_word rt_reg1 = GPR1[RT];
8731 for(i=0;i<HALFWORDS_IN_MMI_REGS;i++)
8733 if (RS_SH(i) < RT_SH(i)) GPR_SH(destreg,i) = RS_SH(i);
8734 else GPR_SH(destreg,i) = RT_SH(i);
8739 // end-sanitize-r5900
8740 // start-sanitize-r5900
8742 011100,5.RS,5.RT,5.RD,00011101000:MMI1:32::PMINW
8745 unsigned32 instruction = instruction_0;
8746 int destreg = ((instruction >> 11) & 0x0000001F);
8747 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8748 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8749 signed_word rt_reg = GPR[RT];
8750 signed_word rt_reg1 = GPR1[RT];
8753 for(i=0;i<WORDS_IN_MMI_REGS;i++)
8755 if (RS_SW(i) < RT_SW(i)) GPR_SW(destreg,i) = RS_SW(i);
8756 else GPR_SW(destreg,i) = RT_SW(i);
8761 // end-sanitize-r5900
8762 // start-sanitize-r5900
8764 011100,5.RS,5.RT,5.RD,10100001001:MMI2:32::PMSUBH
8767 unsigned32 instruction = instruction_0;
8768 int destreg = ((instruction >> 11) & 0x0000001F);
8769 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8770 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8771 signed_word rt_reg = GPR[RT];
8772 signed_word rt_reg1 = GPR1[RT];
8774 GPR_SW(destreg,0) = LO_SW(0) -= (RS_SH(0) * RT_SH(0));
8775 LO_SW(1) -= (RS_SH(1) * RT_SH(1));
8776 GPR_SW(destreg,1) = HI_SW(0) -= (RS_SH(2) * RT_SH(2));
8777 HI_SW(1) -= (RS_SH(3) * RT_SH(3));
8778 GPR_SW(destreg,2) = LO_SW(2) -= (RS_SH(4) * RT_SH(4));
8779 LO_SW(3) -= (RS_SH(5) * RT_SH(5));
8780 GPR_SW(destreg,3) = HI_SW(2) -= (RS_SH(6) * RT_SH(6));
8781 HI_SW(3) -= (RS_SH(7) * RT_SH(7));
8785 // end-sanitize-r5900
8786 // start-sanitize-r5900
8788 011100,5.RS,5.RT,5.RD,00100001001:MMI2:32::PMSUBW
8791 unsigned32 instruction = instruction_0;
8792 int destreg = ((instruction >> 11) & 0x0000001F);
8793 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8794 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8795 signed_word rt_reg = GPR[RT];
8796 signed_word rt_reg1 = GPR1[RT];
8798 signed64 sum0 = WORD64( HI_SW(0), LO_SW(0) );
8799 signed64 sum1 = WORD64( HI_SW(2), LO_SW(2) );
8800 signed64 prod0 = (signed64)RS_SW(0) * (signed64)RT_SW(0);
8801 signed64 prod1 = (signed64)RS_SW(2) * (signed64)RT_SW(2);
8804 GPR_SD(destreg,0) = sum0;
8805 GPR_SD(destreg,1) = sum1;
8806 LO = SIGNEXTEND( sum0, 32 );
8807 HI = SIGNEXTEND( VH4_8(sum0), 32 );
8808 LO1 = SIGNEXTEND( sum1, 32 );
8809 HI1 = SIGNEXTEND( VH4_8(sum1), 32 );
8813 // end-sanitize-r5900
8814 // start-sanitize-r5900
8816 011100,5.RS,000000000001000101001:MMI3:32::PMTHI
8819 unsigned32 instruction = instruction_0;
8820 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8821 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8828 // end-sanitize-r5900
8829 // start-sanitize-r5900
8831 011100,5.RS,000000000001001101001:MMI3:32::PMTLO
8834 unsigned32 instruction = instruction_0;
8835 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8836 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8843 // end-sanitize-r5900
8844 // start-sanitize-r5900
8846 011100,5.RS,000000000000000110001:MMINORM:32::PMTHL.LW
8849 unsigned32 instruction = instruction_0;
8850 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8851 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8853 LO_UW(0) = RS_UW(0);
8854 HI_UW(0) = RS_UW(1);
8855 LO_UW(2) = RS_UW(2);
8856 HI_UW(2) = RS_UW(3);
8860 // end-sanitize-r5900
8861 // start-sanitize-r5900
8863 011100,5.RS,5.RT,5.RD,11100001001:MMI2:32::PMULTH
8866 unsigned32 instruction = instruction_0;
8867 int destreg = ((instruction >> 11) & 0x0000001F);
8868 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8869 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8870 signed_word rt_reg = GPR[RT];
8871 signed_word rt_reg1 = GPR1[RT];
8873 GPR_SW(destreg,0) = LO_SW(0) = (RS_SH(0) * RT_SH(0));
8874 LO_SW(1) = (RS_SH(1) * RT_SH(1));
8875 GPR_SW(destreg,1) = HI_SW(0) = (RS_SH(2) * RT_SH(2));
8876 HI_SW(1) = (RS_SH(3) * RT_SH(3));
8877 GPR_SW(destreg,2) = LO_SW(2) = (RS_SH(4) * RT_SH(4));
8878 LO_SW(3) = (RS_SH(5) * RT_SH(5));
8879 GPR_SW(destreg,3) = HI_SW(2) = (RS_SH(6) * RT_SH(6));
8880 HI_SW(3) = (RS_SH(7) * RT_SH(7));
8884 // end-sanitize-r5900
8885 // start-sanitize-r5900
8887 011100,5.RS,5.RT,5.RD,01100101001:MMI3:32::PMULTUW
8890 unsigned32 instruction = instruction_0;
8891 int destreg = ((instruction >> 11) & 0x0000001F);
8892 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8893 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8894 signed_word rt_reg = GPR[RT];
8895 signed_word rt_reg1 = GPR1[RT];
8897 unsigned64 sum0 = 0;
8898 unsigned64 sum1 = 0;
8899 unsigned64 prod0 = (unsigned64)RS_UW(0) * (unsigned64)RT_UW(0);
8900 unsigned64 prod1 = (unsigned64)RS_UW(2) * (unsigned64)RT_UW(2);
8903 GPR_UD(destreg,0) = sum0;
8904 GPR_UD(destreg,1) = sum1;
8905 LO = SIGNEXTEND( sum0, 32 );
8906 HI = SIGNEXTEND( VH4_8(sum0), 32 );
8907 LO1 = SIGNEXTEND( sum1, 32 );
8908 HI1 = SIGNEXTEND( VH4_8(sum1), 32 );
8912 // end-sanitize-r5900
8913 // start-sanitize-r5900
8915 011100,5.RS,5.RT,5.RD,01100001001:MMI2:32::PMULTW
8918 unsigned32 instruction = instruction_0;
8919 int destreg = ((instruction >> 11) & 0x0000001F);
8920 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8921 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8922 signed_word rt_reg = GPR[RT];
8923 signed_word rt_reg1 = GPR1[RT];
8927 signed64 prod0 = (signed64)RS_SW(0) * (signed64)RT_SW(0);
8928 signed64 prod1 = (signed64)RS_SW(2) * (signed64)RT_SW(2);
8931 GPR_SD(destreg,0) = sum0;
8932 GPR_SD(destreg,1) = sum1;
8933 LO = SIGNEXTEND( sum0, 32 );
8934 HI = SIGNEXTEND( VH4_8(sum0), 32 );
8935 LO1 = SIGNEXTEND( sum1, 32 );
8936 HI1 = SIGNEXTEND( VH4_8(sum1), 32 );
8940 // end-sanitize-r5900
8941 // start-sanitize-r5900
8943 011100,5.RS,5.RT,5.RD,10011101001:MMI3:32::PNOR
8946 unsigned32 instruction = instruction_0;
8947 int destreg = ((instruction >> 11) & 0x0000001F);
8948 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8949 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8950 signed_word rt_reg = GPR[RT];
8951 signed_word rt_reg1 = GPR1[RT];
8954 for(i=0;i<WORDS_IN_MMI_REGS;i++)
8955 GPR_UW(destreg,i) = ~(RS_UW(i) | RT_UW(i));
8959 // end-sanitize-r5900
8960 // start-sanitize-r5900
8962 011100,5.RS,5.RT,5.RD,10010101001:MMI3:32::POR
8965 unsigned32 instruction = instruction_0;
8966 int destreg = ((instruction >> 11) & 0x0000001F);
8967 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
8968 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
8969 signed_word rt_reg = GPR[RT];
8970 signed_word rt_reg1 = GPR1[RT];
8973 for(i=0;i<WORDS_IN_MMI_REGS;i++)
8974 GPR_UW(destreg,i) = (RS_UW(i) | RT_UW(i));
8978 // end-sanitize-r5900
8979 // start-sanitize-r5900
8981 01110000000,5.RT,5.RD,11111001000:MMI0:32::PPAC5
8984 unsigned32 instruction = instruction_0;
8985 int destreg = ((instruction >> 11) & 0x0000001F);
8986 signed_word rt_reg = GPR[RT];
8987 signed_word rt_reg1 = GPR1[RT];
8990 for(i=0;i<WORDS_IN_MMI_REGS;i++)
8992 unsigned32 x = RT_UW(i);
8993 GPR_UW(destreg,i) = ((x & (1 << 31)) >> (31 - 15))
8994 | ((x & (31 << 19)) >> (19 - 10))
8995 | ((x & (31 << 11)) >> (11 - 5))
8996 | ((x & (31 << 3)) >> (3 - 0));
9001 // end-sanitize-r5900
9002 // start-sanitize-r5900
9004 011100,5.RS,5.RT,5.RD,11011001000:MMI0:32::PPACB
9007 unsigned32 instruction = instruction_0;
9008 int destreg = ((instruction >> 11) & 0x0000001F);
9009 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9010 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9011 signed_word rt_reg = GPR[RT];
9012 signed_word rt_reg1 = GPR1[RT];
9014 GPR_UB(destreg,0) = RT_UB(0);
9015 GPR_UB(destreg,1) = RT_UB(2);
9016 GPR_UB(destreg,2) = RT_UB(4);
9017 GPR_UB(destreg,3) = RT_UB(6);
9018 GPR_UB(destreg,4) = RT_UB(8);
9019 GPR_UB(destreg,5) = RT_UB(10);
9020 GPR_UB(destreg,6) = RT_UB(12);
9021 GPR_UB(destreg,7) = RT_UB(14);
9022 GPR_UB(destreg,8) = RS_UB(0);
9023 GPR_UB(destreg,9) = RS_UB(2);
9024 GPR_UB(destreg,10) = RS_UB(4);
9025 GPR_UB(destreg,11) = RS_UB(6);
9026 GPR_UB(destreg,12) = RS_UB(8);
9027 GPR_UB(destreg,13) = RS_UB(10);
9028 GPR_UB(destreg,14) = RS_UB(12);
9029 GPR_UB(destreg,15) = RS_UB(14);
9033 // end-sanitize-r5900
9034 // start-sanitize-r5900
9036 011100,5.RS,5.RT,5.RD,10111001000:MMI0:32::PPACH
9039 unsigned32 instruction = instruction_0;
9040 int destreg = ((instruction >> 11) & 0x0000001F);
9041 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9042 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9043 signed_word rt_reg = GPR[RT];
9044 signed_word rt_reg1 = GPR1[RT];
9046 GPR_UH(destreg,0) = RT_UH(0);
9047 GPR_UH(destreg,1) = RT_UH(2);
9048 GPR_UH(destreg,2) = RT_UH(4);
9049 GPR_UH(destreg,3) = RT_UH(6);
9050 GPR_UH(destreg,4) = RS_UH(0);
9051 GPR_UH(destreg,5) = RS_UH(2);
9052 GPR_UH(destreg,6) = RS_UH(4);
9053 GPR_UH(destreg,7) = RS_UH(6);
9057 // end-sanitize-r5900
9058 // start-sanitize-r5900
9060 011100,5.RS,5.RT,5.RD,10011001000:MMI0:32::PPACW
9063 unsigned32 instruction = instruction_0;
9064 int destreg = ((instruction >> 11) & 0x0000001F);
9065 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9066 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9067 signed_word rt_reg = GPR[RT];
9068 signed_word rt_reg1 = GPR1[RT];
9070 GPR_UW(destreg,0) = RT_UW(0);
9071 GPR_UW(destreg,1) = RT_UW(2);
9072 GPR_UW(destreg,2) = RS_UW(0);
9073 GPR_UW(destreg,3) = RS_UW(2);
9077 // end-sanitize-r5900
9078 // start-sanitize-r5900
9080 01110000000,5.RT,5.RD,11011001001:MMI2:32::PREVH
9083 unsigned32 instruction = instruction_0;
9084 int destreg = ((instruction >> 11) & 0x0000001F);
9085 signed_word rt_reg = GPR[RT];
9086 signed_word rt_reg1 = GPR1[RT];
9088 GPR_UH(destreg,0) = RT_UH(3);
9089 GPR_UH(destreg,1) = RT_UH(2);
9090 GPR_UH(destreg,2) = RT_UH(1);
9091 GPR_UH(destreg,3) = RT_UH(0);
9092 GPR_UH(destreg,4) = RT_UH(7);
9093 GPR_UH(destreg,5) = RT_UH(6);
9094 GPR_UH(destreg,6) = RT_UH(5);
9095 GPR_UH(destreg,7) = RT_UH(4);
9099 // end-sanitize-r5900
9100 // start-sanitize-r5900
9102 01110000000,5.RT,5.RD,11111001001:MMI2:32::PROT3W
9105 unsigned32 instruction = instruction_0;
9106 int destreg = ((instruction >> 11) & 0x0000001F);
9107 signed_word rt_reg = GPR[RT];
9108 signed_word rt_reg1 = GPR1[RT];
9110 GPR_UW(destreg,0) = RT_UW(0);
9111 GPR_UW(destreg,1) = RT_UW(3);
9112 GPR_UW(destreg,2) = RT_UW(1);
9113 GPR_UW(destreg,3) = RT_UW(2);
9117 // end-sanitize-r5900
9118 // start-sanitize-r5900
9120 01110000000,5.RT,5.RD,5.SHIFT,110100:MMINORM:32::PSLLH
9123 unsigned32 instruction = instruction_0;
9124 int op1 = ((instruction >> 6) & 0x0000001F);
9125 int destreg = ((instruction >> 11) & 0x0000001F);
9126 signed_word rt_reg = GPR[RT];
9127 signed_word rt_reg1 = GPR1[RT];
9129 int shift_by = op1 & (16-1);
9131 for(i=0;i<HALFWORDS_IN_MMI_REGS;i++)
9132 GPR_UH(destreg,i) = (RT_UH(i) << shift_by);
9136 // end-sanitize-r5900
9137 // start-sanitize-r5900
9139 011100,5.RS,5.RT,5.RD,00010001001:MMI2:32::PSLLVW
9142 unsigned32 instruction = instruction_0;
9143 int destreg = ((instruction >> 11) & 0x0000001F);
9144 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9145 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9146 signed_word rt_reg = GPR[RT];
9147 signed_word rt_reg1 = GPR1[RT];
9149 int s0 = (RS_UB(0) & 0x1F);
9150 int s1 = (RS_UB(8) & 0x1F);
9151 signed32 temp0 = RT_UW(0) << s0;
9152 signed32 temp1 = RT_UW(2) << s1;
9153 GPR_SD(destreg,0) = (signed64)temp0;
9154 GPR_SD(destreg,1) = (signed64)temp1;
9158 // end-sanitize-r5900
9159 // start-sanitize-r5900
9161 01110000000,5.RT,5.RD,5.SHIFT,111100:MMINORM:32::PSLLW
9164 unsigned32 instruction = instruction_0;
9165 int op1 = ((instruction >> 6) & 0x0000001F);
9166 int destreg = ((instruction >> 11) & 0x0000001F);
9167 signed_word rt_reg = GPR[RT];
9168 signed_word rt_reg1 = GPR1[RT];
9170 int shift_by = op1 & (32-1);
9172 for(i=0;i<WORDS_IN_MMI_REGS;i++)
9173 GPR_UW(destreg,i) = (RT_UW(i) << shift_by);
9177 // end-sanitize-r5900
9178 // start-sanitize-r5900
9180 01110000000,5.RT,5.RD,5.SHIFT,110111:MMINORM:32::PSRAH
9183 unsigned32 instruction = instruction_0;
9184 int op1 = ((instruction >> 6) & 0x0000001F);
9185 int destreg = ((instruction >> 11) & 0x0000001F);
9186 signed_word rt_reg = GPR[RT];
9187 signed_word rt_reg1 = GPR1[RT];
9189 int shift_by = op1 & (16-1);
9191 for(i=0;i<HALFWORDS_IN_MMI_REGS;i++)
9192 GPR_SH(destreg,i) = SIGNEXTEND( (RT_SH(i) >> shift_by), (16-shift_by) );
9196 // end-sanitize-r5900
9197 // start-sanitize-r5900
9199 011100,5.RS,5.RT,5.RD,00011101001:MMI3:32::PSRAVW
9202 unsigned32 instruction = instruction_0;
9203 int destreg = ((instruction >> 11) & 0x0000001F);
9204 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9205 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9206 signed_word rt_reg = GPR[RT];
9207 signed_word rt_reg1 = GPR1[RT];
9209 GPR_SD(destreg,0) = SIGNEXTEND( (RT_SW (0) >> (RS_UB(0) & 0x1F)), 32-(RS_UB(0) & 0x1F) );
9210 GPR_SD(destreg,1) = SIGNEXTEND( (RT_SW (2) >> (RS_UB(8) & 0x1F)), 32-(RS_UB(8) & 0x1F) );
9214 // end-sanitize-r5900
9215 // start-sanitize-r5900
9217 01110000000,5.RT,5.RD,5.SHIFT,111111:MMINORM:32::PSRAW
9220 unsigned32 instruction = instruction_0;
9221 int op1 = ((instruction >> 6) & 0x0000001F);
9222 int destreg = ((instruction >> 11) & 0x0000001F);
9223 signed_word rt_reg = GPR[RT];
9224 signed_word rt_reg1 = GPR1[RT];
9226 int shift_by = op1 & (32-1);
9228 for(i=0;i<WORDS_IN_MMI_REGS;i++)
9229 GPR_SW(destreg,i) = SIGNEXTEND( (RT_SW(i) >> shift_by), (32-shift_by) );
9233 // end-sanitize-r5900
9234 // start-sanitize-r5900
9236 01110000000,5.RT,5.RD,5.SHIFT,110110:MMINORM:32::PSRLH
9239 unsigned32 instruction = instruction_0;
9240 int op1 = ((instruction >> 6) & 0x0000001F);
9241 int destreg = ((instruction >> 11) & 0x0000001F);
9242 signed_word rt_reg = GPR[RT];
9243 signed_word rt_reg1 = GPR1[RT];
9245 int shift_by = op1 & (16-1);
9247 for(i=0;i<HALFWORDS_IN_MMI_REGS;i++)
9248 GPR_UH(destreg,i) = (RT_UH(i) >> shift_by);
9252 // end-sanitize-r5900
9253 // start-sanitize-r5900
9255 011100,5.RS,5.RT,5.RD,00011001001:MMI2:32::PSRLVW
9258 unsigned32 instruction = instruction_0;
9259 int destreg = ((instruction >> 11) & 0x0000001F);
9260 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9261 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9262 signed_word rt_reg = GPR[RT];
9263 signed_word rt_reg1 = GPR1[RT];
9265 GPR_UD(destreg,0) = SIGNEXTEND ( RT_UW(0) >> (RS_UB(0) & 0x1F), 31);
9266 GPR_UD(destreg,1) = SIGNEXTEND ( RT_UW(2) >> (RS_UB(8) & 0x1F), 31);
9270 // end-sanitize-r5900
9271 // start-sanitize-r5900
9273 01110000000,5.RT,5.RD,5.SHIFT,111110:MMINORM:32::PSRLW
9276 unsigned32 instruction = instruction_0;
9277 int op1 = ((instruction >> 6) & 0x0000001F);
9278 int destreg = ((instruction >> 11) & 0x0000001F);
9279 signed_word rt_reg = GPR[RT];
9280 signed_word rt_reg1 = GPR1[RT];
9282 int shift_by = op1 & (32-1);
9284 for(i=0;i<WORDS_IN_MMI_REGS;i++)
9285 GPR_UW(destreg,i) = (RT_UW(i) >> shift_by);
9289 // end-sanitize-r5900
9290 // start-sanitize-r5900
9292 011100,5.RS,5.RT,5.RD,01001001000:MMI0:32::PSUBB
9295 unsigned32 instruction = instruction_0;
9296 int destreg = ((instruction >> 11) & 0x0000001F);
9297 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9298 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9299 signed_word rt_reg = GPR[RT];
9300 signed_word rt_reg1 = GPR1[RT];
9303 for (i=0; i < BYTES_IN_MMI_REGS; i++)
9308 GPR_SB(destreg,i) = r;
9313 // end-sanitize-r5900
9314 // start-sanitize-r5900
9316 011100,5.RS,5.RT,5.RD,00101001000:MMI0:32::PSUBH
9319 unsigned32 instruction = instruction_0;
9320 int destreg = ((instruction >> 11) & 0x0000001F);
9321 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9322 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9323 signed_word rt_reg = GPR[RT];
9324 signed_word rt_reg1 = GPR1[RT];
9327 for (i=0; i < HALFWORDS_IN_MMI_REGS; i++)
9332 GPR_SH(destreg,i) = r;
9337 // end-sanitize-r5900
9338 // start-sanitize-r5900
9340 011100,5.RS,5.RT,5.RD,11001001000:MMI0:32::PSUBSB
9343 unsigned32 instruction = instruction_0;
9344 int destreg = ((instruction >> 11) & 0x0000001F);
9345 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9346 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9347 signed_word rt_reg = GPR[RT];
9348 signed_word rt_reg1 = GPR1[RT];
9351 for (i=0; i < BYTES_IN_MMI_REGS; i++)
9357 GPR_SB(destreg,i) = 127;
9359 GPR_SB(destreg,i) = -128;
9361 GPR_SB(destreg,i) = r;
9366 // end-sanitize-r5900
9367 // start-sanitize-r5900
9369 011100,5.RS,5.RT,5.RD,10101001000:MMI0:32::PSUBSH
9372 unsigned32 instruction = instruction_0;
9373 int destreg = ((instruction >> 11) & 0x0000001F);
9374 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9375 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9376 signed_word rt_reg = GPR[RT];
9377 signed_word rt_reg1 = GPR1[RT];
9380 for (i=0; i < HALFWORDS_IN_MMI_REGS; i++)
9386 GPR_SH(destreg,i) = 32767;
9387 else if (r < -32768)
9388 GPR_SH(destreg,i) = -32768;
9390 GPR_SH(destreg,i) = r;
9395 // end-sanitize-r5900
9396 // start-sanitize-r5900
9398 011100,5.RS,5.RT,5.RD,10001001000:MMI0:32::PSUBSW
9401 unsigned32 instruction = instruction_0;
9402 int destreg = ((instruction >> 11) & 0x0000001F);
9403 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9404 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9405 signed_word rt_reg = GPR[RT];
9406 signed_word rt_reg1 = GPR1[RT];
9409 for (i=0; i < WORDS_IN_MMI_REGS; i++)
9411 signed64 s = RS_SW(i);
9412 signed64 t = RT_SW(i);
9414 if (r > (int)0x7FFFFFFF)
9415 GPR_SW(destreg,i) = (int)0x7FFFFFFF;
9416 else if (r < (int)0x80000000)
9417 GPR_SW(destreg,i) = (int)0x80000000;
9419 GPR_SW(destreg,i) = r;
9424 // end-sanitize-r5900
9425 // start-sanitize-r5900
9427 011100,5.RS,5.RT,5.RD,11001101000:MMI1:32::PSUBUB
9430 unsigned32 instruction = instruction_0;
9431 int destreg = ((instruction >> 11) & 0x0000001F);
9432 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9433 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9434 signed_word rt_reg = GPR[RT];
9435 signed_word rt_reg1 = GPR1[RT];
9438 for (i=0; i < BYTES_IN_MMI_REGS; i++)
9440 unsigned int s = RS_UB(i);
9441 unsigned int t = RT_UB(i);
9442 unsigned int r = s - t;
9444 GPR_UB(destreg,i) = 0;
9446 GPR_UB(destreg,i) = r;
9451 // end-sanitize-r5900
9452 // start-sanitize-r5900
9454 011100,5.RS,5.RT,5.RD,10101101000:MMI1:32::PSUBUH
9457 unsigned32 instruction = instruction_0;
9458 int destreg = ((instruction >> 11) & 0x0000001F);
9459 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9460 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9461 signed_word rt_reg = GPR[RT];
9462 signed_word rt_reg1 = GPR1[RT];
9465 for (i=0; i < HALFWORDS_IN_MMI_REGS; i++)
9467 unsigned int s = RS_UH(i);
9468 unsigned int t = RT_UH(i);
9469 unsigned int r = s - t;
9471 GPR_UH(destreg,i) = 0;
9473 GPR_UH(destreg,i) = r;
9478 // end-sanitize-r5900
9479 // start-sanitize-r5900
9481 011100,5.RS,5.RT,5.RD,10001101000:MMI1:32::PSUBUW
9484 unsigned32 instruction = instruction_0;
9485 int destreg = ((instruction >> 11) & 0x0000001F);
9486 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9487 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9488 signed_word rt_reg = GPR[RT];
9489 signed_word rt_reg1 = GPR1[RT];
9492 for (i=0; i < WORDS_IN_MMI_REGS; i++)
9494 unsigned64 s = RS_UW(i);
9495 unsigned64 t = RT_UW(i);
9496 unsigned64 r = s - t;
9498 GPR_UW(destreg,i) = 0;
9500 GPR_UW(destreg,i) = r;
9505 // end-sanitize-r5900
9506 // start-sanitize-r5900
9508 011100,5.RS,5.RT,5.RD,00001001000:MMI0:32::PSUBW
9511 unsigned32 instruction = instruction_0;
9512 int destreg = ((instruction >> 11) & 0x0000001F);
9513 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9514 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9515 signed_word rt_reg = GPR[RT];
9516 signed_word rt_reg1 = GPR1[RT];
9519 for (i=0; i < WORDS_IN_MMI_REGS; i++)
9521 signed64 s = RS_SW(i);
9522 signed64 t = RT_SW(i);
9524 GPR_SW(destreg,i) = r;
9529 // end-sanitize-r5900
9530 // start-sanitize-r5900
9532 011100,5.RS,5.RT,5.RD,10011001001:MMI2:32::PXOR
9535 unsigned32 instruction = instruction_0;
9536 int destreg = ((instruction >> 11) & 0x0000001F);
9537 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9538 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9539 signed_word rt_reg = GPR[RT];
9540 signed_word rt_reg1 = GPR1[RT];
9543 for(i=0;i<WORDS_IN_MMI_REGS;i++)
9544 GPR_UW(destreg,i) = (RS_UW(i) ^ RT_UW(i));
9548 // end-sanitize-r5900
9549 // start-sanitize-r5900
9551 011100,5.RS,5.RT,5.RD,11011101000:MMI1:32::QFSRV
9554 unsigned32 instruction = instruction_0;
9555 int destreg = ((instruction >> 11) & 0x0000001F);
9556 signed_word rs_reg = GPR[((instruction >> 21) & 0x0000001F)];
9557 signed_word rs_reg1 = GPR1[((instruction >> 21) & 0x0000001F)];
9558 signed_word rt_reg = GPR[RT];
9559 signed_word rt_reg1 = GPR1[RT];
9561 int bytes = (SA / 8) % 16;
9563 SignalException(ReservedInstruction,instruction);
9567 for(i=0;i<(16-bytes);i++)
9568 GPR_SB(destreg,i) = RT_SB(bytes+i);
9570 GPR_SB(destreg,i) = RS_SB(i-(16-bytes));
9575 // end-sanitize-r5900
9576 // start-sanitize-r5900
9578 011111,5.RS,5.RT,16.OFFSET:NORMAL:128::SQ
9581 unsigned32 instruction = instruction_0;
9582 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
9583 signed_word rsigned_word = GPR[((instruction >> 16) & 0x0000001F)];
9584 signed_word rsigned_word1 = GPR1[((instruction >> 16) & 0x0000001F)];
9585 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
9586 signed_word rt_reg = GPR[RT];
9587 signed_word rt_reg1 = GPR1[RT];
9589 address_word vaddr = ((unsigned64)op1 + offset);
9592 if ((vaddr & 15) != 0)
9593 SignalExceptionAddressStore();
9596 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
9598 unsigned64 memval = 0;
9599 unsigned64 memval1 = 0;
9600 memval = rsigned_word;
9601 memval1 = rsigned_word1;
9603 StoreMemory(uncached,AccessLength_QUADWORD,memval,memval1,paddr,vaddr,isREAL);
9610 // end-sanitize-r5900
9612 // start-sanitize-cygnus-never
9614 // // FIXME FIXME FIXME What is this instruction?
9615 // 111011,5.RS,5.RT,16.OFFSET:NORMAL:32::<INT>
9620 // // start-sanitize-r5900
9622 // // end-sanitize-r5900
9624 // // start-sanitize-tx19
9626 // // end-sanitize-tx19
9628 // unsigned32 instruction = instruction_0;
9629 // signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
9630 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
9631 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
9633 // if (CoProcPresent(3))
9634 // SignalException(CoProcessorUnusable);
9636 // SignalException(ReservedInstruction,instruction);
9640 // end-sanitize-cygnus-never
9641 // start-sanitize-cygnus-never
9643 // // FIXME FIXME FIXME What is this?
9644 // 11100,******,00001:RR:16::SDBBP
9647 // unsigned32 instruction = instruction_0;
9648 // if (have_extendval)
9649 // SignalException (ReservedInstruction, instruction);
9651 // SignalException(DebugBreakPoint,instruction);
9655 // end-sanitize-cygnus-never
9656 // start-sanitize-cygnus-never
9658 // // FIXME FIXME FIXME What is this?
9659 // 000000,********************,001110:SPECIAL:32::SDBBP
9662 // unsigned32 instruction = instruction_0;
9664 // SignalException(DebugBreakPoint,instruction);
9668 // end-sanitize-cygnus-never
9669 // start-sanitize-cygnus-never
9671 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
9672 // // isn't yet reconized by this simulator.
9673 // 000000,5.RS,5.RT,0000000000101000:SPECIAL:32::MADD16
9676 // unsigned32 instruction = instruction_0;
9677 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
9678 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
9680 // CHECKHILO("Multiply-Add");
9682 // unsigned64 temp = (op1 * op2);
9683 // temp += (SET64HI(VL4_8(HI)) | VL4_8(LO));
9684 // LO = SIGNEXTEND((unsigned64)VL4_8(temp),32);
9685 // HI = SIGNEXTEND((unsigned64)VH4_8(temp),32);
9690 // end-sanitize-cygnus-never
9691 // start-sanitize-cygnus-never
9693 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
9694 // // isn't yet reconized by this simulator.
9695 // 000000,5.RS,5.RT,0000000000101001:SPECIAL:64::DMADD16
9698 // unsigned32 instruction = instruction_0;
9699 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
9700 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
9702 // CHECKHILO("Multiply-Add");
9704 // unsigned64 temp = (op1 * op2);
9710 // start-sanitize-cygnus-never