4 // <insn-word> { "+" <insn-word> }
11 // { <insn-mnemonic> }
16 // IGEN config - mips16
17 // :option:16::insn-bit-size:16
18 // :option:16::hi-bit-nr:15
19 :option:16::insn-specifying-widths:true
20 :option:16::gen-delayed-branch:false
22 // IGEN config - mips32/64..
23 // :option:32::insn-bit-size:32
24 // :option:32::hi-bit-nr:31
25 :option:32::insn-specifying-widths:true
26 :option:32::gen-delayed-branch:false
29 // Generate separate simulators for each target
30 // :option:::multi-sim:true
33 // Models known by this simulator
34 :model:::mipsI:mips3000:
35 :model:::mipsII:mips6000:
36 :model:::mipsIII:mips4000:
37 :model:::mipsIV:mips8000:
38 :model:::mips16:mips16:
39 // start-sanitize-r5900
40 :model:::r5900:mips5900:
42 :model:::r3900:mips3900:
43 // start-sanitize-tx19
46 // start-sanitize-vr4320
47 :model:::vr4320:mips4320:
48 // end-sanitize-vr4320
49 // start-sanitize-vr5400
50 :model:::vr5400:mips5400:
52 // end-sanitize-vr5400
53 :model:::vr5000:mips5000:
57 // Pseudo instructions known by IGEN
60 SignalException (ReservedInstruction, 0);
64 // Pseudo instructions known by interp.c
65 // For grep - RSVD_INSTRUCTION, RSVD_INSTRUCTION_MASK
66 000000,5.*,5.*,5.*,5.OP,000101:SPECIAL:32::RSVD
69 SignalException (ReservedInstruction, instruction_0);
77 // CPU Instruction Set (mipsI - mipsIV)
81 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD
82 "add r<RD>, r<RS>, r<RT>"
83 *mipsI,mipsII,mipsIII,mipsIV:
85 // start-sanitize-vr4320
87 // end-sanitize-vr4320
88 // start-sanitize-vr5400
90 // end-sanitize-vr5400
91 // start-sanitize-r5900
95 // start-sanitize-tx19
99 ALU32_BEGIN (GPR[RS]);
105 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI
106 "addi r<RT>, r<RS>, IMMEDIATE"
107 *mipsI,mipsII,mipsIII,mipsIV:
109 // start-sanitize-vr4320
111 // end-sanitize-vr4320
112 // start-sanitize-vr5400
114 // end-sanitize-vr5400
115 // start-sanitize-r5900
117 // end-sanitize-r5900
119 // start-sanitize-tx19
123 ALU32_BEGIN (GPR[RS]);
124 ALU32_ADD (EXTEND16 (IMMEDIATE));
129 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU
130 "add r<RT>, r<RS>, <IMMEDIATE>"
131 *mipsI,mipsII,mipsIII,mipsIV:
133 // start-sanitize-vr4320
135 // end-sanitize-vr4320
136 // start-sanitize-vr5400
138 // end-sanitize-vr5400
139 // start-sanitize-r5900
141 // end-sanitize-r5900
143 // start-sanitize-tx19
147 signed32 temp = GPR[RS] + EXTEND16 (IMMEDIATE);
148 GPR[RT] = EXTEND32 (temp);
152 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU
153 *mipsI,mipsII,mipsIII,mipsIV:
155 // start-sanitize-vr4320
157 // end-sanitize-vr4320
158 // start-sanitize-vr5400
160 // end-sanitize-vr5400
161 // start-sanitize-r5900
163 // end-sanitize-r5900
165 // start-sanitize-tx19
169 signed32 temp = GPR[RS] + GPR[RT];
170 GPR[RD] = EXTEND32 (temp);
174 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND
175 "and r<RD>, r<RS>, r<RT>"
176 *mipsI,mipsII,mipsIII,mipsIV:
178 // start-sanitize-vr4320
180 // end-sanitize-vr4320
181 // start-sanitize-vr5400
183 // end-sanitize-vr5400
184 // start-sanitize-r5900
186 // end-sanitize-r5900
188 // start-sanitize-tx19
192 GPR[RD] = GPR[RS] & GPR[RT];
196 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI
197 "and r<RT>, r<RS>, <IMMEDIATE>"
198 *mipsI,mipsII,mipsIII,mipsIV:
200 // start-sanitize-vr4320
202 // end-sanitize-vr4320
203 // start-sanitize-vr5400
205 // end-sanitize-vr5400
206 // start-sanitize-r5900
208 // end-sanitize-r5900
210 // start-sanitize-tx19
214 GPR[RT] = GPR[RS] & IMMEDIATE;
218 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ
219 "beq r<RS>, r<RT>, <OFFSET>"
220 *mipsI,mipsII,mipsIII,mipsIV:
222 // start-sanitize-vr4320
224 // end-sanitize-vr4320
225 // start-sanitize-vr5400
227 // end-sanitize-vr5400
228 // start-sanitize-r5900
230 // end-sanitize-r5900
232 // start-sanitize-tx19
236 address_word offset = EXTEND16 (OFFSET) << 2;
237 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
238 DELAY_SLOT (NIA + offset);
242 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL
243 "beql r<RS>, r<RT>, <OFFSET>"
248 // start-sanitize-vr4320
250 // end-sanitize-vr4320
251 // start-sanitize-vr5400
253 // end-sanitize-vr5400
254 // start-sanitize-r5900
256 // end-sanitize-r5900
258 // start-sanitize-tx19
262 address_word offset = EXTEND16 (OFFSET) << 2;
263 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
264 DELAY_SLOT (NIA + offset);
266 NULLIFY_NEXT_INSTRUCTION ();
270 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ
271 "bgez r<RS>, <OFFSET>"
272 *mipsI,mipsII,mipsIII,mipsIV:
274 // start-sanitize-vr4320
276 // end-sanitize-vr4320
277 // start-sanitize-vr5400
279 // end-sanitize-vr5400
280 // start-sanitize-r5900
282 // end-sanitize-r5900
284 // start-sanitize-tx19
288 address_word offset = EXTEND16 (OFFSET) << 2;
289 if ((signed_word) GPR[RS] >= 0)
290 DELAY_SLOT (NIA + offset);
294 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL
295 "bgezal r<RS>, <OFFSET>"
296 *mipsI,mipsII,mipsIII,mipsIV:
298 // start-sanitize-vr4320
300 // end-sanitize-vr4320
301 // start-sanitize-vr5400
303 // end-sanitize-vr5400
304 // start-sanitize-r5900
306 // end-sanitize-r5900
308 // start-sanitize-tx19
312 address_word offset = EXTEND16 (OFFSET) << 2;
314 if ((signed_word) GPR[RS] >= 0)
315 DELAY_SLOT (NIA + offset);
319 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL
320 "bgezall r<RS>, <OFFSET>"
325 // start-sanitize-vr4320
327 // end-sanitize-vr4320
328 // start-sanitize-vr5400
330 // end-sanitize-vr5400
331 // start-sanitize-r5900
333 // end-sanitize-r5900
335 // start-sanitize-tx19
339 address_word offset = EXTEND16 (OFFSET) << 2;
341 /* NOTE: The branch occurs AFTER the next instruction has been
343 if ((signed_word) GPR[RS] >= 0)
344 DELAY_SLOT (NIA + offset);
346 NULLIFY_NEXT_INSTRUCTION ();
350 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL
351 "bgezl r<RS>, <OFFSET>"
356 // start-sanitize-vr4320
358 // end-sanitize-vr4320
359 // start-sanitize-vr5400
361 // end-sanitize-vr5400
362 // start-sanitize-r5900
364 // end-sanitize-r5900
366 // start-sanitize-tx19
370 address_word offset = EXTEND16 (OFFSET) << 2;
371 if ((signed_word) GPR[RS] >= 0)
372 DELAY_SLOT (NIA + offset);
374 NULLIFY_NEXT_INSTRUCTION ();
378 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ
379 "bgtz r<RS>, <OFFSET>"
380 *mipsI,mipsII,mipsIII,mipsIV:
382 // start-sanitize-vr4320
384 // end-sanitize-vr4320
385 // start-sanitize-vr5400
387 // end-sanitize-vr5400
388 // start-sanitize-r5900
390 // end-sanitize-r5900
392 // start-sanitize-tx19
396 address_word offset = EXTEND16 (OFFSET) << 2;
397 if ((signed_word) GPR[RS] > 0)
398 DELAY_SLOT (NIA + offset);
402 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL
403 "bgtzl r<RS>, <OFFSET>"
408 // start-sanitize-vr4320
410 // end-sanitize-vr4320
411 // start-sanitize-vr5400
413 // end-sanitize-vr5400
414 // start-sanitize-r5900
416 // end-sanitize-r5900
418 // start-sanitize-tx19
422 address_word offset = EXTEND16 (OFFSET) << 2;
423 /* NOTE: The branch occurs AFTER the next instruction has been
425 if ((signed_word) GPR[RS] > 0)
426 DELAY_SLOT (NIA + offset);
428 NULLIFY_NEXT_INSTRUCTION ();
432 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ
433 "blez r<RS>, <OFFSET>"
434 *mipsI,mipsII,mipsIII,mipsIV:
436 // start-sanitize-vr4320
438 // end-sanitize-vr4320
439 // start-sanitize-vr5400
441 // end-sanitize-vr5400
442 // start-sanitize-r5900
444 // end-sanitize-r5900
446 // start-sanitize-tx19
450 address_word offset = EXTEND16 (OFFSET) << 2;
451 /* NOTE: The branch occurs AFTER the next instruction has been
453 if ((signed_word) GPR[RS] <= 0)
454 DELAY_SLOT (NIA + offset);
458 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL
459 "bgezl r<RS>, <OFFSET>"
464 // start-sanitize-vr4320
466 // end-sanitize-vr4320
467 // start-sanitize-vr5400
469 // end-sanitize-vr5400
470 // start-sanitize-r5900
472 // end-sanitize-r5900
474 // start-sanitize-tx19
478 address_word offset = EXTEND16 (OFFSET) << 2;
479 if ((signed_word) GPR[RS] <= 0)
480 DELAY_SLOT (NIA + offset);
482 NULLIFY_NEXT_INSTRUCTION ();
486 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ
487 "bltz r<RS>, <OFFSET>"
488 *mipsI,mipsII,mipsIII,mipsIV:
490 // start-sanitize-vr4320
492 // end-sanitize-vr4320
493 // start-sanitize-vr5400
495 // end-sanitize-vr5400
496 // start-sanitize-r5900
498 // end-sanitize-r5900
500 // start-sanitize-tx19
504 address_word offset = EXTEND16 (OFFSET) << 2;
505 if ((signed_word) GPR[RS] < 0)
506 DELAY_SLOT (NIA + offset);
510 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL
511 "bltzal r<RS>, <OFFSET>"
512 *mipsI,mipsII,mipsIII,mipsIV:
514 // start-sanitize-vr4320
516 // end-sanitize-vr4320
517 // start-sanitize-vr5400
519 // end-sanitize-vr5400
520 // start-sanitize-r5900
522 // end-sanitize-r5900
524 // start-sanitize-tx19
528 address_word offset = EXTEND16 (OFFSET) << 2;
530 /* NOTE: The branch occurs AFTER the next instruction has been
532 if ((signed_word) GPR[RS] < 0)
533 DELAY_SLOT (NIA + offset);
537 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL
538 "bltzall r<RS>, <OFFSET>"
543 // start-sanitize-vr4320
545 // end-sanitize-vr4320
546 // start-sanitize-vr5400
548 // end-sanitize-vr5400
549 // start-sanitize-r5900
551 // end-sanitize-r5900
553 // start-sanitize-tx19
557 address_word offset = EXTEND16 (OFFSET) << 2;
559 if ((signed_word) GPR[RS] < 0)
560 DELAY_SLOT (NIA + offset);
562 NULLIFY_NEXT_INSTRUCTION ();
566 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL
567 "bltzl r<RS>, <OFFSET>"
572 // start-sanitize-vr4320
574 // end-sanitize-vr4320
575 // start-sanitize-vr5400
577 // end-sanitize-vr5400
578 // start-sanitize-r5900
580 // end-sanitize-r5900
582 // start-sanitize-tx19
586 address_word offset = EXTEND16 (OFFSET) << 2;
587 /* NOTE: The branch occurs AFTER the next instruction has been
589 if ((signed_word) GPR[RS] < 0)
590 DELAY_SLOT (NIA + offset);
592 NULLIFY_NEXT_INSTRUCTION ();
596 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE
597 "bne r<RS>, r<RT>, <OFFSET>"
598 *mipsI,mipsII,mipsIII,mipsIV:
600 // start-sanitize-vr4320
602 // end-sanitize-vr4320
603 // start-sanitize-vr5400
605 // end-sanitize-vr5400
606 // start-sanitize-r5900
608 // end-sanitize-r5900
610 // start-sanitize-tx19
614 address_word offset = EXTEND16 (OFFSET) << 2;
615 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
616 DELAY_SLOT (NIA + offset);
620 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL
621 "bnel r<RS>, r<RT>, <OFFSET>"
626 // start-sanitize-vr4320
628 // end-sanitize-vr4320
629 // start-sanitize-vr5400
631 // end-sanitize-vr5400
632 // start-sanitize-r5900
634 // end-sanitize-r5900
636 // start-sanitize-tx19
640 address_word offset = EXTEND16 (OFFSET) << 2;
641 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
642 DELAY_SLOT (NIA + offset);
644 NULLIFY_NEXT_INSTRUCTION ();
648 000000,20.CODE,001101:SPECIAL:32::BREAK
650 *mipsI,mipsII,mipsIII,mipsIV:
652 // start-sanitize-vr4320
654 // end-sanitize-vr4320
655 // start-sanitize-vr5400
657 // end-sanitize-vr5400
658 // start-sanitize-r5900
660 // end-sanitize-r5900
662 // start-sanitize-tx19
666 SignalException(BreakPoint, instruction_0);
670 0100,ZZ!0!1!3,26.COP_FUN:NORMAL:32::COPz
672 *mipsI,mipsII,mipsIII,mipsIV:
673 // start-sanitize-r5900
675 // end-sanitize-r5900
677 // start-sanitize-tx19
681 DecodeCoproc (instruction_0);
685 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD
686 "dadd r<RD>, r<RS>, r<RT>"
690 // start-sanitize-vr4320
692 // end-sanitize-vr4320
693 // start-sanitize-vr5400
695 // end-sanitize-vr5400
696 // start-sanitize-r5900
698 // end-sanitize-r5900
700 // start-sanitize-tx19
704 /* this check's for overflow */
705 ALU64_BEGIN (GPR[RS]);
711 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI
712 "daddi r<RT>, r<RS>, <IMMEDIATE>"
716 // start-sanitize-vr4320
718 // end-sanitize-vr4320
719 // start-sanitize-vr5400
721 // end-sanitize-vr5400
722 // start-sanitize-r5900
724 // end-sanitize-r5900
726 // start-sanitize-tx19
730 ALU64_BEGIN (GPR[RS]);
731 ALU64_ADD (EXTEND16 (IMMEDIATE));
736 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU
737 "daddu r<RT>, r<RS>, <IMMEDIATE>"
741 // start-sanitize-vr4320
743 // end-sanitize-vr4320
744 // start-sanitize-vr5400
746 // end-sanitize-vr5400
747 // start-sanitize-r5900
749 // end-sanitize-r5900
751 // start-sanitize-tx19
755 GPR[RT] = GPR[RS] + EXTEND16 (IMMEDIATE);
759 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU
760 "daddu r<RD>, r<RS>, r<RT>"
764 // start-sanitize-vr4320
766 // end-sanitize-vr4320
767 // start-sanitize-vr5400
769 // end-sanitize-vr5400
770 // start-sanitize-r5900
772 // end-sanitize-r5900
774 // start-sanitize-tx19
778 GPR[RD] = GPR[RS] + GPR[RT];
782 000000,5.RS,5.RT,0000000000011110:SPECIAL:64::DDIV
787 // start-sanitize-vr4320
789 // end-sanitize-vr4320
790 // start-sanitize-vr5400
792 // end-sanitize-vr5400
793 // start-sanitize-r5900
795 // end-sanitize-r5900
797 // start-sanitize-tx19
801 CHECKHILO ("Division");
803 signed64 n = GPR[RS];
804 signed64 d = GPR[RT];
807 LO = SIGNED64 (0x8000000000000000);
810 else if (d == -1 && n == SIGNED64 (0x8000000000000000))
812 LO = SIGNED64 (0x8000000000000000);
825 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU
831 // start-sanitize-vr4320
833 // end-sanitize-vr4320
834 // start-sanitize-vr5400
836 // end-sanitize-vr5400
837 // start-sanitize-tx19
841 CHECKHILO ("Division");
843 unsigned64 n = GPR[RS];
844 unsigned64 d = GPR[RT];
847 LO = SIGNED64 (0x8000000000000000);
859 000000,5.RS,5.RT,0000000000011010:SPECIAL:32::DIV
861 *mipsI,mipsII,mipsIII,mipsIV:
863 // start-sanitize-vr4320
865 // end-sanitize-vr4320
866 // start-sanitize-vr5400
868 // end-sanitize-vr5400
869 // start-sanitize-r5900
871 // end-sanitize-r5900
873 // start-sanitize-tx19
877 CHECKHILO("Division");
879 signed32 n = GPR[RS];
880 signed32 d = GPR[RT];
883 LO = EXTEND32 (0x80000000);
886 else if (n == SIGNED32 (0x80000000) && d == -1)
888 LO = EXTEND32 (0x80000000);
893 LO = EXTEND32 (n / d);
894 HI = EXTEND32 (n % d);
900 000000,5.RS,5.RT,0000000000011011:SPECIAL:32::DIVU
902 *mipsI,mipsII,mipsIII,mipsIV:
904 // start-sanitize-vr4320
906 // end-sanitize-vr4320
907 // start-sanitize-vr5400
909 // end-sanitize-vr5400
910 // start-sanitize-r5900
912 // end-sanitize-r5900
914 // start-sanitize-tx19
918 CHECKHILO ("Division");
920 unsigned32 n = GPR[RS];
921 unsigned32 d = GPR[RT];
924 LO = EXTEND32 (0x80000000);
929 LO = EXTEND32 (n / d);
930 HI = EXTEND32 (n % d);
936 :function:::void:do_dmult:int rs, int rt, int rd, int signed_p
946 unsigned64 op1 = GPR[rs];
947 unsigned64 op2 = GPR[rt];
948 CHECKHILO ("Multiplication");
949 /* make signed multiply unsigned */
964 /* multuply out the 4 sub products */
965 m00 = ((unsigned64) VL4_8 (op1) * (unsigned64) VL4_8 (op2));
966 m10 = ((unsigned64) VH4_8 (op1) * (unsigned64) VL4_8 (op2));
967 m01 = ((unsigned64) VL4_8 (op1) * (unsigned64) VH4_8 (op2));
968 m11 = ((unsigned64) VH4_8 (op1) * (unsigned64) VH4_8 (op2));
969 /* add the products */
970 mid = ((unsigned64) VH4_8 (m00)
971 + (unsigned64) VL4_8 (m10)
972 + (unsigned64) VL4_8 (m01));
973 lo = U8_4 (mid, m00);
975 + (unsigned64) VH4_8 (mid)
976 + (unsigned64) VH4_8 (m01)
977 + (unsigned64) VH4_8 (m10));
987 /* save the result HI/LO (and a gpr) */
995 000000,5.RS,5.RT,0000000000011100:SPECIAL:64::DMULT
999 // start-sanitize-tx19
1001 // end-sanitize-tx19
1002 // start-sanitize-vr4320
1004 // end-sanitize-vr4320
1006 do_dmult (SD_, RS, RT, 0, 1);
1009 000000,5.RS,5.RT,5.RD,00000011100:SPECIAL:64::DMULT
1010 "dmult r<RS>, r<RT>":RD == 0
1011 "dmult r<RD>, r<RS>, r<RT>"
1013 // start-sanitize-vr5400
1015 // end-sanitize-vr5400
1017 do_dmult (SD_, RS, RT, RD, 1);
1022 000000,5.RS,5.RT,0000000000011101:SPECIAL:64::DMULTU
1023 "dmultu r<RS>, r<RT>"
1026 // start-sanitize-tx19
1028 // end-sanitize-tx19
1029 // start-sanitize-vr4320
1031 // end-sanitize-vr4320
1033 do_dmult (SD_, RS, RT, 0, 0);
1036 000000,5.RS,5.RT,5.RD,00000011101:SPECIAL:64::DMULTU
1037 "dmultu r<RD>, r<RS>, r<RT>":RD == 0
1038 "dmultu r<RS>, r<RT>"
1040 // start-sanitize-vr5400
1042 // end-sanitize-vr5400
1044 do_dmult (SD_, RS, RT, RD, 0);
1049 00000000000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL
1050 "dsll r<RD>, r<RT>, <SHIFT>"
1054 // start-sanitize-vr4320
1056 // end-sanitize-vr4320
1057 // start-sanitize-vr5400
1059 // end-sanitize-vr5400
1060 // start-sanitize-r5900
1062 // end-sanitize-r5900
1064 // start-sanitize-tx19
1066 // end-sanitize-tx19
1069 GPR[RD] = GPR[RT] << s;
1073 00000000000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32
1074 "dsll32 r<RD>, r<RT>, <SHIFT>"
1078 // start-sanitize-vr4320
1080 // end-sanitize-vr4320
1081 // start-sanitize-vr5400
1083 // end-sanitize-vr5400
1084 // start-sanitize-r5900
1086 // end-sanitize-r5900
1088 // start-sanitize-tx19
1090 // end-sanitize-tx19
1093 GPR[RD] = GPR[RT] << s;
1097 000000,5.RS,5.RT,5.RD,00000010100:SPECIAL:64::DSLLV
1098 "dsllv r<RD>, r<RT>, r<RS>"
1102 // start-sanitize-vr4320
1104 // end-sanitize-vr4320
1105 // start-sanitize-vr5400
1107 // end-sanitize-vr5400
1108 // start-sanitize-r5900
1110 // end-sanitize-r5900
1112 // start-sanitize-tx19
1114 // end-sanitize-tx19
1116 int s = MASKED64 (GPR[RS], 5, 0);
1117 GPR[RD] = GPR[RT] << s;
1121 00000000000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA
1122 "dsra r<RD>, r<RT>, <SHIFT>"
1126 // start-sanitize-vr4320
1128 // end-sanitize-vr4320
1129 // start-sanitize-vr5400
1131 // end-sanitize-vr5400
1132 // start-sanitize-r5900
1134 // end-sanitize-r5900
1136 // start-sanitize-tx19
1138 // end-sanitize-tx19
1141 GPR[RD] = ((signed64) GPR[RT]) >> s;
1145 00000000000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32
1146 "dsra32 r<RT>, r<RD>, <SHIFT>"
1150 // start-sanitize-vr4320
1152 // end-sanitize-vr4320
1153 // start-sanitize-vr5400
1155 // end-sanitize-vr5400
1156 // start-sanitize-r5900
1158 // end-sanitize-r5900
1160 // start-sanitize-tx19
1162 // end-sanitize-tx19
1165 GPR[RD] = ((signed64) GPR[RT]) >> s;
1169 000000,5.RS,5.RT,5.RD,00000010111:SPECIAL:64::DSRAV
1170 "dsra32 r<RT>, r<RD>, r<RS>"
1174 // start-sanitize-vr4320
1176 // end-sanitize-vr4320
1177 // start-sanitize-vr5400
1179 // end-sanitize-vr5400
1180 // start-sanitize-r5900
1182 // end-sanitize-r5900
1184 // start-sanitize-tx19
1186 // end-sanitize-tx19
1188 int s = MASKED64 (GPR[RS], 5, 0);
1189 GPR[RD] = ((signed64) GPR[RT]) >> s;
1193 00000000000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL
1194 "dsrav r<RD>, r<RT>, <SHIFT>"
1198 // start-sanitize-vr4320
1200 // end-sanitize-vr4320
1201 // start-sanitize-vr5400
1203 // end-sanitize-vr5400
1204 // start-sanitize-r5900
1206 // end-sanitize-r5900
1208 // start-sanitize-tx19
1210 // end-sanitize-tx19
1213 GPR[RD] = (unsigned64) GPR[RT] >> s;
1217 00000000000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32
1218 "dsrl32 r<RD>, r<RT>, <SHIFT>"
1222 // start-sanitize-vr4320
1224 // end-sanitize-vr4320
1225 // start-sanitize-vr5400
1227 // end-sanitize-vr5400
1228 // start-sanitize-r5900
1230 // end-sanitize-r5900
1232 // start-sanitize-tx19
1234 // end-sanitize-tx19
1237 GPR[RD] = (unsigned64) GPR[RT] >> s;
1241 000000,5.RS,5.RT,5.RD,00000010110:SPECIAL:64::DSRLV
1242 "dsrl32 r<RD>, r<RT>, r<RS>"
1246 // start-sanitize-vr4320
1248 // end-sanitize-vr4320
1249 // start-sanitize-vr5400
1251 // end-sanitize-vr5400
1252 // start-sanitize-r5900
1254 // end-sanitize-r5900
1256 // start-sanitize-tx19
1258 // end-sanitize-tx19
1260 int s = MASKED64 (GPR[RS], 5, 0);
1261 GPR[RD] = (unsigned64) GPR[RT] >> s;
1265 000000,5.RS,5.RT,5.RD,00000101110:SPECIAL:64::DSUB
1266 "dsub r<RD>, r<RS>, r<RT>"
1270 // start-sanitize-vr4320
1272 // end-sanitize-vr4320
1273 // start-sanitize-vr5400
1275 // end-sanitize-vr5400
1276 // start-sanitize-r5900
1278 // end-sanitize-r5900
1280 // start-sanitize-tx19
1282 // end-sanitize-tx19
1284 ALU64_BEGIN (GPR[RS]);
1285 ALU64_SUB (GPR[RT]);
1286 ALU64_END (GPR[RD]);
1290 000000,5.RS,5.RT,5.RD,00000101111:SPECIAL:64::DSUBU
1291 "dsubu r<RD>, r<RS>, r<RT>"
1295 // start-sanitize-vr4320
1297 // end-sanitize-vr4320
1298 // start-sanitize-vr5400
1300 // end-sanitize-vr5400
1301 // start-sanitize-r5900
1303 // end-sanitize-r5900
1305 // start-sanitize-tx19
1307 // end-sanitize-tx19
1309 GPR[RD] = GPR[RS] - GPR[RT];
1313 000010,26.INSTR_INDEX:NORMAL:32::J
1315 *mipsI,mipsII,mipsIII,mipsIV:
1317 // start-sanitize-vr4320
1319 // end-sanitize-vr4320
1320 // start-sanitize-vr5400
1322 // end-sanitize-vr5400
1323 // start-sanitize-r5900
1325 // end-sanitize-r5900
1327 // start-sanitize-tx19
1329 // end-sanitize-tx19
1331 /* NOTE: The region used is that of the delay slot NIA and NOT the
1332 current instruction */
1333 address_word region = (NIA & MASK (63, 28));
1334 DELAY_SLOT (region | (INSTR_INDEX << 2));
1338 000011,26.INSTR_INDEX:NORMAL:32::JAL
1340 *mipsI,mipsII,mipsIII,mipsIV:
1342 // start-sanitize-vr4320
1344 // end-sanitize-vr4320
1345 // start-sanitize-vr5400
1347 // end-sanitize-vr5400
1348 // start-sanitize-r5900
1350 // end-sanitize-r5900
1352 // start-sanitize-tx19
1354 // end-sanitize-tx19
1356 /* NOTE: The region used is that of the delay slot and NOT the
1357 current instruction */
1358 address_word region = (NIA & MASK (63, 28));
1360 DELAY_SLOT (region | (INSTR_INDEX << 2));
1364 000000,5.RS,00000,5.RD,00000001001:SPECIAL:32::JALR
1365 "jalr r<RS>":RD == 31
1367 *mipsI,mipsII,mipsIII,mipsIV:
1369 // start-sanitize-vr4320
1371 // end-sanitize-vr4320
1372 // start-sanitize-vr5400
1374 // end-sanitize-vr5400
1375 // start-sanitize-r5900
1377 // end-sanitize-r5900
1379 // start-sanitize-tx19
1381 // end-sanitize-tx19
1383 address_word temp = GPR[RS];
1389 000000,5.RS,000000000000000001000:SPECIAL:32::JR
1391 *mipsI,mipsII,mipsIII,mipsIV:
1393 // start-sanitize-vr4320
1395 // end-sanitize-vr4320
1396 // start-sanitize-vr5400
1398 // end-sanitize-vr5400
1399 // start-sanitize-r5900
1401 // end-sanitize-r5900
1403 // start-sanitize-tx19
1405 // end-sanitize-tx19
1407 DELAY_SLOT (GPR[RS]);
1411 :function:::void:do_load_byte:address_word gpr_base, int rt, signed16 offset
1413 address_word vaddr = offset + gpr_base;
1416 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1418 unsigned64 memval = 0;
1419 address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3);
1420 unsigned int reverse = (ReverseEndian ? mask : 0);
1421 unsigned int bigend = (BigEndianCPU ? mask : 0);
1423 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1424 LoadMemory (&memval, NULL, uncached, AccessLength_BYTE, paddr, vaddr, isDATA, isREAL);
1425 byte = ((vaddr & mask) ^ bigend);
1426 GPR[rt] = EXTEND8 ((memval >> (8 * byte)));
1430 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB
1431 "lb r<RT>, <OFFSET>(r<BASE>)"
1432 *mipsI,mipsII,mipsIII,mipsIV:
1434 // start-sanitize-vr4320
1436 // end-sanitize-vr4320
1437 // start-sanitize-vr5400
1439 // end-sanitize-vr5400
1440 // start-sanitize-r5900
1442 // end-sanitize-r5900
1444 // start-sanitize-tx19
1446 // end-sanitize-tx19
1448 do_load_byte (SD_, GPR[BASE], RT, OFFSET);
1450 unsigned32 instruction = instruction_0;
1451 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1452 int destreg = ((instruction >> 16) & 0x0000001F);
1453 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1455 address_word vaddr = ((uword64)op1 + offset);
1459 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1462 uword64 memval1 = 0;
1464 unsigned int shift = 0;
1465 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1466 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1468 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1469 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
1470 byte = ((vaddr & mask) ^ (bigend << shift));
1471 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x000000FF),8));
1479 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU
1480 "lbu r<RT>, <OFFSET>(r<BASE>)"
1481 *mipsI,mipsII,mipsIII,mipsIV:
1483 // start-sanitize-vr4320
1485 // end-sanitize-vr4320
1486 // start-sanitize-vr5400
1488 // end-sanitize-vr5400
1489 // start-sanitize-r5900
1491 // end-sanitize-r5900
1493 // start-sanitize-tx19
1495 // end-sanitize-tx19
1497 unsigned32 instruction = instruction_0;
1498 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1499 int destreg = ((instruction >> 16) & 0x0000001F);
1500 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1502 address_word vaddr = ((unsigned64)op1 + offset);
1506 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1508 unsigned64 memval = 0;
1509 unsigned64 memval1 = 0;
1510 unsigned64 mask = 0x7;
1511 unsigned int shift = 0;
1512 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1513 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1515 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1516 LoadMemory(&memval,&memval1,uncached,AccessLength_BYTE,paddr,vaddr,isDATA,isREAL);
1517 byte = ((vaddr & mask) ^ (bigend << shift));
1518 GPR[destreg] = (((memval >> (8 * byte)) & 0x000000FF));
1525 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD
1526 "ld r<RT>, <OFFSET>(r<BASE>)"
1530 // start-sanitize-vr4320
1532 // end-sanitize-vr4320
1533 // start-sanitize-vr5400
1535 // end-sanitize-vr5400
1536 // start-sanitize-r5900
1538 // end-sanitize-r5900
1540 // start-sanitize-tx19
1542 // end-sanitize-tx19
1544 unsigned32 instruction = instruction_0;
1545 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1546 int destreg = ((instruction >> 16) & 0x0000001F);
1547 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1549 address_word vaddr = ((unsigned64)op1 + offset);
1552 if ((vaddr & 7) != 0)
1553 SignalExceptionAddressLoad();
1556 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1558 unsigned64 memval = 0;
1559 unsigned64 memval1 = 0;
1560 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1561 GPR[destreg] = memval;
1568 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz
1569 "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
1574 // start-sanitize-vr4320
1576 // end-sanitize-vr4320
1577 // start-sanitize-vr5400
1579 // end-sanitize-vr5400
1581 // start-sanitize-tx19
1583 // end-sanitize-tx19
1585 unsigned32 instruction = instruction_0;
1586 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1587 int destreg = ((instruction >> 16) & 0x0000001F);
1588 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1590 address_word vaddr = ((unsigned64)op1 + offset);
1593 if ((vaddr & 7) != 0)
1594 SignalExceptionAddressLoad();
1597 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1599 unsigned64 memval = 0;
1600 unsigned64 memval1 = 0;
1601 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1602 COP_LD(((instruction >> 26) & 0x3),destreg,memval);;
1609 // start-sanitize-sky
1610 110110,5.BASE,5.RT,16.OFFSET:NORMAL:64::LQC2
1611 "lqc2 r<RT>, <OFFSET>(r<BASE>)"
1614 unsigned32 instruction = instruction_0;
1615 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1616 int destreg = ((instruction >> 16) & 0x0000001F);
1617 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1619 address_word vaddr = ((unsigned64)op1 + offset);
1622 if ((vaddr & 0x0f) != 0)
1623 SignalExceptionAddressLoad();
1626 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1628 unsigned64 memval = 0;
1629 unsigned64 memval1 = 0;
1630 unsigned128 qw = U16_8(memval, memval1); /* XXX: check order */
1631 /* XXX: block on VU0 pipeline if necessary */
1632 LoadMemory(&memval,&memval1,uncached,AccessLength_QUADWORD,paddr,vaddr,isDATA,isREAL);
1633 COP_LQ(((instruction >> 26) & 0x3),destreg,qw);;
1641 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
1642 "ldl r<RT>, <OFFSET>(r<BASE>)"
1646 // start-sanitize-vr4320
1648 // end-sanitize-vr4320
1649 // start-sanitize-vr5400
1651 // end-sanitize-vr5400
1652 // start-sanitize-r5900
1654 // end-sanitize-r5900
1656 // start-sanitize-tx19
1658 // end-sanitize-tx19
1660 unsigned32 instruction = instruction_0;
1661 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1662 int destreg = ((instruction >> 16) & 0x0000001F);
1663 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1665 address_word vaddr = ((unsigned64)op1 + offset);
1669 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1671 unsigned64 memval = 0;
1672 unsigned64 memval1 = 0;
1673 unsigned64 mask = 7;
1674 unsigned int reverse = (ReverseEndian ? mask : 0);
1675 unsigned int bigend = (BigEndianCPU ? mask : 0);
1677 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1678 byte = ((vaddr & mask) ^ bigend);
1681 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
1682 GPR[destreg] = ((memval << ((7 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((7 - byte) * 8)) - 1)));
1689 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
1690 "ldr r<RT>, <OFFSET>(r<BASE>)"
1694 // start-sanitize-vr4320
1696 // end-sanitize-vr4320
1697 // start-sanitize-vr5400
1699 // end-sanitize-vr5400
1700 // start-sanitize-r5900
1702 // end-sanitize-r5900
1704 // start-sanitize-tx19
1706 // end-sanitize-tx19
1708 unsigned32 instruction = instruction_0;
1709 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1710 int destreg = ((instruction >> 16) & 0x0000001F);
1711 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1713 address_word vaddr = ((unsigned64)op1 + offset);
1717 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1719 unsigned64 memval = 0;
1720 unsigned64 memval1 = 0;
1721 unsigned64 mask = 7;
1722 unsigned int reverse = (ReverseEndian ? mask : 0);
1723 unsigned int bigend = (BigEndianCPU ? mask : 0);
1725 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1726 byte = ((vaddr & mask) ^ bigend);
1729 LoadMemory(&memval,&memval1,uncached,(7 - byte),paddr,vaddr,isDATA,isREAL);
1735 srcmask = ((unsigned64)-1 << (8 * (8 - byte)));
1736 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
1744 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
1745 "lh r<RT>, <OFFSET>(r<BASE>)"
1746 *mipsI,mipsII,mipsIII,mipsIV:
1748 // start-sanitize-vr4320
1750 // end-sanitize-vr4320
1751 // start-sanitize-vr5400
1753 // end-sanitize-vr5400
1754 // start-sanitize-r5900
1756 // end-sanitize-r5900
1758 // start-sanitize-tx19
1760 // end-sanitize-tx19
1762 unsigned32 instruction = instruction_0;
1763 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1764 int destreg = ((instruction >> 16) & 0x0000001F);
1765 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1767 address_word vaddr = ((unsigned64)op1 + offset);
1770 if ((vaddr & 1) != 0)
1771 SignalExceptionAddressLoad();
1774 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1776 unsigned64 memval = 0;
1777 unsigned64 memval1 = 0;
1778 unsigned64 mask = 0x7;
1779 unsigned int shift = 1;
1780 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1781 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1783 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1784 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1785 byte = ((vaddr & mask) ^ (bigend << shift));
1786 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x0000FFFF),16));
1793 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
1794 "lhu r<RT>, <OFFSET>(r<BASE>)"
1795 *mipsI,mipsII,mipsIII,mipsIV:
1797 // start-sanitize-vr4320
1799 // end-sanitize-vr4320
1800 // start-sanitize-vr5400
1802 // end-sanitize-vr5400
1803 // start-sanitize-r5900
1805 // end-sanitize-r5900
1807 // start-sanitize-tx19
1809 // end-sanitize-tx19
1811 unsigned32 instruction = instruction_0;
1812 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1813 int destreg = ((instruction >> 16) & 0x0000001F);
1814 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1816 address_word vaddr = ((unsigned64)op1 + offset);
1819 if ((vaddr & 1) != 0)
1820 SignalExceptionAddressLoad();
1823 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1825 unsigned64 memval = 0;
1826 unsigned64 memval1 = 0;
1827 unsigned64 mask = 0x7;
1828 unsigned int shift = 1;
1829 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1830 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1832 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1833 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1834 byte = ((vaddr & mask) ^ (bigend << shift));
1835 GPR[destreg] = (((memval >> (8 * byte)) & 0x0000FFFF));
1842 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
1843 "ll r<RT>, <OFFSET>(r<BASE>)"
1848 // start-sanitize-vr4320
1850 // end-sanitize-vr4320
1851 // start-sanitize-vr5400
1853 // end-sanitize-vr5400
1854 // start-sanitize-r5900
1856 // end-sanitize-r5900
1858 // start-sanitize-tx19
1860 // end-sanitize-tx19
1862 unsigned32 instruction = instruction_0;
1863 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1864 int destreg = ((instruction >> 16) & 0x0000001F);
1865 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1867 address_word vaddr = ((unsigned64)op1 + offset);
1870 if ((vaddr & 3) != 0)
1871 SignalExceptionAddressLoad();
1874 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1876 unsigned64 memval = 0;
1877 unsigned64 memval1 = 0;
1878 unsigned64 mask = 0x7;
1879 unsigned int shift = 2;
1880 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1881 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1883 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1884 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1885 byte = ((vaddr & mask) ^ (bigend << shift));
1886 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
1894 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
1895 "lld r<RT>, <OFFSET>(r<BASE>)"
1899 // start-sanitize-vr4320
1901 // end-sanitize-vr4320
1902 // start-sanitize-vr5400
1904 // end-sanitize-vr5400
1905 // start-sanitize-r5900
1907 // end-sanitize-r5900
1909 // start-sanitize-tx19
1911 // end-sanitize-tx19
1913 unsigned32 instruction = instruction_0;
1914 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1915 int destreg = ((instruction >> 16) & 0x0000001F);
1916 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1918 address_word vaddr = ((unsigned64)op1 + offset);
1921 if ((vaddr & 7) != 0)
1922 SignalExceptionAddressLoad();
1925 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1927 unsigned64 memval = 0;
1928 unsigned64 memval1 = 0;
1929 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1930 GPR[destreg] = memval;
1938 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
1939 "lui r<RT>, <IMMEDIATE>"
1940 *mipsI,mipsII,mipsIII,mipsIV:
1942 // start-sanitize-vr4320
1944 // end-sanitize-vr4320
1945 // start-sanitize-vr5400
1947 // end-sanitize-vr5400
1948 // start-sanitize-r5900
1950 // end-sanitize-r5900
1952 // start-sanitize-tx19
1954 // end-sanitize-tx19
1956 GPR[RT] = EXTEND32 (IMMEDIATE << 16);
1960 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
1961 "lw r<RT>, <OFFSET>(r<BASE>)"
1962 *mipsI,mipsII,mipsIII,mipsIV:
1964 // start-sanitize-vr4320
1966 // end-sanitize-vr4320
1967 // start-sanitize-vr5400
1969 // end-sanitize-vr5400
1970 // start-sanitize-r5900
1972 // end-sanitize-r5900
1974 // start-sanitize-tx19
1976 // end-sanitize-tx19
1978 unsigned32 instruction = instruction_0;
1979 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1980 int destreg = ((instruction >> 16) & 0x0000001F);
1981 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1983 address_word vaddr = ((unsigned64)op1 + offset);
1986 if ((vaddr & 3) != 0)
1987 SignalExceptionAddressLoad();
1990 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1992 unsigned64 memval = 0;
1993 unsigned64 memval1 = 0;
1994 unsigned64 mask = 0x7;
1995 unsigned int shift = 2;
1996 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1997 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1999 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2000 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2001 byte = ((vaddr & mask) ^ (bigend << shift));
2002 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
2009 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
2010 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2011 *mipsI,mipsII,mipsIII,mipsIV:
2013 // start-sanitize-vr4320
2015 // end-sanitize-vr4320
2016 // start-sanitize-vr5400
2018 // end-sanitize-vr5400
2019 // start-sanitize-r5900
2021 // end-sanitize-r5900
2023 // start-sanitize-tx19
2025 // end-sanitize-tx19
2027 unsigned32 instruction = instruction_0;
2028 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2029 int destreg = ((instruction >> 16) & 0x0000001F);
2030 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2032 address_word vaddr = ((unsigned64)op1 + offset);
2035 if ((vaddr & 3) != 0)
2036 SignalExceptionAddressLoad();
2039 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2041 unsigned64 memval = 0;
2042 unsigned64 memval1 = 0;
2043 unsigned64 mask = 0x7;
2044 unsigned int shift = 2;
2045 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2046 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2048 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2049 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2050 byte = ((vaddr & mask) ^ (bigend << shift));
2051 COP_LW(((instruction >> 26) & 0x3),destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
2058 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
2059 "lwl r<RT>, <OFFSET>(r<BASE>)"
2060 *mipsI,mipsII,mipsIII,mipsIV:
2062 // start-sanitize-vr4320
2064 // end-sanitize-vr4320
2065 // start-sanitize-vr5400
2067 // end-sanitize-vr5400
2068 // start-sanitize-r5900
2070 // end-sanitize-r5900
2072 // start-sanitize-tx19
2074 // end-sanitize-tx19
2076 unsigned32 instruction = instruction_0;
2077 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2078 int destreg = ((instruction >> 16) & 0x0000001F);
2079 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2081 address_word vaddr = ((unsigned64)op1 + offset);
2085 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2087 unsigned64 memval = 0;
2088 unsigned64 memval1 = 0;
2089 unsigned64 mask = 3;
2090 unsigned int reverse = (ReverseEndian ? mask : 0);
2091 unsigned int bigend = (BigEndianCPU ? mask : 0);
2093 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2094 byte = ((vaddr & mask) ^ bigend);
2097 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
2098 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
2101 GPR[destreg] = ((memval << ((3 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((3 - byte) * 8)) - 1)));
2102 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
2109 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
2110 "lwr r<RT>, <OFFSET>(r<BASE>)"
2111 *mipsI,mipsII,mipsIII,mipsIV:
2113 // start-sanitize-vr4320
2115 // end-sanitize-vr4320
2116 // start-sanitize-vr5400
2118 // end-sanitize-vr5400
2119 // start-sanitize-r5900
2121 // end-sanitize-r5900
2123 // start-sanitize-tx19
2125 // end-sanitize-tx19
2127 unsigned32 instruction = instruction_0;
2128 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2129 int destreg = ((instruction >> 16) & 0x0000001F);
2130 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2132 address_word vaddr = ((unsigned64)op1 + offset);
2136 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2138 unsigned64 memval = 0;
2139 unsigned64 memval1 = 0;
2140 unsigned64 mask = 3;
2141 unsigned int reverse = (ReverseEndian ? mask : 0);
2142 unsigned int bigend = (BigEndianCPU ? mask : 0);
2144 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2145 byte = ((vaddr & mask) ^ bigend);
2148 LoadMemory(&memval,&memval1,uncached,(3 - byte),paddr,vaddr,isDATA,isREAL);
2149 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
2157 srcmask = ((unsigned64)-1 << (8 * (4 - byte)));
2158 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
2160 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
2167 100111,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWU
2168 "lwu r<RT>, <OFFSET>(r<BASE>)"
2172 // start-sanitize-vr4320
2174 // end-sanitize-vr4320
2175 // start-sanitize-vr5400
2177 // end-sanitize-vr5400
2178 // start-sanitize-r5900
2180 // end-sanitize-r5900
2182 // start-sanitize-tx19
2184 // end-sanitize-tx19
2186 unsigned32 instruction = instruction_0;
2187 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2188 int destreg = ((instruction >> 16) & 0x0000001F);
2189 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2191 address_word vaddr = ((unsigned64)op1 + offset);
2194 if ((vaddr & 3) != 0)
2195 SignalExceptionAddressLoad();
2198 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2200 unsigned64 memval = 0;
2201 unsigned64 memval1 = 0;
2202 unsigned64 mask = 0x7;
2203 unsigned int shift = 2;
2204 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2205 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2207 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2208 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2209 byte = ((vaddr & mask) ^ (bigend << shift));
2210 GPR[destreg] = (((memval >> (8 * byte)) & 0xFFFFFFFF));
2217 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
2219 *mipsI,mipsII,mipsIII,mipsIV:
2221 // start-sanitize-vr4320
2223 // end-sanitize-vr4320
2224 // start-sanitize-vr5400
2226 // end-sanitize-vr5400
2227 // start-sanitize-r5900
2229 // end-sanitize-r5900
2231 // start-sanitize-tx19
2233 // end-sanitize-tx19
2242 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
2244 *mipsI,mipsII,mipsIII,mipsIV:
2246 // start-sanitize-vr4320
2248 // end-sanitize-vr4320
2249 // start-sanitize-vr5400
2251 // end-sanitize-vr5400
2252 // start-sanitize-r5900
2254 // end-sanitize-r5900
2256 // start-sanitize-tx19
2258 // end-sanitize-tx19
2262 LOACCESS = 3; /* 3rd instruction will be safe */
2267 000000,5.RS,5.RT,5.RD,00000001011:SPECIAL:32::MOVN
2268 "movn r<RD>, r<RS>, r<RT>"
2271 // start-sanitize-vr4320
2273 // end-sanitize-vr4320
2274 // start-sanitize-vr5400
2276 // end-sanitize-vr5400
2277 // start-sanitize-r5900
2279 // end-sanitize-r5900
2286 000000,5.RS,5.RT,5.RD,00000001010:SPECIAL:32::MOVZ
2287 "movz r<RD>, r<RS>, r<RT>"
2290 // start-sanitize-vr4320
2292 // end-sanitize-vr4320
2293 // start-sanitize-vr5400
2295 // end-sanitize-vr5400
2296 // start-sanitize-r5900
2298 // end-sanitize-r5900
2305 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
2307 *mipsI,mipsII,mipsIII,mipsIV:
2309 // start-sanitize-vr4320
2311 // end-sanitize-vr4320
2312 // start-sanitize-vr5400
2314 // end-sanitize-vr5400
2315 // start-sanitize-r5900
2317 // end-sanitize-r5900
2319 // start-sanitize-tx19
2321 // end-sanitize-tx19
2325 sim_io_eprintf (sd, "MT (move-to) over-writing HI register value\n");
2329 HIACCESS = 3; /* 3rd instruction will be safe */
2334 000000,5.RS,000000000000000010011:SPECIAL:32::MTLO
2336 *mipsI,mipsII,mipsIII,mipsIV:
2338 // start-sanitize-vr4320
2340 // end-sanitize-vr4320
2341 // start-sanitize-vr5400
2343 // end-sanitize-vr5400
2344 // start-sanitize-r5900
2346 // end-sanitize-r5900
2348 // start-sanitize-tx19
2350 // end-sanitize-tx19
2354 sim_io_eprintf (sd, "MT (move-to) over-writing LO register value\n");
2358 LOACCESS = 3; /* 3rd instruction will be safe */
2363 000000,5.RS,5.RT,00000,00000011000:SPECIAL:32::MULT
2365 *mipsI,mipsII,mipsIII,mipsIV:
2366 // start-sanitize-vr4320
2368 // end-sanitize-vr4320
2371 CHECKHILO ("Multiplication");
2372 prod = (((signed64)(signed32) GPR[RS])
2373 * ((signed64)(signed32) GPR[RT]));
2374 LO = EXTEND32 (VL4_8 (prod));
2375 HI = EXTEND32 (VH4_8 (prod));
2379 000000,5.RS,5.RT,5.RD,00000011000:SPECIAL:32::MULT
2380 "mult r<RD>, r<RS>, r<RT>"
2382 // start-sanitize-vr5400
2384 // end-sanitize-vr5400
2385 // start-sanitize-r5900
2387 // end-sanitize-r5900
2389 // start-sanitize-tx19
2391 // end-sanitize-tx19
2394 CHECKHILO ("Multiplication");
2395 prod = (((signed64)(signed32) GPR[RS])
2396 * ((signed64)(signed32) GPR[RT]));
2397 LO = EXTEND32 (VL4_8 (prod));
2398 HI = EXTEND32 (VH4_8 (prod));
2404 000000,5.RS,5.RT,00000,00000011001:SPECIAL:32::MULTU
2405 "multu r<RS>, r<RT>"
2406 *mipsI,mipsII,mipsIII,mipsIV:
2407 // start-sanitize-vr4320
2409 // end-sanitize-vr4320
2412 CHECKHILO ("Multiplication");
2413 prod = (((unsigned64)(unsigned32) GPR[RS])
2414 * ((unsigned64)(unsigned32) GPR[RT]));
2415 LO = EXTEND32 (VL4_8 (prod));
2416 HI = EXTEND32 (VH4_8 (prod));
2418 000000,5.RS,5.RT,5.RD,00000011001:SPECIAL:32::MULTU
2419 "multu r<RD>, r<RS>, r<RT>"
2421 // start-sanitize-vr5400
2423 // end-sanitize-vr5400
2424 // start-sanitize-r5900
2426 // end-sanitize-r5900
2428 // start-sanitize-tx19
2430 // end-sanitize-tx19
2433 CHECKHILO ("Multiplication");
2434 prod = (((unsigned64)(unsigned32) GPR[RS])
2435 * ((unsigned64)(unsigned32) GPR[RT]));
2436 LO = EXTEND32 (VL4_8 (prod));
2437 HI = EXTEND32 (VH4_8 (prod));
2443 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
2444 "nor r<RD>, r<RS>, r<RT>"
2445 *mipsI,mipsII,mipsIII,mipsIV:
2447 // start-sanitize-vr4320
2449 // end-sanitize-vr4320
2450 // start-sanitize-vr5400
2452 // end-sanitize-vr5400
2453 // start-sanitize-r5900
2455 // end-sanitize-r5900
2457 // start-sanitize-tx19
2459 // end-sanitize-tx19
2461 GPR[RD] = ~ (GPR[RS] | GPR[RT]);
2465 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
2466 "or r<RD>, r<RS>, r<RT>"
2467 *mipsI,mipsII,mipsIII,mipsIV:
2469 // start-sanitize-vr4320
2471 // end-sanitize-vr4320
2472 // start-sanitize-vr5400
2474 // end-sanitize-vr5400
2475 // start-sanitize-r5900
2477 // end-sanitize-r5900
2479 // start-sanitize-tx19
2481 // end-sanitize-tx19
2483 GPR[RD] = (GPR[RS] | GPR[RT]);
2487 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
2488 "ori r<RT>, r<RS>, <IMMEDIATE>"
2489 *mipsI,mipsII,mipsIII,mipsIV:
2491 // start-sanitize-vr4320
2493 // end-sanitize-vr4320
2494 // start-sanitize-vr5400
2496 // end-sanitize-vr5400
2497 // start-sanitize-r5900
2499 // end-sanitize-r5900
2501 // start-sanitize-tx19
2503 // end-sanitize-tx19
2505 GPR[RT] = (GPR[RS] | IMMEDIATE);
2509 110011,5.RS,nnnnn,16.OFFSET:NORMAL:32::PREF
2512 // start-sanitize-vr4320
2514 // end-sanitize-vr4320
2515 // start-sanitize-vr5400
2517 // end-sanitize-vr5400
2518 // start-sanitize-r5900
2520 // end-sanitize-r5900
2522 unsigned32 instruction = instruction_0;
2523 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2524 int hint = ((instruction >> 16) & 0x0000001F);
2525 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2527 address_word vaddr = ((unsigned64)op1 + offset);
2531 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2532 Prefetch(uncached,paddr,vaddr,isDATA,hint);
2537 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
2538 "sb r<RT>, <OFFSET>(r<BASE>)"
2539 *mipsI,mipsII,mipsIII,mipsIV:
2541 // start-sanitize-vr4320
2543 // end-sanitize-vr4320
2544 // start-sanitize-vr5400
2546 // end-sanitize-vr5400
2547 // start-sanitize-r5900
2549 // end-sanitize-r5900
2551 // start-sanitize-tx19
2553 // end-sanitize-tx19
2555 unsigned32 instruction = instruction_0;
2556 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2557 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2558 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2560 address_word vaddr = ((unsigned64)op1 + offset);
2564 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2566 unsigned64 memval = 0;
2567 unsigned64 memval1 = 0;
2568 unsigned64 mask = 0x7;
2569 unsigned int shift = 0;
2570 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2571 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2573 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2574 byte = ((vaddr & mask) ^ (bigend << shift));
2575 memval = ((unsigned64) op2 << (8 * byte));
2577 StoreMemory(uncached,AccessLength_BYTE,memval,memval1,paddr,vaddr,isREAL);
2585 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
2586 "sc r<RT>, <OFFSET>(r<BASE>)"
2591 // start-sanitize-vr4320
2593 // end-sanitize-vr4320
2594 // start-sanitize-vr5400
2596 // end-sanitize-vr5400
2597 // start-sanitize-r5900
2599 // end-sanitize-r5900
2601 // start-sanitize-tx19
2603 // end-sanitize-tx19
2605 unsigned32 instruction = instruction_0;
2606 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2607 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2608 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2610 address_word vaddr = ((unsigned64)op1 + offset);
2613 if ((vaddr & 3) != 0)
2614 SignalExceptionAddressStore();
2617 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2619 unsigned64 memval = 0;
2620 unsigned64 memval1 = 0;
2621 unsigned64 mask = 0x7;
2623 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2624 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2625 memval = ((unsigned64) op2 << (8 * byte));
2628 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2630 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2637 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
2638 "scd r<RT>, <OFFSET>(r<BASE>)"
2642 // start-sanitize-vr4320
2644 // end-sanitize-vr4320
2645 // start-sanitize-vr5400
2647 // end-sanitize-vr5400
2648 // start-sanitize-r5900
2650 // end-sanitize-r5900
2652 // start-sanitize-tx19
2654 // end-sanitize-tx19
2656 unsigned32 instruction = instruction_0;
2657 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2658 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2659 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2661 address_word vaddr = ((unsigned64)op1 + offset);
2664 if ((vaddr & 7) != 0)
2665 SignalExceptionAddressStore();
2668 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2670 unsigned64 memval = 0;
2671 unsigned64 memval1 = 0;
2675 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2677 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2684 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
2685 "sd r<RT>, <OFFSET>(r<BASE>)"
2689 // start-sanitize-vr4320
2691 // end-sanitize-vr4320
2692 // start-sanitize-vr5400
2694 // end-sanitize-vr5400
2695 // start-sanitize-r5900
2697 // end-sanitize-r5900
2699 // start-sanitize-tx19
2701 // end-sanitize-tx19
2703 unsigned32 instruction = instruction_0;
2704 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2705 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2706 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2708 address_word vaddr = ((unsigned64)op1 + offset);
2711 if ((vaddr & 7) != 0)
2712 SignalExceptionAddressStore();
2715 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2717 unsigned64 memval = 0;
2718 unsigned64 memval1 = 0;
2721 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2729 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
2730 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2735 // start-sanitize-vr4320
2737 // end-sanitize-vr4320
2738 // start-sanitize-vr5400
2740 // end-sanitize-vr5400
2741 // start-sanitize-r5900
2743 // end-sanitize-r5900
2745 // start-sanitize-tx19
2747 // end-sanitize-tx19
2749 unsigned32 instruction = instruction_0;
2750 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2751 int destreg = ((instruction >> 16) & 0x0000001F);
2752 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2754 address_word vaddr = ((unsigned64)op1 + offset);
2757 if ((vaddr & 7) != 0)
2758 SignalExceptionAddressStore();
2761 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2763 unsigned64 memval = 0;
2764 unsigned64 memval1 = 0;
2765 memval = (unsigned64)COP_SD(((instruction >> 26) & 0x3),destreg);
2767 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2775 // start-sanitize-sky
2776 111010,5.BASE,5.RT,16.OFFSET:NORMAL:64::SQC2
2777 "sqc2 r<RT>, <OFFSET>(r<BASE>)"
2780 unsigned32 instruction = instruction_0;
2781 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2782 int destreg = ((instruction >> 16) & 0x0000001F);
2783 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2785 address_word vaddr = ((unsigned64)op1 + offset);
2788 if ((vaddr & 0x0f) != 0)
2789 SignalExceptionAddressStore();
2792 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2795 unsigned64 memval0 = 0;
2796 unsigned64 memval1 = 0;
2797 qw = COP_SQ(((instruction >> 26) & 0x3),destreg);
2798 memval0 = *A8_16(& qw, 0);
2799 memval1 = *A8_16(& qw, 1);
2801 StoreMemory(uncached,AccessLength_WORD,memval0,memval1,paddr,vaddr,isREAL);
2811 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
2812 "sdl r<RT>, <OFFSET>(r<BASE>)"
2816 // start-sanitize-vr4320
2818 // end-sanitize-vr4320
2819 // start-sanitize-vr5400
2821 // end-sanitize-vr5400
2822 // start-sanitize-r5900
2824 // end-sanitize-r5900
2826 // start-sanitize-tx19
2828 // end-sanitize-tx19
2830 unsigned32 instruction = instruction_0;
2831 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2832 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2833 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2835 address_word vaddr = ((unsigned64)op1 + offset);
2839 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2841 unsigned64 memval = 0;
2842 unsigned64 memval1 = 0;
2843 unsigned64 mask = 7;
2844 unsigned int reverse = (ReverseEndian ? mask : 0);
2845 unsigned int bigend = (BigEndianCPU ? mask : 0);
2847 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2848 byte = ((vaddr & mask) ^ bigend);
2851 memval = (op2 >> (8 * (7 - byte)));
2852 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
2859 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
2860 "sdr r<RT>, <OFFSET>(r<BASE>)"
2864 // start-sanitize-vr4320
2866 // end-sanitize-vr4320
2867 // start-sanitize-vr5400
2869 // end-sanitize-vr5400
2870 // start-sanitize-r5900
2872 // end-sanitize-r5900
2874 // start-sanitize-tx19
2876 // end-sanitize-tx19
2881 unsigned64 mask = 7;
2882 unsigned int reverse = (ReverseEndian ? mask : 0);
2883 unsigned int bigend = (BigEndianCPU ? mask : 0);
2885 address_word vaddr = (GPR[BASE] + EXTEND16 (OFFSET));
2886 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
2887 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2890 byte = ((vaddr & mask) ^ bigend);
2891 memval = (GPR[RT] << (byte * 8));
2892 StoreMemory(uncached,(AccessLength_DOUBLEWORD - byte),memval,0,paddr,vaddr,isREAL);
2896 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
2897 "sh r<RT>, <OFFSET>(r<BASE>)"
2898 *mipsI,mipsII,mipsIII,mipsIV:
2900 // start-sanitize-vr4320
2902 // end-sanitize-vr4320
2903 // start-sanitize-vr5400
2905 // end-sanitize-vr5400
2906 // start-sanitize-r5900
2908 // end-sanitize-r5900
2910 // start-sanitize-tx19
2912 // end-sanitize-tx19
2914 unsigned32 instruction = instruction_0;
2915 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2916 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2917 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2919 address_word vaddr = ((unsigned64)op1 + offset);
2922 if ((vaddr & 1) != 0)
2923 SignalExceptionAddressStore();
2926 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2928 unsigned64 memval = 0;
2929 unsigned64 memval1 = 0;
2930 unsigned64 mask = 0x7;
2931 unsigned int shift = 1;
2932 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2933 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2935 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2936 byte = ((vaddr & mask) ^ (bigend << shift));
2937 memval = ((unsigned64) op2 << (8 * byte));
2939 StoreMemory(uncached,AccessLength_HALFWORD,memval,memval1,paddr,vaddr,isREAL);
2947 00000000000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLL
2948 "sll r<RD>, r<RT>, <SHIFT>"
2949 *mipsI,mipsII,mipsIII,mipsIV:
2951 // start-sanitize-vr4320
2953 // end-sanitize-vr4320
2954 // start-sanitize-vr5400
2956 // end-sanitize-vr5400
2957 // start-sanitize-r5900
2959 // end-sanitize-r5900
2961 // start-sanitize-tx19
2963 // end-sanitize-tx19
2966 unsigned32 temp = (GPR[RT] << s);
2967 GPR[RD] = EXTEND32 (temp);
2971 000000,5.RS,5.RT,5.RD,00000000100:SPECIAL:32::SLLV
2972 "sllv r<RD>, r<RT>, r<RS>"
2973 *mipsI,mipsII,mipsIII,mipsIV:
2975 // start-sanitize-vr4320
2977 // end-sanitize-vr4320
2978 // start-sanitize-vr5400
2980 // end-sanitize-vr5400
2981 // start-sanitize-r5900
2983 // end-sanitize-r5900
2985 // start-sanitize-tx19
2987 // end-sanitize-tx19
2989 int s = MASKED (GPR[RS], 4, 0);
2990 unsigned32 temp = (GPR[RT] << s);
2991 GPR[RD] = EXTEND32 (temp);
2995 000000,5.RS,5.RT,5.RD,00000101010:SPECIAL:32::SLT
2996 "slt r<RD>, r<RS>, r<RT>"
2997 *mipsI,mipsII,mipsIII,mipsIV:
2999 // start-sanitize-vr4320
3001 // end-sanitize-vr4320
3002 // start-sanitize-vr5400
3004 // end-sanitize-vr5400
3005 // start-sanitize-r5900
3007 // end-sanitize-r5900
3009 // start-sanitize-tx19
3011 // end-sanitize-tx19
3013 GPR[RD] = ((signed_word) GPR[RS] < (signed_word) GPR[RT]);
3017 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
3018 "slti r<RT>, r<RS>, <IMMEDIATE>"
3019 *mipsI,mipsII,mipsIII,mipsIV:
3021 // start-sanitize-vr4320
3023 // end-sanitize-vr4320
3024 // start-sanitize-vr5400
3026 // end-sanitize-vr5400
3027 // start-sanitize-r5900
3029 // end-sanitize-r5900
3031 // start-sanitize-tx19
3033 // end-sanitize-tx19
3035 GPR[RT] = ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE));
3039 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
3040 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
3041 *mipsI,mipsII,mipsIII,mipsIV:
3043 // start-sanitize-vr4320
3045 // end-sanitize-vr4320
3046 // start-sanitize-vr5400
3048 // end-sanitize-vr5400
3049 // start-sanitize-r5900
3051 // end-sanitize-r5900
3053 // start-sanitize-tx19
3055 // end-sanitize-tx19
3057 GPR[RT] = ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE));
3060 000000,5.RS,5.RT,5.RD,00000101011:SPECIAL:32::SLTU
3061 "sltu r<RD>, r<RS>, r<RT>"
3062 *mipsI,mipsII,mipsIII,mipsIV:
3064 // start-sanitize-vr4320
3066 // end-sanitize-vr4320
3067 // start-sanitize-vr5400
3069 // end-sanitize-vr5400
3070 // start-sanitize-r5900
3072 // end-sanitize-r5900
3074 // start-sanitize-tx19
3076 // end-sanitize-tx19
3078 GPR[RD] = ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT]);
3082 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
3083 "sra r<RD>, r<RT>, <SHIFT>"
3084 *mipsI,mipsII,mipsIII,mipsIV:
3086 // start-sanitize-vr4320
3088 // end-sanitize-vr4320
3089 // start-sanitize-vr5400
3091 // end-sanitize-vr5400
3092 // start-sanitize-r5900
3094 // end-sanitize-r5900
3096 // start-sanitize-tx19
3098 // end-sanitize-tx19
3101 signed32 temp = (signed32) GPR[RT] >> s;
3102 GPR[RD] = EXTEND32 (temp);
3106 000000,5.RS,5.RT,5.RD,00000000111:SPECIAL:32::SRAV
3107 "srav r<RD>, r<RT>, r<RS>"
3108 *mipsI,mipsII,mipsIII,mipsIV:
3110 // start-sanitize-vr4320
3112 // end-sanitize-vr4320
3113 // start-sanitize-vr5400
3115 // end-sanitize-vr5400
3116 // start-sanitize-r5900
3118 // end-sanitize-r5900
3120 // start-sanitize-tx19
3122 // end-sanitize-tx19
3124 int s = MASKED (GPR[RS], 4, 0);
3125 signed32 temp = (signed32) GPR[RT] >> s;
3126 GPR[RD] = EXTEND32 (temp);
3130 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
3131 "srl r<RD>, r<RT>, <SHIFT>"
3132 *mipsI,mipsII,mipsIII,mipsIV:
3134 // start-sanitize-vr4320
3136 // end-sanitize-vr4320
3137 // start-sanitize-vr5400
3139 // end-sanitize-vr5400
3140 // start-sanitize-r5900
3142 // end-sanitize-r5900
3144 // start-sanitize-tx19
3146 // end-sanitize-tx19
3149 unsigned32 temp = (unsigned32) GPR[RT] >> s;
3150 GPR[RD] = EXTEND32 (temp);
3154 000000,5.RS,5.RT,5.RD,00000000110:SPECIAL:32::SRLV
3155 "srlv r<RD>, r<RT>, r<RS>"
3156 *mipsI,mipsII,mipsIII,mipsIV:
3158 // start-sanitize-vr4320
3160 // end-sanitize-vr4320
3161 // start-sanitize-vr5400
3163 // end-sanitize-vr5400
3164 // start-sanitize-r5900
3166 // end-sanitize-r5900
3168 // start-sanitize-tx19
3170 // end-sanitize-tx19
3172 int s = MASKED (GPR[RS], 4, 0);
3173 unsigned32 temp = (unsigned32) GPR[RT] >> s;
3174 GPR[RD] = EXTEND32 (temp);
3178 000000,5.RS,5.RT,5.RD,00000100010:SPECIAL:32::SUB
3179 "sub r<RD>, r<RS>, r<RT>"
3180 *mipsI,mipsII,mipsIII,mipsIV:
3182 // start-sanitize-vr4320
3184 // end-sanitize-vr4320
3185 // start-sanitize-vr5400
3187 // end-sanitize-vr5400
3188 // start-sanitize-r5900
3190 // end-sanitize-r5900
3192 // start-sanitize-tx19
3194 // end-sanitize-tx19
3196 ALU32_BEGIN (GPR[RS]);
3197 ALU32_SUB (GPR[RT]);
3198 ALU32_END (GPR[RD]);
3202 000000,5.RS,5.RT,5.RD,00000100011:SPECIAL:32::SUBU
3203 "subu r<RD>, r<RS>, r<RT>"
3204 *mipsI,mipsII,mipsIII,mipsIV:
3206 // start-sanitize-vr4320
3208 // end-sanitize-vr4320
3209 // start-sanitize-vr5400
3211 // end-sanitize-vr5400
3212 // start-sanitize-r5900
3214 // end-sanitize-r5900
3216 // start-sanitize-tx19
3218 // end-sanitize-tx19
3220 GPR[RD] = EXTEND32 (GPR[RS] - GPR[RT]);
3224 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
3225 "sw r<RT>, <OFFSET>(r<BASE>)"
3226 *mipsI,mipsII,mipsIII,mipsIV:
3228 // start-sanitize-vr4320
3230 // end-sanitize-vr4320
3231 // start-sanitize-vr5400
3233 // end-sanitize-vr5400
3234 // start-sanitize-r5900
3236 // end-sanitize-r5900
3238 // start-sanitize-tx19
3240 // end-sanitize-tx19
3242 unsigned32 instruction = instruction_0;
3243 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
3244 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
3245 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3247 address_word vaddr = ((unsigned64)op1 + offset);
3250 if ((vaddr & 3) != 0)
3251 SignalExceptionAddressStore();
3254 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3256 unsigned64 memval = 0;
3257 unsigned64 memval1 = 0;
3258 unsigned64 mask = 0x7;
3260 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
3261 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
3262 memval = ((unsigned64) op2 << (8 * byte));
3264 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
3272 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
3273 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3274 *mipsI,mipsII,mipsIII,mipsIV:
3276 // start-sanitize-vr4320
3278 // end-sanitize-vr4320
3279 // start-sanitize-vr5400
3281 // end-sanitize-vr5400
3283 // start-sanitize-tx19
3285 // end-sanitize-tx19
3287 unsigned32 instruction = instruction_0;
3288 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
3289 int destreg = ((instruction >> 16) & 0x0000001F);
3290 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3292 address_word vaddr = ((unsigned64)op1 + offset);
3295 if ((vaddr & 3) != 0)
3296 SignalExceptionAddressStore();
3299 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3301 unsigned64 memval = 0;
3302 unsigned64 memval1 = 0;
3303 unsigned64 mask = 0x7;
3305 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
3306 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
3307 memval = (((unsigned64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
3309 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
3317 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
3318 "swl r<RT>, <OFFSET>(r<BASE>)"
3319 *mipsI,mipsII,mipsIII,mipsIV:
3321 // start-sanitize-vr4320
3323 // end-sanitize-vr4320
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 unsigned32 instruction = instruction_0;
3336 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
3337 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
3338 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3340 address_word vaddr = ((unsigned64)op1 + offset);
3344 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3346 unsigned64 memval = 0;
3347 unsigned64 memval1 = 0;
3348 unsigned64 mask = 3;
3349 unsigned int reverse = (ReverseEndian ? mask : 0);
3350 unsigned int bigend = (BigEndianCPU ? mask : 0);
3352 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
3353 byte = ((vaddr & mask) ^ bigend);
3356 memval = (op2 >> (8 * (3 - byte)));
3357 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
3360 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
3367 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
3368 "swr r<RT>, <OFFSET>(r<BASE>)"
3369 *mipsI,mipsII,mipsIII,mipsIV:
3371 // start-sanitize-vr4320
3373 // end-sanitize-vr4320
3374 // start-sanitize-vr5400
3376 // end-sanitize-vr5400
3377 // start-sanitize-r5900
3379 // end-sanitize-r5900
3381 // start-sanitize-tx19
3383 // end-sanitize-tx19
3385 unsigned64 memval = 0;
3386 unsigned64 mask = 3;
3387 unsigned int reverse = (ReverseEndian ? mask : 0);
3388 unsigned int bigend = (BigEndianCPU ? mask : 0);
3392 address_word vaddr = (GPR[BASE] + EXTEND16 (OFFSET));
3393 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
3394 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
3397 byte = ((vaddr & mask) ^ bigend);
3398 memval = (GPR[RT] << (byte * 8));
3399 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2))
3401 StoreMemory(uncached,(AccessLength_WORD - byte),memval,0,paddr,vaddr,isREAL);
3405 000000000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
3412 // start-sanitize-vr4320
3414 // end-sanitize-vr4320
3415 // start-sanitize-vr5400
3417 // end-sanitize-vr5400
3418 // start-sanitize-r5900
3420 // end-sanitize-r5900
3422 // start-sanitize-tx19
3424 // end-sanitize-tx19
3426 SyncOperation (STYPE);
3430 000000,20.CODE,001100:SPECIAL:32::SYSCALL
3432 *mipsI,mipsII,mipsIII,mipsIV:
3434 // start-sanitize-vr4320
3436 // end-sanitize-vr4320
3437 // start-sanitize-vr5400
3439 // end-sanitize-vr5400
3440 // start-sanitize-r5900
3442 // end-sanitize-r5900
3444 // start-sanitize-tx19
3446 // end-sanitize-tx19
3448 SignalException(SystemCall, instruction_0);
3452 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
3458 // start-sanitize-vr4320
3460 // end-sanitize-vr4320
3461 // start-sanitize-vr5400
3463 // end-sanitize-vr5400
3464 // start-sanitize-r5900
3466 // end-sanitize-r5900
3468 // start-sanitize-tx19
3470 // end-sanitize-tx19
3472 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
3473 SignalException(Trap, instruction_0);
3477 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
3478 "teqi r<RS>, <IMMEDIATE>"
3483 // start-sanitize-vr4320
3485 // end-sanitize-vr4320
3486 // start-sanitize-vr5400
3488 // end-sanitize-vr5400
3489 // start-sanitize-r5900
3491 // end-sanitize-r5900
3493 // start-sanitize-tx19
3495 // end-sanitize-tx19
3497 if ((signed_word) GPR[RS] == (signed_word) EXTEND16 (IMMEDIATE))
3498 SignalException(Trap, instruction_0);
3502 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
3508 // start-sanitize-vr4320
3510 // end-sanitize-vr4320
3511 // start-sanitize-vr5400
3513 // end-sanitize-vr5400
3514 // start-sanitize-r5900
3516 // end-sanitize-r5900
3518 // start-sanitize-tx19
3520 // end-sanitize-tx19
3522 if ((signed_word) GPR[RS] >= (signed_word) GPR[RT])
3523 SignalException(Trap, instruction_0);
3527 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
3528 "tgei r<RS>, <IMMEDIATE>"
3533 // start-sanitize-vr4320
3535 // end-sanitize-vr4320
3536 // start-sanitize-vr5400
3538 // end-sanitize-vr5400
3539 // start-sanitize-r5900
3541 // end-sanitize-r5900
3543 // start-sanitize-tx19
3545 // end-sanitize-tx19
3547 if ((signed_word) GPR[RS] >= (signed_word) EXTEND16 (IMMEDIATE))
3548 SignalException(Trap, instruction_0);
3552 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
3553 "tgeiu r<RS>, <IMMEDIATE>"
3558 // start-sanitize-vr4320
3560 // end-sanitize-vr4320
3561 // start-sanitize-vr5400
3563 // end-sanitize-vr5400
3564 // start-sanitize-r5900
3566 // end-sanitize-r5900
3568 // start-sanitize-tx19
3570 // end-sanitize-tx19
3572 if ((unsigned_word) GPR[RS] >= (unsigned_word) EXTEND16 (IMMEDIATE))
3573 SignalException(Trap, instruction_0);
3577 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
3583 // start-sanitize-vr4320
3585 // end-sanitize-vr4320
3586 // start-sanitize-vr5400
3588 // end-sanitize-vr5400
3589 // start-sanitize-r5900
3591 // end-sanitize-r5900
3593 // start-sanitize-tx19
3595 // end-sanitize-tx19
3597 if ((unsigned_word) GPR[RS] >= (unsigned_word) GPR[RT])
3598 SignalException(Trap, instruction_0);
3602 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
3608 // start-sanitize-vr4320
3610 // end-sanitize-vr4320
3611 // start-sanitize-vr5400
3613 // end-sanitize-vr5400
3614 // start-sanitize-r5900
3616 // end-sanitize-r5900
3618 // start-sanitize-tx19
3620 // end-sanitize-tx19
3622 if ((signed_word) GPR[RS] < (signed_word) GPR[RT])
3623 SignalException(Trap, instruction_0);
3627 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
3628 "tlti r<RS>, <IMMEDIATE>"
3633 // start-sanitize-vr4320
3635 // end-sanitize-vr4320
3636 // start-sanitize-vr5400
3638 // end-sanitize-vr5400
3639 // start-sanitize-r5900
3641 // end-sanitize-r5900
3643 // start-sanitize-tx19
3645 // end-sanitize-tx19
3647 if ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE))
3648 SignalException(Trap, instruction_0);
3652 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
3653 "tltiu r<RS>, <IMMEDIATE>"
3658 // start-sanitize-vr4320
3660 // end-sanitize-vr4320
3661 // start-sanitize-vr5400
3663 // end-sanitize-vr5400
3664 // start-sanitize-r5900
3666 // end-sanitize-r5900
3668 // start-sanitize-tx19
3670 // end-sanitize-tx19
3672 if ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE))
3673 SignalException(Trap, instruction_0);
3677 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
3683 // start-sanitize-vr4320
3685 // end-sanitize-vr4320
3686 // start-sanitize-vr5400
3688 // end-sanitize-vr5400
3689 // start-sanitize-r5900
3691 // end-sanitize-r5900
3693 // start-sanitize-tx19
3695 // end-sanitize-tx19
3697 if ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT])
3698 SignalException(Trap, instruction_0);
3702 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
3708 // start-sanitize-vr4320
3710 // end-sanitize-vr4320
3711 // start-sanitize-vr5400
3713 // end-sanitize-vr5400
3714 // start-sanitize-r5900
3716 // end-sanitize-r5900
3718 // start-sanitize-tx19
3720 // end-sanitize-tx19
3722 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
3723 SignalException(Trap, instruction_0);
3727 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
3728 "tne r<RS>, <IMMEDIATE>"
3733 // start-sanitize-vr4320
3735 // end-sanitize-vr4320
3736 // start-sanitize-vr5400
3738 // end-sanitize-vr5400
3739 // start-sanitize-r5900
3741 // end-sanitize-r5900
3743 // start-sanitize-tx19
3745 // end-sanitize-tx19
3747 if ((signed_word) GPR[RS] != (signed_word) EXTEND16 (IMMEDIATE))
3748 SignalException(Trap, instruction_0);
3752 000000,5.RS,5.RT,5.RD,00000100110:SPECIAL:32::XOR
3753 "xor r<RD>, r<RS>, r<RT>"
3754 *mipsI,mipsII,mipsIII,mipsIV:
3756 // start-sanitize-vr4320
3758 // end-sanitize-vr4320
3759 // start-sanitize-vr5400
3761 // end-sanitize-vr5400
3762 // start-sanitize-r5900
3764 // end-sanitize-r5900
3766 // start-sanitize-tx19
3768 // end-sanitize-tx19
3770 GPR[RD] = GPR[RS] ^ GPR[RT];
3774 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
3775 "xori r<RT>, r<RS>, <IMMEDIATE>"
3776 *mipsI,mipsII,mipsIII,mipsIV:
3778 // start-sanitize-vr4320
3780 // end-sanitize-vr4320
3781 // start-sanitize-vr5400
3783 // end-sanitize-vr5400
3784 // start-sanitize-r5900
3786 // end-sanitize-r5900
3788 // start-sanitize-tx19
3790 // end-sanitize-tx19
3792 GPR[RT] = GPR[RS] ^ IMMEDIATE;
3797 // MIPS Architecture:
3799 // FPU Instruction Set (COP1 & COP1X)
3807 case fmt_single: return "s";
3808 case fmt_double: return "d";
3809 case fmt_word: return "w";
3810 case fmt_long: return "l";
3811 default: return "?";
3821 default: return "?";
3841 :%s::::COND:int cond
3845 case 00: return "f";
3846 case 01: return "un";
3847 case 02: return "eq";
3848 case 03: return "ueq";
3849 case 04: return "olt";
3850 case 05: return "ult";
3851 case 06: return "ole";
3852 case 07: return "ule";
3853 case 010: return "sf";
3854 case 011: return "ngle";
3855 case 012: return "seq";
3856 case 013: return "ngl";
3857 case 014: return "lt";
3858 case 015: return "nge";
3859 case 016: return "le";
3860 case 017: return "ngt";
3861 default: return "?";
3866 010001,10,3.FMT,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
3867 "abs.%s<FMT> f<FD>, f<FS>"
3868 *mipsI,mipsII,mipsIII,mipsIV:
3870 // start-sanitize-vr4320
3872 // end-sanitize-vr4320
3873 // start-sanitize-vr5400
3875 // end-sanitize-vr5400
3877 // start-sanitize-tx19
3879 // end-sanitize-tx19
3881 unsigned32 instruction = instruction_0;
3882 int destreg = ((instruction >> 6) & 0x0000001F);
3883 int fs = ((instruction >> 11) & 0x0000001F);
3884 int format = ((instruction >> 21) & 0x00000007);
3886 if ((format != fmt_single) && (format != fmt_double))
3887 SignalException(ReservedInstruction,instruction);
3889 StoreFPR(destreg,format,AbsoluteValue(ValueFPR(fs,format),format));
3895 010001,10,3.FMT,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt
3896 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
3897 *mipsI,mipsII,mipsIII,mipsIV:
3899 // start-sanitize-vr4320
3901 // end-sanitize-vr4320
3902 // start-sanitize-vr5400
3904 // end-sanitize-vr5400
3906 // start-sanitize-tx19
3908 // end-sanitize-tx19
3910 unsigned32 instruction = instruction_0;
3911 int destreg = ((instruction >> 6) & 0x0000001F);
3912 int fs = ((instruction >> 11) & 0x0000001F);
3913 int ft = ((instruction >> 16) & 0x0000001F);
3914 int format = ((instruction >> 21) & 0x00000007);
3916 if ((format != fmt_single) && (format != fmt_double))
3917 SignalException(ReservedInstruction, instruction);
3919 StoreFPR(destreg,format,Add(ValueFPR(fs,format),ValueFPR(ft,format),format));
3930 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3931 "bc1%s<TF>%s<ND> <OFFSET>"
3932 *mipsI,mipsII,mipsIII:
3933 // start-sanitize-r5900
3935 // end-sanitize-r5900
3937 TRACE_BRANCH_INPUT (PREVCOC1());
3938 if (PREVCOC1() == TF)
3940 address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
3941 TRACE_BRANCH_RESULT (dest);
3946 TRACE_BRANCH_RESULT (0);
3947 NULLIFY_NEXT_INSTRUCTION ();
3951 TRACE_BRANCH_RESULT (NIA);
3955 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3956 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
3957 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
3960 // start-sanitize-vr4320
3962 // end-sanitize-vr4320
3963 // start-sanitize-vr5400
3965 // end-sanitize-vr5400
3967 // start-sanitize-tx19
3969 // end-sanitize-tx19
3971 if (GETFCC(CC) == TF)
3973 DELAY_SLOT (NIA + (EXTEND16 (OFFSET) << 2));
3977 NULLIFY_NEXT_INSTRUCTION ();
3987 :function:::void:do_c_cond_fmt:int fmt, int ft, int fs, int cc, int cond, instruction_word insn
3989 if ((fmt != fmt_single) && (fmt != fmt_double))
3990 SignalException (ReservedInstruction, insn);
3997 unsigned64 ofs = ValueFPR (fs, fmt);
3998 unsigned64 oft = ValueFPR (ft, fmt);
3999 if (NaN (ofs, fmt) || NaN (oft, fmt))
4001 if (FCSR & FP_ENABLE (IO))
4003 FCSR |= FP_CAUSE (IO);
4004 SignalExceptionFPE ();
4012 less = Less (ofs, oft, fmt);
4013 equal = Equal (ofs, oft, fmt);
4016 condition = (((cond & (1 << 2)) && less)
4017 || ((cond & (1 << 1)) && equal)
4018 || ((cond & (1 << 0)) && unordered));
4019 SETFCC (cc, condition);
4023 010001,10,3.FMT,5.FT,5.FS,3.0,00,11,4.COND:COP1:32::C.cond.fmt
4024 *mipsI,mipsII,mipsIII:
4025 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":
4027 do_c_cond_fmt (SD_, FMT, FT, FS, 0, COND, instruction_0);
4030 010001,10,3.FMT,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32::C.cond.fmt
4031 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
4032 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
4035 // start-sanitize-vr4320
4037 // end-sanitize-vr4320
4038 // start-sanitize-vr5400
4040 // end-sanitize-vr5400
4042 // start-sanitize-tx19
4044 // end-sanitize-tx19
4046 do_c_cond_fmt (SD_, FMT, FT, FS, CC, COND, instruction_0);
4050 010001,10,3.FMT,00000,5.FS,5.FD,001010:COP1:64::CEIL.L.fmt
4051 "ceil.l.%s<FMT> f<FD>, f<FS>"
4055 // start-sanitize-vr4320
4057 // end-sanitize-vr4320
4058 // start-sanitize-vr5400
4060 // end-sanitize-vr5400
4061 // start-sanitize-r5900
4063 // end-sanitize-r5900
4065 // start-sanitize-tx19
4067 // end-sanitize-tx19
4069 unsigned32 instruction = instruction_0;
4070 int destreg = ((instruction >> 6) & 0x0000001F);
4071 int fs = ((instruction >> 11) & 0x0000001F);
4072 int format = ((instruction >> 21) & 0x00000007);
4074 if ((format != fmt_single) && (format != fmt_double))
4075 SignalException(ReservedInstruction,instruction);
4077 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_long));
4082 010001,10,3.FMT,00000,5.FS,5.FD,001110:COP1:32::CEIL.W
4087 // start-sanitize-vr4320
4089 // end-sanitize-vr4320
4090 // start-sanitize-vr5400
4092 // end-sanitize-vr5400
4093 // start-sanitize-r5900
4095 // end-sanitize-r5900
4097 // start-sanitize-tx19
4099 // end-sanitize-tx19
4101 unsigned32 instruction = instruction_0;
4102 int destreg = ((instruction >> 6) & 0x0000001F);
4103 int fs = ((instruction >> 11) & 0x0000001F);
4104 int format = ((instruction >> 21) & 0x00000007);
4106 if ((format != fmt_single) && (format != fmt_double))
4107 SignalException(ReservedInstruction,instruction);
4109 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_word));
4116 010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
4117 "c%s<X>c1 r<RT>, f<FS>"
4125 PENDING_FILL((FS + FCR0IDX),VL4_8(GPR[RT]));
4127 PENDING_FILL((FS + FCR31IDX),VL4_8(GPR[RT]));
4129 PENDING_FILL(COCIDX,0); /* special case */
4132 { /* control from */
4134 PENDING_FILL(RT,SIGNEXTEND(FCR0,32));
4136 PENDING_FILL(RT,SIGNEXTEND(FCR31,32));
4140 010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
4141 "c%s<X>c1 r<RT>, f<FS>"
4144 // start-sanitize-vr4320
4146 // end-sanitize-vr4320
4147 // start-sanitize-vr5400
4149 // end-sanitize-vr5400
4150 // start-sanitize-r5900
4152 // end-sanitize-r5900
4154 // start-sanitize-tx19
4156 // end-sanitize-tx19
4161 TRACE_ALU_INPUT1 (GPR[RT]);
4164 FCR0 = VL4_8(GPR[RT]);
4165 TRACE_ALU_RESULT (FCR0);
4169 FCR31 = VL4_8(GPR[RT]);
4170 SETFCC(0,((FCR31 & (1 << 23)) ? 1 : 0));
4171 TRACE_ALU_RESULT (FCR31);
4175 TRACE_ALU_RESULT0 ();
4180 { /* control from */
4183 TRACE_ALU_INPUT1 (FCR0);
4184 GPR[RT] = SIGNEXTEND (FCR0, 32);
4188 TRACE_ALU_INPUT1 (FCR31);
4189 GPR[RT] = SIGNEXTEND (FCR31, 32);
4191 TRACE_ALU_RESULT (GPR[RT]);
4198 // FIXME: Does not correctly differentiate between mips*
4200 010001,10,3.FMT,00000,5.FS,5.FD,100001:COP1:32::CVT.D.fmt
4201 "cvt.d.%s<FMT> f<FD>, f<FS>"
4202 *mipsI,mipsII,mipsIII,mipsIV:
4204 // start-sanitize-vr4320
4206 // end-sanitize-vr4320
4207 // start-sanitize-vr5400
4209 // end-sanitize-vr5400
4211 // start-sanitize-tx19
4213 // end-sanitize-tx19
4215 unsigned32 instruction = instruction_0;
4216 int destreg = ((instruction >> 6) & 0x0000001F);
4217 int fs = ((instruction >> 11) & 0x0000001F);
4218 int format = ((instruction >> 21) & 0x00000007);
4220 if ((format == fmt_double) | 0)
4221 SignalException(ReservedInstruction,instruction);
4223 StoreFPR(destreg,fmt_double,Convert(GETRM(),ValueFPR(fs,format),format,fmt_double));
4228 010001,10,3.FMT,00000,5.FS,5.FD,100101:COP1:64::CVT.L.fmt
4229 "cvt.l.%s<FMT> f<FD>, f<FS>"
4233 // start-sanitize-vr4320
4235 // end-sanitize-vr4320
4236 // start-sanitize-vr5400
4238 // end-sanitize-vr5400
4240 // start-sanitize-tx19
4242 // end-sanitize-tx19
4244 unsigned32 instruction = instruction_0;
4245 int destreg = ((instruction >> 6) & 0x0000001F);
4246 int fs = ((instruction >> 11) & 0x0000001F);
4247 int format = ((instruction >> 21) & 0x00000007);
4249 if ((format == fmt_long) | ((format == fmt_long) || (format == fmt_word)))
4250 SignalException(ReservedInstruction,instruction);
4252 StoreFPR(destreg,fmt_long,Convert(GETRM(),ValueFPR(fs,format),format,fmt_long));
4258 // FIXME: Does not correctly differentiate between mips*
4260 010001,10,3.FMT,00000,5.FS,5.FD,100000:COP1:32::CVT.S.fmt
4261 "cvt.s.%s<FMT> f<FD>, f<FS>"
4262 *mipsI,mipsII,mipsIII,mipsIV:
4264 // start-sanitize-vr4320
4266 // end-sanitize-vr4320
4267 // start-sanitize-vr5400
4269 // end-sanitize-vr5400
4271 // start-sanitize-tx19
4273 // end-sanitize-tx19
4275 unsigned32 instruction = instruction_0;
4276 int destreg = ((instruction >> 6) & 0x0000001F);
4277 int fs = ((instruction >> 11) & 0x0000001F);
4278 int format = ((instruction >> 21) & 0x00000007);
4280 if ((format == fmt_single) | 0)
4281 SignalException(ReservedInstruction,instruction);
4283 StoreFPR(destreg,fmt_single,Convert(GETRM(),ValueFPR(fs,format),format,fmt_single));
4288 010001,10,3.FMT,00000,5.FS,5.FD,100100:COP1:32::CVT.W.fmt
4289 "cvt.w.%s<FMT> f<FD>, f<FS>"
4290 *mipsI,mipsII,mipsIII,mipsIV:
4292 // start-sanitize-vr4320
4294 // end-sanitize-vr4320
4295 // start-sanitize-vr5400
4297 // end-sanitize-vr5400
4299 // start-sanitize-tx19
4301 // end-sanitize-tx19
4303 unsigned32 instruction = instruction_0;
4304 int destreg = ((instruction >> 6) & 0x0000001F);
4305 int fs = ((instruction >> 11) & 0x0000001F);
4306 int format = ((instruction >> 21) & 0x00000007);
4308 if ((format == fmt_word) | ((format == fmt_long) || (format == fmt_word)))
4309 SignalException(ReservedInstruction,instruction);
4311 StoreFPR(destreg,fmt_word,Convert(GETRM(),ValueFPR(fs,format),format,fmt_word));
4316 010001,10,3.FMT,5.FT,5.FS,5.FD,000011:COP1:32::DIV.fmt
4317 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
4318 *mipsI,mipsII,mipsIII,mipsIV:
4320 // start-sanitize-vr4320
4322 // end-sanitize-vr4320
4323 // start-sanitize-vr5400
4325 // end-sanitize-vr5400
4327 // start-sanitize-tx19
4329 // end-sanitize-tx19
4331 unsigned32 instruction = instruction_0;
4332 int destreg = ((instruction >> 6) & 0x0000001F);
4333 int fs = ((instruction >> 11) & 0x0000001F);
4334 int ft = ((instruction >> 16) & 0x0000001F);
4335 int format = ((instruction >> 21) & 0x00000007);
4337 if ((format != fmt_single) && (format != fmt_double))
4338 SignalException(ReservedInstruction,instruction);
4340 StoreFPR(destreg,format,Divide(ValueFPR(fs,format),ValueFPR(ft,format),format));
4347 010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
4348 "dm%s<X>c1 r<RT>, f<FS>"
4353 if (SizeFGR() == 64)
4354 PENDING_FILL((FS + FGRIDX),GPR[RT]);
4355 else if ((FS & 0x1) == 0)
4357 PENDING_FILL(((FS + 1) + FGRIDX),VH4_8(GPR[RT]));
4358 PENDING_FILL((FS + FGRIDX),VL4_8(GPR[RT]));
4363 if (SizeFGR() == 64)
4364 PENDING_FILL(RT,FGR[FS]);
4365 else if ((FS & 0x1) == 0)
4366 PENDING_FILL(RT,(SET64HI(FGR[FS+1]) | FGR[FS]));
4368 PENDING_FILL(RT,SET64HI(0xDEADC0DE) | 0xBAD0BAD0);
4371 010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
4372 "dm%s<X>c1 r<RT>, f<FS>"
4375 // start-sanitize-vr4320
4377 // end-sanitize-vr4320
4378 // start-sanitize-vr5400
4380 // end-sanitize-vr5400
4381 // start-sanitize-r5900
4383 // end-sanitize-r5900
4385 // start-sanitize-tx19
4387 // end-sanitize-tx19
4391 if (SizeFGR() == 64)
4392 StoreFPR (FS, fmt_uninterpreted_64, GPR[RT]);
4393 else if ((FS & 0x1) == 0)
4394 StoreFPR (FS, fmt_uninterpreted_64, SET64HI (FGR[FS+1]) | FGR[FS]);
4398 if (SizeFGR() == 64)
4400 else if ((FS & 0x1) == 0)
4401 GPR[RT] = SET64HI (FGR[FS+1]) | FGR[FS];
4403 GPR[RT] = SET64HI (0xDEADC0DE) | 0xBAD0BAD0;
4408 010001,10,3.FMT,00000,5.FS,5.FD,001011:COP1:64::FLOOR.L.fmt
4409 "floor.l.%s<FMT> f<FD>, f<FS>"
4413 // start-sanitize-vr4320
4415 // end-sanitize-vr4320
4416 // start-sanitize-vr5400
4418 // end-sanitize-vr5400
4419 // start-sanitize-r5900
4421 // end-sanitize-r5900
4423 // start-sanitize-tx19
4425 // end-sanitize-tx19
4427 unsigned32 instruction = instruction_0;
4428 int destreg = ((instruction >> 6) & 0x0000001F);
4429 int fs = ((instruction >> 11) & 0x0000001F);
4430 int format = ((instruction >> 21) & 0x00000007);
4432 if ((format != fmt_single) && (format != fmt_double))
4433 SignalException(ReservedInstruction,instruction);
4435 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_long));
4440 010001,10,3.FMT,00000,5.FS,5.FD,001111:COP1:32::FLOOR.W.fmt
4441 "floor.w.%s<FMT> f<FD>, f<FS>"
4446 // start-sanitize-vr4320
4448 // end-sanitize-vr4320
4449 // start-sanitize-vr5400
4451 // end-sanitize-vr5400
4452 // start-sanitize-r5900
4454 // end-sanitize-r5900
4456 // start-sanitize-tx19
4458 // end-sanitize-tx19
4460 unsigned32 instruction = instruction_0;
4461 int destreg = ((instruction >> 6) & 0x0000001F);
4462 int fs = ((instruction >> 11) & 0x0000001F);
4463 int format = ((instruction >> 21) & 0x00000007);
4465 if ((format != fmt_single) && (format != fmt_double))
4466 SignalException(ReservedInstruction,instruction);
4468 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_word));
4473 110101,5.BASE,5.FT,16.OFFSET:COP1:64::LDC1
4474 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
4479 // start-sanitize-vr4320
4481 // end-sanitize-vr4320
4482 // start-sanitize-vr5400
4484 // end-sanitize-vr5400
4486 // start-sanitize-tx19
4488 // end-sanitize-tx19
4490 address_word vaddr = GPR[BASE] + EXTEND16 (OFFSET);
4493 if ((vaddr & 7) != 0)
4494 SignalExceptionAddressLoad();
4498 AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL);
4499 LoadMemory(&memval,0,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4500 COP_LD(((instruction_0 >> 26) & 0x3),FT,memval);;
4505 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64::LDXC1
4506 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
4509 // start-sanitize-vr4320
4511 // end-sanitize-vr4320
4512 // start-sanitize-vr5400
4514 // end-sanitize-vr5400
4516 unsigned32 instruction = instruction_0;
4517 int destreg = ((instruction >> 6) & 0x0000001F);
4518 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4519 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4521 address_word vaddr = ((unsigned64)op1 + op2);
4524 if ((vaddr & 7) != 0)
4525 SignalExceptionAddressLoad();
4528 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4530 unsigned64 memval = 0;
4531 unsigned64 memval1 = 0;
4532 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4533 COP_LD(1,destreg,memval);;
4541 110001,5.BASE,5.FT,16.OFFSET:COP1:32::LWC1
4542 "lwc1 f<FT>, <OFFSET>(r<BASE>)"
4543 *mipsI,mipsII,mipsIII,mipsIV:
4545 // start-sanitize-vr4320
4547 // end-sanitize-vr4320
4548 // start-sanitize-vr5400
4550 // end-sanitize-vr5400
4551 // start-sanitize-r5900
4553 // end-sanitize-r5900
4555 // start-sanitize-tx19
4557 // end-sanitize-tx19
4559 unsigned32 instruction = instruction_0;
4560 signed_word offset = EXTEND16 (OFFSET);
4561 int destreg UNUSED = ((instruction >> 16) & 0x0000001F);
4562 signed_word op1 UNUSED = GPR[((instruction >> 21) & 0x0000001F)];
4564 address_word vaddr = ((uword64)op1 + offset);
4567 if ((vaddr & 3) != 0)
4568 SignalExceptionAddressLoad();
4571 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4574 uword64 memval1 = 0;
4576 unsigned int shift = 2;
4577 unsigned int reverse UNUSED = (ReverseEndian ? (mask >> shift) : 0);
4578 unsigned int bigend UNUSED = (BigEndianCPU ? (mask >> shift) : 0);
4579 unsigned int byte UNUSED;
4580 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4581 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4582 byte = ((vaddr & mask) ^ (bigend << shift));
4583 COP_LW(((instruction >> 26) & 0x3),destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
4590 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32::LWXC1
4591 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
4594 // start-sanitize-vr4320
4596 // end-sanitize-vr4320
4597 // start-sanitize-vr5400
4599 // end-sanitize-vr5400
4601 unsigned32 instruction = instruction_0;
4602 int destreg = ((instruction >> 6) & 0x0000001F);
4603 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4604 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4606 address_word vaddr = ((unsigned64)op1 + op2);
4609 if ((vaddr & 3) != 0)
4610 SignalExceptionAddressLoad();
4613 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4615 unsigned64 memval = 0;
4616 unsigned64 memval1 = 0;
4617 unsigned64 mask = 0x7;
4618 unsigned int shift = 2;
4619 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4620 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4622 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4623 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4624 byte = ((vaddr & mask) ^ (bigend << shift));
4625 COP_LW(1,destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
4634 // FIXME: Not correct for mips*
4636 010011,5.FR,5.FT,5.FS,5.FD,100,001:COP1X:32,f::MADD.D
4637 "madd.d f<FD>, f<FR>, f<FS>, f<FT>"
4640 // start-sanitize-vr4320
4642 // end-sanitize-vr4320
4643 // start-sanitize-vr5400
4645 // end-sanitize-vr5400
4647 unsigned32 instruction = instruction_0;
4648 int destreg = ((instruction >> 6) & 0x0000001F);
4649 int fs = ((instruction >> 11) & 0x0000001F);
4650 int ft = ((instruction >> 16) & 0x0000001F);
4651 int fr = ((instruction >> 21) & 0x0000001F);
4653 StoreFPR(destreg,fmt_double,Add(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4658 010011,5.FR,5.FT,5.FS,5.FD,100,000:COP1X:32,f::MADD.S
4659 "madd.s f<FD>, f<FR>, f<FS>, f<FT>"
4662 // start-sanitize-vr4320
4664 // end-sanitize-vr4320
4665 // start-sanitize-vr5400
4667 // end-sanitize-vr5400
4669 unsigned32 instruction = instruction_0;
4670 int destreg = ((instruction >> 6) & 0x0000001F);
4671 int fs = ((instruction >> 11) & 0x0000001F);
4672 int ft = ((instruction >> 16) & 0x0000001F);
4673 int fr = ((instruction >> 21) & 0x0000001F);
4675 StoreFPR(destreg,fmt_single,Add(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4682 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4683 "m%s<X>c1 r<RT>, f<FS>"
4690 if (SizeFGR() == 64)
4691 PENDING_FILL ((FS + FGRIDX), (SET64HI(0xDEADC0DE) | VL4_8(GPR[RT])));
4693 PENDING_FILL ((FS + FGRIDX), VL4_8(GPR[RT]));
4696 PENDING_FILL (RT, SIGNEXTEND(FGR[FS],32));
4698 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4699 "m%s<X>c1 r<RT>, f<FS>"
4702 // start-sanitize-vr4320
4704 // end-sanitize-vr4320
4705 // start-sanitize-vr5400
4707 // end-sanitize-vr5400
4709 // start-sanitize-tx19
4711 // end-sanitize-tx19
4715 StoreFPR (FS, fmt_uninterpreted_32, VL4_8 (GPR[RT]));
4717 GPR[RT] = SIGNEXTEND(FGR[FS],32);
4721 010001,10,3.FMT,00000,5.FS,5.FD,000110:COP1:32::MOV.fmt
4722 "mov.%s<FMT> f<FD>, f<FS>"
4723 *mipsI,mipsII,mipsIII,mipsIV:
4725 // start-sanitize-vr4320
4727 // end-sanitize-vr4320
4728 // start-sanitize-vr5400
4730 // end-sanitize-vr5400
4732 // start-sanitize-tx19
4734 // end-sanitize-tx19
4736 unsigned32 instruction = instruction_0;
4737 int destreg = ((instruction >> 6) & 0x0000001F);
4738 int fs = ((instruction >> 11) & 0x0000001F);
4739 int format = ((instruction >> 21) & 0x00000007);
4741 StoreFPR(destreg,format,ValueFPR(fs,format));
4747 000000,5.RS,3.CC,0,1.TF,5.RD,00000000001:SPECIAL:32::MOVtf
4748 "mov%s<TF> r<RD>, r<RS>, <CC>"
4751 // start-sanitize-vr4320
4753 // end-sanitize-vr4320
4754 // start-sanitize-vr5400
4756 // end-sanitize-vr5400
4757 // start-sanitize-r5900
4759 // end-sanitize-r5900
4761 if (GETFCC(CC) == TF)
4767 010001,10,3.FMT,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32::MOVtf.fmt
4768 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
4771 // start-sanitize-vr4320
4773 // end-sanitize-vr4320
4774 // start-sanitize-vr5400
4776 // end-sanitize-vr5400
4777 // start-sanitize-r5900
4779 // end-sanitize-r5900
4781 unsigned32 instruction = instruction_0;
4782 int format = ((instruction >> 21) & 0x00000007);
4784 if (GETFCC(CC) == TF)
4785 StoreFPR (FD, format, ValueFPR (FS, format));
4787 StoreFPR (FD, format, ValueFPR (FD, format));
4792 010001,10,3.FMT,5.RT,5.FS,5.FD,010011:COP1:32::MOVN.fmt
4795 // start-sanitize-vr4320
4797 // end-sanitize-vr4320
4798 // start-sanitize-vr5400
4800 // end-sanitize-vr5400
4801 // start-sanitize-r5900
4803 // end-sanitize-r5900
4805 unsigned32 instruction = instruction_0;
4806 int destreg = ((instruction >> 6) & 0x0000001F);
4807 int fs = ((instruction >> 11) & 0x0000001F);
4808 int format = ((instruction >> 21) & 0x00000007);
4810 StoreFPR(destreg,format,ValueFPR(fs,format));
4818 // MOVT.fmt see MOVtf.fmt
4822 010001,10,3.FMT,5.RT,5.FS,5.FD,010010:COP1:32::MOVZ.fmt
4823 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
4826 // start-sanitize-vr4320
4828 // end-sanitize-vr4320
4829 // start-sanitize-vr5400
4831 // end-sanitize-vr5400
4832 // start-sanitize-r5900
4834 // end-sanitize-r5900
4836 unsigned32 instruction = instruction_0;
4837 int destreg = ((instruction >> 6) & 0x0000001F);
4838 int fs = ((instruction >> 11) & 0x0000001F);
4839 int format = ((instruction >> 21) & 0x00000007);
4841 StoreFPR(destreg,format,ValueFPR(fs,format));
4847 010011,5.FR,5.FT,5.FS,5.FD,101,001:COP1X:32::MSUB.D
4848 "msub.d f<FD>, f<FR>, f<FS>, f<FT>"
4851 // start-sanitize-vr4320
4853 // end-sanitize-vr4320
4854 // start-sanitize-vr5400
4856 // end-sanitize-vr5400
4857 // start-sanitize-r5900
4859 // end-sanitize-r5900
4861 unsigned32 instruction = instruction_0;
4862 int destreg = ((instruction >> 6) & 0x0000001F);
4863 int fs = ((instruction >> 11) & 0x0000001F);
4864 int ft = ((instruction >> 16) & 0x0000001F);
4865 int fr = ((instruction >> 21) & 0x0000001F);
4867 StoreFPR(destreg,fmt_double,Sub(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4873 010011,5.FR,5.FT,5.FS,5.FD,101000:COP1X:32::MSUB.S
4874 "msub.s f<FD>, f<FR>, f<FS>, f<FT>"
4877 // start-sanitize-vr4320
4879 // end-sanitize-vr4320
4880 // start-sanitize-vr5400
4882 // end-sanitize-vr5400
4883 // start-sanitize-r5900
4885 // end-sanitize-r5900
4887 unsigned32 instruction = instruction_0;
4888 int destreg = ((instruction >> 6) & 0x0000001F);
4889 int fs = ((instruction >> 11) & 0x0000001F);
4890 int ft = ((instruction >> 16) & 0x0000001F);
4891 int fr = ((instruction >> 21) & 0x0000001F);
4893 StoreFPR(destreg,fmt_single,Sub(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4901 010001,10,3.FMT,5.FT,5.FS,5.FD,000010:COP1:32::MUL.fmt
4902 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
4903 *mipsI,mipsII,mipsIII,mipsIV:
4905 // start-sanitize-vr4320
4907 // end-sanitize-vr4320
4908 // start-sanitize-vr5400
4910 // end-sanitize-vr5400
4912 // start-sanitize-tx19
4914 // end-sanitize-tx19
4916 unsigned32 instruction = instruction_0;
4917 int destreg = ((instruction >> 6) & 0x0000001F);
4918 int fs = ((instruction >> 11) & 0x0000001F);
4919 int ft = ((instruction >> 16) & 0x0000001F);
4920 int format = ((instruction >> 21) & 0x00000007);
4922 if ((format != fmt_single) && (format != fmt_double))
4923 SignalException(ReservedInstruction,instruction);
4925 StoreFPR(destreg,format,Multiply(ValueFPR(fs,format),ValueFPR(ft,format),format));
4930 010001,10,3.FMT,00000,5.FS,5.FD,000111:COP1:32::NEG.fmt
4931 "neg.%s<FMT> f<FD>, f<FS>"
4932 *mipsI,mipsII,mipsIII,mipsIV:
4934 // start-sanitize-vr4320
4936 // end-sanitize-vr4320
4937 // start-sanitize-vr5400
4939 // end-sanitize-vr5400
4941 // start-sanitize-tx19
4943 // end-sanitize-tx19
4945 unsigned32 instruction = instruction_0;
4946 int destreg = ((instruction >> 6) & 0x0000001F);
4947 int fs = ((instruction >> 11) & 0x0000001F);
4948 int format = ((instruction >> 21) & 0x00000007);
4950 if ((format != fmt_single) && (format != fmt_double))
4951 SignalException(ReservedInstruction,instruction);
4953 StoreFPR(destreg,format,Negate(ValueFPR(fs,format),format));
4959 010011,5.FR,5.FT,5.FS,5.FD,110001:COP1X:32::NMADD.D
4960 "nmadd.d f<FD>, f<FR>, f<FS>, f<FT>"
4963 // start-sanitize-vr4320
4965 // end-sanitize-vr4320
4966 // start-sanitize-vr5400
4968 // end-sanitize-vr5400
4970 unsigned32 instruction = instruction_0;
4971 int destreg = ((instruction >> 6) & 0x0000001F);
4972 int fs = ((instruction >> 11) & 0x0000001F);
4973 int ft = ((instruction >> 16) & 0x0000001F);
4974 int fr = ((instruction >> 21) & 0x0000001F);
4976 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));
4982 010011,5.FR,5.FT,5.FS,5.FD,110000:COP1X:32::NMADD.S
4983 "nmadd.s f<FD>, f<FR>, f<FS>, f<FT>"
4986 // start-sanitize-vr4320
4988 // end-sanitize-vr4320
4989 // start-sanitize-vr5400
4991 // end-sanitize-vr5400
4993 unsigned32 instruction = instruction_0;
4994 int destreg = ((instruction >> 6) & 0x0000001F);
4995 int fs = ((instruction >> 11) & 0x0000001F);
4996 int ft = ((instruction >> 16) & 0x0000001F);
4997 int fr = ((instruction >> 21) & 0x0000001F);
4999 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));
5005 010011,5.FR,5.FT,5.FS,5.FD,111001:COP1X:32::NMSUB.D
5006 "nmsub.d f<FD>, f<FR>, f<FS>, f<FT>"
5009 // start-sanitize-vr4320
5011 // end-sanitize-vr4320
5012 // start-sanitize-vr5400
5014 // end-sanitize-vr5400
5016 unsigned32 instruction = instruction_0;
5017 int destreg = ((instruction >> 6) & 0x0000001F);
5018 int fs = ((instruction >> 11) & 0x0000001F);
5019 int ft = ((instruction >> 16) & 0x0000001F);
5020 int fr = ((instruction >> 21) & 0x0000001F);
5022 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));
5028 010011,5.FR,5.FT,5.FS,5.FD,111000:COP1X:32::NMSUB.S
5029 "nmsub.s f<FD>, f<FR>, f<FS>, f<FT>"
5032 // start-sanitize-vr4320
5034 // end-sanitize-vr4320
5035 // start-sanitize-vr5400
5037 // end-sanitize-vr5400
5039 unsigned32 instruction = instruction_0;
5040 int destreg = ((instruction >> 6) & 0x0000001F);
5041 int fs = ((instruction >> 11) & 0x0000001F);
5042 int ft = ((instruction >> 16) & 0x0000001F);
5043 int fr = ((instruction >> 21) & 0x0000001F);
5045 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));
5050 010011,5.BASE,5.INDEX,5.HINT,00000001111:COP1X:32::PREFX
5051 "prefx <HINT>, r<INDEX>(r<BASE>)"
5054 // start-sanitize-vr4320
5056 // end-sanitize-vr4320
5057 // start-sanitize-vr5400
5059 // end-sanitize-vr5400
5061 unsigned32 instruction = instruction_0;
5062 int fs = ((instruction >> 11) & 0x0000001F);
5063 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5064 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5066 address_word vaddr = ((unsigned64)op1 + (unsigned64)op2);
5069 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5070 Prefetch(uncached,paddr,vaddr,isDATA,fs);
5074 010001,10,3.FMT,00000,5.FS,5.FD,010101:COP1:32::RECIP.fmt
5076 "recip.%s<FMT> f<FD>, f<FS>"
5078 // start-sanitize-vr4320
5080 // end-sanitize-vr4320
5081 // start-sanitize-vr5400
5083 // end-sanitize-vr5400
5085 unsigned32 instruction = instruction_0;
5086 int destreg = ((instruction >> 6) & 0x0000001F);
5087 int fs = ((instruction >> 11) & 0x0000001F);
5088 int format = ((instruction >> 21) & 0x00000007);
5090 if ((format != fmt_single) && (format != fmt_double))
5091 SignalException(ReservedInstruction,instruction);
5093 StoreFPR(destreg,format,Recip(ValueFPR(fs,format),format));
5098 010001,10,3.FMT,00000,5.FS,5.FD,001000:COP1:64::ROUND.L.fmt
5099 "round.l.%s<FMT> f<FD>, f<FS>"
5103 // start-sanitize-vr4320
5105 // end-sanitize-vr4320
5106 // start-sanitize-vr5400
5108 // end-sanitize-vr5400
5109 // start-sanitize-r5900
5111 // end-sanitize-r5900
5113 // start-sanitize-tx19
5115 // end-sanitize-tx19
5117 unsigned32 instruction = instruction_0;
5118 int destreg = ((instruction >> 6) & 0x0000001F);
5119 int fs = ((instruction >> 11) & 0x0000001F);
5120 int format = ((instruction >> 21) & 0x00000007);
5122 if ((format != fmt_single) && (format != fmt_double))
5123 SignalException(ReservedInstruction,instruction);
5125 StoreFPR(destreg,fmt_long,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_long));
5130 010001,10,3.FMT,00000,5.FS,5.FD,001100:COP1:32::ROUND.W.fmt
5131 "round.w.%s<FMT> f<FD>, f<FS>"
5136 // start-sanitize-vr4320
5138 // end-sanitize-vr4320
5139 // start-sanitize-vr5400
5141 // end-sanitize-vr5400
5142 // start-sanitize-r5900
5144 // end-sanitize-r5900
5146 // start-sanitize-tx19
5148 // end-sanitize-tx19
5150 unsigned32 instruction = instruction_0;
5151 int destreg = ((instruction >> 6) & 0x0000001F);
5152 int fs = ((instruction >> 11) & 0x0000001F);
5153 int format = ((instruction >> 21) & 0x00000007);
5155 if ((format != fmt_single) && (format != fmt_double))
5156 SignalException(ReservedInstruction,instruction);
5158 StoreFPR(destreg,fmt_word,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_word));
5163 010001,10,3.FMT,00000,5.FS,5.FD,010110:COP1:32::RSQRT.fmt
5165 "rsqrt.%s<FMT> f<FD>, f<FS>"
5167 // start-sanitize-vr4320
5169 // end-sanitize-vr4320
5170 // start-sanitize-vr5400
5172 // end-sanitize-vr5400
5174 unsigned32 instruction = instruction_0;
5175 int destreg = ((instruction >> 6) & 0x0000001F);
5176 int fs = ((instruction >> 11) & 0x0000001F);
5177 int format = ((instruction >> 21) & 0x00000007);
5179 if ((format != fmt_single) && (format != fmt_double))
5180 SignalException(ReservedInstruction,instruction);
5182 StoreFPR(destreg,format,Recip(SquareRoot(ValueFPR(fs,format),format),format));
5187 111101,5.BASE,5.FT,16.OFFSET:COP1:64::SDC1
5188 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
5193 // start-sanitize-vr4320
5195 // end-sanitize-vr4320
5196 // start-sanitize-vr5400
5198 // end-sanitize-vr5400
5200 // start-sanitize-tx19
5202 // end-sanitize-tx19
5204 address_word vaddr = GPR[BASE] + EXTEND16 (OFFSET);
5206 if ((vaddr & 7) != 0)
5207 SignalExceptionAddressStore();
5212 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
5213 memval = (unsigned64) COP_SD(((instruction_0 >> 26) & 0x3),FT);
5214 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,0,paddr,vaddr,isREAL);
5219 010011,5.RS,5.RT,vvvvv,00000001001:COP1X:64::SDXC1
5222 // start-sanitize-vr4320
5224 // end-sanitize-vr4320
5225 // start-sanitize-vr5400
5227 // end-sanitize-vr5400
5229 unsigned32 instruction = instruction_0;
5230 int fs = ((instruction >> 11) & 0x0000001F);
5231 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5232 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5234 address_word vaddr = ((unsigned64)op1 + op2);
5237 if ((vaddr & 7) != 0)
5238 SignalExceptionAddressStore();
5241 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5243 unsigned64 memval = 0;
5244 unsigned64 memval1 = 0;
5245 memval = (unsigned64)COP_SD(1,fs);
5247 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
5255 010001,10,3.FMT,00000,5.FS,5.FD,000100:COP1:32::SQRT.fmt
5256 "sqrt.%s<FMT> f<FD>, f<FS>"
5261 // start-sanitize-vr4320
5263 // end-sanitize-vr4320
5264 // start-sanitize-vr5400
5266 // end-sanitize-vr5400
5268 // start-sanitize-tx19
5270 // end-sanitize-tx19
5272 unsigned32 instruction = instruction_0;
5273 int destreg = ((instruction >> 6) & 0x0000001F);
5274 int fs = ((instruction >> 11) & 0x0000001F);
5275 int format = ((instruction >> 21) & 0x00000007);
5277 if ((format != fmt_single) && (format != fmt_double))
5278 SignalException(ReservedInstruction,instruction);
5280 StoreFPR(destreg,format,(SquareRoot(ValueFPR(fs,format),format)));
5285 010001,10,3.FMT,5.FT,5.FS,5.FD,000001:COP1:32::SUB.fmt
5286 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
5287 *mipsI,mipsII,mipsIII,mipsIV:
5289 // start-sanitize-vr4320
5291 // end-sanitize-vr4320
5292 // start-sanitize-vr5400
5294 // end-sanitize-vr5400
5296 // start-sanitize-tx19
5298 // end-sanitize-tx19
5300 unsigned32 instruction = instruction_0;
5301 int destreg = ((instruction >> 6) & 0x0000001F);
5302 int fs = ((instruction >> 11) & 0x0000001F);
5303 int ft = ((instruction >> 16) & 0x0000001F);
5304 int format = ((instruction >> 21) & 0x00000007);
5306 if ((format != fmt_single) && (format != fmt_double))
5307 SignalException(ReservedInstruction,instruction);
5309 StoreFPR(destreg,format,Sub(ValueFPR(fs,format),ValueFPR(ft,format),format));
5315 111001,5.BASE,5.FT,16.OFFSET:COP1:32::SWC1
5316 "swc1 f<FT>, <OFFSET>(r<BASE>)"
5317 *mipsI,mipsII,mipsIII,mipsIV:
5319 // start-sanitize-vr4320
5321 // end-sanitize-vr4320
5322 // start-sanitize-vr5400
5324 // end-sanitize-vr5400
5325 // start-sanitize-r5900
5327 // end-sanitize-r5900
5329 // start-sanitize-tx19
5331 // end-sanitize-tx19
5333 unsigned32 instruction = instruction_0;
5334 signed_word offset = EXTEND16 (OFFSET);
5335 int destreg UNUSED = ((instruction >> 16) & 0x0000001F);
5336 signed_word op1 UNUSED = GPR[((instruction >> 21) & 0x0000001F)];
5338 address_word vaddr = ((uword64)op1 + offset);
5341 if ((vaddr & 3) != 0)
5342 SignalExceptionAddressStore();
5345 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5348 uword64 memval1 = 0;
5351 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
5352 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
5353 memval = (((uword64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
5355 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5363 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32::SWXC1
5364 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
5367 // start-sanitize-vr4320
5369 // end-sanitize-vr4320
5370 // start-sanitize-vr5400
5372 // end-sanitize-vr5400
5374 unsigned32 instruction = instruction_0;
5375 int fs = ((instruction >> 11) & 0x0000001F);
5376 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5377 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5379 address_word vaddr = ((unsigned64)op1 + op2);
5382 if ((vaddr & 3) != 0)
5383 SignalExceptionAddressStore();
5386 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5388 unsigned64 memval = 0;
5389 unsigned64 memval1 = 0;
5390 unsigned64 mask = 0x7;
5392 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
5393 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
5394 memval = (((unsigned64)COP_SW(1,fs)) << (8 * byte));
5396 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5404 010001,10,3.FMT,00000,5.FS,5.FD,001001:COP1:64::TRUNC.L.fmt
5405 "trunc.l.%s<FMT> f<FD>, f<FS>"
5409 // start-sanitize-vr4320
5411 // end-sanitize-vr4320
5412 // start-sanitize-vr5400
5414 // end-sanitize-vr5400
5415 // start-sanitize-r5900
5417 // end-sanitize-r5900
5419 // start-sanitize-tx19
5421 // end-sanitize-tx19
5423 unsigned32 instruction = instruction_0;
5424 int destreg = ((instruction >> 6) & 0x0000001F);
5425 int fs = ((instruction >> 11) & 0x0000001F);
5426 int format = ((instruction >> 21) & 0x00000007);
5428 if ((format != fmt_single) && (format != fmt_double))
5429 SignalException(ReservedInstruction,instruction);
5431 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_long));
5436 010001,10,3.FMT,00000,5.FS,5.FD,001101:COP1:32::TRUNC.W
5437 "trunc.w.%s<FMT> f<FD>, f<FS>"
5442 // start-sanitize-vr4320
5444 // end-sanitize-vr4320
5445 // start-sanitize-vr5400
5447 // end-sanitize-vr5400
5448 // start-sanitize-r5900
5450 // end-sanitize-r5900
5452 // start-sanitize-tx19
5454 // end-sanitize-tx19
5456 unsigned32 instruction = instruction_0;
5457 int destreg = ((instruction >> 6) & 0x0000001F);
5458 int fs = ((instruction >> 11) & 0x0000001F);
5459 int format = ((instruction >> 21) & 0x00000007);
5461 if ((format != fmt_single) && (format != fmt_double))
5462 SignalException(ReservedInstruction,instruction);
5464 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_word));
5470 // MIPS Architecture:
5472 // System Control Instruction Set (COP0)
5476 010000,01000,00000,16.OFFSET:COP0:32::BC0F
5478 *mipsI,mipsII,mipsIII,mipsIV:
5480 // start-sanitize-vr4320
5482 // end-sanitize-vr4320
5483 // start-sanitize-vr5400
5485 // end-sanitize-vr5400
5486 // start-sanitize-r5900
5488 // end-sanitize-r5900
5491 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
5493 *mipsI,mipsII,mipsIII,mipsIV:
5495 // start-sanitize-vr4320
5497 // end-sanitize-vr4320
5498 // start-sanitize-vr5400
5500 // end-sanitize-vr5400
5501 // start-sanitize-r5900
5503 // end-sanitize-r5900
5506 010000,01000,00001,16.OFFSET:COP0:32::BC0T
5508 *mipsI,mipsII,mipsIII,mipsIV:
5509 // start-sanitize-r5900
5511 // end-sanitize-r5900
5515 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
5517 *mipsI,mipsII,mipsIII,mipsIV:
5519 // start-sanitize-vr4320
5521 // end-sanitize-vr4320
5522 // start-sanitize-vr5400
5524 // end-sanitize-vr5400
5525 // start-sanitize-r5900
5527 // end-sanitize-r5900
5530 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
5534 // start-sanitize-vr4320
5536 // end-sanitize-vr4320
5537 // start-sanitize-vr5400
5539 // end-sanitize-vr5400
5540 // start-sanitize-r5900
5542 // end-sanitize-r5900
5544 // start-sanitize-tx19
5546 // end-sanitize-tx19
5548 unsigned32 instruction = instruction_0;
5549 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
5550 int hint = ((instruction >> 16) & 0x0000001F);
5551 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5553 address_word vaddr = (op1 + offset);
5556 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5557 CacheOp(hint,vaddr,paddr,instruction);
5562 010000,10000,000000000000000,111001:COP0:32::DI
5564 *mipsI,mipsII,mipsIII,mipsIV:
5566 // start-sanitize-vr4320
5568 // end-sanitize-vr4320
5569 // start-sanitize-vr5400
5571 // end-sanitize-vr5400
5572 // start-sanitize-r5900
5574 // end-sanitize-r5900
5577 010000,10000,000000000000000,111000:COP0:32::EI
5579 *mipsI,mipsII,mipsIII,mipsIV:
5581 // start-sanitize-vr4320
5583 // end-sanitize-vr4320
5584 // start-sanitize-vr5400
5586 // end-sanitize-vr5400
5587 // start-sanitize-r5900
5589 // end-sanitize-r5900
5592 010000,10000,000000000000000,011000:COP0:32::ERET
5597 // start-sanitize-vr4320
5599 // end-sanitize-vr4320
5600 // start-sanitize-vr5400
5602 // end-sanitize-vr5400
5603 // start-sanitize-r5900
5605 // end-sanitize-r5900
5608 010000,00000,5.RT,5.RD,00000,6.REGX:COP0:32::MFC0
5609 "mfc0 r<RT>, r<RD> # <REGX>"
5610 *mipsI,mipsII,mipsIII,mipsIV:
5612 // start-sanitize-vr4320
5614 // end-sanitize-vr4320
5615 // start-sanitize-vr5400
5617 // end-sanitize-vr5400
5618 // start-sanitize-r5900
5620 // end-sanitize-r5900
5622 DecodeCoproc (instruction_0);
5625 010000,00100,5.RT,5.RD,00000,6.REGX:COP0:32::MTC0
5626 "mtc0 r<RT>, r<RD> # <REGX>"
5627 *mipsI,mipsII,mipsIII,mipsIV:
5629 // start-sanitize-vr4320
5631 // end-sanitize-vr4320
5632 // start-sanitize-vr5400
5634 // end-sanitize-vr5400
5635 // start-sanitize-r5900
5637 // end-sanitize-r5900
5639 DecodeCoproc (instruction_0);
5643 010000,10000,000000000000000,001000:COP0:32::TLBP
5645 *mipsI,mipsII,mipsIII,mipsIV:
5647 // start-sanitize-vr4320
5649 // end-sanitize-vr4320
5650 // start-sanitize-vr5400
5652 // end-sanitize-vr5400
5653 // start-sanitize-r5900
5655 // end-sanitize-r5900
5658 010000,10000,000000000000000,000001:COP0:32::TLBR
5660 *mipsI,mipsII,mipsIII,mipsIV:
5662 // start-sanitize-vr4320
5664 // end-sanitize-vr4320
5665 // start-sanitize-vr5400
5667 // end-sanitize-vr5400
5668 // start-sanitize-r5900
5670 // end-sanitize-r5900
5673 010000,10000,000000000000000,000010:COP0:32::TLBWI
5675 *mipsI,mipsII,mipsIII,mipsIV:
5677 // start-sanitize-vr4320
5679 // end-sanitize-vr4320
5680 // start-sanitize-vr5400
5682 // end-sanitize-vr5400
5683 // start-sanitize-r5900
5685 // end-sanitize-r5900
5688 010000,10000,000000000000000,000110:COP0:32::TLBWR
5690 *mipsI,mipsII,mipsIII,mipsIV:
5692 // start-sanitize-vr4320
5694 // end-sanitize-vr4320
5695 // start-sanitize-vr5400
5697 // end-sanitize-vr5400
5698 // start-sanitize-r5900
5700 // end-sanitize-r5900
5703 :include:16::m16.igen
5704 // start-sanitize-vr4320
5705 :include::vr4320:vr4320.igen
5706 // end-sanitize-vr4320
5707 // start-sanitize-vr5400
5708 :include::vr5400:vr5400.igen
5709 :include:64,f::mdmx.igen
5710 // end-sanitize-vr5400
5711 // start-sanitize-r5900
5712 :include::r5900:r5900.igen
5713 // end-sanitize-r5900
5715 // start-sanitize-cygnus-never
5717 // // FIXME FIXME FIXME What is this instruction?
5718 // 111011,5.RS,5.RT,16.OFFSET:NORMAL:32::<INT>
5723 // // start-sanitize-r5900
5725 // // end-sanitize-r5900
5727 // // start-sanitize-tx19
5729 // // end-sanitize-tx19
5731 // unsigned32 instruction = instruction_0;
5732 // signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
5733 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5734 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5736 // if (CoProcPresent(3))
5737 // SignalException(CoProcessorUnusable);
5739 // SignalException(ReservedInstruction,instruction);
5743 // end-sanitize-cygnus-never
5744 // start-sanitize-cygnus-never
5746 // // FIXME FIXME FIXME What is this?
5747 // 11100,******,00001:RR:16::SDBBP
5750 // unsigned32 instruction = instruction_0;
5751 // if (have_extendval)
5752 // SignalException (ReservedInstruction, instruction);
5754 // SignalException(DebugBreakPoint,instruction);
5758 // end-sanitize-cygnus-never
5759 // start-sanitize-cygnus-never
5761 // // FIXME FIXME FIXME What is this?
5762 // 000000,********************,001110:SPECIAL:32::SDBBP
5765 // unsigned32 instruction = instruction_0;
5767 // SignalException(DebugBreakPoint,instruction);
5771 // end-sanitize-cygnus-never
5772 // start-sanitize-cygnus-never
5774 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5775 // // isn't yet reconized by this simulator.
5776 // 000000,5.RS,5.RT,0000000000101000:SPECIAL:32::MADD16
5779 // unsigned32 instruction = instruction_0;
5780 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5781 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5783 // CHECKHILO("Multiply-Add");
5785 // unsigned64 temp = (op1 * op2);
5786 // temp += (SET64HI(VL4_8(HI)) | VL4_8(LO));
5787 // LO = SIGNEXTEND((unsigned64)VL4_8(temp),32);
5788 // HI = SIGNEXTEND((unsigned64)VH4_8(temp),32);
5793 // end-sanitize-cygnus-never
5794 // start-sanitize-cygnus-never
5796 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5797 // // isn't yet reconized by this simulator.
5798 // 000000,5.RS,5.RT,0000000000101001:SPECIAL:64::DMADD16
5801 // unsigned32 instruction = instruction_0;
5802 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5803 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5805 // CHECKHILO("Multiply-Add");
5807 // unsigned64 temp = (op1 * op2);
5813 // end-sanitize-cygnus-never