2 // <insn-word> { "+" <insn-word> }
14 // IGEN config - mips16
15 // :option:16::insn-bit-size:16
16 // :option:16::hi-bit-nr:15
17 :option:16::insn-specifying-widths:true
18 :option:16::gen-delayed-branch:false
20 // IGEN config - mips32/64..
21 // :option:32::insn-bit-size:32
22 // :option:32::hi-bit-nr:31
23 :option:32::insn-specifying-widths:true
24 :option:32::gen-delayed-branch:false
27 // Generate separate simulators for each target
28 // :option:::multi-sim:true
31 // Models known by this simulator
33 :model:::mipsII:mipsII:
34 :model:::mipsIII:mipsIII:
35 :model:::mipsIV:mipsIV:
36 :model:::mips16:mips16:
37 // start-sanitize-r5900
38 :model:::r5900:mips5900:
40 :model:::r3900:mips3900:
41 // start-sanitize-tx19
44 // start-sanitize-vr5400
45 :model:::vr5400:mips5400:
47 // end-sanitize-vr5400
48 :model:::vr5000:mips5000:
52 // Pseudo instructions known by IGEN
55 SignalException (ReservedInstruction, 0);
59 // Pseudo instructions known by interp.c
60 // For grep - RSVD_INSTRUCTION, RSVD_INSTRUCTION_MASK
61 000000,5.*,5.*,5.*,5.OP,000101:SPECIAL:32::RSVD
64 SignalException (ReservedInstruction, instruction_0);
72 // CPU Instruction Set (mipsI - mipsIV)
76 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
77 "add r<RD>, r<RS>, r<RT>"
78 *mipsI,mipsII,mipsIII,mipsIV:
80 // start-sanitize-vr5400
82 // end-sanitize-vr5400
83 // start-sanitize-r5900
87 // start-sanitize-tx19
91 ALU32_BEGIN (GPR[RS]);
97 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
98 "addi r<RT>, r<RS>, IMMEDIATE"
99 *mipsI,mipsII,mipsIII,mipsIV:
101 // start-sanitize-vr5400
103 // end-sanitize-vr5400
104 // start-sanitize-r5900
106 // end-sanitize-r5900
108 // start-sanitize-tx19
112 ALU32_BEGIN (GPR[RS]);
113 ALU32_ADD (EXTEND16 (IMMEDIATE));
118 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
119 "add r<RT>, r<RS>, <IMMEDIATE>"
120 *mipsI,mipsII,mipsIII,mipsIV:
122 // start-sanitize-vr5400
124 // end-sanitize-vr5400
125 // start-sanitize-r5900
127 // end-sanitize-r5900
129 // start-sanitize-tx19
133 signed32 temp = GPR[RS] + EXTEND16 (IMMEDIATE);
134 GPR[RT] = EXTEND32 (temp);
138 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
139 *mipsI,mipsII,mipsIII,mipsIV:
141 // start-sanitize-vr5400
143 // end-sanitize-vr5400
144 // start-sanitize-r5900
146 // end-sanitize-r5900
148 // start-sanitize-tx19
152 signed32 temp = GPR[RS] + GPR[RT];
153 GPR[RD] = EXTEND32 (temp);
157 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
158 "and r<RD>, r<RS>, r<RT>"
159 *mipsI,mipsII,mipsIII,mipsIV:
161 // start-sanitize-vr5400
163 // end-sanitize-vr5400
164 // start-sanitize-r5900
166 // end-sanitize-r5900
168 // start-sanitize-tx19
172 GPR[RD] = GPR[RS] & GPR[RT];
176 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
177 "and r<RT>, r<RS>, <IMMEDIATE>"
178 *mipsI,mipsII,mipsIII,mipsIV:
180 // start-sanitize-vr5400
182 // end-sanitize-vr5400
183 // start-sanitize-r5900
185 // end-sanitize-r5900
187 // start-sanitize-tx19
191 GPR[RT] = GPR[RS] & IMMEDIATE;
195 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
196 "beq r<RS>, r<RT>, <OFFSET>"
197 *mipsI,mipsII,mipsIII,mipsIV:
199 // start-sanitize-vr5400
201 // end-sanitize-vr5400
202 // start-sanitize-r5900
204 // end-sanitize-r5900
206 // start-sanitize-tx19
210 address_word offset = EXTEND16 (OFFSET) << 2;
211 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
212 DELAY_SLOT (NIA + offset);
216 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
217 "beql r<RS>, r<RT>, <OFFSET>"
222 // start-sanitize-vr5400
224 // end-sanitize-vr5400
225 // start-sanitize-r5900
227 // end-sanitize-r5900
229 // start-sanitize-tx19
233 address_word offset = EXTEND16 (OFFSET) << 2;
234 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
235 DELAY_SLOT (NIA + offset);
237 NULLIFY_NEXT_INSTRUCTION ();
241 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
242 "bgez r<RS>, <OFFSET>"
243 *mipsI,mipsII,mipsIII,mipsIV:
245 // start-sanitize-vr5400
247 // end-sanitize-vr5400
248 // start-sanitize-r5900
250 // end-sanitize-r5900
252 // start-sanitize-tx19
256 address_word offset = EXTEND16 (OFFSET) << 2;
257 if ((signed_word) GPR[RS] >= 0)
258 DELAY_SLOT (NIA + offset);
262 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
263 "bgezal r<RS>, <OFFSET>"
264 *mipsI,mipsII,mipsIII,mipsIV:
266 // start-sanitize-vr5400
268 // end-sanitize-vr5400
269 // start-sanitize-r5900
271 // end-sanitize-r5900
273 // start-sanitize-tx19
277 address_word offset = EXTEND16 (OFFSET) << 2;
279 if ((signed_word) GPR[RS] >= 0)
280 DELAY_SLOT (NIA + offset);
284 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
285 "bgezall r<RS>, <OFFSET>"
290 // start-sanitize-vr5400
292 // end-sanitize-vr5400
293 // start-sanitize-r5900
295 // end-sanitize-r5900
297 // start-sanitize-tx19
301 address_word offset = EXTEND16 (OFFSET) << 2;
303 /* NOTE: The branch occurs AFTER the next instruction has been
305 if ((signed_word) GPR[RS] >= 0)
306 DELAY_SLOT (NIA + offset);
308 NULLIFY_NEXT_INSTRUCTION ();
312 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
313 "bgezl r<RS>, <OFFSET>"
318 // start-sanitize-vr5400
320 // end-sanitize-vr5400
321 // start-sanitize-r5900
323 // end-sanitize-r5900
325 // start-sanitize-tx19
329 address_word offset = EXTEND16 (OFFSET) << 2;
330 if ((signed_word) GPR[RS] >= 0)
331 DELAY_SLOT (NIA + offset);
333 NULLIFY_NEXT_INSTRUCTION ();
337 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
338 "bgtz r<RS>, <OFFSET>"
339 *mipsI,mipsII,mipsIII,mipsIV:
341 // start-sanitize-vr5400
343 // end-sanitize-vr5400
344 // start-sanitize-r5900
346 // end-sanitize-r5900
348 // start-sanitize-tx19
352 address_word offset = EXTEND16 (OFFSET) << 2;
353 if ((signed_word) GPR[RS] > 0)
354 DELAY_SLOT (NIA + offset);
358 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
359 "bgtzl r<RS>, <OFFSET>"
364 // start-sanitize-vr5400
366 // end-sanitize-vr5400
367 // start-sanitize-r5900
369 // end-sanitize-r5900
371 // start-sanitize-tx19
375 address_word offset = EXTEND16 (OFFSET) << 2;
376 /* NOTE: The branch occurs AFTER the next instruction has been
378 if ((signed_word) GPR[RS] > 0)
379 DELAY_SLOT (NIA + offset);
381 NULLIFY_NEXT_INSTRUCTION ();
385 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
386 "blez r<RS>, <OFFSET>"
387 *mipsI,mipsII,mipsIII,mipsIV:
389 // start-sanitize-vr5400
391 // end-sanitize-vr5400
392 // start-sanitize-r5900
394 // end-sanitize-r5900
396 // start-sanitize-tx19
400 address_word offset = EXTEND16 (OFFSET) << 2;
401 /* NOTE: The branch occurs AFTER the next instruction has been
403 if ((signed_word) GPR[RS] <= 0)
404 DELAY_SLOT (NIA + offset);
408 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
409 "bgezl r<RS>, <OFFSET>"
414 // start-sanitize-vr5400
416 // end-sanitize-vr5400
417 // start-sanitize-r5900
419 // end-sanitize-r5900
421 // start-sanitize-tx19
425 address_word offset = EXTEND16 (OFFSET) << 2;
426 if ((signed_word) GPR[RS] <= 0)
427 DELAY_SLOT (NIA + offset);
429 NULLIFY_NEXT_INSTRUCTION ();
433 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
434 "bltz r<RS>, <OFFSET>"
435 *mipsI,mipsII,mipsIII,mipsIV:
437 // start-sanitize-vr5400
439 // end-sanitize-vr5400
440 // start-sanitize-r5900
442 // end-sanitize-r5900
444 // start-sanitize-tx19
448 address_word offset = EXTEND16 (OFFSET) << 2;
449 if ((signed_word) GPR[RS] < 0)
450 DELAY_SLOT (NIA + offset);
454 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
455 "bltzal r<RS>, <OFFSET>"
456 *mipsI,mipsII,mipsIII,mipsIV:
458 // start-sanitize-vr5400
460 // end-sanitize-vr5400
461 // start-sanitize-r5900
463 // end-sanitize-r5900
465 // start-sanitize-tx19
469 address_word offset = EXTEND16 (OFFSET) << 2;
471 /* NOTE: The branch occurs AFTER the next instruction has been
473 if ((signed_word) GPR[RS] < 0)
474 DELAY_SLOT (NIA + offset);
478 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
479 "bltzall r<RS>, <OFFSET>"
484 // start-sanitize-vr5400
486 // end-sanitize-vr5400
487 // start-sanitize-r5900
489 // end-sanitize-r5900
491 // start-sanitize-tx19
495 address_word offset = EXTEND16 (OFFSET) << 2;
497 if ((signed_word) GPR[RS] < 0)
498 DELAY_SLOT (NIA + offset);
500 NULLIFY_NEXT_INSTRUCTION ();
504 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
505 "bltzl r<RS>, <OFFSET>"
510 // start-sanitize-vr5400
512 // end-sanitize-vr5400
513 // start-sanitize-r5900
515 // end-sanitize-r5900
517 // start-sanitize-tx19
521 address_word offset = EXTEND16 (OFFSET) << 2;
522 /* NOTE: The branch occurs AFTER the next instruction has been
524 if ((signed_word) GPR[RS] < 0)
525 DELAY_SLOT (NIA + offset);
527 NULLIFY_NEXT_INSTRUCTION ();
531 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
532 "bne r<RS>, r<RT>, <OFFSET>"
533 *mipsI,mipsII,mipsIII,mipsIV:
535 // start-sanitize-vr5400
537 // end-sanitize-vr5400
538 // start-sanitize-r5900
540 // end-sanitize-r5900
542 // start-sanitize-tx19
546 address_word offset = EXTEND16 (OFFSET) << 2;
547 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
548 DELAY_SLOT (NIA + offset);
552 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
553 "bnel r<RS>, r<RT>, <OFFSET>"
558 // start-sanitize-vr5400
560 // end-sanitize-vr5400
561 // start-sanitize-r5900
563 // end-sanitize-r5900
565 // start-sanitize-tx19
569 address_word offset = EXTEND16 (OFFSET) << 2;
570 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
571 DELAY_SLOT (NIA + offset);
573 NULLIFY_NEXT_INSTRUCTION ();
577 000000,20.CODE,001101:SPECIAL:32::BREAK
579 *mipsI,mipsII,mipsIII,mipsIV:
581 // start-sanitize-vr5400
583 // end-sanitize-vr5400
584 // start-sanitize-r5900
586 // end-sanitize-r5900
588 // start-sanitize-tx19
592 SignalException(BreakPoint, instruction_0);
596 0100,ZZ!0!1!3,26.COP_FUN:NORMAL:32::COPz
598 *mipsI,mipsII,mipsIII,mipsIV:
599 // start-sanitize-r5900
601 // end-sanitize-r5900
603 // start-sanitize-tx19
607 DecodeCoproc (instruction_0);
611 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
612 "dadd r<RD>, r<RS>, r<RT>"
616 // start-sanitize-vr5400
618 // end-sanitize-vr5400
619 // start-sanitize-r5900
621 // end-sanitize-r5900
623 // start-sanitize-tx19
627 ALU64_BEGIN (GPR[RS]);
633 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
634 "daddi r<RT>, r<RS>, <IMMEDIATE>"
638 // start-sanitize-vr5400
640 // end-sanitize-vr5400
641 // start-sanitize-r5900
643 // end-sanitize-r5900
645 // start-sanitize-tx19
649 ALU64_BEGIN (GPR[RS]);
650 ALU64_ADD (EXTEND16 (IMMEDIATE));
655 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
656 "daddu r<RT>, r<RS>, <IMMEDIATE>"
660 // start-sanitize-vr5400
662 // end-sanitize-vr5400
663 // start-sanitize-r5900
665 // end-sanitize-r5900
667 // start-sanitize-tx19
671 GPR[RT] = GPR[RS] + EXTEND16 (IMMEDIATE);
675 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
676 "daddu r<RD>, r<RS>, r<RT>"
680 // start-sanitize-vr5400
682 // end-sanitize-vr5400
683 // start-sanitize-r5900
685 // end-sanitize-r5900
687 // start-sanitize-tx19
691 GPR[RD] = GPR[RS] + GPR[RT];
695 000000,5.RS,5.RT,0000000000011110:SPECIAL:64::DDIV
700 // start-sanitize-vr5400
702 // end-sanitize-vr5400
703 // start-sanitize-r5900
705 // end-sanitize-r5900
707 // start-sanitize-tx19
711 CHECKHILO ("Division");
713 signed64 n = GPR[RS];
714 signed64 d = GPR[RT];
717 LO = SIGNED64 (0x8000000000000000);
720 else if (d == -1 && n == SIGNED64 (0x8000000000000000))
722 LO = SIGNED64 (0x8000000000000000);
735 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
741 // start-sanitize-vr5400
743 // end-sanitize-vr5400
744 // start-sanitize-tx19
748 CHECKHILO ("Division");
750 unsigned64 n = GPR[RS];
751 unsigned64 d = GPR[RT];
754 LO = SIGNED64 (0x8000000000000000);
766 000000,5.RS,5.RT,0000000000011010:SPECIAL:32::DIV
768 *mipsI,mipsII,mipsIII,mipsIV:
770 // start-sanitize-vr5400
772 // end-sanitize-vr5400
773 // start-sanitize-r5900
775 // end-sanitize-r5900
777 // start-sanitize-tx19
781 CHECKHILO("Division");
783 signed32 n = GPR[RS];
784 signed32 d = GPR[RT];
787 LO = EXTEND32 (0x80000000);
790 else if (d == -1 && d == 0x80000000)
792 LO = EXTEND32 (0x80000000);
797 LO = EXTEND32 (n / d);
798 HI = EXTEND32 (n % d);
804 000000,5.RS,5.RT,0000000000011011:SPECIAL:32::DIVU
806 *mipsI,mipsII,mipsIII,mipsIV:
808 // start-sanitize-vr5400
810 // end-sanitize-vr5400
811 // start-sanitize-r5900
813 // end-sanitize-r5900
815 // start-sanitize-tx19
819 CHECKHILO ("Division");
821 unsigned32 n = GPR[RS];
822 unsigned32 d = GPR[RT];
825 LO = EXTEND32 (0x80000000);
830 LO = EXTEND32 (n / d);
831 HI = EXTEND32 (n % d);
837 :function:::void:do_dmult:int rs, int rt, int rd, int signed_p
847 unsigned64 op1 = GPR[rs];
848 unsigned64 op2 = GPR[rt];
849 CHECKHILO ("Multiplication");
850 /* make signed multiply unsigned */
865 /* multuply out the 4 sub products */
866 m00 = ((unsigned64) VL4_8 (op1) * (unsigned64) VL4_8 (op2));
867 m10 = ((unsigned64) VH4_8 (op1) * (unsigned64) VL4_8 (op2));
868 m01 = ((unsigned64) VL4_8 (op1) * (unsigned64) VH4_8 (op2));
869 m11 = ((unsigned64) VH4_8 (op1) * (unsigned64) VH4_8 (op2));
870 /* add the products */
871 mid = ((unsigned64) VH4_8 (m00)
872 + (unsigned64) VL4_8 (m10)
873 + (unsigned64) VL4_8 (m01));
874 lo = U8_4 (mid, m00);
876 + (unsigned64) VH4_8 (mid)
877 + (unsigned64) VH4_8 (m01)
878 + (unsigned64) VH4_8 (m10));
888 /* save the result HI/LO (and a gpr) */
896 000000,5.RS,5.RT,0000000000011100:SPECIAL:64::DMULT
900 // start-sanitize-tx19
904 do_dmult (SD_, RS, RT, 0, 1);
907 000000,5.RS,5.RT,5.RD,00000011100:SPECIAL:64::DMULT
908 "dmult r<RS>, r<RT>":RD == 0
909 "dmult r<RD>, r<RS>, r<RT>"
911 // start-sanitize-vr5400
913 // end-sanitize-vr5400
915 do_dmult (SD_, RS, RT, RD, 1);
920 000000,5.RS,5.RT,0000000000011101:SPECIAL:64::DMULTU
921 "dmultu r<RS>, r<RT>"
924 // start-sanitize-tx19
928 do_dmult (SD_, RS, RT, 0, 0);
931 000000,5.RS,5.RT,5.RD,00000011101:SPECIAL:64::DMULTU
932 "dmultu r<RD>, r<RS>, r<RT>":RD == 0
933 "dmultu r<RS>, r<RT>"
935 // start-sanitize-vr5400
937 // end-sanitize-vr5400
939 do_dmult (SD_, RS, RT, RD, 0);
944 00000000000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
945 "dsll r<RD>, r<RT>, <SHIFT>"
949 // start-sanitize-vr5400
951 // end-sanitize-vr5400
952 // start-sanitize-r5900
954 // end-sanitize-r5900
956 // start-sanitize-tx19
961 GPR[RD] = GPR[RT] << s;
965 00000000000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
966 "dsll32 r<RD>, r<RT>, <SHIFT>"
970 // start-sanitize-vr5400
972 // end-sanitize-vr5400
973 // start-sanitize-r5900
975 // end-sanitize-r5900
977 // start-sanitize-tx19
982 GPR[RD] = GPR[RT] << s;
986 000000,5.RS,5.RT,5.RD,00000010100:SPECIAL:64::DSLLV
987 "dsllv r<RD>, r<RT>, r<RS>"
991 // start-sanitize-vr5400
993 // end-sanitize-vr5400
994 // start-sanitize-r5900
996 // end-sanitize-r5900
998 // start-sanitize-tx19
1000 // end-sanitize-tx19
1002 int s = MASKED64 (GPR[RS], 5, 0);
1003 GPR[RD] = GPR[RT] << s;
1007 00000000000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
1008 "dsra r<RD>, r<RT>, <SHIFT>"
1012 // start-sanitize-vr5400
1014 // end-sanitize-vr5400
1015 // start-sanitize-r5900
1017 // end-sanitize-r5900
1019 // start-sanitize-tx19
1021 // end-sanitize-tx19
1024 GPR[RD] = ((signed64) GPR[RT]) >> s;
1028 00000000000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
1029 "dsra32 r<RT>, r<RD>, <SHIFT>"
1033 // start-sanitize-vr5400
1035 // end-sanitize-vr5400
1036 // start-sanitize-r5900
1038 // end-sanitize-r5900
1040 // start-sanitize-tx19
1042 // end-sanitize-tx19
1045 GPR[RD] = ((signed64) GPR[RT]) >> s;
1049 000000,5.RS,5.RT,5.RD,00000010111:SPECIAL:64::DSRAV
1050 "dsra32 r<RT>, r<RD>, r<RS>"
1054 // start-sanitize-vr5400
1056 // end-sanitize-vr5400
1057 // start-sanitize-r5900
1059 // end-sanitize-r5900
1061 // start-sanitize-tx19
1063 // end-sanitize-tx19
1065 int s = MASKED64 (GPR[RS], 5, 0);
1066 GPR[RD] = ((signed64) GPR[RT]) >> s;
1070 00000000000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
1071 "dsrav r<RD>, r<RT>, <SHIFT>"
1075 // start-sanitize-vr5400
1077 // end-sanitize-vr5400
1078 // start-sanitize-r5900
1080 // end-sanitize-r5900
1082 // start-sanitize-tx19
1084 // end-sanitize-tx19
1087 GPR[RD] = (unsigned64) GPR[RT] >> s;
1091 00000000000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
1092 "dsrl32 r<RD>, r<RT>, <SHIFT>"
1096 // start-sanitize-vr5400
1098 // end-sanitize-vr5400
1099 // start-sanitize-r5900
1101 // end-sanitize-r5900
1103 // start-sanitize-tx19
1105 // end-sanitize-tx19
1108 GPR[RD] = (unsigned64) GPR[RT] >> s;
1112 000000,5.RS,5.RT,5.RD,00000010110:SPECIAL:64::DSRLV
1113 "dsrl32 r<RD>, r<RT>, r<RS>"
1117 // start-sanitize-vr5400
1119 // end-sanitize-vr5400
1120 // start-sanitize-r5900
1122 // end-sanitize-r5900
1124 // start-sanitize-tx19
1126 // end-sanitize-tx19
1128 int s = MASKED64 (GPR[RS], 5, 0);
1129 GPR[RD] = (unsigned64) GPR[RT] >> s;
1133 000000,5.RS,5.RT,5.RD,00000101110:SPECIAL:64::DSUB
1134 "dsub r<RD>, r<RS>, r<RT>"
1138 // start-sanitize-vr5400
1140 // end-sanitize-vr5400
1141 // start-sanitize-r5900
1143 // end-sanitize-r5900
1145 // start-sanitize-tx19
1147 // end-sanitize-tx19
1149 ALU64_BEGIN (GPR[RS]);
1150 ALU64_SUB (GPR[RT]);
1151 ALU64_END (GPR[RD]);
1155 000000,5.RS,5.RT,5.RD,00000101111:SPECIAL:64::DSUBU
1156 "dsubu r<RD>, r<RS>, r<RT>"
1160 // start-sanitize-vr5400
1162 // end-sanitize-vr5400
1163 // start-sanitize-r5900
1165 // end-sanitize-r5900
1167 // start-sanitize-tx19
1169 // end-sanitize-tx19
1171 GPR[RD] = GPR[RS] - GPR[RT];
1175 000010,26.INSTR_INDEX:NORMAL:32::J
1177 *mipsI,mipsII,mipsIII,mipsIV:
1179 // start-sanitize-vr5400
1181 // end-sanitize-vr5400
1182 // start-sanitize-r5900
1184 // end-sanitize-r5900
1186 // start-sanitize-tx19
1188 // end-sanitize-tx19
1190 /* NOTE: The region used is that of the delay slot NIA and NOT the
1191 current instruction */
1192 address_word region = (NIA & MASK (63, 28));
1193 DELAY_SLOT (region | (INSTR_INDEX << 2));
1197 000011,26.INSTR_INDEX:NORMAL:32::JAL
1199 *mipsI,mipsII,mipsIII,mipsIV:
1201 // start-sanitize-vr5400
1203 // end-sanitize-vr5400
1204 // start-sanitize-r5900
1206 // end-sanitize-r5900
1208 // start-sanitize-tx19
1210 // end-sanitize-tx19
1212 /* NOTE: The region used is that of the delay slot and NOT the
1213 current instruction */
1214 address_word region = (NIA & MASK (63, 28));
1216 DELAY_SLOT (region | (INSTR_INDEX << 2));
1220 000000,5.RS,00000,5.RD,00000001001:SPECIAL:32::JALR
1221 "jalr r<RS>":RD == 31
1223 *mipsI,mipsII,mipsIII,mipsIV:
1225 // start-sanitize-vr5400
1227 // end-sanitize-vr5400
1228 // start-sanitize-r5900
1230 // end-sanitize-r5900
1232 // start-sanitize-tx19
1234 // end-sanitize-tx19
1236 address_word temp = GPR[RS];
1242 000000,5.RS,000000000000000001000:SPECIAL:32::JR
1244 *mipsI,mipsII,mipsIII,mipsIV:
1246 // start-sanitize-vr5400
1248 // end-sanitize-vr5400
1249 // start-sanitize-r5900
1251 // end-sanitize-r5900
1253 // start-sanitize-tx19
1255 // end-sanitize-tx19
1257 DELAY_SLOT (GPR[RS]);
1261 :function:::void:do_load_byte:address_word gpr_base, int rt, signed16 offset
1263 address_word vaddr = offset + gpr_base;
1266 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1268 unsigned64 memval = 0;
1269 address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
1270 unsigned int reverse = (ReverseEndian ? mask : 0);
1271 unsigned int bigend = (BigEndianCPU ? mask : 0);
1273 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1274 LoadMemory (&memval, NULL, uncached, AccessLength_BYTE, paddr, vaddr, isDATA, isREAL);
1275 byte = ((vaddr & mask) ^ bigend);
1276 GPR[rt] = EXTEND8 ((memval >> (8 * byte)));
1280 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
1281 "lb r<RT>, <OFFSET>(r<BASE>)"
1282 *mipsI,mipsII,mipsIII,mipsIV:
1284 // start-sanitize-vr5400
1286 // end-sanitize-vr5400
1287 // start-sanitize-r5900
1289 // end-sanitize-r5900
1291 // start-sanitize-tx19
1293 // end-sanitize-tx19
1295 do_load_byte (SD_, GPR[BASE], RT, OFFSET);
1297 unsigned32 instruction = instruction_0;
1298 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1299 int destreg = ((instruction >> 16) & 0x0000001F);
1300 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1302 address_word vaddr = ((uword64)op1 + offset);
1306 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1309 uword64 memval1 = 0;
1311 unsigned int shift = 0;
1312 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1313 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1315 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1316 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
1317 byte = ((vaddr & mask) ^ (bigend << shift));
1318 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x000000FF),8));
1326 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
1327 "lbu r<RT>, <OFFSET>(r<BASE>)"
1328 *mipsI,mipsII,mipsIII,mipsIV:
1330 // start-sanitize-vr5400
1332 // end-sanitize-vr5400
1333 // start-sanitize-r5900
1335 // end-sanitize-r5900
1337 // start-sanitize-tx19
1339 // end-sanitize-tx19
1341 unsigned32 instruction = instruction_0;
1342 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1343 int destreg = ((instruction >> 16) & 0x0000001F);
1344 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1346 address_word vaddr = ((unsigned64)op1 + offset);
1350 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1352 unsigned64 memval = 0;
1353 unsigned64 memval1 = 0;
1354 unsigned64 mask = 0x7;
1355 unsigned int shift = 0;
1356 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1357 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1359 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1360 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
1361 byte = ((vaddr & mask) ^ (bigend << shift));
1362 GPR[destreg] = (((memval >> (8 * byte)) & 0x000000FF));
1369 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
1370 "ld r<RT>, <OFFSET>(r<BASE>)"
1374 // start-sanitize-vr5400
1376 // end-sanitize-vr5400
1377 // start-sanitize-r5900
1379 // end-sanitize-r5900
1381 // start-sanitize-tx19
1383 // end-sanitize-tx19
1385 unsigned32 instruction = instruction_0;
1386 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1387 int destreg = ((instruction >> 16) & 0x0000001F);
1388 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1390 address_word vaddr = ((unsigned64)op1 + offset);
1393 if ((vaddr & 7) != 0)
1394 SignalExceptionAddressLoad();
1397 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1399 unsigned64 memval = 0;
1400 unsigned64 memval1 = 0;
1401 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1402 GPR[destreg] = memval;
1409 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
1410 "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
1415 // start-sanitize-vr5400
1417 // end-sanitize-vr5400
1418 // start-sanitize-r5900
1420 // end-sanitize-r5900
1422 // start-sanitize-tx19
1424 // end-sanitize-tx19
1426 unsigned32 instruction = instruction_0;
1427 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1428 int destreg = ((instruction >> 16) & 0x0000001F);
1429 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1431 address_word vaddr = ((unsigned64)op1 + offset);
1434 if ((vaddr & 7) != 0)
1435 SignalExceptionAddressLoad();
1438 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1440 unsigned64 memval = 0;
1441 unsigned64 memval1 = 0;
1442 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1443 COP_LD(((instruction >> 26) & 0x3),destreg,memval);;
1450 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
1451 "ldl r<RT>, <OFFSET>(r<BASE>)"
1455 // start-sanitize-vr5400
1457 // end-sanitize-vr5400
1458 // start-sanitize-r5900
1460 // end-sanitize-r5900
1462 // start-sanitize-tx19
1464 // end-sanitize-tx19
1466 unsigned32 instruction = instruction_0;
1467 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1468 int destreg = ((instruction >> 16) & 0x0000001F);
1469 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1471 address_word vaddr = ((unsigned64)op1 + offset);
1475 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1477 unsigned64 memval = 0;
1478 unsigned64 memval1 = 0;
1479 unsigned64 mask = 7;
1480 unsigned int reverse = (ReverseEndian ? mask : 0);
1481 unsigned int bigend = (BigEndianCPU ? mask : 0);
1483 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1484 byte = ((vaddr & mask) ^ bigend);
1487 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
1488 GPR[destreg] = ((memval << ((7 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((7 - byte) * 8)) - 1)));
1495 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
1496 "ldr r<RT>, <OFFSET>(r<BASE>)"
1500 // start-sanitize-vr5400
1502 // end-sanitize-vr5400
1503 // start-sanitize-r5900
1505 // end-sanitize-r5900
1507 // start-sanitize-tx19
1509 // end-sanitize-tx19
1511 unsigned32 instruction = instruction_0;
1512 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1513 int destreg = ((instruction >> 16) & 0x0000001F);
1514 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1516 address_word vaddr = ((unsigned64)op1 + offset);
1520 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1522 unsigned64 memval = 0;
1523 unsigned64 memval1 = 0;
1524 unsigned64 mask = 7;
1525 unsigned int reverse = (ReverseEndian ? mask : 0);
1526 unsigned int bigend = (BigEndianCPU ? mask : 0);
1528 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1529 byte = ((vaddr & mask) ^ bigend);
1532 LoadMemory(&memval,&memval1,uncached,(7 - byte),paddr,vaddr,isDATA,isREAL);
1538 srcmask = ((unsigned64)-1 << (8 * (8 - byte)));
1539 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
1547 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
1548 "lh r<RT>, <OFFSET>(r<BASE>)"
1549 *mipsI,mipsII,mipsIII,mipsIV:
1551 // start-sanitize-vr5400
1553 // end-sanitize-vr5400
1554 // start-sanitize-r5900
1556 // end-sanitize-r5900
1558 // start-sanitize-tx19
1560 // end-sanitize-tx19
1562 unsigned32 instruction = instruction_0;
1563 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1564 int destreg = ((instruction >> 16) & 0x0000001F);
1565 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1567 address_word vaddr = ((unsigned64)op1 + offset);
1570 if ((vaddr & 1) != 0)
1571 SignalExceptionAddressLoad();
1574 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1576 unsigned64 memval = 0;
1577 unsigned64 memval1 = 0;
1578 unsigned64 mask = 0x7;
1579 unsigned int shift = 1;
1580 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1581 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1583 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1584 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1585 byte = ((vaddr & mask) ^ (bigend << shift));
1586 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x0000FFFF),16));
1593 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
1594 "lhu r<RT>, <OFFSET>(r<BASE>)"
1595 *mipsI,mipsII,mipsIII,mipsIV:
1597 // start-sanitize-vr5400
1599 // end-sanitize-vr5400
1600 // start-sanitize-r5900
1602 // end-sanitize-r5900
1604 // start-sanitize-tx19
1606 // end-sanitize-tx19
1608 unsigned32 instruction = instruction_0;
1609 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1610 int destreg = ((instruction >> 16) & 0x0000001F);
1611 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1613 address_word vaddr = ((unsigned64)op1 + offset);
1616 if ((vaddr & 1) != 0)
1617 SignalExceptionAddressLoad();
1620 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1622 unsigned64 memval = 0;
1623 unsigned64 memval1 = 0;
1624 unsigned64 mask = 0x7;
1625 unsigned int shift = 1;
1626 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1627 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1629 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1630 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1631 byte = ((vaddr & mask) ^ (bigend << shift));
1632 GPR[destreg] = (((memval >> (8 * byte)) & 0x0000FFFF));
1639 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
1640 "ll r<RT>, <OFFSET>(r<BASE>)"
1645 // start-sanitize-vr5400
1647 // end-sanitize-vr5400
1648 // start-sanitize-r5900
1650 // end-sanitize-r5900
1652 // start-sanitize-tx19
1654 // end-sanitize-tx19
1656 unsigned32 instruction = instruction_0;
1657 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1658 int destreg = ((instruction >> 16) & 0x0000001F);
1659 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1661 address_word vaddr = ((unsigned64)op1 + offset);
1664 if ((vaddr & 3) != 0)
1665 SignalExceptionAddressLoad();
1668 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1670 unsigned64 memval = 0;
1671 unsigned64 memval1 = 0;
1672 unsigned64 mask = 0x7;
1673 unsigned int shift = 2;
1674 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1675 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1677 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1678 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1679 byte = ((vaddr & mask) ^ (bigend << shift));
1680 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
1688 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
1689 "lld r<RT>, <OFFSET>(r<BASE>)"
1693 // start-sanitize-vr5400
1695 // end-sanitize-vr5400
1696 // start-sanitize-r5900
1698 // end-sanitize-r5900
1700 // start-sanitize-tx19
1702 // end-sanitize-tx19
1704 unsigned32 instruction = instruction_0;
1705 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1706 int destreg = ((instruction >> 16) & 0x0000001F);
1707 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1709 address_word vaddr = ((unsigned64)op1 + offset);
1712 if ((vaddr & 7) != 0)
1713 SignalExceptionAddressLoad();
1716 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1718 unsigned64 memval = 0;
1719 unsigned64 memval1 = 0;
1720 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1721 GPR[destreg] = memval;
1729 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
1730 "lui r<RT>, <IMMEDIATE>"
1731 *mipsI,mipsII,mipsIII,mipsIV:
1733 // start-sanitize-vr5400
1735 // end-sanitize-vr5400
1736 // start-sanitize-r5900
1738 // end-sanitize-r5900
1740 // start-sanitize-tx19
1742 // end-sanitize-tx19
1744 GPR[RT] = EXTEND32 (IMMEDIATE << 16);
1748 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
1749 "lw r<RT>, <OFFSET>(r<BASE>)"
1750 *mipsI,mipsII,mipsIII,mipsIV:
1752 // start-sanitize-vr5400
1754 // end-sanitize-vr5400
1755 // start-sanitize-r5900
1757 // end-sanitize-r5900
1759 // start-sanitize-tx19
1761 // end-sanitize-tx19
1763 unsigned32 instruction = instruction_0;
1764 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1765 int destreg = ((instruction >> 16) & 0x0000001F);
1766 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1768 address_word vaddr = ((unsigned64)op1 + offset);
1771 if ((vaddr & 3) != 0)
1772 SignalExceptionAddressLoad();
1775 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1777 unsigned64 memval = 0;
1778 unsigned64 memval1 = 0;
1779 unsigned64 mask = 0x7;
1780 unsigned int shift = 2;
1781 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1782 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1784 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1785 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1786 byte = ((vaddr & mask) ^ (bigend << shift));
1787 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
1794 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
1795 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
1796 *mipsI,mipsII,mipsIII,mipsIV:
1798 // start-sanitize-vr5400
1800 // end-sanitize-vr5400
1801 // start-sanitize-r5900
1803 // end-sanitize-r5900
1805 // start-sanitize-tx19
1807 // end-sanitize-tx19
1809 unsigned32 instruction = instruction_0;
1810 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1811 int destreg = ((instruction >> 16) & 0x0000001F);
1812 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1814 address_word vaddr = ((unsigned64)op1 + offset);
1817 if ((vaddr & 3) != 0)
1818 SignalExceptionAddressLoad();
1821 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1823 unsigned64 memval = 0;
1824 unsigned64 memval1 = 0;
1825 unsigned64 mask = 0x7;
1826 unsigned int shift = 2;
1827 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1828 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1830 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1831 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1832 byte = ((vaddr & mask) ^ (bigend << shift));
1833 COP_LW(((instruction >> 26) & 0x3),destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
1840 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
1841 "lwl r<RT>, <OFFSET>(r<BASE>)"
1842 *mipsI,mipsII,mipsIII,mipsIV:
1844 // start-sanitize-vr5400
1846 // end-sanitize-vr5400
1847 // start-sanitize-r5900
1849 // end-sanitize-r5900
1851 // start-sanitize-tx19
1853 // end-sanitize-tx19
1855 unsigned32 instruction = instruction_0;
1856 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1857 int destreg = ((instruction >> 16) & 0x0000001F);
1858 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1860 address_word vaddr = ((unsigned64)op1 + offset);
1864 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1866 unsigned64 memval = 0;
1867 unsigned64 memval1 = 0;
1868 unsigned64 mask = 3;
1869 unsigned int reverse = (ReverseEndian ? mask : 0);
1870 unsigned int bigend = (BigEndianCPU ? mask : 0);
1872 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1873 byte = ((vaddr & mask) ^ bigend);
1876 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
1877 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
1880 GPR[destreg] = ((memval << ((3 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((3 - byte) * 8)) - 1)));
1881 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
1888 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
1889 "lwr r<RT>, <OFFSET>(r<BASE>)"
1890 *mipsI,mipsII,mipsIII,mipsIV:
1892 // start-sanitize-vr5400
1894 // end-sanitize-vr5400
1895 // start-sanitize-r5900
1897 // end-sanitize-r5900
1899 // start-sanitize-tx19
1901 // end-sanitize-tx19
1903 unsigned32 instruction = instruction_0;
1904 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1905 int destreg = ((instruction >> 16) & 0x0000001F);
1906 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1908 address_word vaddr = ((unsigned64)op1 + offset);
1912 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1914 unsigned64 memval = 0;
1915 unsigned64 memval1 = 0;
1916 unsigned64 mask = 3;
1917 unsigned int reverse = (ReverseEndian ? mask : 0);
1918 unsigned int bigend = (BigEndianCPU ? mask : 0);
1920 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1921 byte = ((vaddr & mask) ^ bigend);
1924 LoadMemory(&memval,&memval1,uncached,(3 - byte),paddr,vaddr,isDATA,isREAL);
1925 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
1933 srcmask = ((unsigned64)-1 << (8 * (4 - byte)));
1934 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
1936 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
1943 100111,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWU
1944 "lwu r<RT>, <OFFSET>(r<BASE>)"
1948 // start-sanitize-vr5400
1950 // end-sanitize-vr5400
1951 // start-sanitize-r5900
1953 // end-sanitize-r5900
1955 // start-sanitize-tx19
1957 // end-sanitize-tx19
1959 unsigned32 instruction = instruction_0;
1960 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1961 int destreg = ((instruction >> 16) & 0x0000001F);
1962 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1964 address_word vaddr = ((unsigned64)op1 + offset);
1967 if ((vaddr & 3) != 0)
1968 SignalExceptionAddressLoad();
1971 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1973 unsigned64 memval = 0;
1974 unsigned64 memval1 = 0;
1975 unsigned64 mask = 0x7;
1976 unsigned int shift = 2;
1977 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1978 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1980 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1981 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1982 byte = ((vaddr & mask) ^ (bigend << shift));
1983 GPR[destreg] = (((memval >> (8 * byte)) & 0xFFFFFFFF));
1990 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
1992 *mipsI,mipsII,mipsIII,mipsIV:
1994 // start-sanitize-vr5400
1996 // end-sanitize-vr5400
1997 // start-sanitize-r5900
1999 // end-sanitize-r5900
2001 // start-sanitize-tx19
2003 // end-sanitize-tx19
2012 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
2014 *mipsI,mipsII,mipsIII,mipsIV:
2016 // start-sanitize-vr5400
2018 // end-sanitize-vr5400
2019 // start-sanitize-r5900
2021 // end-sanitize-r5900
2023 // start-sanitize-tx19
2025 // end-sanitize-tx19
2029 LOACCESS = 3; /* 3rd instruction will be safe */
2034 000000,5.RS,5.RT,5.RD,00000001011:SPECIAL:32::MOVN
2035 "movn r<RD>, r<RS>, r<RT>"
2038 // start-sanitize-vr5400
2040 // end-sanitize-vr5400
2041 // start-sanitize-r5900
2043 // end-sanitize-r5900
2050 000000,5.RS,5.RT,5.RD,00000001010:SPECIAL:32::MOVZ
2051 "movz r<RD>, r<RS>, r<RT>"
2054 // start-sanitize-vr5400
2056 // end-sanitize-vr5400
2057 // start-sanitize-r5900
2059 // end-sanitize-r5900
2066 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
2068 *mipsI,mipsII,mipsIII,mipsIV:
2070 // start-sanitize-vr5400
2072 // end-sanitize-vr5400
2073 // start-sanitize-r5900
2075 // end-sanitize-r5900
2077 // start-sanitize-tx19
2079 // end-sanitize-tx19
2083 sim_io_eprintf (sd, "MT (move-to) over-writing HI register value\n");
2087 HIACCESS = 3; /* 3rd instruction will be safe */
2092 000000,5.RS,000000000000000010011:SPECIAL:32::MTLO
2094 *mipsI,mipsII,mipsIII,mipsIV:
2096 // start-sanitize-vr5400
2098 // end-sanitize-vr5400
2099 // start-sanitize-r5900
2101 // end-sanitize-r5900
2103 // start-sanitize-tx19
2105 // end-sanitize-tx19
2109 sim_io_eprintf (sd, "MT (move-to) over-writing LO register value\n");
2113 LOACCESS = 3; /* 3rd instruction will be safe */
2118 000000,5.RS,5.RT,00000,00000011000:SPECIAL:32::MULT
2120 *mipsI,mipsII,mipsIII,mipsIV:
2123 CHECKHILO ("Multiplication");
2124 prod = (((signed64)(signed32) GPR[RS])
2125 * ((signed64)(signed32) GPR[RT]));
2126 LO = EXTEND32 (VL4_8 (prod));
2127 HI = EXTEND32 (VH4_8 (prod));
2129 000000,5.RS,5.RT,5.RD,00000011000:SPECIAL:32::MULT
2130 "mult r<RD>, r<RS>, r<RT>"
2132 // start-sanitize-vr5400
2134 // end-sanitize-vr5400
2135 // start-sanitize-r5900
2137 // end-sanitize-r5900
2139 // start-sanitize-tx19
2141 // end-sanitize-tx19
2144 CHECKHILO ("Multiplication");
2145 prod = (((signed64)(signed32) GPR[RS])
2146 * ((signed64)(signed32) GPR[RT]));
2147 LO = EXTEND32 (VL4_8 (prod));
2148 HI = EXTEND32 (VH4_8 (prod));
2154 000000,5.RS,5.RT,00000,00000011001:SPECIAL:32::MULTU
2155 "multu r<RS>, r<RT>"
2156 *mipsI,mipsII,mipsIII,mipsIV:
2159 CHECKHILO ("Multiplication");
2160 prod = (((unsigned64)(unsigned32) GPR[RS])
2161 * ((unsigned64)(unsigned32) GPR[RT]));
2162 LO = EXTEND32 (VL4_8 (prod));
2163 HI = EXTEND32 (VH4_8 (prod));
2165 000000,5.RS,5.RT,5.RD,00000011001:SPECIAL:32::MULTU
2166 "multu r<RD>, r<RS>, r<RT>"
2168 // start-sanitize-vr5400
2170 // end-sanitize-vr5400
2171 // start-sanitize-r5900
2173 // end-sanitize-r5900
2175 // start-sanitize-tx19
2177 // end-sanitize-tx19
2180 CHECKHILO ("Multiplication");
2181 prod = (((unsigned64)(unsigned32) GPR[RS])
2182 * ((unsigned64)(unsigned32) GPR[RT]));
2183 LO = EXTEND32 (VL4_8 (prod));
2184 HI = EXTEND32 (VH4_8 (prod));
2190 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
2191 "nor r<RD>, r<RS>, r<RT>"
2192 *mipsI,mipsII,mipsIII,mipsIV:
2194 // start-sanitize-vr5400
2196 // end-sanitize-vr5400
2197 // start-sanitize-r5900
2199 // end-sanitize-r5900
2201 // start-sanitize-tx19
2203 // end-sanitize-tx19
2205 GPR[RD] = ~ (GPR[RS] | GPR[RT]);
2209 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
2210 "or r<RD>, r<RS>, r<RT>"
2211 *mipsI,mipsII,mipsIII,mipsIV:
2213 // start-sanitize-vr5400
2215 // end-sanitize-vr5400
2216 // start-sanitize-r5900
2218 // end-sanitize-r5900
2220 // start-sanitize-tx19
2222 // end-sanitize-tx19
2224 GPR[RD] = (GPR[RS] | GPR[RT]);
2228 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
2229 "ori r<RT>, r<RS>, <IMMEDIATE>"
2230 *mipsI,mipsII,mipsIII,mipsIV:
2232 // start-sanitize-vr5400
2234 // end-sanitize-vr5400
2235 // start-sanitize-r5900
2237 // end-sanitize-r5900
2239 // start-sanitize-tx19
2241 // end-sanitize-tx19
2243 GPR[RT] = (GPR[RS] | IMMEDIATE);
2247 110011,5.RS,nnnnn,16.OFFSET:NORMAL:32::PREF
2250 // start-sanitize-vr5400
2252 // end-sanitize-vr5400
2253 // start-sanitize-r5900
2255 // end-sanitize-r5900
2257 unsigned32 instruction = instruction_0;
2258 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2259 int hint = ((instruction >> 16) & 0x0000001F);
2260 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2262 address_word vaddr = ((unsigned64)op1 + offset);
2266 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2267 Prefetch(uncached,paddr,vaddr,isDATA,hint);
2272 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
2273 "sb r<RT>, <OFFSET>(r<BASE>)"
2274 *mipsI,mipsII,mipsIII,mipsIV:
2276 // start-sanitize-vr5400
2278 // end-sanitize-vr5400
2279 // start-sanitize-r5900
2281 // end-sanitize-r5900
2283 // start-sanitize-tx19
2285 // end-sanitize-tx19
2287 unsigned32 instruction = instruction_0;
2288 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2289 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2290 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2292 address_word vaddr = ((unsigned64)op1 + offset);
2296 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2298 unsigned64 memval = 0;
2299 unsigned64 memval1 = 0;
2300 unsigned64 mask = 0x7;
2301 unsigned int shift = 0;
2302 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2303 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2305 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2306 byte = ((vaddr & mask) ^ (bigend << shift));
2307 memval = ((unsigned64) op2 << (8 * byte));
2309 StoreMemory(uncached,AccessLength_BYTE,memval,memval1,paddr,vaddr,isREAL);
2317 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
2318 "sc r<RT>, <OFFSET>(r<BASE>)"
2323 // start-sanitize-vr5400
2325 // end-sanitize-vr5400
2326 // start-sanitize-r5900
2328 // end-sanitize-r5900
2330 // start-sanitize-tx19
2332 // end-sanitize-tx19
2334 unsigned32 instruction = instruction_0;
2335 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2336 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2337 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2339 address_word vaddr = ((unsigned64)op1 + offset);
2342 if ((vaddr & 3) != 0)
2343 SignalExceptionAddressStore();
2346 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2348 unsigned64 memval = 0;
2349 unsigned64 memval1 = 0;
2350 unsigned64 mask = 0x7;
2352 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2353 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2354 memval = ((unsigned64) op2 << (8 * byte));
2357 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2359 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2366 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
2367 "scd r<RT>, <OFFSET>(r<BASE>)"
2371 // start-sanitize-vr5400
2373 // end-sanitize-vr5400
2374 // start-sanitize-r5900
2376 // end-sanitize-r5900
2378 // start-sanitize-tx19
2380 // end-sanitize-tx19
2382 unsigned32 instruction = instruction_0;
2383 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2384 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2385 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2387 address_word vaddr = ((unsigned64)op1 + offset);
2390 if ((vaddr & 7) != 0)
2391 SignalExceptionAddressStore();
2394 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2396 unsigned64 memval = 0;
2397 unsigned64 memval1 = 0;
2401 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2403 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2410 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
2411 "sd r<RT>, <OFFSET>(r<BASE>)"
2415 // start-sanitize-vr5400
2417 // end-sanitize-vr5400
2418 // start-sanitize-r5900
2420 // end-sanitize-r5900
2422 // start-sanitize-tx19
2424 // end-sanitize-tx19
2426 unsigned32 instruction = instruction_0;
2427 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2428 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2429 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2431 address_word vaddr = ((unsigned64)op1 + offset);
2434 if ((vaddr & 7) != 0)
2435 SignalExceptionAddressStore();
2438 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2440 unsigned64 memval = 0;
2441 unsigned64 memval1 = 0;
2444 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2452 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
2453 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2458 // start-sanitize-vr5400
2460 // end-sanitize-vr5400
2461 // start-sanitize-r5900
2463 // end-sanitize-r5900
2465 // start-sanitize-tx19
2467 // end-sanitize-tx19
2469 unsigned32 instruction = instruction_0;
2470 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2471 int destreg = ((instruction >> 16) & 0x0000001F);
2472 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2474 address_word vaddr = ((unsigned64)op1 + offset);
2477 if ((vaddr & 7) != 0)
2478 SignalExceptionAddressStore();
2481 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2483 unsigned64 memval = 0;
2484 unsigned64 memval1 = 0;
2485 memval = (unsigned64)COP_SD(((instruction >> 26) & 0x3),destreg);
2487 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2495 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
2496 "sdl r<RT>, <OFFSET>(r<BASE>)"
2500 // start-sanitize-vr5400
2502 // end-sanitize-vr5400
2503 // start-sanitize-r5900
2505 // end-sanitize-r5900
2507 // start-sanitize-tx19
2509 // end-sanitize-tx19
2511 unsigned32 instruction = instruction_0;
2512 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2513 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2514 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2516 address_word vaddr = ((unsigned64)op1 + offset);
2520 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2522 unsigned64 memval = 0;
2523 unsigned64 memval1 = 0;
2524 unsigned64 mask = 7;
2525 unsigned int reverse = (ReverseEndian ? mask : 0);
2526 unsigned int bigend = (BigEndianCPU ? mask : 0);
2528 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2529 byte = ((vaddr & mask) ^ bigend);
2532 memval = (op2 >> (8 * (7 - byte)));
2533 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
2540 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
2541 "sdr r<RT>, <OFFSET>(r<BASE>)"
2545 // start-sanitize-vr5400
2547 // end-sanitize-vr5400
2548 // start-sanitize-r5900
2550 // end-sanitize-r5900
2552 // start-sanitize-tx19
2554 // end-sanitize-tx19
2559 unsigned64 mask = 7;
2560 unsigned int reverse = (ReverseEndian ? mask : 0);
2561 unsigned int bigend = (BigEndianCPU ? mask : 0);
2563 address_word vaddr = (GPR[BASE] + EXTEND16 (OFFSET));
2564 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
2565 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2568 byte = ((vaddr & mask) ^ bigend);
2569 memval = (GPR[RT] << (byte * 8));
2570 StoreMemory(uncached,(AccessLength_DOUBLEWORD - byte),memval,0,paddr,vaddr,isREAL);
2574 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
2575 "sh r<RT>, <OFFSET>(r<BASE>)"
2576 *mipsI,mipsII,mipsIII,mipsIV:
2578 // start-sanitize-vr5400
2580 // end-sanitize-vr5400
2581 // start-sanitize-r5900
2583 // end-sanitize-r5900
2585 // start-sanitize-tx19
2587 // end-sanitize-tx19
2589 unsigned32 instruction = instruction_0;
2590 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2591 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2592 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2594 address_word vaddr = ((unsigned64)op1 + offset);
2597 if ((vaddr & 1) != 0)
2598 SignalExceptionAddressStore();
2601 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2603 unsigned64 memval = 0;
2604 unsigned64 memval1 = 0;
2605 unsigned64 mask = 0x7;
2606 unsigned int shift = 1;
2607 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2608 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2610 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2611 byte = ((vaddr & mask) ^ (bigend << shift));
2612 memval = ((unsigned64) op2 << (8 * byte));
2614 StoreMemory(uncached,AccessLength_HALFWORD,memval,memval1,paddr,vaddr,isREAL);
2622 00000000000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLL
2623 "sll r<RD>, r<RT>, <SHIFT>"
2624 *mipsI,mipsII,mipsIII,mipsIV:
2626 // start-sanitize-vr5400
2628 // end-sanitize-vr5400
2629 // start-sanitize-r5900
2631 // end-sanitize-r5900
2633 // start-sanitize-tx19
2635 // end-sanitize-tx19
2638 unsigned32 temp = (GPR[RT] << s);
2639 GPR[RD] = EXTEND32 (temp);
2643 000000,5.RS,5.RT,5.RD,00000000100:SPECIAL:32::SLLV
2644 "sllv r<RD>, r<RT>, r<RS>"
2645 *mipsI,mipsII,mipsIII,mipsIV:
2647 // start-sanitize-vr5400
2649 // end-sanitize-vr5400
2650 // start-sanitize-r5900
2652 // end-sanitize-r5900
2654 // start-sanitize-tx19
2656 // end-sanitize-tx19
2658 int s = MASKED (GPR[RS], 4, 0);
2659 unsigned32 temp = (GPR[RT] << s);
2660 GPR[RD] = EXTEND32 (temp);
2664 000000,5.RS,5.RT,5.RD,00000101010:SPECIAL:32::SLT
2665 "slt r<RD>, r<RS>, r<RT>"
2666 *mipsI,mipsII,mipsIII,mipsIV:
2668 // start-sanitize-vr5400
2670 // end-sanitize-vr5400
2671 // start-sanitize-r5900
2673 // end-sanitize-r5900
2675 // start-sanitize-tx19
2677 // end-sanitize-tx19
2679 GPR[RD] = ((signed_word) GPR[RS] < (signed_word) GPR[RT]);
2683 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
2684 "slti r<RT>, r<RS>, <IMMEDIATE>"
2685 *mipsI,mipsII,mipsIII,mipsIV:
2687 // start-sanitize-vr5400
2689 // end-sanitize-vr5400
2690 // start-sanitize-r5900
2692 // end-sanitize-r5900
2694 // start-sanitize-tx19
2696 // end-sanitize-tx19
2698 GPR[RT] = ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE));
2702 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
2703 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
2704 *mipsI,mipsII,mipsIII,mipsIV:
2706 // start-sanitize-vr5400
2708 // end-sanitize-vr5400
2709 // start-sanitize-r5900
2711 // end-sanitize-r5900
2713 // start-sanitize-tx19
2715 // end-sanitize-tx19
2717 GPR[RT] = ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE));
2720 000000,5.RS,5.RT,5.RD,00000101011:SPECIAL:32::SLTU
2721 "sltu r<RD>, r<RS>, r<RT>"
2722 *mipsI,mipsII,mipsIII,mipsIV:
2724 // start-sanitize-vr5400
2726 // end-sanitize-vr5400
2727 // start-sanitize-r5900
2729 // end-sanitize-r5900
2731 // start-sanitize-tx19
2733 // end-sanitize-tx19
2735 GPR[RD] = ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT]);
2739 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
2740 "sra r<RD>, r<RT>, <SHIFT>"
2741 *mipsI,mipsII,mipsIII,mipsIV:
2743 // start-sanitize-vr5400
2745 // end-sanitize-vr5400
2746 // start-sanitize-r5900
2748 // end-sanitize-r5900
2750 // start-sanitize-tx19
2752 // end-sanitize-tx19
2755 signed32 temp = (signed32) GPR[RT] >> s;
2756 GPR[RD] = EXTEND32 (temp);
2760 000000,5.RS,5.RT,5.RD,00000000111:SPECIAL:32::SRAV
2761 "srav r<RD>, r<RT>, r<RS>"
2762 *mipsI,mipsII,mipsIII,mipsIV:
2764 // start-sanitize-vr5400
2766 // end-sanitize-vr5400
2767 // start-sanitize-r5900
2769 // end-sanitize-r5900
2771 // start-sanitize-tx19
2773 // end-sanitize-tx19
2775 int s = MASKED (GPR[RS], 4, 0);
2776 signed32 temp = (signed32) GPR[RT] >> s;
2777 GPR[RD] = EXTEND32 (temp);
2781 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
2782 "srl r<RD>, r<RT>, <SHIFT>"
2783 *mipsI,mipsII,mipsIII,mipsIV:
2785 // start-sanitize-vr5400
2787 // end-sanitize-vr5400
2788 // start-sanitize-r5900
2790 // end-sanitize-r5900
2792 // start-sanitize-tx19
2794 // end-sanitize-tx19
2797 unsigned32 temp = (unsigned32) GPR[RT] >> s;
2798 GPR[RD] = EXTEND32 (temp);
2802 000000,5.RS,5.RT,5.RD,00000000110:SPECIAL:32::SRLV
2803 "srlv r<RD>, r<RT>, r<RS>"
2804 *mipsI,mipsII,mipsIII,mipsIV:
2806 // start-sanitize-vr5400
2808 // end-sanitize-vr5400
2809 // start-sanitize-r5900
2811 // end-sanitize-r5900
2813 // start-sanitize-tx19
2815 // end-sanitize-tx19
2817 int s = MASKED (GPR[RS], 4, 0);
2818 unsigned32 temp = (unsigned32) GPR[RT] >> s;
2819 GPR[RD] = EXTEND32 (temp);
2823 000000,5.RS,5.RT,5.RD,00000100010:SPECIAL:32::SUB
2824 "sub r<RD>, r<RS>, r<RT>"
2825 *mipsI,mipsII,mipsIII,mipsIV:
2827 // start-sanitize-vr5400
2829 // end-sanitize-vr5400
2830 // start-sanitize-r5900
2832 // end-sanitize-r5900
2834 // start-sanitize-tx19
2836 // end-sanitize-tx19
2838 ALU32_BEGIN (GPR[RS]);
2839 ALU32_SUB (GPR[RT]);
2840 ALU32_END (GPR[RD]);
2844 000000,5.RS,5.RT,5.RD,00000100011:SPECIAL:32::SUBU
2845 "subu r<RD>, r<RS>, r<RT>"
2846 *mipsI,mipsII,mipsIII,mipsIV:
2848 // start-sanitize-vr5400
2850 // end-sanitize-vr5400
2851 // start-sanitize-r5900
2853 // end-sanitize-r5900
2855 // start-sanitize-tx19
2857 // end-sanitize-tx19
2859 GPR[RD] = EXTEND32 (GPR[RS] - GPR[RT]);
2863 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
2864 "sw r<RT>, <OFFSET>(r<BASE>)"
2865 *mipsI,mipsII,mipsIII,mipsIV:
2867 // start-sanitize-vr5400
2869 // end-sanitize-vr5400
2870 // start-sanitize-r5900
2872 // end-sanitize-r5900
2874 // start-sanitize-tx19
2876 // end-sanitize-tx19
2878 unsigned32 instruction = instruction_0;
2879 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2880 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2881 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2883 address_word vaddr = ((unsigned64)op1 + offset);
2886 if ((vaddr & 3) != 0)
2887 SignalExceptionAddressStore();
2890 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2892 unsigned64 memval = 0;
2893 unsigned64 memval1 = 0;
2894 unsigned64 mask = 0x7;
2896 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2897 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2898 memval = ((unsigned64) op2 << (8 * byte));
2900 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2908 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
2909 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2910 *mipsI,mipsII,mipsIII,mipsIV:
2912 // start-sanitize-vr5400
2914 // end-sanitize-vr5400
2915 // start-sanitize-r5900
2917 // end-sanitize-r5900
2919 // start-sanitize-tx19
2921 // end-sanitize-tx19
2923 unsigned32 instruction = instruction_0;
2924 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2925 int destreg = ((instruction >> 16) & 0x0000001F);
2926 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2928 address_word vaddr = ((unsigned64)op1 + offset);
2931 if ((vaddr & 3) != 0)
2932 SignalExceptionAddressStore();
2935 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2937 unsigned64 memval = 0;
2938 unsigned64 memval1 = 0;
2939 unsigned64 mask = 0x7;
2941 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2942 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2943 memval = (((unsigned64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
2945 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2953 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
2954 "swl r<RT>, <OFFSET>(r<BASE>)"
2955 *mipsI,mipsII,mipsIII,mipsIV:
2957 // start-sanitize-vr5400
2959 // end-sanitize-vr5400
2960 // start-sanitize-r5900
2962 // end-sanitize-r5900
2964 // start-sanitize-tx19
2966 // end-sanitize-tx19
2968 unsigned32 instruction = instruction_0;
2969 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2970 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2971 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2973 address_word vaddr = ((unsigned64)op1 + offset);
2977 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2979 unsigned64 memval = 0;
2980 unsigned64 memval1 = 0;
2981 unsigned64 mask = 3;
2982 unsigned int reverse = (ReverseEndian ? mask : 0);
2983 unsigned int bigend = (BigEndianCPU ? mask : 0);
2985 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2986 byte = ((vaddr & mask) ^ bigend);
2989 memval = (op2 >> (8 * (3 - byte)));
2990 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
2993 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
3000 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
3001 "swr r<RT>, <OFFSET>(r<BASE>)"
3002 *mipsI,mipsII,mipsIII,mipsIV:
3004 // start-sanitize-vr5400
3006 // end-sanitize-vr5400
3007 // start-sanitize-r5900
3009 // end-sanitize-r5900
3011 // start-sanitize-tx19
3013 // end-sanitize-tx19
3015 unsigned64 memval = 0;
3016 unsigned64 mask = 3;
3017 unsigned int reverse = (ReverseEndian ? mask : 0);
3018 unsigned int bigend = (BigEndianCPU ? mask : 0);
3022 address_word vaddr = (GPR[BASE] + EXTEND16 (OFFSET));
3023 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
3024 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
3027 byte = ((vaddr & mask) ^ bigend);
3028 memval = (GPR[RT] << (byte * 8));
3029 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2))
3031 StoreMemory(uncached,(AccessLength_WORD - byte),memval,0,paddr,vaddr,isREAL);
3035 000000000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
3042 // start-sanitize-vr5400
3044 // end-sanitize-vr5400
3045 // start-sanitize-r5900
3047 // end-sanitize-r5900
3049 // start-sanitize-tx19
3051 // end-sanitize-tx19
3053 SyncOperation (STYPE);
3057 000000,20.CODE,001100:SPECIAL:32::SYSCALL
3059 *mipsI,mipsII,mipsIII,mipsIV:
3061 // start-sanitize-vr5400
3063 // end-sanitize-vr5400
3064 // start-sanitize-r5900
3066 // end-sanitize-r5900
3068 // start-sanitize-tx19
3070 // end-sanitize-tx19
3072 SignalException(SystemCall, instruction_0);
3076 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
3082 // start-sanitize-vr5400
3084 // end-sanitize-vr5400
3085 // start-sanitize-r5900
3087 // end-sanitize-r5900
3089 // start-sanitize-tx19
3091 // end-sanitize-tx19
3093 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
3094 SignalException(Trap, instruction_0);
3098 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
3099 "teqi r<RS>, <IMMEDIATE>"
3104 // start-sanitize-vr5400
3106 // end-sanitize-vr5400
3107 // start-sanitize-r5900
3109 // end-sanitize-r5900
3111 // start-sanitize-tx19
3113 // end-sanitize-tx19
3115 if ((signed_word) GPR[RS] == (signed_word) EXTEND16 (IMMEDIATE))
3116 SignalException(Trap, instruction_0);
3120 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
3126 // start-sanitize-vr5400
3128 // end-sanitize-vr5400
3129 // start-sanitize-r5900
3131 // end-sanitize-r5900
3133 // start-sanitize-tx19
3135 // end-sanitize-tx19
3137 if ((signed_word) GPR[RS] >= (signed_word) GPR[RT])
3138 SignalException(Trap, instruction_0);
3142 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
3143 "tgei r<RS>, <IMMEDIATE>"
3148 // start-sanitize-vr5400
3150 // end-sanitize-vr5400
3151 // start-sanitize-r5900
3153 // end-sanitize-r5900
3155 // start-sanitize-tx19
3157 // end-sanitize-tx19
3159 if ((signed_word) GPR[RS] >= (signed_word) EXTEND16 (IMMEDIATE))
3160 SignalException(Trap, instruction_0);
3164 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
3165 "tgeiu r<RS>, <IMMEDIATE>"
3170 // start-sanitize-vr5400
3172 // end-sanitize-vr5400
3173 // start-sanitize-r5900
3175 // end-sanitize-r5900
3177 // start-sanitize-tx19
3179 // end-sanitize-tx19
3181 if ((unsigned_word) GPR[RS] >= (unsigned_word) EXTEND16 (IMMEDIATE))
3182 SignalException(Trap, instruction_0);
3186 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
3192 // start-sanitize-vr5400
3194 // end-sanitize-vr5400
3195 // start-sanitize-r5900
3197 // end-sanitize-r5900
3199 // start-sanitize-tx19
3201 // end-sanitize-tx19
3203 if ((unsigned_word) GPR[RS] >= (unsigned_word) GPR[RT])
3204 SignalException(Trap, instruction_0);
3208 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
3214 // start-sanitize-vr5400
3216 // end-sanitize-vr5400
3217 // start-sanitize-r5900
3219 // end-sanitize-r5900
3221 // start-sanitize-tx19
3223 // end-sanitize-tx19
3225 if ((signed_word) GPR[RS] < (signed_word) GPR[RT])
3226 SignalException(Trap, instruction_0);
3230 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
3231 "tlti r<RS>, <IMMEDIATE>"
3236 // start-sanitize-vr5400
3238 // end-sanitize-vr5400
3239 // start-sanitize-r5900
3241 // end-sanitize-r5900
3243 // start-sanitize-tx19
3245 // end-sanitize-tx19
3247 if ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE))
3248 SignalException(Trap, instruction_0);
3252 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
3253 "tltiu r<RS>, <IMMEDIATE>"
3258 // start-sanitize-vr5400
3260 // end-sanitize-vr5400
3261 // start-sanitize-r5900
3263 // end-sanitize-r5900
3265 // start-sanitize-tx19
3267 // end-sanitize-tx19
3269 if ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE))
3270 SignalException(Trap, instruction_0);
3274 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
3280 // start-sanitize-vr5400
3282 // end-sanitize-vr5400
3283 // start-sanitize-r5900
3285 // end-sanitize-r5900
3287 // start-sanitize-tx19
3289 // end-sanitize-tx19
3291 if ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT])
3292 SignalException(Trap, instruction_0);
3296 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
3302 // start-sanitize-vr5400
3304 // end-sanitize-vr5400
3305 // start-sanitize-r5900
3307 // end-sanitize-r5900
3309 // start-sanitize-tx19
3311 // end-sanitize-tx19
3313 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
3314 SignalException(Trap, instruction_0);
3318 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
3319 "tne r<RS>, <IMMEDIATE>"
3324 // start-sanitize-vr5400
3326 // end-sanitize-vr5400
3327 // start-sanitize-r5900
3329 // end-sanitize-r5900
3331 // start-sanitize-tx19
3333 // end-sanitize-tx19
3335 if ((signed_word) GPR[RS] != (signed_word) EXTEND16 (IMMEDIATE))
3336 SignalException(Trap, instruction_0);
3340 000000,5.RS,5.RT,5.RD,00000100110:SPECIAL:32::XOR
3341 "xor r<RD>, r<RS>, r<RT>"
3342 *mipsI,mipsII,mipsIII,mipsIV:
3344 // start-sanitize-vr5400
3346 // end-sanitize-vr5400
3347 // start-sanitize-r5900
3349 // end-sanitize-r5900
3351 // start-sanitize-tx19
3353 // end-sanitize-tx19
3355 GPR[RD] = GPR[RS] ^ GPR[RT];
3359 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
3360 "xori r<RT>, r<RS>, <IMMEDIATE>"
3361 *mipsI,mipsII,mipsIII,mipsIV:
3363 // start-sanitize-vr5400
3365 // end-sanitize-vr5400
3366 // start-sanitize-r5900
3368 // end-sanitize-r5900
3370 // start-sanitize-tx19
3372 // end-sanitize-tx19
3374 GPR[RT] = GPR[RS] ^ IMMEDIATE;
3379 // MIPS Architecture:
3381 // FPU Instruction Set (COP1 & COP1X)
3389 case fmt_single: return "s";
3390 case fmt_double: return "d";
3391 case fmt_word: return "w";
3392 case fmt_long: return "l";
3393 default: return "?";
3403 default: return "?";
3423 :%s::::COND:int cond
3427 case 00: return "f";
3428 case 01: return "un";
3429 case 02: return "eq";
3430 case 03: return "ueq";
3431 case 04: return "olt";
3432 case 05: return "ult";
3433 case 06: return "ole";
3434 case 07: return "ule";
3435 case 010: return "sf";
3436 case 011: return "ngle";
3437 case 012: return "seq";
3438 case 013: return "ngl";
3439 case 014: return "lt";
3440 case 015: return "nge";
3441 case 016: return "le";
3442 case 017: return "ngt";
3443 default: return "?";
3448 010001,10,3.FMT,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
3449 "abs.%s<FMT> f<FD>, f<FS>"
3450 *mipsI,mipsII,mipsIII,mipsIV:
3452 // start-sanitize-vr5400
3454 // end-sanitize-vr5400
3456 // start-sanitize-tx19
3458 // end-sanitize-tx19
3460 unsigned32 instruction = instruction_0;
3461 int destreg = ((instruction >> 6) & 0x0000001F);
3462 int fs = ((instruction >> 11) & 0x0000001F);
3463 int format = ((instruction >> 21) & 0x00000007);
3465 if ((format != fmt_single) && (format != fmt_double))
3466 SignalException(ReservedInstruction,instruction);
3468 StoreFPR(destreg,format,AbsoluteValue(ValueFPR(fs,format),format));
3474 010001,10,3.FMT,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt
3475 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
3476 *mipsI,mipsII,mipsIII,mipsIV:
3478 // start-sanitize-vr5400
3480 // end-sanitize-vr5400
3482 // start-sanitize-tx19
3484 // end-sanitize-tx19
3486 unsigned32 instruction = instruction_0;
3487 int destreg = ((instruction >> 6) & 0x0000001F);
3488 int fs = ((instruction >> 11) & 0x0000001F);
3489 int ft = ((instruction >> 16) & 0x0000001F);
3490 int format = ((instruction >> 21) & 0x00000007);
3492 if ((format != fmt_single) && (format != fmt_double))
3493 SignalException(ReservedInstruction, instruction);
3495 StoreFPR(destreg,format,Add(ValueFPR(fs,format),ValueFPR(ft,format),format));
3506 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3507 "bc1%s<TF>%s<ND> <OFFSET>"
3508 *mipsI,mipsII,mipsIII:
3509 // start-sanitize-r5900
3511 // end-sanitize-r5900
3513 TRACE_BRANCH_INPUT (PREVCOC1());
3514 if (PREVCOC1() == TF)
3516 address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
3517 TRACE_BRANCH_RESULT (dest);
3522 TRACE_BRANCH_RESULT (0);
3523 NULLIFY_NEXT_INSTRUCTION ();
3527 TRACE_BRANCH_RESULT (NIA);
3531 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3532 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
3533 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
3536 // start-sanitize-vr5400
3538 // end-sanitize-vr5400
3540 // start-sanitize-tx19
3542 // end-sanitize-tx19
3544 if (GETFCC(CC) == TF)
3546 DELAY_SLOT (NIA + (EXTEND16 (OFFSET) << 2));
3550 NULLIFY_NEXT_INSTRUCTION ();
3560 :function:::void:do_c_cond_fmt:int fmt, int ft, int fs, int cc, int cond, instruction_word insn
3562 if ((fmt != fmt_single) && (fmt != fmt_double))
3563 SignalException (ReservedInstruction, insn);
3570 unsigned64 ofs = ValueFPR (fs, fmt);
3571 unsigned64 oft = ValueFPR (ft, fmt);
3572 if (NaN (ofs, fmt) || NaN (oft, fmt))
3574 if (FCSR & FP_ENABLE (IO))
3576 FCSR |= FP_CAUSE (IO);
3577 SignalExceptionFPE ();
3585 less = Less (ofs, oft, fmt);
3586 equal = Equal (ofs, oft, fmt);
3589 condition = (((cond & (1 << 2)) && less)
3590 || ((cond & (1 << 1)) && equal)
3591 || ((cond & (1 << 0)) && unordered));
3592 SETFCC (cc, condition);
3596 010001,10,3.FMT,5.FT,5.FS,3.0,00,11,4.COND:COP1:32::C.cond.fmt
3597 *mipsI,mipsII,mipsIII:
3598 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":
3600 do_c_cond_fmt (SD_, FMT, FT, FS, 0, COND, instruction_0);
3603 010001,10,3.FMT,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32::C.cond.fmt
3604 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
3605 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
3608 // start-sanitize-vr5400
3610 // end-sanitize-vr5400
3612 // start-sanitize-tx19
3614 // end-sanitize-tx19
3616 do_c_cond_fmt (SD_, FMT, FT, FS, CC, COND, instruction_0);
3620 010001,10,3.FMT,00000,5.FS,5.FD,001010:COP1:64::CEIL.L.fmt
3621 "ceil.l.%s<FMT> f<FD>, f<FS>"
3625 // start-sanitize-vr5400
3627 // end-sanitize-vr5400
3628 // start-sanitize-r5900
3630 // end-sanitize-r5900
3632 // start-sanitize-tx19
3634 // end-sanitize-tx19
3636 unsigned32 instruction = instruction_0;
3637 int destreg = ((instruction >> 6) & 0x0000001F);
3638 int fs = ((instruction >> 11) & 0x0000001F);
3639 int format = ((instruction >> 21) & 0x00000007);
3641 if ((format != fmt_single) && (format != fmt_double))
3642 SignalException(ReservedInstruction,instruction);
3644 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_long));
3649 010001,10,3.FMT,00000,5.FS,5.FD,001110:COP1:32::CEIL.W
3654 // start-sanitize-vr5400
3656 // end-sanitize-vr5400
3657 // start-sanitize-r5900
3659 // end-sanitize-r5900
3661 // start-sanitize-tx19
3663 // end-sanitize-tx19
3665 unsigned32 instruction = instruction_0;
3666 int destreg = ((instruction >> 6) & 0x0000001F);
3667 int fs = ((instruction >> 11) & 0x0000001F);
3668 int format = ((instruction >> 21) & 0x00000007);
3670 if ((format != fmt_single) && (format != fmt_double))
3671 SignalException(ReservedInstruction,instruction);
3673 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_word));
3680 010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
3681 "c%s<X>c1 r<RT>, f<FS>"
3689 PENDING_FILL((FS + FCR0IDX),VL4_8(GPR[RT]));
3691 PENDING_FILL((FS + FCR31IDX),VL4_8(GPR[RT]));
3693 PENDING_FILL(COCIDX,0); /* special case */
3696 { /* control from */
3698 PENDING_FILL(RT,SIGNEXTEND(FCR0,32));
3700 PENDING_FILL(RT,SIGNEXTEND(FCR31,32));
3704 010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
3705 "c%s<X>c1 r<RT>, f<FS>"
3708 // start-sanitize-vr5400
3710 // end-sanitize-vr5400
3711 // start-sanitize-r5900
3713 // end-sanitize-r5900
3715 // start-sanitize-tx19
3717 // end-sanitize-tx19
3722 TRACE_ALU_INPUT1 (GPR[RT]);
3725 FCR0 = VL4_8(GPR[RT]);
3726 TRACE_ALU_RESULT (FCR0);
3730 FCR31 = VL4_8(GPR[RT]);
3731 SETFCC(0,((FCR31 & (1 << 23)) ? 1 : 0));
3732 TRACE_ALU_RESULT (FCR31);
3736 TRACE_ALU_RESULT0 ();
3741 { /* control from */
3744 TRACE_ALU_INPUT1 (FCR0);
3745 GPR[RT] = SIGNEXTEND (FCR0, 32);
3749 TRACE_ALU_INPUT1 (FCR31);
3750 GPR[RT] = SIGNEXTEND (FCR31, 32);
3752 TRACE_ALU_RESULT (GPR[RT]);
3759 // FIXME: Does not correctly differentiate between mips*
3761 010001,10,3.FMT,00000,5.FS,5.FD,100001:COP1:32::CVT.D.fmt
3762 "cvt.d.%s<FMT> f<FD>, f<FS>"
3763 *mipsI,mipsII,mipsIII,mipsIV:
3765 // start-sanitize-vr5400
3767 // end-sanitize-vr5400
3769 // start-sanitize-tx19
3771 // end-sanitize-tx19
3773 unsigned32 instruction = instruction_0;
3774 int destreg = ((instruction >> 6) & 0x0000001F);
3775 int fs = ((instruction >> 11) & 0x0000001F);
3776 int format = ((instruction >> 21) & 0x00000007);
3778 if ((format == fmt_double) | 0)
3779 SignalException(ReservedInstruction,instruction);
3781 StoreFPR(destreg,fmt_double,Convert(GETRM(),ValueFPR(fs,format),format,fmt_double));
3786 010001,10,3.FMT,00000,5.FS,5.FD,100101:COP1:64::CVT.L.fmt
3787 "cvt.l.%s<FMT> f<FD>, f<FS>"
3791 // start-sanitize-vr5400
3793 // end-sanitize-vr5400
3795 // start-sanitize-tx19
3797 // end-sanitize-tx19
3799 unsigned32 instruction = instruction_0;
3800 int destreg = ((instruction >> 6) & 0x0000001F);
3801 int fs = ((instruction >> 11) & 0x0000001F);
3802 int format = ((instruction >> 21) & 0x00000007);
3804 if ((format == fmt_long) | ((format == fmt_long) || (format == fmt_word)))
3805 SignalException(ReservedInstruction,instruction);
3807 StoreFPR(destreg,fmt_long,Convert(GETRM(),ValueFPR(fs,format),format,fmt_long));
3813 // FIXME: Does not correctly differentiate between mips*
3815 010001,10,3.FMT,00000,5.FS,5.FD,100000:COP1:32::CVT.S.fmt
3816 "cvt.s.%s<FMT> f<FD>, f<FS>"
3817 *mipsI,mipsII,mipsIII,mipsIV:
3819 // start-sanitize-vr5400
3821 // end-sanitize-vr5400
3823 // start-sanitize-tx19
3825 // end-sanitize-tx19
3827 unsigned32 instruction = instruction_0;
3828 int destreg = ((instruction >> 6) & 0x0000001F);
3829 int fs = ((instruction >> 11) & 0x0000001F);
3830 int format = ((instruction >> 21) & 0x00000007);
3832 if ((format == fmt_single) | 0)
3833 SignalException(ReservedInstruction,instruction);
3835 StoreFPR(destreg,fmt_single,Convert(GETRM(),ValueFPR(fs,format),format,fmt_single));
3840 010001,10,3.FMT,00000,5.FS,5.FD,100100:COP1:32::CVT.W.fmt
3841 "cvt.w.%s<FMT> f<FD>, f<FS>"
3842 *mipsI,mipsII,mipsIII,mipsIV:
3844 // start-sanitize-vr5400
3846 // end-sanitize-vr5400
3848 // start-sanitize-tx19
3850 // end-sanitize-tx19
3852 unsigned32 instruction = instruction_0;
3853 int destreg = ((instruction >> 6) & 0x0000001F);
3854 int fs = ((instruction >> 11) & 0x0000001F);
3855 int format = ((instruction >> 21) & 0x00000007);
3857 if ((format == fmt_word) | ((format == fmt_long) || (format == fmt_word)))
3858 SignalException(ReservedInstruction,instruction);
3860 StoreFPR(destreg,fmt_word,Convert(GETRM(),ValueFPR(fs,format),format,fmt_word));
3865 010001,10,3.FMT,5.FT,5.FS,5.FD,000011:COP1:32::DIV.fmt
3866 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
3867 *mipsI,mipsII,mipsIII,mipsIV:
3869 // start-sanitize-vr5400
3871 // end-sanitize-vr5400
3873 // start-sanitize-tx19
3875 // end-sanitize-tx19
3877 unsigned32 instruction = instruction_0;
3878 int destreg = ((instruction >> 6) & 0x0000001F);
3879 int fs = ((instruction >> 11) & 0x0000001F);
3880 int ft = ((instruction >> 16) & 0x0000001F);
3881 int format = ((instruction >> 21) & 0x00000007);
3883 if ((format != fmt_single) && (format != fmt_double))
3884 SignalException(ReservedInstruction,instruction);
3886 StoreFPR(destreg,format,Divide(ValueFPR(fs,format),ValueFPR(ft,format),format));
3893 010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
3894 "dm%s<X>c1 r<RT>, f<FS>"
3899 if (SizeFGR() == 64)
3900 PENDING_FILL((FS + FGRIDX),GPR[RT]);
3901 else if ((FS & 0x1) == 0)
3903 PENDING_FILL(((FS + 1) + FGRIDX),VH4_8(GPR[RT]));
3904 PENDING_FILL((FS + FGRIDX),VL4_8(GPR[RT]));
3909 if (SizeFGR() == 64)
3910 PENDING_FILL(RT,FGR[FS]);
3911 else if ((FS & 0x1) == 0)
3912 PENDING_FILL(RT,(SET64HI(FGR[FS+1]) | FGR[FS]));
3914 PENDING_FILL(RT,SET64HI(0xDEADC0DE) | 0xBAD0BAD0);
3917 010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
3918 "dm%s<X>c1 r<RT>, f<FS>"
3921 // start-sanitize-vr5400
3923 // end-sanitize-vr5400
3924 // start-sanitize-r5900
3926 // end-sanitize-r5900
3928 // start-sanitize-tx19
3930 // end-sanitize-tx19
3934 if (SizeFGR() == 64)
3935 StoreFPR (FS, fmt_uninterpreted_64, GPR[RT]);
3936 else if ((FS & 0x1) == 0)
3937 StoreFPR (FS, fmt_uninterpreted_64, SET64HI (FGR[FS+1]) | FGR[FS]);
3941 if (SizeFGR() == 64)
3943 else if ((FS & 0x1) == 0)
3944 GPR[RT] = SET64HI (FGR[FS+1]) | FGR[FS];
3946 GPR[RT] = SET64HI (0xDEADC0DE) | 0xBAD0BAD0;
3951 010001,10,3.FMT,00000,5.FS,5.FD,001011:COP1:64::FLOOR.L.fmt
3952 "floor.l.%s<FMT> f<FD>, f<FS>"
3956 // start-sanitize-vr5400
3958 // end-sanitize-vr5400
3959 // start-sanitize-r5900
3961 // end-sanitize-r5900
3963 // start-sanitize-tx19
3965 // end-sanitize-tx19
3967 unsigned32 instruction = instruction_0;
3968 int destreg = ((instruction >> 6) & 0x0000001F);
3969 int fs = ((instruction >> 11) & 0x0000001F);
3970 int format = ((instruction >> 21) & 0x00000007);
3972 if ((format != fmt_single) && (format != fmt_double))
3973 SignalException(ReservedInstruction,instruction);
3975 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_long));
3980 010001,10,3.FMT,00000,5.FS,5.FD,001111:COP1:32::FLOOR.W.fmt
3981 "floor.w.%s<FMT> f<FD>, f<FS>"
3986 // start-sanitize-vr5400
3988 // end-sanitize-vr5400
3989 // start-sanitize-r5900
3991 // end-sanitize-r5900
3993 // start-sanitize-tx19
3995 // end-sanitize-tx19
3997 unsigned32 instruction = instruction_0;
3998 int destreg = ((instruction >> 6) & 0x0000001F);
3999 int fs = ((instruction >> 11) & 0x0000001F);
4000 int format = ((instruction >> 21) & 0x00000007);
4002 if ((format != fmt_single) && (format != fmt_double))
4003 SignalException(ReservedInstruction,instruction);
4005 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_word));
4010 110101,5.BASE,5.FT,16.OFFSET:COP1:64::LDC1
4011 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
4016 // start-sanitize-vr5400
4018 // end-sanitize-vr5400
4020 // start-sanitize-tx19
4022 // end-sanitize-tx19
4024 address_word vaddr = GPR[BASE] + EXTEND16 (OFFSET);
4027 if ((vaddr & 7) != 0)
4028 SignalExceptionAddressLoad();
4032 AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL);
4033 LoadMemory(&memval,0,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4034 COP_LD(((instruction_0 >> 26) & 0x3),FT,memval);;
4039 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64::LDXC1
4040 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
4043 // start-sanitize-vr5400
4045 // end-sanitize-vr5400
4047 unsigned32 instruction = instruction_0;
4048 int destreg = ((instruction >> 6) & 0x0000001F);
4049 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4050 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4052 address_word vaddr = ((unsigned64)op1 + op2);
4055 if ((vaddr & 7) != 0)
4056 SignalExceptionAddressLoad();
4059 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4061 unsigned64 memval = 0;
4062 unsigned64 memval1 = 0;
4063 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4064 COP_LD(1,destreg,memval);;
4072 110001,5.BASE,5.FT,16.OFFSET:COP1:32::LWC1
4073 "lwc1 f<FT>, <OFFSET>(r<BASE>)"
4074 *mipsI,mipsII,mipsIII,mipsIV:
4076 // start-sanitize-vr5400
4078 // end-sanitize-vr5400
4079 // start-sanitize-r5900
4081 // end-sanitize-r5900
4083 // start-sanitize-tx19
4085 // end-sanitize-tx19
4087 unsigned32 instruction = instruction_0;
4088 signed_word offset = EXTEND16 (OFFSET);
4089 int destreg UNUSED = ((instruction >> 16) & 0x0000001F);
4090 signed_word op1 UNUSED = GPR[((instruction >> 21) & 0x0000001F)];
4092 address_word vaddr = ((uword64)op1 + offset);
4095 if ((vaddr & 3) != 0)
4096 SignalExceptionAddressLoad();
4099 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4102 uword64 memval1 = 0;
4104 unsigned int shift = 2;
4105 unsigned int reverse UNUSED = (ReverseEndian ? (mask >> shift) : 0);
4106 unsigned int bigend UNUSED = (BigEndianCPU ? (mask >> shift) : 0);
4107 unsigned int byte UNUSED;
4108 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4109 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4110 byte = ((vaddr & mask) ^ (bigend << shift));
4111 COP_LW(((instruction >> 26) & 0x3),destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
4118 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32::LWXC1
4119 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
4122 // start-sanitize-vr5400
4124 // end-sanitize-vr5400
4126 unsigned32 instruction = instruction_0;
4127 int destreg = ((instruction >> 6) & 0x0000001F);
4128 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4129 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4131 address_word vaddr = ((unsigned64)op1 + op2);
4134 if ((vaddr & 3) != 0)
4135 SignalExceptionAddressLoad();
4138 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4140 unsigned64 memval = 0;
4141 unsigned64 memval1 = 0;
4142 unsigned64 mask = 0x7;
4143 unsigned int shift = 2;
4144 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4145 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4147 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4148 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4149 byte = ((vaddr & mask) ^ (bigend << shift));
4150 COP_LW(1,destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
4159 // FIXME: Not correct for mips*
4161 010011,5.FR,5.FT,5.FS,5.FD,100,001:COP1X:32,f::MADD.D
4162 "madd.d f<FD>, f<FR>, f<FS>, f<FT>"
4165 // start-sanitize-vr5400
4167 // end-sanitize-vr5400
4169 unsigned32 instruction = instruction_0;
4170 int destreg = ((instruction >> 6) & 0x0000001F);
4171 int fs = ((instruction >> 11) & 0x0000001F);
4172 int ft = ((instruction >> 16) & 0x0000001F);
4173 int fr = ((instruction >> 21) & 0x0000001F);
4175 StoreFPR(destreg,fmt_double,Add(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4180 010011,5.FR,5.FT,5.FS,5.FD,100,000:COP1X:32,f::MADD.S
4181 "madd.s f<FD>, f<FR>, f<FS>, f<FT>"
4184 // start-sanitize-vr5400
4186 // end-sanitize-vr5400
4188 unsigned32 instruction = instruction_0;
4189 int destreg = ((instruction >> 6) & 0x0000001F);
4190 int fs = ((instruction >> 11) & 0x0000001F);
4191 int ft = ((instruction >> 16) & 0x0000001F);
4192 int fr = ((instruction >> 21) & 0x0000001F);
4194 StoreFPR(destreg,fmt_single,Add(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4201 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4202 "m%s<X>c1 r<RT>, f<FS>"
4209 if (SizeFGR() == 64)
4210 PENDING_FILL ((FS + FGRIDX), (SET64HI(0xDEADC0DE) | VL4_8(GPR[RT])));
4212 PENDING_FILL ((FS + FGRIDX), VL4_8(GPR[RT]));
4215 PENDING_FILL (RT, SIGNEXTEND(FGR[FS],32));
4217 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4218 "m%s<X>c1 r<RT>, f<FS>"
4221 // start-sanitize-vr5400
4223 // end-sanitize-vr5400
4225 // start-sanitize-tx19
4227 // end-sanitize-tx19
4231 StoreFPR (FS, fmt_uninterpreted_32, VL4_8 (GPR[RT]));
4233 GPR[RT] = SIGNEXTEND(FGR[FS],32);
4237 010001,10,3.FMT,00000,5.FS,5.FD,000110:COP1:32::MOV.fmt
4238 "mov.%s<FMT> f<FD>, f<FS>"
4239 *mipsI,mipsII,mipsIII,mipsIV:
4241 // start-sanitize-vr5400
4243 // end-sanitize-vr5400
4245 // start-sanitize-tx19
4247 // end-sanitize-tx19
4249 unsigned32 instruction = instruction_0;
4250 int destreg = ((instruction >> 6) & 0x0000001F);
4251 int fs = ((instruction >> 11) & 0x0000001F);
4252 int format = ((instruction >> 21) & 0x00000007);
4254 StoreFPR(destreg,format,ValueFPR(fs,format));
4260 000000,5.RS,3.CC,0,1.TF,5.RD,00000000001:SPECIAL:32::MOVtf
4261 "mov%s<TF> r<RD>, r<RS>, <CC>"
4264 // start-sanitize-vr5400
4266 // end-sanitize-vr5400
4267 // start-sanitize-r5900
4269 // end-sanitize-r5900
4271 if (GETFCC(CC) == TF)
4277 010001,10,3.FMT,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32::MOVtf.fmt
4278 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
4281 // start-sanitize-vr5400
4283 // end-sanitize-vr5400
4284 // start-sanitize-r5900
4286 // end-sanitize-r5900
4288 unsigned32 instruction = instruction_0;
4289 int format = ((instruction >> 21) & 0x00000007);
4291 if (GETFCC(CC) == TF)
4292 StoreFPR (FD, format, ValueFPR (FS, format));
4294 StoreFPR (FD, format, ValueFPR (FD, format));
4299 010001,10,3.FMT,5.RT,5.FS,5.FD,010011:COP1:32::MOVN.fmt
4302 // start-sanitize-vr5400
4304 // end-sanitize-vr5400
4305 // start-sanitize-r5900
4307 // end-sanitize-r5900
4309 unsigned32 instruction = instruction_0;
4310 int destreg = ((instruction >> 6) & 0x0000001F);
4311 int fs = ((instruction >> 11) & 0x0000001F);
4312 int format = ((instruction >> 21) & 0x00000007);
4314 StoreFPR(destreg,format,ValueFPR(fs,format));
4322 // MOVT.fmt see MOVtf.fmt
4326 010001,10,3.FMT,5.RT,5.FS,5.FD,010010:COP1:32::MOVZ.fmt
4327 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
4330 // start-sanitize-vr5400
4332 // end-sanitize-vr5400
4333 // start-sanitize-r5900
4335 // end-sanitize-r5900
4337 unsigned32 instruction = instruction_0;
4338 int destreg = ((instruction >> 6) & 0x0000001F);
4339 int fs = ((instruction >> 11) & 0x0000001F);
4340 int format = ((instruction >> 21) & 0x00000007);
4342 StoreFPR(destreg,format,ValueFPR(fs,format));
4348 010011,5.FR,5.FT,5.FS,5.FD,101,001:COP1X:32::MSUB.D
4349 "msub.d f<FD>, f<FR>, f<FS>, f<FT>"
4352 // start-sanitize-vr5400
4354 // end-sanitize-vr5400
4355 // start-sanitize-r5900
4357 // end-sanitize-r5900
4359 unsigned32 instruction = instruction_0;
4360 int destreg = ((instruction >> 6) & 0x0000001F);
4361 int fs = ((instruction >> 11) & 0x0000001F);
4362 int ft = ((instruction >> 16) & 0x0000001F);
4363 int fr = ((instruction >> 21) & 0x0000001F);
4365 StoreFPR(destreg,fmt_double,Sub(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4371 010011,5.FR,5.FT,5.FS,5.FD,101000:COP1X:32::MSUB.S
4372 "msub.s f<FD>, f<FR>, f<FS>, f<FT>"
4375 // start-sanitize-vr5400
4377 // end-sanitize-vr5400
4378 // start-sanitize-r5900
4380 // end-sanitize-r5900
4382 unsigned32 instruction = instruction_0;
4383 int destreg = ((instruction >> 6) & 0x0000001F);
4384 int fs = ((instruction >> 11) & 0x0000001F);
4385 int ft = ((instruction >> 16) & 0x0000001F);
4386 int fr = ((instruction >> 21) & 0x0000001F);
4388 StoreFPR(destreg,fmt_single,Sub(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4396 010001,10,3.FMT,5.FT,5.FS,5.FD,000010:COP1:32::MUL.fmt
4397 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
4398 *mipsI,mipsII,mipsIII,mipsIV:
4400 // start-sanitize-vr5400
4402 // end-sanitize-vr5400
4404 // start-sanitize-tx19
4406 // end-sanitize-tx19
4408 unsigned32 instruction = instruction_0;
4409 int destreg = ((instruction >> 6) & 0x0000001F);
4410 int fs = ((instruction >> 11) & 0x0000001F);
4411 int ft = ((instruction >> 16) & 0x0000001F);
4412 int format = ((instruction >> 21) & 0x00000007);
4414 if ((format != fmt_single) && (format != fmt_double))
4415 SignalException(ReservedInstruction,instruction);
4417 StoreFPR(destreg,format,Multiply(ValueFPR(fs,format),ValueFPR(ft,format),format));
4422 010001,10,3.FMT,00000,5.FS,5.FD,000111:COP1:32::NEG.fmt
4423 "neg.%s<FMT> f<FD>, f<FS>"
4424 *mipsI,mipsII,mipsIII,mipsIV:
4426 // start-sanitize-vr5400
4428 // end-sanitize-vr5400
4430 // start-sanitize-tx19
4432 // end-sanitize-tx19
4434 unsigned32 instruction = instruction_0;
4435 int destreg = ((instruction >> 6) & 0x0000001F);
4436 int fs = ((instruction >> 11) & 0x0000001F);
4437 int format = ((instruction >> 21) & 0x00000007);
4439 if ((format != fmt_single) && (format != fmt_double))
4440 SignalException(ReservedInstruction,instruction);
4442 StoreFPR(destreg,format,Negate(ValueFPR(fs,format),format));
4448 010011,5.FR,5.FT,5.FS,5.FD,110001:COP1X:32::NMADD.D
4449 "nmadd.d f<FD>, f<FR>, f<FS>, f<FT>"
4452 // start-sanitize-vr5400
4454 // end-sanitize-vr5400
4456 unsigned32 instruction = instruction_0;
4457 int destreg = ((instruction >> 6) & 0x0000001F);
4458 int fs = ((instruction >> 11) & 0x0000001F);
4459 int ft = ((instruction >> 16) & 0x0000001F);
4460 int fr = ((instruction >> 21) & 0x0000001F);
4462 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));
4468 010011,5.FR,5.FT,5.FS,5.FD,110000:COP1X:32::NMADD.S
4469 "nmadd.s f<FD>, f<FR>, f<FS>, f<FT>"
4472 // start-sanitize-vr5400
4474 // end-sanitize-vr5400
4476 unsigned32 instruction = instruction_0;
4477 int destreg = ((instruction >> 6) & 0x0000001F);
4478 int fs = ((instruction >> 11) & 0x0000001F);
4479 int ft = ((instruction >> 16) & 0x0000001F);
4480 int fr = ((instruction >> 21) & 0x0000001F);
4482 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));
4488 010011,5.FR,5.FT,5.FS,5.FD,111001:COP1X:32::NMSUB.D
4489 "nmsub.d f<FD>, f<FR>, f<FS>, f<FT>"
4492 // start-sanitize-vr5400
4494 // end-sanitize-vr5400
4496 unsigned32 instruction = instruction_0;
4497 int destreg = ((instruction >> 6) & 0x0000001F);
4498 int fs = ((instruction >> 11) & 0x0000001F);
4499 int ft = ((instruction >> 16) & 0x0000001F);
4500 int fr = ((instruction >> 21) & 0x0000001F);
4502 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));
4508 010011,5.FR,5.FT,5.FS,5.FD,111000:COP1X:32::NMSUB.S
4509 "nmsub.s f<FD>, f<FR>, f<FS>, f<FT>"
4512 // start-sanitize-vr5400
4514 // end-sanitize-vr5400
4516 unsigned32 instruction = instruction_0;
4517 int destreg = ((instruction >> 6) & 0x0000001F);
4518 int fs = ((instruction >> 11) & 0x0000001F);
4519 int ft = ((instruction >> 16) & 0x0000001F);
4520 int fr = ((instruction >> 21) & 0x0000001F);
4522 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));
4527 010011,5.BASE,5.INDEX,5.HINT,00000001111:COP1X:32::PREFX
4528 "prefx <HINT>, r<INDEX>(r<BASE>)"
4531 // start-sanitize-vr5400
4533 // end-sanitize-vr5400
4535 unsigned32 instruction = instruction_0;
4536 int fs = ((instruction >> 11) & 0x0000001F);
4537 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4538 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4540 address_word vaddr = ((unsigned64)op1 + (unsigned64)op2);
4543 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4544 Prefetch(uncached,paddr,vaddr,isDATA,fs);
4548 010001,10,3.FMT,00000,5.FS,5.FD,010101:COP1:32::RECIP.fmt
4550 "recip.%s<FMT> f<FD>, f<FS>"
4552 // start-sanitize-vr5400
4554 // end-sanitize-vr5400
4556 unsigned32 instruction = instruction_0;
4557 int destreg = ((instruction >> 6) & 0x0000001F);
4558 int fs = ((instruction >> 11) & 0x0000001F);
4559 int format = ((instruction >> 21) & 0x00000007);
4561 if ((format != fmt_single) && (format != fmt_double))
4562 SignalException(ReservedInstruction,instruction);
4564 StoreFPR(destreg,format,Recip(ValueFPR(fs,format),format));
4569 010001,10,3.FMT,00000,5.FS,5.FD,001000:COP1:64::ROUND.L.fmt
4570 "round.l.%s<FMT> f<FD>, f<FS>"
4574 // start-sanitize-vr5400
4576 // end-sanitize-vr5400
4577 // start-sanitize-r5900
4579 // end-sanitize-r5900
4581 // start-sanitize-tx19
4583 // end-sanitize-tx19
4585 unsigned32 instruction = instruction_0;
4586 int destreg = ((instruction >> 6) & 0x0000001F);
4587 int fs = ((instruction >> 11) & 0x0000001F);
4588 int format = ((instruction >> 21) & 0x00000007);
4590 if ((format != fmt_single) && (format != fmt_double))
4591 SignalException(ReservedInstruction,instruction);
4593 StoreFPR(destreg,fmt_long,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_long));
4598 010001,10,3.FMT,00000,5.FS,5.FD,001100:COP1:32::ROUND.W.fmt
4599 "round.w.%s<FMT> f<FD>, f<FS>"
4604 // start-sanitize-vr5400
4606 // end-sanitize-vr5400
4607 // start-sanitize-r5900
4609 // end-sanitize-r5900
4611 // start-sanitize-tx19
4613 // end-sanitize-tx19
4615 unsigned32 instruction = instruction_0;
4616 int destreg = ((instruction >> 6) & 0x0000001F);
4617 int fs = ((instruction >> 11) & 0x0000001F);
4618 int format = ((instruction >> 21) & 0x00000007);
4620 if ((format != fmt_single) && (format != fmt_double))
4621 SignalException(ReservedInstruction,instruction);
4623 StoreFPR(destreg,fmt_word,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_word));
4628 010001,10,3.FMT,00000,5.FS,5.FD,010110:COP1:32::RSQRT.fmt
4630 "rsqrt.%s<FMT> f<FD>, f<FS>"
4632 // start-sanitize-vr5400
4634 // end-sanitize-vr5400
4636 unsigned32 instruction = instruction_0;
4637 int destreg = ((instruction >> 6) & 0x0000001F);
4638 int fs = ((instruction >> 11) & 0x0000001F);
4639 int format = ((instruction >> 21) & 0x00000007);
4641 if ((format != fmt_single) && (format != fmt_double))
4642 SignalException(ReservedInstruction,instruction);
4644 StoreFPR(destreg,format,Recip(SquareRoot(ValueFPR(fs,format),format),format));
4649 111101,5.BASE,5.FT,16.OFFSET:COP1:64::SDC1
4650 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
4655 // start-sanitize-vr5400
4657 // end-sanitize-vr5400
4659 // start-sanitize-tx19
4661 // end-sanitize-tx19
4663 address_word vaddr = GPR[BASE] + EXTEND16 (OFFSET);
4665 if ((vaddr & 7) != 0)
4666 SignalExceptionAddressStore();
4671 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
4672 memval = (unsigned64) COP_SD(((instruction_0 >> 26) & 0x3),FT);
4673 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,0,paddr,vaddr,isREAL);
4679 010011,5.RS,5.RT,vvvvv,00000001001:COP1X:64::SDXC1
4682 // start-sanitize-vr5400
4684 // end-sanitize-vr5400
4686 unsigned32 instruction = instruction_0;
4687 int fs = ((instruction >> 11) & 0x0000001F);
4688 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4689 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4691 address_word vaddr = ((unsigned64)op1 + op2);
4694 if ((vaddr & 7) != 0)
4695 SignalExceptionAddressStore();
4698 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
4700 unsigned64 memval = 0;
4701 unsigned64 memval1 = 0;
4702 memval = (unsigned64)COP_SD(1,fs);
4704 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
4712 010001,10,3.FMT,00000,5.FS,5.FD,000100:COP1:32::SQRT.fmt
4713 "sqrt.%s<FMT> f<FD>, f<FS>"
4718 // start-sanitize-vr5400
4720 // end-sanitize-vr5400
4722 // start-sanitize-tx19
4724 // end-sanitize-tx19
4726 unsigned32 instruction = instruction_0;
4727 int destreg = ((instruction >> 6) & 0x0000001F);
4728 int fs = ((instruction >> 11) & 0x0000001F);
4729 int format = ((instruction >> 21) & 0x00000007);
4731 if ((format != fmt_single) && (format != fmt_double))
4732 SignalException(ReservedInstruction,instruction);
4734 StoreFPR(destreg,format,(SquareRoot(ValueFPR(fs,format),format)));
4739 010001,10,3.FMT,5.FT,5.FS,5.FD,000001:COP1:32::SUB.fmt
4740 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
4741 *mipsI,mipsII,mipsIII,mipsIV:
4743 // start-sanitize-vr5400
4745 // end-sanitize-vr5400
4747 // start-sanitize-tx19
4749 // end-sanitize-tx19
4751 unsigned32 instruction = instruction_0;
4752 int destreg = ((instruction >> 6) & 0x0000001F);
4753 int fs = ((instruction >> 11) & 0x0000001F);
4754 int ft = ((instruction >> 16) & 0x0000001F);
4755 int format = ((instruction >> 21) & 0x00000007);
4757 if ((format != fmt_single) && (format != fmt_double))
4758 SignalException(ReservedInstruction,instruction);
4760 StoreFPR(destreg,format,Sub(ValueFPR(fs,format),ValueFPR(ft,format),format));
4766 111001,5.BASE,5.FT,16.OFFSET:COP1:32::SWC1
4767 "swc1 f<FT>, <OFFSET>(r<BASE>)"
4768 *mipsI,mipsII,mipsIII,mipsIV:
4770 // start-sanitize-vr5400
4772 // end-sanitize-vr5400
4773 // start-sanitize-r5900
4775 // end-sanitize-r5900
4777 // start-sanitize-tx19
4779 // end-sanitize-tx19
4781 unsigned32 instruction = instruction_0;
4782 signed_word offset = EXTEND16 (OFFSET);
4783 int destreg UNUSED = ((instruction >> 16) & 0x0000001F);
4784 signed_word op1 UNUSED = GPR[((instruction >> 21) & 0x0000001F)];
4786 address_word vaddr = ((uword64)op1 + offset);
4789 if ((vaddr & 3) != 0)
4790 SignalExceptionAddressStore();
4793 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
4796 uword64 memval1 = 0;
4799 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
4800 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
4801 memval = (((uword64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
4803 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
4811 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32::SWXC1
4812 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
4815 // start-sanitize-vr5400
4817 // end-sanitize-vr5400
4819 unsigned32 instruction = instruction_0;
4820 int fs = ((instruction >> 11) & 0x0000001F);
4821 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4822 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4824 address_word vaddr = ((unsigned64)op1 + op2);
4827 if ((vaddr & 3) != 0)
4828 SignalExceptionAddressStore();
4831 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
4833 unsigned64 memval = 0;
4834 unsigned64 memval1 = 0;
4835 unsigned64 mask = 0x7;
4837 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
4838 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
4839 memval = (((unsigned64)COP_SW(1,fs)) << (8 * byte));
4841 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
4849 010001,10,3.FMT,00000,5.FS,5.FD,001001:COP1:64::TRUNC.L.fmt
4850 "trunc.l.%s<FMT> f<FD>, f<FS>"
4854 // start-sanitize-vr5400
4856 // end-sanitize-vr5400
4857 // start-sanitize-r5900
4859 // end-sanitize-r5900
4861 // start-sanitize-tx19
4863 // end-sanitize-tx19
4865 unsigned32 instruction = instruction_0;
4866 int destreg = ((instruction >> 6) & 0x0000001F);
4867 int fs = ((instruction >> 11) & 0x0000001F);
4868 int format = ((instruction >> 21) & 0x00000007);
4870 if ((format != fmt_single) && (format != fmt_double))
4871 SignalException(ReservedInstruction,instruction);
4873 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_long));
4878 010001,10,3.FMT,00000,5.FS,5.FD,001101:COP1:32::TRUNC.W
4879 "trunc.w.%s<FMT> f<FD>, f<FS>"
4884 // start-sanitize-vr5400
4886 // end-sanitize-vr5400
4887 // start-sanitize-r5900
4889 // end-sanitize-r5900
4891 // start-sanitize-tx19
4893 // end-sanitize-tx19
4895 unsigned32 instruction = instruction_0;
4896 int destreg = ((instruction >> 6) & 0x0000001F);
4897 int fs = ((instruction >> 11) & 0x0000001F);
4898 int format = ((instruction >> 21) & 0x00000007);
4900 if ((format != fmt_single) && (format != fmt_double))
4901 SignalException(ReservedInstruction,instruction);
4903 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_word));
4909 // MIPS Architecture:
4911 // System Control Instruction Set (COP0)
4915 010000,01000,00000,16.OFFSET:COP0:32::BC0F
4917 *mipsI,mipsII,mipsIII,mipsIV:
4919 // start-sanitize-vr5400
4921 // end-sanitize-vr5400
4922 // start-sanitize-r5900
4924 // end-sanitize-r5900
4927 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
4929 *mipsI,mipsII,mipsIII,mipsIV:
4931 // start-sanitize-vr5400
4933 // end-sanitize-vr5400
4934 // start-sanitize-r5900
4936 // end-sanitize-r5900
4939 010000,01000,00001,16.OFFSET:COP0:32::BC0T
4941 *mipsI,mipsII,mipsIII,mipsIV:
4942 // start-sanitize-r5900
4944 // end-sanitize-r5900
4948 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
4950 *mipsI,mipsII,mipsIII,mipsIV:
4952 // start-sanitize-vr5400
4954 // end-sanitize-vr5400
4955 // start-sanitize-r5900
4957 // end-sanitize-r5900
4960 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
4964 // start-sanitize-vr5400
4966 // end-sanitize-vr5400
4967 // start-sanitize-r5900
4969 // end-sanitize-r5900
4971 // start-sanitize-tx19
4973 // end-sanitize-tx19
4975 unsigned32 instruction = instruction_0;
4976 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
4977 int hint = ((instruction >> 16) & 0x0000001F);
4978 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4980 address_word vaddr = (op1 + offset);
4983 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4984 CacheOp(hint,vaddr,paddr,instruction);
4989 010000,10000,000000000000000,111001:COP0:32::DI
4991 *mipsI,mipsII,mipsIII,mipsIV:
4993 // start-sanitize-vr5400
4995 // end-sanitize-vr5400
4996 // start-sanitize-r5900
4998 // end-sanitize-r5900
5001 010000,10000,000000000000000,111000:COP0:32::EI
5003 *mipsI,mipsII,mipsIII,mipsIV:
5005 // start-sanitize-vr5400
5007 // end-sanitize-vr5400
5008 // start-sanitize-r5900
5010 // end-sanitize-r5900
5013 010000,10000,000000000000000,011000:COP0:32::ERET
5018 // start-sanitize-vr5400
5020 // end-sanitize-vr5400
5021 // start-sanitize-r5900
5023 // end-sanitize-r5900
5026 010000,00000,5.RT,5.RD,00000,6.REGX:COP0:32::MFC0
5027 "mfc0 r<RT>, r<RD> # <REGX>"
5028 *mipsI,mipsII,mipsIII,mipsIV:
5030 // start-sanitize-vr5400
5032 // end-sanitize-vr5400
5033 // start-sanitize-r5900
5035 // end-sanitize-r5900
5037 DecodeCoproc (instruction_0);
5040 010000,00100,5.RT,5.RD,00000,6.REGX:COP0:32::MTC0
5041 "mtc0 r<RT>, r<RD> # <REGX>"
5042 *mipsI,mipsII,mipsIII,mipsIV:
5044 // start-sanitize-vr5400
5046 // end-sanitize-vr5400
5047 // start-sanitize-r5900
5049 // end-sanitize-r5900
5051 DecodeCoproc (instruction_0);
5055 010000,10000,000000000000000,001000:COP0:32::TLBP
5057 *mipsI,mipsII,mipsIII,mipsIV:
5059 // start-sanitize-vr5400
5061 // end-sanitize-vr5400
5062 // start-sanitize-r5900
5064 // end-sanitize-r5900
5067 010000,10000,000000000000000,000001:COP0:32::TLBR
5069 *mipsI,mipsII,mipsIII,mipsIV:
5071 // start-sanitize-vr5400
5073 // end-sanitize-vr5400
5074 // start-sanitize-r5900
5076 // end-sanitize-r5900
5079 010000,10000,000000000000000,000010:COP0:32::TLBWI
5081 *mipsI,mipsII,mipsIII,mipsIV:
5083 // start-sanitize-vr5400
5085 // end-sanitize-vr5400
5086 // start-sanitize-r5900
5088 // end-sanitize-r5900
5091 010000,10000,000000000000000,000110:COP0:32::TLBWR
5093 *mipsI,mipsII,mipsIII,mipsIV:
5095 // start-sanitize-vr5400
5097 // end-sanitize-vr5400
5098 // start-sanitize-r5900
5100 // end-sanitize-r5900
5103 :include:16::m16.igen
5104 // start-sanitize-vr5400
5105 :include::vr5400:vr5400.igen
5106 :include:64,f::mdmx.igen
5107 // end-sanitize-vr5400
5108 // start-sanitize-r5900
5109 :include::r5900:r5900.igen
5110 // end-sanitize-r5900
5112 // start-sanitize-cygnus-never
5114 // // FIXME FIXME FIXME What is this instruction?
5115 // 111011,5.RS,5.RT,16.OFFSET:NORMAL:32::<INT>
5120 // // start-sanitize-r5900
5122 // // end-sanitize-r5900
5124 // // start-sanitize-tx19
5126 // // end-sanitize-tx19
5128 // unsigned32 instruction = instruction_0;
5129 // signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
5130 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5131 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5133 // if (CoProcPresent(3))
5134 // SignalException(CoProcessorUnusable);
5136 // SignalException(ReservedInstruction,instruction);
5140 // end-sanitize-cygnus-never
5141 // start-sanitize-cygnus-never
5143 // // FIXME FIXME FIXME What is this?
5144 // 11100,******,00001:RR:16::SDBBP
5147 // unsigned32 instruction = instruction_0;
5148 // if (have_extendval)
5149 // SignalException (ReservedInstruction, instruction);
5151 // SignalException(DebugBreakPoint,instruction);
5155 // end-sanitize-cygnus-never
5156 // start-sanitize-cygnus-never
5158 // // FIXME FIXME FIXME What is this?
5159 // 000000,********************,001110:SPECIAL:32::SDBBP
5162 // unsigned32 instruction = instruction_0;
5164 // SignalException(DebugBreakPoint,instruction);
5168 // end-sanitize-cygnus-never
5169 // start-sanitize-cygnus-never
5171 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5172 // // isn't yet reconized by this simulator.
5173 // 000000,5.RS,5.RT,0000000000101000:SPECIAL:32::MADD16
5176 // unsigned32 instruction = instruction_0;
5177 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5178 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5180 // CHECKHILO("Multiply-Add");
5182 // unsigned64 temp = (op1 * op2);
5183 // temp += (SET64HI(VL4_8(HI)) | VL4_8(LO));
5184 // LO = SIGNEXTEND((unsigned64)VL4_8(temp),32);
5185 // HI = SIGNEXTEND((unsigned64)VH4_8(temp),32);
5190 // end-sanitize-cygnus-never
5191 // start-sanitize-cygnus-never
5193 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5194 // // isn't yet reconized by this simulator.
5195 // 000000,5.RS,5.RT,0000000000101001:SPECIAL:64::DMADD16
5198 // unsigned32 instruction = instruction_0;
5199 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5200 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5202 // CHECKHILO("Multiply-Add");
5204 // unsigned64 temp = (op1 * op2);
5210 // end-sanitize-cygnus-never