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>)"
1615 unsigned32 instruction = instruction_0;
1616 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1617 int destreg = ((instruction >> 16) & 0x0000001F);
1618 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1620 address_word vaddr = ((unsigned64)op1 + offset);
1623 if ((vaddr & 0x0f) != 0)
1624 SignalExceptionAddressLoad();
1627 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1629 unsigned64 memval = 0;
1630 unsigned64 memval1 = 0;
1631 unsigned128 qw = U16_8(memval, memval1); /* XXX: check order */
1632 /* XXX: block on VU0 pipeline if necessary */
1633 LoadMemory(&memval,&memval1,uncached,AccessLength_QUADWORD,paddr,vaddr,isDATA,isREAL);
1634 COP_LQ(((instruction >> 26) & 0x3),destreg,qw);;
1638 #endif /* TARGET_SKY */
1643 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL
1644 "ldl r<RT>, <OFFSET>(r<BASE>)"
1648 // start-sanitize-vr4320
1650 // end-sanitize-vr4320
1651 // start-sanitize-vr5400
1653 // end-sanitize-vr5400
1654 // start-sanitize-r5900
1656 // end-sanitize-r5900
1658 // start-sanitize-tx19
1660 // end-sanitize-tx19
1662 unsigned32 instruction = instruction_0;
1663 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1664 int destreg = ((instruction >> 16) & 0x0000001F);
1665 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1667 address_word vaddr = ((unsigned64)op1 + offset);
1671 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1673 unsigned64 memval = 0;
1674 unsigned64 memval1 = 0;
1675 unsigned64 mask = 7;
1676 unsigned int reverse = (ReverseEndian ? mask : 0);
1677 unsigned int bigend = (BigEndianCPU ? mask : 0);
1679 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1680 byte = ((vaddr & mask) ^ bigend);
1683 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
1684 GPR[destreg] = ((memval << ((7 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((7 - byte) * 8)) - 1)));
1691 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR
1692 "ldr r<RT>, <OFFSET>(r<BASE>)"
1696 // start-sanitize-vr4320
1698 // end-sanitize-vr4320
1699 // start-sanitize-vr5400
1701 // end-sanitize-vr5400
1702 // start-sanitize-r5900
1704 // end-sanitize-r5900
1706 // start-sanitize-tx19
1708 // end-sanitize-tx19
1710 unsigned32 instruction = instruction_0;
1711 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1712 int destreg = ((instruction >> 16) & 0x0000001F);
1713 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1715 address_word vaddr = ((unsigned64)op1 + offset);
1719 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1721 unsigned64 memval = 0;
1722 unsigned64 memval1 = 0;
1723 unsigned64 mask = 7;
1724 unsigned int reverse = (ReverseEndian ? mask : 0);
1725 unsigned int bigend = (BigEndianCPU ? mask : 0);
1727 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
1728 byte = ((vaddr & mask) ^ bigend);
1731 LoadMemory(&memval,&memval1,uncached,(7 - byte),paddr,vaddr,isDATA,isREAL);
1737 srcmask = ((unsigned64)-1 << (8 * (8 - byte)));
1738 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
1746 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH
1747 "lh r<RT>, <OFFSET>(r<BASE>)"
1748 *mipsI,mipsII,mipsIII,mipsIV:
1750 // start-sanitize-vr4320
1752 // end-sanitize-vr4320
1753 // start-sanitize-vr5400
1755 // end-sanitize-vr5400
1756 // start-sanitize-r5900
1758 // end-sanitize-r5900
1760 // start-sanitize-tx19
1762 // end-sanitize-tx19
1764 unsigned32 instruction = instruction_0;
1765 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1766 int destreg = ((instruction >> 16) & 0x0000001F);
1767 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1769 address_word vaddr = ((unsigned64)op1 + offset);
1772 if ((vaddr & 1) != 0)
1773 SignalExceptionAddressLoad();
1776 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1778 unsigned64 memval = 0;
1779 unsigned64 memval1 = 0;
1780 unsigned64 mask = 0x7;
1781 unsigned int shift = 1;
1782 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1783 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1785 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1786 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1787 byte = ((vaddr & mask) ^ (bigend << shift));
1788 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0x0000FFFF),16));
1795 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU
1796 "lhu r<RT>, <OFFSET>(r<BASE>)"
1797 *mipsI,mipsII,mipsIII,mipsIV:
1799 // start-sanitize-vr4320
1801 // end-sanitize-vr4320
1802 // start-sanitize-vr5400
1804 // end-sanitize-vr5400
1805 // start-sanitize-r5900
1807 // end-sanitize-r5900
1809 // start-sanitize-tx19
1811 // end-sanitize-tx19
1813 unsigned32 instruction = instruction_0;
1814 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1815 int destreg = ((instruction >> 16) & 0x0000001F);
1816 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1818 address_word vaddr = ((unsigned64)op1 + offset);
1821 if ((vaddr & 1) != 0)
1822 SignalExceptionAddressLoad();
1825 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1827 unsigned64 memval = 0;
1828 unsigned64 memval1 = 0;
1829 unsigned64 mask = 0x7;
1830 unsigned int shift = 1;
1831 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1832 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1834 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1835 LoadMemory(&memval,&memval1,uncached,AccessLength_HALFWORD,paddr,vaddr,isDATA,isREAL);
1836 byte = ((vaddr & mask) ^ (bigend << shift));
1837 GPR[destreg] = (((memval >> (8 * byte)) & 0x0000FFFF));
1844 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL
1845 "ll r<RT>, <OFFSET>(r<BASE>)"
1850 // start-sanitize-vr4320
1852 // end-sanitize-vr4320
1853 // start-sanitize-vr5400
1855 // end-sanitize-vr5400
1856 // start-sanitize-r5900
1858 // end-sanitize-r5900
1860 // start-sanitize-tx19
1862 // end-sanitize-tx19
1864 unsigned32 instruction = instruction_0;
1865 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1866 int destreg = ((instruction >> 16) & 0x0000001F);
1867 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1869 address_word vaddr = ((unsigned64)op1 + offset);
1872 if ((vaddr & 3) != 0)
1873 SignalExceptionAddressLoad();
1876 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1878 unsigned64 memval = 0;
1879 unsigned64 memval1 = 0;
1880 unsigned64 mask = 0x7;
1881 unsigned int shift = 2;
1882 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1883 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
1885 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
1886 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
1887 byte = ((vaddr & mask) ^ (bigend << shift));
1888 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
1896 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD
1897 "lld r<RT>, <OFFSET>(r<BASE>)"
1901 // start-sanitize-vr4320
1903 // end-sanitize-vr4320
1904 // start-sanitize-vr5400
1906 // end-sanitize-vr5400
1907 // start-sanitize-r5900
1909 // end-sanitize-r5900
1911 // start-sanitize-tx19
1913 // end-sanitize-tx19
1915 unsigned32 instruction = instruction_0;
1916 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1917 int destreg = ((instruction >> 16) & 0x0000001F);
1918 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1920 address_word vaddr = ((unsigned64)op1 + offset);
1923 if ((vaddr & 7) != 0)
1924 SignalExceptionAddressLoad();
1927 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1929 unsigned64 memval = 0;
1930 unsigned64 memval1 = 0;
1931 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
1932 GPR[destreg] = memval;
1940 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI
1941 "lui r<RT>, <IMMEDIATE>"
1942 *mipsI,mipsII,mipsIII,mipsIV:
1944 // start-sanitize-vr4320
1946 // end-sanitize-vr4320
1947 // start-sanitize-vr5400
1949 // end-sanitize-vr5400
1950 // start-sanitize-r5900
1952 // end-sanitize-r5900
1954 // start-sanitize-tx19
1956 // end-sanitize-tx19
1958 GPR[RT] = EXTEND32 (IMMEDIATE << 16);
1962 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW
1963 "lw r<RT>, <OFFSET>(r<BASE>)"
1964 *mipsI,mipsII,mipsIII,mipsIV:
1966 // start-sanitize-vr4320
1968 // end-sanitize-vr4320
1969 // start-sanitize-vr5400
1971 // end-sanitize-vr5400
1972 // start-sanitize-r5900
1974 // end-sanitize-r5900
1976 // start-sanitize-tx19
1978 // end-sanitize-tx19
1980 unsigned32 instruction = instruction_0;
1981 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
1982 int destreg = ((instruction >> 16) & 0x0000001F);
1983 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
1985 address_word vaddr = ((unsigned64)op1 + offset);
1988 if ((vaddr & 3) != 0)
1989 SignalExceptionAddressLoad();
1992 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
1994 unsigned64 memval = 0;
1995 unsigned64 memval1 = 0;
1996 unsigned64 mask = 0x7;
1997 unsigned int shift = 2;
1998 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
1999 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2001 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2002 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2003 byte = ((vaddr & mask) ^ (bigend << shift));
2004 GPR[destreg] = (SIGNEXTEND(((memval >> (8 * byte)) & 0xFFFFFFFF),32));
2011 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz
2012 "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2013 *mipsI,mipsII,mipsIII,mipsIV:
2015 // start-sanitize-vr4320
2017 // end-sanitize-vr4320
2018 // start-sanitize-vr5400
2020 // end-sanitize-vr5400
2021 // start-sanitize-r5900
2023 // end-sanitize-r5900
2025 // start-sanitize-tx19
2027 // end-sanitize-tx19
2029 unsigned32 instruction = instruction_0;
2030 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2031 int destreg = ((instruction >> 16) & 0x0000001F);
2032 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2034 address_word vaddr = ((unsigned64)op1 + offset);
2037 if ((vaddr & 3) != 0)
2038 SignalExceptionAddressLoad();
2041 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2043 unsigned64 memval = 0;
2044 unsigned64 memval1 = 0;
2045 unsigned64 mask = 0x7;
2046 unsigned int shift = 2;
2047 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2048 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2050 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2051 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2052 byte = ((vaddr & mask) ^ (bigend << shift));
2053 COP_LW(((instruction >> 26) & 0x3),destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
2060 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL
2061 "lwl r<RT>, <OFFSET>(r<BASE>)"
2062 *mipsI,mipsII,mipsIII,mipsIV:
2064 // start-sanitize-vr4320
2066 // end-sanitize-vr4320
2067 // start-sanitize-vr5400
2069 // end-sanitize-vr5400
2070 // start-sanitize-r5900
2072 // end-sanitize-r5900
2074 // start-sanitize-tx19
2076 // end-sanitize-tx19
2078 unsigned32 instruction = instruction_0;
2079 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2080 int destreg = ((instruction >> 16) & 0x0000001F);
2081 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2083 address_word vaddr = ((unsigned64)op1 + offset);
2087 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2089 unsigned64 memval = 0;
2090 unsigned64 memval1 = 0;
2091 unsigned64 mask = 3;
2092 unsigned int reverse = (ReverseEndian ? mask : 0);
2093 unsigned int bigend = (BigEndianCPU ? mask : 0);
2095 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2096 byte = ((vaddr & mask) ^ bigend);
2099 LoadMemory(&memval,&memval1,uncached,byte,paddr,vaddr,isDATA,isREAL);
2100 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
2103 GPR[destreg] = ((memval << ((3 - byte) * 8)) | (GPR[destreg] & (((unsigned64)1 << ((3 - byte) * 8)) - 1)));
2104 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
2111 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR
2112 "lwr r<RT>, <OFFSET>(r<BASE>)"
2113 *mipsI,mipsII,mipsIII,mipsIV:
2115 // start-sanitize-vr4320
2117 // end-sanitize-vr4320
2118 // start-sanitize-vr5400
2120 // end-sanitize-vr5400
2121 // start-sanitize-r5900
2123 // end-sanitize-r5900
2125 // start-sanitize-tx19
2127 // end-sanitize-tx19
2129 unsigned32 instruction = instruction_0;
2130 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2131 int destreg = ((instruction >> 16) & 0x0000001F);
2132 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2134 address_word vaddr = ((unsigned64)op1 + offset);
2138 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2140 unsigned64 memval = 0;
2141 unsigned64 memval1 = 0;
2142 unsigned64 mask = 3;
2143 unsigned int reverse = (ReverseEndian ? mask : 0);
2144 unsigned int bigend = (BigEndianCPU ? mask : 0);
2146 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2147 byte = ((vaddr & mask) ^ bigend);
2150 LoadMemory(&memval,&memval1,uncached,(3 - byte),paddr,vaddr,isDATA,isREAL);
2151 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
2159 srcmask = ((unsigned64)-1 << (8 * (4 - byte)));
2160 GPR[destreg] = ((GPR[destreg] & srcmask) | (memval >> (8 * byte)));
2162 GPR[destreg] = SIGNEXTEND(GPR[destreg],32);
2169 100111,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWU
2170 "lwu r<RT>, <OFFSET>(r<BASE>)"
2174 // start-sanitize-vr4320
2176 // end-sanitize-vr4320
2177 // start-sanitize-vr5400
2179 // end-sanitize-vr5400
2180 // start-sanitize-r5900
2182 // end-sanitize-r5900
2184 // start-sanitize-tx19
2186 // end-sanitize-tx19
2188 unsigned32 instruction = instruction_0;
2189 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2190 int destreg = ((instruction >> 16) & 0x0000001F);
2191 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2193 address_word vaddr = ((unsigned64)op1 + offset);
2196 if ((vaddr & 3) != 0)
2197 SignalExceptionAddressLoad();
2200 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2202 unsigned64 memval = 0;
2203 unsigned64 memval1 = 0;
2204 unsigned64 mask = 0x7;
2205 unsigned int shift = 2;
2206 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2207 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2209 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2210 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
2211 byte = ((vaddr & mask) ^ (bigend << shift));
2212 GPR[destreg] = (((memval >> (8 * byte)) & 0xFFFFFFFF));
2219 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI
2221 *mipsI,mipsII,mipsIII,mipsIV:
2223 // start-sanitize-vr4320
2225 // end-sanitize-vr4320
2226 // start-sanitize-vr5400
2228 // end-sanitize-vr5400
2229 // start-sanitize-r5900
2231 // end-sanitize-r5900
2233 // start-sanitize-tx19
2235 // end-sanitize-tx19
2244 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO
2246 *mipsI,mipsII,mipsIII,mipsIV:
2248 // start-sanitize-vr4320
2250 // end-sanitize-vr4320
2251 // start-sanitize-vr5400
2253 // end-sanitize-vr5400
2254 // start-sanitize-r5900
2256 // end-sanitize-r5900
2258 // start-sanitize-tx19
2260 // end-sanitize-tx19
2264 LOACCESS = 3; /* 3rd instruction will be safe */
2269 000000,5.RS,5.RT,5.RD,00000001011:SPECIAL:32::MOVN
2270 "movn r<RD>, r<RS>, r<RT>"
2273 // start-sanitize-vr4320
2275 // end-sanitize-vr4320
2276 // start-sanitize-vr5400
2278 // end-sanitize-vr5400
2279 // start-sanitize-r5900
2281 // end-sanitize-r5900
2288 000000,5.RS,5.RT,5.RD,00000001010:SPECIAL:32::MOVZ
2289 "movz r<RD>, r<RS>, r<RT>"
2292 // start-sanitize-vr4320
2294 // end-sanitize-vr4320
2295 // start-sanitize-vr5400
2297 // end-sanitize-vr5400
2298 // start-sanitize-r5900
2300 // end-sanitize-r5900
2307 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI
2309 *mipsI,mipsII,mipsIII,mipsIV:
2311 // start-sanitize-vr4320
2313 // end-sanitize-vr4320
2314 // start-sanitize-vr5400
2316 // end-sanitize-vr5400
2317 // start-sanitize-r5900
2319 // end-sanitize-r5900
2321 // start-sanitize-tx19
2323 // end-sanitize-tx19
2327 sim_io_eprintf (sd, "MT (move-to) over-writing HI register value\n");
2331 HIACCESS = 3; /* 3rd instruction will be safe */
2336 000000,5.RS,000000000000000010011:SPECIAL:32::MTLO
2338 *mipsI,mipsII,mipsIII,mipsIV:
2340 // start-sanitize-vr4320
2342 // end-sanitize-vr4320
2343 // start-sanitize-vr5400
2345 // end-sanitize-vr5400
2346 // start-sanitize-r5900
2348 // end-sanitize-r5900
2350 // start-sanitize-tx19
2352 // end-sanitize-tx19
2356 sim_io_eprintf (sd, "MT (move-to) over-writing LO register value\n");
2360 LOACCESS = 3; /* 3rd instruction will be safe */
2365 000000,5.RS,5.RT,00000,00000011000:SPECIAL:32::MULT
2367 *mipsI,mipsII,mipsIII,mipsIV:
2368 // start-sanitize-vr4320
2370 // end-sanitize-vr4320
2373 CHECKHILO ("Multiplication");
2374 prod = (((signed64)(signed32) GPR[RS])
2375 * ((signed64)(signed32) GPR[RT]));
2376 LO = EXTEND32 (VL4_8 (prod));
2377 HI = EXTEND32 (VH4_8 (prod));
2381 000000,5.RS,5.RT,5.RD,00000011000:SPECIAL:32::MULT
2382 "mult r<RD>, r<RS>, r<RT>"
2384 // start-sanitize-vr5400
2386 // end-sanitize-vr5400
2387 // start-sanitize-r5900
2389 // end-sanitize-r5900
2391 // start-sanitize-tx19
2393 // end-sanitize-tx19
2396 CHECKHILO ("Multiplication");
2397 prod = (((signed64)(signed32) GPR[RS])
2398 * ((signed64)(signed32) GPR[RT]));
2399 LO = EXTEND32 (VL4_8 (prod));
2400 HI = EXTEND32 (VH4_8 (prod));
2406 000000,5.RS,5.RT,00000,00000011001:SPECIAL:32::MULTU
2407 "multu r<RS>, r<RT>"
2408 *mipsI,mipsII,mipsIII,mipsIV:
2409 // start-sanitize-vr4320
2411 // end-sanitize-vr4320
2414 CHECKHILO ("Multiplication");
2415 prod = (((unsigned64)(unsigned32) GPR[RS])
2416 * ((unsigned64)(unsigned32) GPR[RT]));
2417 LO = EXTEND32 (VL4_8 (prod));
2418 HI = EXTEND32 (VH4_8 (prod));
2420 000000,5.RS,5.RT,5.RD,00000011001:SPECIAL:32::MULTU
2421 "multu r<RD>, r<RS>, r<RT>"
2423 // start-sanitize-vr5400
2425 // end-sanitize-vr5400
2426 // start-sanitize-r5900
2428 // end-sanitize-r5900
2430 // start-sanitize-tx19
2432 // end-sanitize-tx19
2435 CHECKHILO ("Multiplication");
2436 prod = (((unsigned64)(unsigned32) GPR[RS])
2437 * ((unsigned64)(unsigned32) GPR[RT]));
2438 LO = EXTEND32 (VL4_8 (prod));
2439 HI = EXTEND32 (VH4_8 (prod));
2445 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR
2446 "nor r<RD>, r<RS>, r<RT>"
2447 *mipsI,mipsII,mipsIII,mipsIV:
2449 // start-sanitize-vr4320
2451 // end-sanitize-vr4320
2452 // start-sanitize-vr5400
2454 // end-sanitize-vr5400
2455 // start-sanitize-r5900
2457 // end-sanitize-r5900
2459 // start-sanitize-tx19
2461 // end-sanitize-tx19
2463 GPR[RD] = ~ (GPR[RS] | GPR[RT]);
2467 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR
2468 "or r<RD>, r<RS>, r<RT>"
2469 *mipsI,mipsII,mipsIII,mipsIV:
2471 // start-sanitize-vr4320
2473 // end-sanitize-vr4320
2474 // start-sanitize-vr5400
2476 // end-sanitize-vr5400
2477 // start-sanitize-r5900
2479 // end-sanitize-r5900
2481 // start-sanitize-tx19
2483 // end-sanitize-tx19
2485 GPR[RD] = (GPR[RS] | GPR[RT]);
2489 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI
2490 "ori r<RT>, r<RS>, <IMMEDIATE>"
2491 *mipsI,mipsII,mipsIII,mipsIV:
2493 // start-sanitize-vr4320
2495 // end-sanitize-vr4320
2496 // start-sanitize-vr5400
2498 // end-sanitize-vr5400
2499 // start-sanitize-r5900
2501 // end-sanitize-r5900
2503 // start-sanitize-tx19
2505 // end-sanitize-tx19
2507 GPR[RT] = (GPR[RS] | IMMEDIATE);
2511 110011,5.RS,nnnnn,16.OFFSET:NORMAL:32::PREF
2514 // start-sanitize-vr4320
2516 // end-sanitize-vr4320
2517 // start-sanitize-vr5400
2519 // end-sanitize-vr5400
2520 // start-sanitize-r5900
2522 // end-sanitize-r5900
2524 unsigned32 instruction = instruction_0;
2525 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2526 int hint = ((instruction >> 16) & 0x0000001F);
2527 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2529 address_word vaddr = ((unsigned64)op1 + offset);
2533 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
2534 Prefetch(uncached,paddr,vaddr,isDATA,hint);
2539 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB
2540 "sb r<RT>, <OFFSET>(r<BASE>)"
2541 *mipsI,mipsII,mipsIII,mipsIV:
2543 // start-sanitize-vr4320
2545 // end-sanitize-vr4320
2546 // start-sanitize-vr5400
2548 // end-sanitize-vr5400
2549 // start-sanitize-r5900
2551 // end-sanitize-r5900
2553 // start-sanitize-tx19
2555 // end-sanitize-tx19
2557 unsigned32 instruction = instruction_0;
2558 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2559 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2560 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2562 address_word vaddr = ((unsigned64)op1 + offset);
2566 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2568 unsigned64 memval = 0;
2569 unsigned64 memval1 = 0;
2570 unsigned64 mask = 0x7;
2571 unsigned int shift = 0;
2572 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2573 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2575 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2576 byte = ((vaddr & mask) ^ (bigend << shift));
2577 memval = ((unsigned64) op2 << (8 * byte));
2579 StoreMemory(uncached,AccessLength_BYTE,memval,memval1,paddr,vaddr,isREAL);
2587 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC
2588 "sc r<RT>, <OFFSET>(r<BASE>)"
2593 // start-sanitize-vr4320
2595 // end-sanitize-vr4320
2596 // start-sanitize-vr5400
2598 // end-sanitize-vr5400
2599 // start-sanitize-r5900
2601 // end-sanitize-r5900
2603 // start-sanitize-tx19
2605 // end-sanitize-tx19
2607 unsigned32 instruction = instruction_0;
2608 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2609 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2610 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2612 address_word vaddr = ((unsigned64)op1 + offset);
2615 if ((vaddr & 3) != 0)
2616 SignalExceptionAddressStore();
2619 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2621 unsigned64 memval = 0;
2622 unsigned64 memval1 = 0;
2623 unsigned64 mask = 0x7;
2625 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
2626 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
2627 memval = ((unsigned64) op2 << (8 * byte));
2630 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
2632 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2639 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD
2640 "scd r<RT>, <OFFSET>(r<BASE>)"
2644 // start-sanitize-vr4320
2646 // end-sanitize-vr4320
2647 // start-sanitize-vr5400
2649 // end-sanitize-vr5400
2650 // start-sanitize-r5900
2652 // end-sanitize-r5900
2654 // start-sanitize-tx19
2656 // end-sanitize-tx19
2658 unsigned32 instruction = instruction_0;
2659 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2660 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2661 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2663 address_word vaddr = ((unsigned64)op1 + offset);
2666 if ((vaddr & 7) != 0)
2667 SignalExceptionAddressStore();
2670 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2672 unsigned64 memval = 0;
2673 unsigned64 memval1 = 0;
2677 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2679 GPR[(instruction >> 16) & 0x0000001F] = LLBIT;
2686 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD
2687 "sd r<RT>, <OFFSET>(r<BASE>)"
2691 // start-sanitize-vr4320
2693 // end-sanitize-vr4320
2694 // start-sanitize-vr5400
2696 // end-sanitize-vr5400
2697 // start-sanitize-r5900
2699 // end-sanitize-r5900
2701 // start-sanitize-tx19
2703 // end-sanitize-tx19
2705 unsigned32 instruction = instruction_0;
2706 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2707 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2708 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2710 address_word vaddr = ((unsigned64)op1 + offset);
2713 if ((vaddr & 7) != 0)
2714 SignalExceptionAddressStore();
2717 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2719 unsigned64 memval = 0;
2720 unsigned64 memval1 = 0;
2723 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2731 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz
2732 "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
2737 // start-sanitize-vr4320
2739 // end-sanitize-vr4320
2740 // start-sanitize-vr5400
2742 // end-sanitize-vr5400
2743 // start-sanitize-r5900
2745 // end-sanitize-r5900
2747 // start-sanitize-tx19
2749 // end-sanitize-tx19
2751 unsigned32 instruction = instruction_0;
2752 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2753 int destreg = ((instruction >> 16) & 0x0000001F);
2754 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2756 address_word vaddr = ((unsigned64)op1 + offset);
2759 if ((vaddr & 7) != 0)
2760 SignalExceptionAddressStore();
2763 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2765 unsigned64 memval = 0;
2766 unsigned64 memval1 = 0;
2767 memval = (unsigned64)COP_SD(((instruction >> 26) & 0x3),destreg);
2769 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
2777 // start-sanitize-sky
2778 111010,5.BASE,5.RT,16.OFFSET:NORMAL:64::SQC2
2779 "sqc2 r<RT>, <OFFSET>(r<BASE>)"
2783 unsigned32 instruction = instruction_0;
2784 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2785 int destreg = ((instruction >> 16) & 0x0000001F);
2786 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2788 address_word vaddr = ((unsigned64)op1 + offset);
2791 if ((vaddr & 0x0f) != 0)
2792 SignalExceptionAddressStore();
2795 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2798 unsigned64 memval0 = 0;
2799 unsigned64 memval1 = 0;
2800 qw = COP_SQ(((instruction >> 26) & 0x3),destreg);
2801 memval0 = *A8_16(& qw, 0);
2802 memval1 = *A8_16(& qw, 1);
2804 StoreMemory(uncached,AccessLength_WORD,memval0,memval1,paddr,vaddr,isREAL);
2809 #endif /* TARGET_SKY */
2815 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL
2816 "sdl r<RT>, <OFFSET>(r<BASE>)"
2820 // start-sanitize-vr4320
2822 // end-sanitize-vr4320
2823 // start-sanitize-vr5400
2825 // end-sanitize-vr5400
2826 // start-sanitize-r5900
2828 // end-sanitize-r5900
2830 // start-sanitize-tx19
2832 // end-sanitize-tx19
2834 unsigned32 instruction = instruction_0;
2835 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2836 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2837 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2839 address_word vaddr = ((unsigned64)op1 + offset);
2843 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2845 unsigned64 memval = 0;
2846 unsigned64 memval1 = 0;
2847 unsigned64 mask = 7;
2848 unsigned int reverse = (ReverseEndian ? mask : 0);
2849 unsigned int bigend = (BigEndianCPU ? mask : 0);
2851 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2852 byte = ((vaddr & mask) ^ bigend);
2855 memval = (op2 >> (8 * (7 - byte)));
2856 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
2863 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR
2864 "sdr r<RT>, <OFFSET>(r<BASE>)"
2868 // start-sanitize-vr4320
2870 // end-sanitize-vr4320
2871 // start-sanitize-vr5400
2873 // end-sanitize-vr5400
2874 // start-sanitize-r5900
2876 // end-sanitize-r5900
2878 // start-sanitize-tx19
2880 // end-sanitize-tx19
2885 unsigned64 mask = 7;
2886 unsigned int reverse = (ReverseEndian ? mask : 0);
2887 unsigned int bigend = (BigEndianCPU ? mask : 0);
2889 address_word vaddr = (GPR[BASE] + EXTEND16 (OFFSET));
2890 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
2891 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
2894 byte = ((vaddr & mask) ^ bigend);
2895 memval = (GPR[RT] << (byte * 8));
2896 StoreMemory(uncached,(AccessLength_DOUBLEWORD - byte),memval,0,paddr,vaddr,isREAL);
2900 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH
2901 "sh r<RT>, <OFFSET>(r<BASE>)"
2902 *mipsI,mipsII,mipsIII,mipsIV:
2904 // start-sanitize-vr4320
2906 // end-sanitize-vr4320
2907 // start-sanitize-vr5400
2909 // end-sanitize-vr5400
2910 // start-sanitize-r5900
2912 // end-sanitize-r5900
2914 // start-sanitize-tx19
2916 // end-sanitize-tx19
2918 unsigned32 instruction = instruction_0;
2919 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
2920 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
2921 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
2923 address_word vaddr = ((unsigned64)op1 + offset);
2926 if ((vaddr & 1) != 0)
2927 SignalExceptionAddressStore();
2930 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
2932 unsigned64 memval = 0;
2933 unsigned64 memval1 = 0;
2934 unsigned64 mask = 0x7;
2935 unsigned int shift = 1;
2936 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
2937 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
2939 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
2940 byte = ((vaddr & mask) ^ (bigend << shift));
2941 memval = ((unsigned64) op2 << (8 * byte));
2943 StoreMemory(uncached,AccessLength_HALFWORD,memval,memval1,paddr,vaddr,isREAL);
2951 00000000000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLL
2952 "sll r<RD>, r<RT>, <SHIFT>"
2953 *mipsI,mipsII,mipsIII,mipsIV:
2955 // start-sanitize-vr4320
2957 // end-sanitize-vr4320
2958 // start-sanitize-vr5400
2960 // end-sanitize-vr5400
2961 // start-sanitize-r5900
2963 // end-sanitize-r5900
2965 // start-sanitize-tx19
2967 // end-sanitize-tx19
2970 unsigned32 temp = (GPR[RT] << s);
2971 GPR[RD] = EXTEND32 (temp);
2975 000000,5.RS,5.RT,5.RD,00000000100:SPECIAL:32::SLLV
2976 "sllv r<RD>, r<RT>, r<RS>"
2977 *mipsI,mipsII,mipsIII,mipsIV:
2979 // start-sanitize-vr4320
2981 // end-sanitize-vr4320
2982 // start-sanitize-vr5400
2984 // end-sanitize-vr5400
2985 // start-sanitize-r5900
2987 // end-sanitize-r5900
2989 // start-sanitize-tx19
2991 // end-sanitize-tx19
2993 int s = MASKED (GPR[RS], 4, 0);
2994 unsigned32 temp = (GPR[RT] << s);
2995 GPR[RD] = EXTEND32 (temp);
2999 000000,5.RS,5.RT,5.RD,00000101010:SPECIAL:32::SLT
3000 "slt r<RD>, r<RS>, r<RT>"
3001 *mipsI,mipsII,mipsIII,mipsIV:
3003 // start-sanitize-vr4320
3005 // end-sanitize-vr4320
3006 // start-sanitize-vr5400
3008 // end-sanitize-vr5400
3009 // start-sanitize-r5900
3011 // end-sanitize-r5900
3013 // start-sanitize-tx19
3015 // end-sanitize-tx19
3017 GPR[RD] = ((signed_word) GPR[RS] < (signed_word) GPR[RT]);
3021 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI
3022 "slti r<RT>, r<RS>, <IMMEDIATE>"
3023 *mipsI,mipsII,mipsIII,mipsIV:
3025 // start-sanitize-vr4320
3027 // end-sanitize-vr4320
3028 // start-sanitize-vr5400
3030 // end-sanitize-vr5400
3031 // start-sanitize-r5900
3033 // end-sanitize-r5900
3035 // start-sanitize-tx19
3037 // end-sanitize-tx19
3039 GPR[RT] = ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE));
3043 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU
3044 "sltiu r<RT>, r<RS>, <IMMEDIATE>"
3045 *mipsI,mipsII,mipsIII,mipsIV:
3047 // start-sanitize-vr4320
3049 // end-sanitize-vr4320
3050 // start-sanitize-vr5400
3052 // end-sanitize-vr5400
3053 // start-sanitize-r5900
3055 // end-sanitize-r5900
3057 // start-sanitize-tx19
3059 // end-sanitize-tx19
3061 GPR[RT] = ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE));
3064 000000,5.RS,5.RT,5.RD,00000101011:SPECIAL:32::SLTU
3065 "sltu r<RD>, r<RS>, r<RT>"
3066 *mipsI,mipsII,mipsIII,mipsIV:
3068 // start-sanitize-vr4320
3070 // end-sanitize-vr4320
3071 // start-sanitize-vr5400
3073 // end-sanitize-vr5400
3074 // start-sanitize-r5900
3076 // end-sanitize-r5900
3078 // start-sanitize-tx19
3080 // end-sanitize-tx19
3082 GPR[RD] = ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT]);
3086 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA
3087 "sra r<RD>, r<RT>, <SHIFT>"
3088 *mipsI,mipsII,mipsIII,mipsIV:
3090 // start-sanitize-vr4320
3092 // end-sanitize-vr4320
3093 // start-sanitize-vr5400
3095 // end-sanitize-vr5400
3096 // start-sanitize-r5900
3098 // end-sanitize-r5900
3100 // start-sanitize-tx19
3102 // end-sanitize-tx19
3105 signed32 temp = (signed32) GPR[RT] >> s;
3106 GPR[RD] = EXTEND32 (temp);
3110 000000,5.RS,5.RT,5.RD,00000000111:SPECIAL:32::SRAV
3111 "srav r<RD>, r<RT>, r<RS>"
3112 *mipsI,mipsII,mipsIII,mipsIV:
3114 // start-sanitize-vr4320
3116 // end-sanitize-vr4320
3117 // start-sanitize-vr5400
3119 // end-sanitize-vr5400
3120 // start-sanitize-r5900
3122 // end-sanitize-r5900
3124 // start-sanitize-tx19
3126 // end-sanitize-tx19
3128 int s = MASKED (GPR[RS], 4, 0);
3129 signed32 temp = (signed32) GPR[RT] >> s;
3130 GPR[RD] = EXTEND32 (temp);
3134 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL
3135 "srl r<RD>, r<RT>, <SHIFT>"
3136 *mipsI,mipsII,mipsIII,mipsIV:
3138 // start-sanitize-vr4320
3140 // end-sanitize-vr4320
3141 // start-sanitize-vr5400
3143 // end-sanitize-vr5400
3144 // start-sanitize-r5900
3146 // end-sanitize-r5900
3148 // start-sanitize-tx19
3150 // end-sanitize-tx19
3153 unsigned32 temp = (unsigned32) GPR[RT] >> s;
3154 GPR[RD] = EXTEND32 (temp);
3158 000000,5.RS,5.RT,5.RD,00000000110:SPECIAL:32::SRLV
3159 "srlv r<RD>, r<RT>, r<RS>"
3160 *mipsI,mipsII,mipsIII,mipsIV:
3162 // start-sanitize-vr4320
3164 // end-sanitize-vr4320
3165 // start-sanitize-vr5400
3167 // end-sanitize-vr5400
3168 // start-sanitize-r5900
3170 // end-sanitize-r5900
3172 // start-sanitize-tx19
3174 // end-sanitize-tx19
3176 int s = MASKED (GPR[RS], 4, 0);
3177 unsigned32 temp = (unsigned32) GPR[RT] >> s;
3178 GPR[RD] = EXTEND32 (temp);
3182 000000,5.RS,5.RT,5.RD,00000100010:SPECIAL:32::SUB
3183 "sub r<RD>, r<RS>, r<RT>"
3184 *mipsI,mipsII,mipsIII,mipsIV:
3186 // start-sanitize-vr4320
3188 // end-sanitize-vr4320
3189 // start-sanitize-vr5400
3191 // end-sanitize-vr5400
3192 // start-sanitize-r5900
3194 // end-sanitize-r5900
3196 // start-sanitize-tx19
3198 // end-sanitize-tx19
3200 ALU32_BEGIN (GPR[RS]);
3201 ALU32_SUB (GPR[RT]);
3202 ALU32_END (GPR[RD]);
3206 000000,5.RS,5.RT,5.RD,00000100011:SPECIAL:32::SUBU
3207 "subu r<RD>, r<RS>, r<RT>"
3208 *mipsI,mipsII,mipsIII,mipsIV:
3210 // start-sanitize-vr4320
3212 // end-sanitize-vr4320
3213 // start-sanitize-vr5400
3215 // end-sanitize-vr5400
3216 // start-sanitize-r5900
3218 // end-sanitize-r5900
3220 // start-sanitize-tx19
3222 // end-sanitize-tx19
3224 GPR[RD] = EXTEND32 (GPR[RS] - GPR[RT]);
3228 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW
3229 "sw r<RT>, <OFFSET>(r<BASE>)"
3230 *mipsI,mipsII,mipsIII,mipsIV:
3232 // start-sanitize-vr4320
3234 // end-sanitize-vr4320
3235 // start-sanitize-vr5400
3237 // end-sanitize-vr5400
3238 // start-sanitize-r5900
3240 // end-sanitize-r5900
3242 // start-sanitize-tx19
3244 // end-sanitize-tx19
3246 unsigned32 instruction = instruction_0;
3247 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
3248 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
3249 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3251 address_word vaddr = ((unsigned64)op1 + offset);
3254 if ((vaddr & 3) != 0)
3255 SignalExceptionAddressStore();
3258 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3260 unsigned64 memval = 0;
3261 unsigned64 memval1 = 0;
3262 unsigned64 mask = 0x7;
3264 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
3265 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
3266 memval = ((unsigned64) op2 << (8 * byte));
3268 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
3276 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz
3277 "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)"
3278 *mipsI,mipsII,mipsIII,mipsIV:
3280 // start-sanitize-vr4320
3282 // end-sanitize-vr4320
3283 // start-sanitize-vr5400
3285 // end-sanitize-vr5400
3287 // start-sanitize-tx19
3289 // end-sanitize-tx19
3291 unsigned32 instruction = instruction_0;
3292 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
3293 int destreg = ((instruction >> 16) & 0x0000001F);
3294 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3296 address_word vaddr = ((unsigned64)op1 + offset);
3299 if ((vaddr & 3) != 0)
3300 SignalExceptionAddressStore();
3303 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3305 unsigned64 memval = 0;
3306 unsigned64 memval1 = 0;
3307 unsigned64 mask = 0x7;
3309 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
3310 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
3311 memval = (((unsigned64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
3313 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
3321 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL
3322 "swl r<RT>, <OFFSET>(r<BASE>)"
3323 *mipsI,mipsII,mipsIII,mipsIV:
3325 // start-sanitize-vr4320
3327 // end-sanitize-vr4320
3328 // start-sanitize-vr5400
3330 // end-sanitize-vr5400
3331 // start-sanitize-r5900
3333 // end-sanitize-r5900
3335 // start-sanitize-tx19
3337 // end-sanitize-tx19
3339 unsigned32 instruction = instruction_0;
3340 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
3341 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
3342 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
3344 address_word vaddr = ((unsigned64)op1 + offset);
3348 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
3350 unsigned64 memval = 0;
3351 unsigned64 memval1 = 0;
3352 unsigned64 mask = 3;
3353 unsigned int reverse = (ReverseEndian ? mask : 0);
3354 unsigned int bigend = (BigEndianCPU ? mask : 0);
3356 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
3357 byte = ((vaddr & mask) ^ bigend);
3360 memval = (op2 >> (8 * (3 - byte)));
3361 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2)) {
3364 StoreMemory(uncached,byte,memval,memval1,paddr,vaddr,isREAL);
3371 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR
3372 "swr r<RT>, <OFFSET>(r<BASE>)"
3373 *mipsI,mipsII,mipsIII,mipsIV:
3375 // start-sanitize-vr4320
3377 // end-sanitize-vr4320
3378 // start-sanitize-vr5400
3380 // end-sanitize-vr5400
3381 // start-sanitize-r5900
3383 // end-sanitize-r5900
3385 // start-sanitize-tx19
3387 // end-sanitize-tx19
3389 unsigned64 memval = 0;
3390 unsigned64 mask = 3;
3391 unsigned int reverse = (ReverseEndian ? mask : 0);
3392 unsigned int bigend = (BigEndianCPU ? mask : 0);
3396 address_word vaddr = (GPR[BASE] + EXTEND16 (OFFSET));
3397 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
3398 paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverse));
3401 byte = ((vaddr & mask) ^ bigend);
3402 memval = (GPR[RT] << (byte * 8));
3403 if ((vaddr & (1 << 2)) ^ (BigEndianCPU << 2))
3405 StoreMemory(uncached,(AccessLength_WORD - byte),memval,0,paddr,vaddr,isREAL);
3409 000000000000000000000,5.STYPE,001111:SPECIAL:32::SYNC
3416 // start-sanitize-vr4320
3418 // end-sanitize-vr4320
3419 // start-sanitize-vr5400
3421 // end-sanitize-vr5400
3422 // start-sanitize-r5900
3424 // end-sanitize-r5900
3426 // start-sanitize-tx19
3428 // end-sanitize-tx19
3430 SyncOperation (STYPE);
3434 000000,20.CODE,001100:SPECIAL:32::SYSCALL
3436 *mipsI,mipsII,mipsIII,mipsIV:
3438 // start-sanitize-vr4320
3440 // end-sanitize-vr4320
3441 // start-sanitize-vr5400
3443 // end-sanitize-vr5400
3444 // start-sanitize-r5900
3446 // end-sanitize-r5900
3448 // start-sanitize-tx19
3450 // end-sanitize-tx19
3452 SignalException(SystemCall, instruction_0);
3456 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ
3462 // start-sanitize-vr4320
3464 // end-sanitize-vr4320
3465 // start-sanitize-vr5400
3467 // end-sanitize-vr5400
3468 // start-sanitize-r5900
3470 // end-sanitize-r5900
3472 // start-sanitize-tx19
3474 // end-sanitize-tx19
3476 if ((signed_word) GPR[RS] == (signed_word) GPR[RT])
3477 SignalException(Trap, instruction_0);
3481 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI
3482 "teqi r<RS>, <IMMEDIATE>"
3487 // start-sanitize-vr4320
3489 // end-sanitize-vr4320
3490 // start-sanitize-vr5400
3492 // end-sanitize-vr5400
3493 // start-sanitize-r5900
3495 // end-sanitize-r5900
3497 // start-sanitize-tx19
3499 // end-sanitize-tx19
3501 if ((signed_word) GPR[RS] == (signed_word) EXTEND16 (IMMEDIATE))
3502 SignalException(Trap, instruction_0);
3506 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE
3512 // start-sanitize-vr4320
3514 // end-sanitize-vr4320
3515 // start-sanitize-vr5400
3517 // end-sanitize-vr5400
3518 // start-sanitize-r5900
3520 // end-sanitize-r5900
3522 // start-sanitize-tx19
3524 // end-sanitize-tx19
3526 if ((signed_word) GPR[RS] >= (signed_word) GPR[RT])
3527 SignalException(Trap, instruction_0);
3531 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI
3532 "tgei r<RS>, <IMMEDIATE>"
3537 // start-sanitize-vr4320
3539 // end-sanitize-vr4320
3540 // start-sanitize-vr5400
3542 // end-sanitize-vr5400
3543 // start-sanitize-r5900
3545 // end-sanitize-r5900
3547 // start-sanitize-tx19
3549 // end-sanitize-tx19
3551 if ((signed_word) GPR[RS] >= (signed_word) EXTEND16 (IMMEDIATE))
3552 SignalException(Trap, instruction_0);
3556 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU
3557 "tgeiu r<RS>, <IMMEDIATE>"
3562 // start-sanitize-vr4320
3564 // end-sanitize-vr4320
3565 // start-sanitize-vr5400
3567 // end-sanitize-vr5400
3568 // start-sanitize-r5900
3570 // end-sanitize-r5900
3572 // start-sanitize-tx19
3574 // end-sanitize-tx19
3576 if ((unsigned_word) GPR[RS] >= (unsigned_word) EXTEND16 (IMMEDIATE))
3577 SignalException(Trap, instruction_0);
3581 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU
3587 // start-sanitize-vr4320
3589 // end-sanitize-vr4320
3590 // start-sanitize-vr5400
3592 // end-sanitize-vr5400
3593 // start-sanitize-r5900
3595 // end-sanitize-r5900
3597 // start-sanitize-tx19
3599 // end-sanitize-tx19
3601 if ((unsigned_word) GPR[RS] >= (unsigned_word) GPR[RT])
3602 SignalException(Trap, instruction_0);
3606 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT
3612 // start-sanitize-vr4320
3614 // end-sanitize-vr4320
3615 // start-sanitize-vr5400
3617 // end-sanitize-vr5400
3618 // start-sanitize-r5900
3620 // end-sanitize-r5900
3622 // start-sanitize-tx19
3624 // end-sanitize-tx19
3626 if ((signed_word) GPR[RS] < (signed_word) GPR[RT])
3627 SignalException(Trap, instruction_0);
3631 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI
3632 "tlti r<RS>, <IMMEDIATE>"
3637 // start-sanitize-vr4320
3639 // end-sanitize-vr4320
3640 // start-sanitize-vr5400
3642 // end-sanitize-vr5400
3643 // start-sanitize-r5900
3645 // end-sanitize-r5900
3647 // start-sanitize-tx19
3649 // end-sanitize-tx19
3651 if ((signed_word) GPR[RS] < (signed_word) EXTEND16 (IMMEDIATE))
3652 SignalException(Trap, instruction_0);
3656 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU
3657 "tltiu r<RS>, <IMMEDIATE>"
3662 // start-sanitize-vr4320
3664 // end-sanitize-vr4320
3665 // start-sanitize-vr5400
3667 // end-sanitize-vr5400
3668 // start-sanitize-r5900
3670 // end-sanitize-r5900
3672 // start-sanitize-tx19
3674 // end-sanitize-tx19
3676 if ((unsigned_word) GPR[RS] < (unsigned_word) EXTEND16 (IMMEDIATE))
3677 SignalException(Trap, instruction_0);
3681 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU
3687 // start-sanitize-vr4320
3689 // end-sanitize-vr4320
3690 // start-sanitize-vr5400
3692 // end-sanitize-vr5400
3693 // start-sanitize-r5900
3695 // end-sanitize-r5900
3697 // start-sanitize-tx19
3699 // end-sanitize-tx19
3701 if ((unsigned_word) GPR[RS] < (unsigned_word) GPR[RT])
3702 SignalException(Trap, instruction_0);
3706 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE
3712 // start-sanitize-vr4320
3714 // end-sanitize-vr4320
3715 // start-sanitize-vr5400
3717 // end-sanitize-vr5400
3718 // start-sanitize-r5900
3720 // end-sanitize-r5900
3722 // start-sanitize-tx19
3724 // end-sanitize-tx19
3726 if ((signed_word) GPR[RS] != (signed_word) GPR[RT])
3727 SignalException(Trap, instruction_0);
3731 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI
3732 "tne r<RS>, <IMMEDIATE>"
3737 // start-sanitize-vr4320
3739 // end-sanitize-vr4320
3740 // start-sanitize-vr5400
3742 // end-sanitize-vr5400
3743 // start-sanitize-r5900
3745 // end-sanitize-r5900
3747 // start-sanitize-tx19
3749 // end-sanitize-tx19
3751 if ((signed_word) GPR[RS] != (signed_word) EXTEND16 (IMMEDIATE))
3752 SignalException(Trap, instruction_0);
3756 000000,5.RS,5.RT,5.RD,00000100110:SPECIAL:32::XOR
3757 "xor r<RD>, r<RS>, r<RT>"
3758 *mipsI,mipsII,mipsIII,mipsIV:
3760 // start-sanitize-vr4320
3762 // end-sanitize-vr4320
3763 // start-sanitize-vr5400
3765 // end-sanitize-vr5400
3766 // start-sanitize-r5900
3768 // end-sanitize-r5900
3770 // start-sanitize-tx19
3772 // end-sanitize-tx19
3774 GPR[RD] = GPR[RS] ^ GPR[RT];
3778 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI
3779 "xori r<RT>, r<RS>, <IMMEDIATE>"
3780 *mipsI,mipsII,mipsIII,mipsIV:
3782 // start-sanitize-vr4320
3784 // end-sanitize-vr4320
3785 // start-sanitize-vr5400
3787 // end-sanitize-vr5400
3788 // start-sanitize-r5900
3790 // end-sanitize-r5900
3792 // start-sanitize-tx19
3794 // end-sanitize-tx19
3796 GPR[RT] = GPR[RS] ^ IMMEDIATE;
3801 // MIPS Architecture:
3803 // FPU Instruction Set (COP1 & COP1X)
3811 case fmt_single: return "s";
3812 case fmt_double: return "d";
3813 case fmt_word: return "w";
3814 case fmt_long: return "l";
3815 default: return "?";
3825 default: return "?";
3845 :%s::::COND:int cond
3849 case 00: return "f";
3850 case 01: return "un";
3851 case 02: return "eq";
3852 case 03: return "ueq";
3853 case 04: return "olt";
3854 case 05: return "ult";
3855 case 06: return "ole";
3856 case 07: return "ule";
3857 case 010: return "sf";
3858 case 011: return "ngle";
3859 case 012: return "seq";
3860 case 013: return "ngl";
3861 case 014: return "lt";
3862 case 015: return "nge";
3863 case 016: return "le";
3864 case 017: return "ngt";
3865 default: return "?";
3870 010001,10,3.FMT,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt
3871 "abs.%s<FMT> f<FD>, f<FS>"
3872 *mipsI,mipsII,mipsIII,mipsIV:
3874 // start-sanitize-vr4320
3876 // end-sanitize-vr4320
3877 // start-sanitize-vr5400
3879 // end-sanitize-vr5400
3881 // start-sanitize-tx19
3883 // end-sanitize-tx19
3885 unsigned32 instruction = instruction_0;
3886 int destreg = ((instruction >> 6) & 0x0000001F);
3887 int fs = ((instruction >> 11) & 0x0000001F);
3888 int format = ((instruction >> 21) & 0x00000007);
3890 if ((format != fmt_single) && (format != fmt_double))
3891 SignalException(ReservedInstruction,instruction);
3893 StoreFPR(destreg,format,AbsoluteValue(ValueFPR(fs,format),format));
3899 010001,10,3.FMT,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt
3900 "add.%s<FMT> f<FD>, f<FS>, f<FT>"
3901 *mipsI,mipsII,mipsIII,mipsIV:
3903 // start-sanitize-vr4320
3905 // end-sanitize-vr4320
3906 // start-sanitize-vr5400
3908 // end-sanitize-vr5400
3910 // start-sanitize-tx19
3912 // end-sanitize-tx19
3914 unsigned32 instruction = instruction_0;
3915 int destreg = ((instruction >> 6) & 0x0000001F);
3916 int fs = ((instruction >> 11) & 0x0000001F);
3917 int ft = ((instruction >> 16) & 0x0000001F);
3918 int format = ((instruction >> 21) & 0x00000007);
3920 if ((format != fmt_single) && (format != fmt_double))
3921 SignalException(ReservedInstruction, instruction);
3923 StoreFPR(destreg,format,Add(ValueFPR(fs,format),ValueFPR(ft,format),format));
3934 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3935 "bc1%s<TF>%s<ND> <OFFSET>"
3936 *mipsI,mipsII,mipsIII:
3937 // start-sanitize-r5900
3939 // end-sanitize-r5900
3941 TRACE_BRANCH_INPUT (PREVCOC1());
3942 if (PREVCOC1() == TF)
3944 address_word dest = NIA + (EXTEND16 (OFFSET) << 2);
3945 TRACE_BRANCH_RESULT (dest);
3950 TRACE_BRANCH_RESULT (0);
3951 NULLIFY_NEXT_INSTRUCTION ();
3955 TRACE_BRANCH_RESULT (NIA);
3959 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1
3960 "bc1%s<TF>%s<ND> <OFFSET>":CC == 0
3961 "bc1%s<TF>%s<ND> <CC>, <OFFSET>"
3964 // start-sanitize-vr4320
3966 // end-sanitize-vr4320
3967 // start-sanitize-vr5400
3969 // end-sanitize-vr5400
3971 // start-sanitize-tx19
3973 // end-sanitize-tx19
3975 if (GETFCC(CC) == TF)
3977 DELAY_SLOT (NIA + (EXTEND16 (OFFSET) << 2));
3981 NULLIFY_NEXT_INSTRUCTION ();
3991 :function:::void:do_c_cond_fmt:int fmt, int ft, int fs, int cc, int cond, instruction_word insn
3993 if ((fmt != fmt_single) && (fmt != fmt_double))
3994 SignalException (ReservedInstruction, insn);
4001 unsigned64 ofs = ValueFPR (fs, fmt);
4002 unsigned64 oft = ValueFPR (ft, fmt);
4003 if (NaN (ofs, fmt) || NaN (oft, fmt))
4005 if (FCSR & FP_ENABLE (IO))
4007 FCSR |= FP_CAUSE (IO);
4008 SignalExceptionFPE ();
4016 less = Less (ofs, oft, fmt);
4017 equal = Equal (ofs, oft, fmt);
4020 condition = (((cond & (1 << 2)) && less)
4021 || ((cond & (1 << 1)) && equal)
4022 || ((cond & (1 << 0)) && unordered));
4023 SETFCC (cc, condition);
4027 010001,10,3.FMT,5.FT,5.FS,3.0,00,11,4.COND:COP1:32::C.cond.fmt
4028 *mipsI,mipsII,mipsIII:
4029 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":
4031 do_c_cond_fmt (SD_, FMT, FT, FS, 0, COND, instruction_0);
4034 010001,10,3.FMT,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32::C.cond.fmt
4035 "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0
4036 "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>"
4039 // start-sanitize-vr4320
4041 // end-sanitize-vr4320
4042 // start-sanitize-vr5400
4044 // end-sanitize-vr5400
4046 // start-sanitize-tx19
4048 // end-sanitize-tx19
4050 do_c_cond_fmt (SD_, FMT, FT, FS, CC, COND, instruction_0);
4054 010001,10,3.FMT,00000,5.FS,5.FD,001010:COP1:64::CEIL.L.fmt
4055 "ceil.l.%s<FMT> f<FD>, f<FS>"
4059 // start-sanitize-vr4320
4061 // end-sanitize-vr4320
4062 // start-sanitize-vr5400
4064 // end-sanitize-vr5400
4065 // start-sanitize-r5900
4067 // end-sanitize-r5900
4069 // start-sanitize-tx19
4071 // end-sanitize-tx19
4073 unsigned32 instruction = instruction_0;
4074 int destreg = ((instruction >> 6) & 0x0000001F);
4075 int fs = ((instruction >> 11) & 0x0000001F);
4076 int format = ((instruction >> 21) & 0x00000007);
4078 if ((format != fmt_single) && (format != fmt_double))
4079 SignalException(ReservedInstruction,instruction);
4081 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_long));
4086 010001,10,3.FMT,00000,5.FS,5.FD,001110:COP1:32::CEIL.W
4091 // start-sanitize-vr4320
4093 // end-sanitize-vr4320
4094 // start-sanitize-vr5400
4096 // end-sanitize-vr5400
4097 // start-sanitize-r5900
4099 // end-sanitize-r5900
4101 // start-sanitize-tx19
4103 // end-sanitize-tx19
4105 unsigned32 instruction = instruction_0;
4106 int destreg = ((instruction >> 6) & 0x0000001F);
4107 int fs = ((instruction >> 11) & 0x0000001F);
4108 int format = ((instruction >> 21) & 0x00000007);
4110 if ((format != fmt_single) && (format != fmt_double))
4111 SignalException(ReservedInstruction,instruction);
4113 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOPINF,ValueFPR(fs,format),format,fmt_word));
4120 010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
4121 "c%s<X>c1 r<RT>, f<FS>"
4129 PENDING_FILL((FS + FCR0IDX),VL4_8(GPR[RT]));
4131 PENDING_FILL((FS + FCR31IDX),VL4_8(GPR[RT]));
4133 PENDING_FILL(COCIDX,0); /* special case */
4136 { /* control from */
4138 PENDING_FILL(RT,SIGNEXTEND(FCR0,32));
4140 PENDING_FILL(RT,SIGNEXTEND(FCR31,32));
4144 010001,00,X,10,5.RT,5.FS,00000000000:COP1S:32::CxC1
4145 "c%s<X>c1 r<RT>, f<FS>"
4148 // start-sanitize-vr4320
4150 // end-sanitize-vr4320
4151 // start-sanitize-vr5400
4153 // end-sanitize-vr5400
4154 // start-sanitize-r5900
4156 // end-sanitize-r5900
4158 // start-sanitize-tx19
4160 // end-sanitize-tx19
4165 TRACE_ALU_INPUT1 (GPR[RT]);
4168 FCR0 = VL4_8(GPR[RT]);
4169 TRACE_ALU_RESULT (FCR0);
4173 FCR31 = VL4_8(GPR[RT]);
4174 SETFCC(0,((FCR31 & (1 << 23)) ? 1 : 0));
4175 TRACE_ALU_RESULT (FCR31);
4179 TRACE_ALU_RESULT0 ();
4184 { /* control from */
4187 TRACE_ALU_INPUT1 (FCR0);
4188 GPR[RT] = SIGNEXTEND (FCR0, 32);
4192 TRACE_ALU_INPUT1 (FCR31);
4193 GPR[RT] = SIGNEXTEND (FCR31, 32);
4195 TRACE_ALU_RESULT (GPR[RT]);
4202 // FIXME: Does not correctly differentiate between mips*
4204 010001,10,3.FMT,00000,5.FS,5.FD,100001:COP1:32::CVT.D.fmt
4205 "cvt.d.%s<FMT> f<FD>, f<FS>"
4206 *mipsI,mipsII,mipsIII,mipsIV:
4208 // start-sanitize-vr4320
4210 // end-sanitize-vr4320
4211 // start-sanitize-vr5400
4213 // end-sanitize-vr5400
4215 // start-sanitize-tx19
4217 // end-sanitize-tx19
4219 unsigned32 instruction = instruction_0;
4220 int destreg = ((instruction >> 6) & 0x0000001F);
4221 int fs = ((instruction >> 11) & 0x0000001F);
4222 int format = ((instruction >> 21) & 0x00000007);
4224 if ((format == fmt_double) | 0)
4225 SignalException(ReservedInstruction,instruction);
4227 StoreFPR(destreg,fmt_double,Convert(GETRM(),ValueFPR(fs,format),format,fmt_double));
4232 010001,10,3.FMT,00000,5.FS,5.FD,100101:COP1:64::CVT.L.fmt
4233 "cvt.l.%s<FMT> f<FD>, f<FS>"
4237 // start-sanitize-vr4320
4239 // end-sanitize-vr4320
4240 // start-sanitize-vr5400
4242 // end-sanitize-vr5400
4244 // start-sanitize-tx19
4246 // end-sanitize-tx19
4248 unsigned32 instruction = instruction_0;
4249 int destreg = ((instruction >> 6) & 0x0000001F);
4250 int fs = ((instruction >> 11) & 0x0000001F);
4251 int format = ((instruction >> 21) & 0x00000007);
4253 if ((format == fmt_long) | ((format == fmt_long) || (format == fmt_word)))
4254 SignalException(ReservedInstruction,instruction);
4256 StoreFPR(destreg,fmt_long,Convert(GETRM(),ValueFPR(fs,format),format,fmt_long));
4262 // FIXME: Does not correctly differentiate between mips*
4264 010001,10,3.FMT,00000,5.FS,5.FD,100000:COP1:32::CVT.S.fmt
4265 "cvt.s.%s<FMT> f<FD>, f<FS>"
4266 *mipsI,mipsII,mipsIII,mipsIV:
4268 // start-sanitize-vr4320
4270 // end-sanitize-vr4320
4271 // start-sanitize-vr5400
4273 // end-sanitize-vr5400
4275 // start-sanitize-tx19
4277 // end-sanitize-tx19
4279 unsigned32 instruction = instruction_0;
4280 int destreg = ((instruction >> 6) & 0x0000001F);
4281 int fs = ((instruction >> 11) & 0x0000001F);
4282 int format = ((instruction >> 21) & 0x00000007);
4284 if ((format == fmt_single) | 0)
4285 SignalException(ReservedInstruction,instruction);
4287 StoreFPR(destreg,fmt_single,Convert(GETRM(),ValueFPR(fs,format),format,fmt_single));
4292 010001,10,3.FMT,00000,5.FS,5.FD,100100:COP1:32::CVT.W.fmt
4293 "cvt.w.%s<FMT> f<FD>, f<FS>"
4294 *mipsI,mipsII,mipsIII,mipsIV:
4296 // start-sanitize-vr4320
4298 // end-sanitize-vr4320
4299 // start-sanitize-vr5400
4301 // end-sanitize-vr5400
4303 // start-sanitize-tx19
4305 // end-sanitize-tx19
4307 unsigned32 instruction = instruction_0;
4308 int destreg = ((instruction >> 6) & 0x0000001F);
4309 int fs = ((instruction >> 11) & 0x0000001F);
4310 int format = ((instruction >> 21) & 0x00000007);
4312 if ((format == fmt_word) | ((format == fmt_long) || (format == fmt_word)))
4313 SignalException(ReservedInstruction,instruction);
4315 StoreFPR(destreg,fmt_word,Convert(GETRM(),ValueFPR(fs,format),format,fmt_word));
4320 010001,10,3.FMT,5.FT,5.FS,5.FD,000011:COP1:32::DIV.fmt
4321 "div.%s<FMT> f<FD>, f<FS>, f<FT>"
4322 *mipsI,mipsII,mipsIII,mipsIV:
4324 // start-sanitize-vr4320
4326 // end-sanitize-vr4320
4327 // start-sanitize-vr5400
4329 // end-sanitize-vr5400
4331 // start-sanitize-tx19
4333 // end-sanitize-tx19
4335 unsigned32 instruction = instruction_0;
4336 int destreg = ((instruction >> 6) & 0x0000001F);
4337 int fs = ((instruction >> 11) & 0x0000001F);
4338 int ft = ((instruction >> 16) & 0x0000001F);
4339 int format = ((instruction >> 21) & 0x00000007);
4341 if ((format != fmt_single) && (format != fmt_double))
4342 SignalException(ReservedInstruction,instruction);
4344 StoreFPR(destreg,format,Divide(ValueFPR(fs,format),ValueFPR(ft,format),format));
4351 010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
4352 "dm%s<X>c1 r<RT>, f<FS>"
4357 if (SizeFGR() == 64)
4358 PENDING_FILL((FS + FGRIDX),GPR[RT]);
4359 else if ((FS & 0x1) == 0)
4361 PENDING_FILL(((FS + 1) + FGRIDX),VH4_8(GPR[RT]));
4362 PENDING_FILL((FS + FGRIDX),VL4_8(GPR[RT]));
4367 if (SizeFGR() == 64)
4368 PENDING_FILL(RT,FGR[FS]);
4369 else if ((FS & 0x1) == 0)
4370 PENDING_FILL(RT,(SET64HI(FGR[FS+1]) | FGR[FS]));
4372 PENDING_FILL(RT,SET64HI(0xDEADC0DE) | 0xBAD0BAD0);
4375 010001,00,X,01,5.RT,5.FS,00000000000:COP1S:64::DMxC1
4376 "dm%s<X>c1 r<RT>, f<FS>"
4379 // start-sanitize-vr4320
4381 // end-sanitize-vr4320
4382 // start-sanitize-vr5400
4384 // end-sanitize-vr5400
4385 // start-sanitize-r5900
4387 // end-sanitize-r5900
4389 // start-sanitize-tx19
4391 // end-sanitize-tx19
4395 if (SizeFGR() == 64)
4396 StoreFPR (FS, fmt_uninterpreted_64, GPR[RT]);
4397 else if ((FS & 0x1) == 0)
4398 StoreFPR (FS, fmt_uninterpreted_64, SET64HI (FGR[FS+1]) | FGR[FS]);
4402 if (SizeFGR() == 64)
4404 else if ((FS & 0x1) == 0)
4405 GPR[RT] = SET64HI (FGR[FS+1]) | FGR[FS];
4407 GPR[RT] = SET64HI (0xDEADC0DE) | 0xBAD0BAD0;
4412 010001,10,3.FMT,00000,5.FS,5.FD,001011:COP1:64::FLOOR.L.fmt
4413 "floor.l.%s<FMT> f<FD>, f<FS>"
4417 // start-sanitize-vr4320
4419 // end-sanitize-vr4320
4420 // start-sanitize-vr5400
4422 // end-sanitize-vr5400
4423 // start-sanitize-r5900
4425 // end-sanitize-r5900
4427 // start-sanitize-tx19
4429 // end-sanitize-tx19
4431 unsigned32 instruction = instruction_0;
4432 int destreg = ((instruction >> 6) & 0x0000001F);
4433 int fs = ((instruction >> 11) & 0x0000001F);
4434 int format = ((instruction >> 21) & 0x00000007);
4436 if ((format != fmt_single) && (format != fmt_double))
4437 SignalException(ReservedInstruction,instruction);
4439 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_long));
4444 010001,10,3.FMT,00000,5.FS,5.FD,001111:COP1:32::FLOOR.W.fmt
4445 "floor.w.%s<FMT> f<FD>, f<FS>"
4450 // start-sanitize-vr4320
4452 // end-sanitize-vr4320
4453 // start-sanitize-vr5400
4455 // end-sanitize-vr5400
4456 // start-sanitize-r5900
4458 // end-sanitize-r5900
4460 // start-sanitize-tx19
4462 // end-sanitize-tx19
4464 unsigned32 instruction = instruction_0;
4465 int destreg = ((instruction >> 6) & 0x0000001F);
4466 int fs = ((instruction >> 11) & 0x0000001F);
4467 int format = ((instruction >> 21) & 0x00000007);
4469 if ((format != fmt_single) && (format != fmt_double))
4470 SignalException(ReservedInstruction,instruction);
4472 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOMINF,ValueFPR(fs,format),format,fmt_word));
4477 110101,5.BASE,5.FT,16.OFFSET:COP1:64::LDC1
4478 "ldc1 f<FT>, <OFFSET>(r<BASE>)"
4483 // start-sanitize-vr4320
4485 // end-sanitize-vr4320
4486 // start-sanitize-vr5400
4488 // end-sanitize-vr5400
4490 // start-sanitize-tx19
4492 // end-sanitize-tx19
4494 address_word vaddr = GPR[BASE] + EXTEND16 (OFFSET);
4497 if ((vaddr & 7) != 0)
4498 SignalExceptionAddressLoad();
4502 AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL);
4503 LoadMemory(&memval,0,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4504 COP_LD(((instruction_0 >> 26) & 0x3),FT,memval);;
4509 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64::LDXC1
4510 "ldxc1 f<FD>, r<INDEX>(r<BASE>)"
4513 // start-sanitize-vr4320
4515 // end-sanitize-vr4320
4516 // start-sanitize-vr5400
4518 // end-sanitize-vr5400
4520 unsigned32 instruction = instruction_0;
4521 int destreg = ((instruction >> 6) & 0x0000001F);
4522 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4523 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4525 address_word vaddr = ((unsigned64)op1 + op2);
4528 if ((vaddr & 7) != 0)
4529 SignalExceptionAddressLoad();
4532 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4534 unsigned64 memval = 0;
4535 unsigned64 memval1 = 0;
4536 LoadMemory(&memval,&memval1,uncached,AccessLength_DOUBLEWORD,paddr,vaddr,isDATA,isREAL);
4537 COP_LD(1,destreg,memval);;
4545 110001,5.BASE,5.FT,16.OFFSET:COP1:32::LWC1
4546 "lwc1 f<FT>, <OFFSET>(r<BASE>)"
4547 *mipsI,mipsII,mipsIII,mipsIV:
4549 // start-sanitize-vr4320
4551 // end-sanitize-vr4320
4552 // start-sanitize-vr5400
4554 // end-sanitize-vr5400
4555 // start-sanitize-r5900
4557 // end-sanitize-r5900
4559 // start-sanitize-tx19
4561 // end-sanitize-tx19
4563 unsigned32 instruction = instruction_0;
4564 signed_word offset = EXTEND16 (OFFSET);
4565 int destreg UNUSED = ((instruction >> 16) & 0x0000001F);
4566 signed_word op1 UNUSED = GPR[((instruction >> 21) & 0x0000001F)];
4568 address_word vaddr = ((uword64)op1 + offset);
4571 if ((vaddr & 3) != 0)
4572 SignalExceptionAddressLoad();
4575 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4578 uword64 memval1 = 0;
4580 unsigned int shift = 2;
4581 unsigned int reverse UNUSED = (ReverseEndian ? (mask >> shift) : 0);
4582 unsigned int bigend UNUSED = (BigEndianCPU ? (mask >> shift) : 0);
4583 unsigned int byte UNUSED;
4584 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4585 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4586 byte = ((vaddr & mask) ^ (bigend << shift));
4587 COP_LW(((instruction >> 26) & 0x3),destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
4594 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32::LWXC1
4595 "lwxc1 f<FD>, r<INDEX>(r<BASE>)"
4598 // start-sanitize-vr4320
4600 // end-sanitize-vr4320
4601 // start-sanitize-vr5400
4603 // end-sanitize-vr5400
4605 unsigned32 instruction = instruction_0;
4606 int destreg = ((instruction >> 6) & 0x0000001F);
4607 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
4608 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
4610 address_word vaddr = ((unsigned64)op1 + op2);
4613 if ((vaddr & 3) != 0)
4614 SignalExceptionAddressLoad();
4617 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
4619 unsigned64 memval = 0;
4620 unsigned64 memval1 = 0;
4621 unsigned64 mask = 0x7;
4622 unsigned int shift = 2;
4623 unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0);
4624 unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0);
4626 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift)));
4627 LoadMemory(&memval,&memval1,uncached,AccessLength_WORD,paddr,vaddr,isDATA,isREAL);
4628 byte = ((vaddr & mask) ^ (bigend << shift));
4629 COP_LW(1,destreg,(unsigned int)((memval >> (8 * byte)) & 0xFFFFFFFF));
4638 // FIXME: Not correct for mips*
4640 010011,5.FR,5.FT,5.FS,5.FD,100,001:COP1X:32,f::MADD.D
4641 "madd.d f<FD>, f<FR>, f<FS>, f<FT>"
4644 // start-sanitize-vr4320
4646 // end-sanitize-vr4320
4647 // start-sanitize-vr5400
4649 // end-sanitize-vr5400
4651 unsigned32 instruction = instruction_0;
4652 int destreg = ((instruction >> 6) & 0x0000001F);
4653 int fs = ((instruction >> 11) & 0x0000001F);
4654 int ft = ((instruction >> 16) & 0x0000001F);
4655 int fr = ((instruction >> 21) & 0x0000001F);
4657 StoreFPR(destreg,fmt_double,Add(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4662 010011,5.FR,5.FT,5.FS,5.FD,100,000:COP1X:32,f::MADD.S
4663 "madd.s f<FD>, f<FR>, f<FS>, f<FT>"
4666 // start-sanitize-vr4320
4668 // end-sanitize-vr4320
4669 // start-sanitize-vr5400
4671 // end-sanitize-vr5400
4673 unsigned32 instruction = instruction_0;
4674 int destreg = ((instruction >> 6) & 0x0000001F);
4675 int fs = ((instruction >> 11) & 0x0000001F);
4676 int ft = ((instruction >> 16) & 0x0000001F);
4677 int fr = ((instruction >> 21) & 0x0000001F);
4679 StoreFPR(destreg,fmt_single,Add(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4686 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4687 "m%s<X>c1 r<RT>, f<FS>"
4694 if (SizeFGR() == 64)
4695 PENDING_FILL ((FS + FGRIDX), (SET64HI(0xDEADC0DE) | VL4_8(GPR[RT])));
4697 PENDING_FILL ((FS + FGRIDX), VL4_8(GPR[RT]));
4700 PENDING_FILL (RT, SIGNEXTEND(FGR[FS],32));
4702 010001,00,X,00,5.RT,5.FS,00000000000:COP1S:32::MxC1
4703 "m%s<X>c1 r<RT>, f<FS>"
4706 // start-sanitize-vr4320
4708 // end-sanitize-vr4320
4709 // start-sanitize-vr5400
4711 // end-sanitize-vr5400
4713 // start-sanitize-tx19
4715 // end-sanitize-tx19
4719 StoreFPR (FS, fmt_uninterpreted_32, VL4_8 (GPR[RT]));
4721 GPR[RT] = SIGNEXTEND(FGR[FS],32);
4725 010001,10,3.FMT,00000,5.FS,5.FD,000110:COP1:32::MOV.fmt
4726 "mov.%s<FMT> f<FD>, f<FS>"
4727 *mipsI,mipsII,mipsIII,mipsIV:
4729 // start-sanitize-vr4320
4731 // end-sanitize-vr4320
4732 // start-sanitize-vr5400
4734 // end-sanitize-vr5400
4736 // start-sanitize-tx19
4738 // end-sanitize-tx19
4740 unsigned32 instruction = instruction_0;
4741 int destreg = ((instruction >> 6) & 0x0000001F);
4742 int fs = ((instruction >> 11) & 0x0000001F);
4743 int format = ((instruction >> 21) & 0x00000007);
4745 StoreFPR(destreg,format,ValueFPR(fs,format));
4751 000000,5.RS,3.CC,0,1.TF,5.RD,00000000001:SPECIAL:32::MOVtf
4752 "mov%s<TF> r<RD>, r<RS>, <CC>"
4755 // start-sanitize-vr4320
4757 // end-sanitize-vr4320
4758 // start-sanitize-vr5400
4760 // end-sanitize-vr5400
4761 // start-sanitize-r5900
4763 // end-sanitize-r5900
4765 if (GETFCC(CC) == TF)
4771 010001,10,3.FMT,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32::MOVtf.fmt
4772 "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>"
4775 // start-sanitize-vr4320
4777 // end-sanitize-vr4320
4778 // start-sanitize-vr5400
4780 // end-sanitize-vr5400
4781 // start-sanitize-r5900
4783 // end-sanitize-r5900
4785 unsigned32 instruction = instruction_0;
4786 int format = ((instruction >> 21) & 0x00000007);
4788 if (GETFCC(CC) == TF)
4789 StoreFPR (FD, format, ValueFPR (FS, format));
4791 StoreFPR (FD, format, ValueFPR (FD, format));
4796 010001,10,3.FMT,5.RT,5.FS,5.FD,010011:COP1:32::MOVN.fmt
4799 // start-sanitize-vr4320
4801 // end-sanitize-vr4320
4802 // start-sanitize-vr5400
4804 // end-sanitize-vr5400
4805 // start-sanitize-r5900
4807 // end-sanitize-r5900
4809 unsigned32 instruction = instruction_0;
4810 int destreg = ((instruction >> 6) & 0x0000001F);
4811 int fs = ((instruction >> 11) & 0x0000001F);
4812 int format = ((instruction >> 21) & 0x00000007);
4814 StoreFPR(destreg,format,ValueFPR(fs,format));
4822 // MOVT.fmt see MOVtf.fmt
4826 010001,10,3.FMT,5.RT,5.FS,5.FD,010010:COP1:32::MOVZ.fmt
4827 "movz.%s<FMT> f<FD>, f<FS>, r<RT>"
4830 // start-sanitize-vr4320
4832 // end-sanitize-vr4320
4833 // start-sanitize-vr5400
4835 // end-sanitize-vr5400
4836 // start-sanitize-r5900
4838 // end-sanitize-r5900
4840 unsigned32 instruction = instruction_0;
4841 int destreg = ((instruction >> 6) & 0x0000001F);
4842 int fs = ((instruction >> 11) & 0x0000001F);
4843 int format = ((instruction >> 21) & 0x00000007);
4845 StoreFPR(destreg,format,ValueFPR(fs,format));
4851 010011,5.FR,5.FT,5.FS,5.FD,101,001:COP1X:32::MSUB.D
4852 "msub.d f<FD>, f<FR>, f<FS>, f<FT>"
4855 // start-sanitize-vr4320
4857 // end-sanitize-vr4320
4858 // start-sanitize-vr5400
4860 // end-sanitize-vr5400
4861 // start-sanitize-r5900
4863 // end-sanitize-r5900
4865 unsigned32 instruction = instruction_0;
4866 int destreg = ((instruction >> 6) & 0x0000001F);
4867 int fs = ((instruction >> 11) & 0x0000001F);
4868 int ft = ((instruction >> 16) & 0x0000001F);
4869 int fr = ((instruction >> 21) & 0x0000001F);
4871 StoreFPR(destreg,fmt_double,Sub(Multiply(ValueFPR(fs,fmt_double),ValueFPR(ft,fmt_double),fmt_double),ValueFPR(fr,fmt_double),fmt_double));
4877 010011,5.FR,5.FT,5.FS,5.FD,101000:COP1X:32::MSUB.S
4878 "msub.s f<FD>, f<FR>, f<FS>, f<FT>"
4881 // start-sanitize-vr4320
4883 // end-sanitize-vr4320
4884 // start-sanitize-vr5400
4886 // end-sanitize-vr5400
4887 // start-sanitize-r5900
4889 // end-sanitize-r5900
4891 unsigned32 instruction = instruction_0;
4892 int destreg = ((instruction >> 6) & 0x0000001F);
4893 int fs = ((instruction >> 11) & 0x0000001F);
4894 int ft = ((instruction >> 16) & 0x0000001F);
4895 int fr = ((instruction >> 21) & 0x0000001F);
4897 StoreFPR(destreg,fmt_single,Sub(Multiply(ValueFPR(fs,fmt_single),ValueFPR(ft,fmt_single),fmt_single),ValueFPR(fr,fmt_single),fmt_single));
4905 010001,10,3.FMT,5.FT,5.FS,5.FD,000010:COP1:32::MUL.fmt
4906 "mul.%s<FMT> f<FD>, f<FS>, f<FT>"
4907 *mipsI,mipsII,mipsIII,mipsIV:
4909 // start-sanitize-vr4320
4911 // end-sanitize-vr4320
4912 // start-sanitize-vr5400
4914 // end-sanitize-vr5400
4916 // start-sanitize-tx19
4918 // end-sanitize-tx19
4920 unsigned32 instruction = instruction_0;
4921 int destreg = ((instruction >> 6) & 0x0000001F);
4922 int fs = ((instruction >> 11) & 0x0000001F);
4923 int ft = ((instruction >> 16) & 0x0000001F);
4924 int format = ((instruction >> 21) & 0x00000007);
4926 if ((format != fmt_single) && (format != fmt_double))
4927 SignalException(ReservedInstruction,instruction);
4929 StoreFPR(destreg,format,Multiply(ValueFPR(fs,format),ValueFPR(ft,format),format));
4934 010001,10,3.FMT,00000,5.FS,5.FD,000111:COP1:32::NEG.fmt
4935 "neg.%s<FMT> f<FD>, f<FS>"
4936 *mipsI,mipsII,mipsIII,mipsIV:
4938 // start-sanitize-vr4320
4940 // end-sanitize-vr4320
4941 // start-sanitize-vr5400
4943 // end-sanitize-vr5400
4945 // start-sanitize-tx19
4947 // end-sanitize-tx19
4949 unsigned32 instruction = instruction_0;
4950 int destreg = ((instruction >> 6) & 0x0000001F);
4951 int fs = ((instruction >> 11) & 0x0000001F);
4952 int format = ((instruction >> 21) & 0x00000007);
4954 if ((format != fmt_single) && (format != fmt_double))
4955 SignalException(ReservedInstruction,instruction);
4957 StoreFPR(destreg,format,Negate(ValueFPR(fs,format),format));
4963 010011,5.FR,5.FT,5.FS,5.FD,110001:COP1X:32::NMADD.D
4964 "nmadd.d f<FD>, f<FR>, f<FS>, f<FT>"
4967 // start-sanitize-vr4320
4969 // end-sanitize-vr4320
4970 // start-sanitize-vr5400
4972 // end-sanitize-vr5400
4974 unsigned32 instruction = instruction_0;
4975 int destreg = ((instruction >> 6) & 0x0000001F);
4976 int fs = ((instruction >> 11) & 0x0000001F);
4977 int ft = ((instruction >> 16) & 0x0000001F);
4978 int fr = ((instruction >> 21) & 0x0000001F);
4980 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));
4986 010011,5.FR,5.FT,5.FS,5.FD,110000:COP1X:32::NMADD.S
4987 "nmadd.s f<FD>, f<FR>, f<FS>, f<FT>"
4990 // start-sanitize-vr4320
4992 // end-sanitize-vr4320
4993 // start-sanitize-vr5400
4995 // end-sanitize-vr5400
4997 unsigned32 instruction = instruction_0;
4998 int destreg = ((instruction >> 6) & 0x0000001F);
4999 int fs = ((instruction >> 11) & 0x0000001F);
5000 int ft = ((instruction >> 16) & 0x0000001F);
5001 int fr = ((instruction >> 21) & 0x0000001F);
5003 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));
5009 010011,5.FR,5.FT,5.FS,5.FD,111001:COP1X:32::NMSUB.D
5010 "nmsub.d f<FD>, f<FR>, f<FS>, f<FT>"
5013 // start-sanitize-vr4320
5015 // end-sanitize-vr4320
5016 // start-sanitize-vr5400
5018 // end-sanitize-vr5400
5020 unsigned32 instruction = instruction_0;
5021 int destreg = ((instruction >> 6) & 0x0000001F);
5022 int fs = ((instruction >> 11) & 0x0000001F);
5023 int ft = ((instruction >> 16) & 0x0000001F);
5024 int fr = ((instruction >> 21) & 0x0000001F);
5026 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));
5032 010011,5.FR,5.FT,5.FS,5.FD,111000:COP1X:32::NMSUB.S
5033 "nmsub.s f<FD>, f<FR>, f<FS>, f<FT>"
5036 // start-sanitize-vr4320
5038 // end-sanitize-vr4320
5039 // start-sanitize-vr5400
5041 // end-sanitize-vr5400
5043 unsigned32 instruction = instruction_0;
5044 int destreg = ((instruction >> 6) & 0x0000001F);
5045 int fs = ((instruction >> 11) & 0x0000001F);
5046 int ft = ((instruction >> 16) & 0x0000001F);
5047 int fr = ((instruction >> 21) & 0x0000001F);
5049 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));
5054 010011,5.BASE,5.INDEX,5.HINT,00000001111:COP1X:32::PREFX
5055 "prefx <HINT>, r<INDEX>(r<BASE>)"
5058 // start-sanitize-vr4320
5060 // end-sanitize-vr4320
5061 // start-sanitize-vr5400
5063 // end-sanitize-vr5400
5065 unsigned32 instruction = instruction_0;
5066 int fs = ((instruction >> 11) & 0x0000001F);
5067 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5068 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5070 address_word vaddr = ((unsigned64)op1 + (unsigned64)op2);
5073 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5074 Prefetch(uncached,paddr,vaddr,isDATA,fs);
5078 010001,10,3.FMT,00000,5.FS,5.FD,010101:COP1:32::RECIP.fmt
5080 "recip.%s<FMT> f<FD>, f<FS>"
5082 // start-sanitize-vr4320
5084 // end-sanitize-vr4320
5085 // start-sanitize-vr5400
5087 // end-sanitize-vr5400
5089 unsigned32 instruction = instruction_0;
5090 int destreg = ((instruction >> 6) & 0x0000001F);
5091 int fs = ((instruction >> 11) & 0x0000001F);
5092 int format = ((instruction >> 21) & 0x00000007);
5094 if ((format != fmt_single) && (format != fmt_double))
5095 SignalException(ReservedInstruction,instruction);
5097 StoreFPR(destreg,format,Recip(ValueFPR(fs,format),format));
5102 010001,10,3.FMT,00000,5.FS,5.FD,001000:COP1:64::ROUND.L.fmt
5103 "round.l.%s<FMT> f<FD>, f<FS>"
5107 // start-sanitize-vr4320
5109 // end-sanitize-vr4320
5110 // start-sanitize-vr5400
5112 // end-sanitize-vr5400
5113 // start-sanitize-r5900
5115 // end-sanitize-r5900
5117 // start-sanitize-tx19
5119 // end-sanitize-tx19
5121 unsigned32 instruction = instruction_0;
5122 int destreg = ((instruction >> 6) & 0x0000001F);
5123 int fs = ((instruction >> 11) & 0x0000001F);
5124 int format = ((instruction >> 21) & 0x00000007);
5126 if ((format != fmt_single) && (format != fmt_double))
5127 SignalException(ReservedInstruction,instruction);
5129 StoreFPR(destreg,fmt_long,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_long));
5134 010001,10,3.FMT,00000,5.FS,5.FD,001100:COP1:32::ROUND.W.fmt
5135 "round.w.%s<FMT> f<FD>, f<FS>"
5140 // start-sanitize-vr4320
5142 // end-sanitize-vr4320
5143 // start-sanitize-vr5400
5145 // end-sanitize-vr5400
5146 // start-sanitize-r5900
5148 // end-sanitize-r5900
5150 // start-sanitize-tx19
5152 // end-sanitize-tx19
5154 unsigned32 instruction = instruction_0;
5155 int destreg = ((instruction >> 6) & 0x0000001F);
5156 int fs = ((instruction >> 11) & 0x0000001F);
5157 int format = ((instruction >> 21) & 0x00000007);
5159 if ((format != fmt_single) && (format != fmt_double))
5160 SignalException(ReservedInstruction,instruction);
5162 StoreFPR(destreg,fmt_word,Convert(FP_RM_NEAREST,ValueFPR(fs,format),format,fmt_word));
5167 010001,10,3.FMT,00000,5.FS,5.FD,010110:COP1:32::RSQRT.fmt
5169 "rsqrt.%s<FMT> f<FD>, f<FS>"
5171 // start-sanitize-vr4320
5173 // end-sanitize-vr4320
5174 // start-sanitize-vr5400
5176 // end-sanitize-vr5400
5178 unsigned32 instruction = instruction_0;
5179 int destreg = ((instruction >> 6) & 0x0000001F);
5180 int fs = ((instruction >> 11) & 0x0000001F);
5181 int format = ((instruction >> 21) & 0x00000007);
5183 if ((format != fmt_single) && (format != fmt_double))
5184 SignalException(ReservedInstruction,instruction);
5186 StoreFPR(destreg,format,Recip(SquareRoot(ValueFPR(fs,format),format),format));
5191 111101,5.BASE,5.FT,16.OFFSET:COP1:64::SDC1
5192 "sdc1 f<FT>, <OFFSET>(r<BASE>)"
5197 // start-sanitize-vr4320
5199 // end-sanitize-vr4320
5200 // start-sanitize-vr5400
5202 // end-sanitize-vr5400
5204 // start-sanitize-tx19
5206 // end-sanitize-tx19
5208 address_word vaddr = GPR[BASE] + EXTEND16 (OFFSET);
5210 if ((vaddr & 7) != 0)
5211 SignalExceptionAddressStore();
5216 AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL);
5217 memval = (unsigned64) COP_SD(((instruction_0 >> 26) & 0x3),FT);
5218 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,0,paddr,vaddr,isREAL);
5223 010011,5.RS,5.RT,vvvvv,00000001001:COP1X:64::SDXC1
5226 // start-sanitize-vr4320
5228 // end-sanitize-vr4320
5229 // start-sanitize-vr5400
5231 // end-sanitize-vr5400
5233 unsigned32 instruction = instruction_0;
5234 int fs = ((instruction >> 11) & 0x0000001F);
5235 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5236 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5238 address_word vaddr = ((unsigned64)op1 + op2);
5241 if ((vaddr & 7) != 0)
5242 SignalExceptionAddressStore();
5245 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5247 unsigned64 memval = 0;
5248 unsigned64 memval1 = 0;
5249 memval = (unsigned64)COP_SD(1,fs);
5251 StoreMemory(uncached,AccessLength_DOUBLEWORD,memval,memval1,paddr,vaddr,isREAL);
5259 010001,10,3.FMT,00000,5.FS,5.FD,000100:COP1:32::SQRT.fmt
5260 "sqrt.%s<FMT> f<FD>, f<FS>"
5265 // start-sanitize-vr4320
5267 // end-sanitize-vr4320
5268 // start-sanitize-vr5400
5270 // end-sanitize-vr5400
5272 // start-sanitize-tx19
5274 // end-sanitize-tx19
5276 unsigned32 instruction = instruction_0;
5277 int destreg = ((instruction >> 6) & 0x0000001F);
5278 int fs = ((instruction >> 11) & 0x0000001F);
5279 int format = ((instruction >> 21) & 0x00000007);
5281 if ((format != fmt_single) && (format != fmt_double))
5282 SignalException(ReservedInstruction,instruction);
5284 StoreFPR(destreg,format,(SquareRoot(ValueFPR(fs,format),format)));
5289 010001,10,3.FMT,5.FT,5.FS,5.FD,000001:COP1:32::SUB.fmt
5290 "sub.%s<FMT> f<FD>, f<FS>, f<FT>"
5291 *mipsI,mipsII,mipsIII,mipsIV:
5293 // start-sanitize-vr4320
5295 // end-sanitize-vr4320
5296 // start-sanitize-vr5400
5298 // end-sanitize-vr5400
5300 // start-sanitize-tx19
5302 // end-sanitize-tx19
5304 unsigned32 instruction = instruction_0;
5305 int destreg = ((instruction >> 6) & 0x0000001F);
5306 int fs = ((instruction >> 11) & 0x0000001F);
5307 int ft = ((instruction >> 16) & 0x0000001F);
5308 int format = ((instruction >> 21) & 0x00000007);
5310 if ((format != fmt_single) && (format != fmt_double))
5311 SignalException(ReservedInstruction,instruction);
5313 StoreFPR(destreg,format,Sub(ValueFPR(fs,format),ValueFPR(ft,format),format));
5319 111001,5.BASE,5.FT,16.OFFSET:COP1:32::SWC1
5320 "swc1 f<FT>, <OFFSET>(r<BASE>)"
5321 *mipsI,mipsII,mipsIII,mipsIV:
5323 // start-sanitize-vr4320
5325 // end-sanitize-vr4320
5326 // start-sanitize-vr5400
5328 // end-sanitize-vr5400
5329 // start-sanitize-r5900
5331 // end-sanitize-r5900
5333 // start-sanitize-tx19
5335 // end-sanitize-tx19
5337 unsigned32 instruction = instruction_0;
5338 signed_word offset = EXTEND16 (OFFSET);
5339 int destreg UNUSED = ((instruction >> 16) & 0x0000001F);
5340 signed_word op1 UNUSED = GPR[((instruction >> 21) & 0x0000001F)];
5342 address_word vaddr = ((uword64)op1 + offset);
5345 if ((vaddr & 3) != 0)
5346 SignalExceptionAddressStore();
5349 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5352 uword64 memval1 = 0;
5355 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
5356 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
5357 memval = (((uword64)COP_SW(((instruction >> 26) & 0x3),destreg)) << (8 * byte));
5359 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5367 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32::SWXC1
5368 "swxc1 f<FS>, r<INDEX>(r<BASE>)"
5371 // start-sanitize-vr4320
5373 // end-sanitize-vr4320
5374 // start-sanitize-vr5400
5376 // end-sanitize-vr5400
5378 unsigned32 instruction = instruction_0;
5379 int fs = ((instruction >> 11) & 0x0000001F);
5380 signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5381 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5383 address_word vaddr = ((unsigned64)op1 + op2);
5386 if ((vaddr & 3) != 0)
5387 SignalExceptionAddressStore();
5390 if (AddressTranslation(vaddr,isDATA,isSTORE,&paddr,&uncached,isTARGET,isREAL))
5392 unsigned64 memval = 0;
5393 unsigned64 memval1 = 0;
5394 unsigned64 mask = 0x7;
5396 paddr = ((paddr & ~mask) | ((paddr & mask) ^ (ReverseEndian << 2)));
5397 byte = ((vaddr & mask) ^ (BigEndianCPU << 2));
5398 memval = (((unsigned64)COP_SW(1,fs)) << (8 * byte));
5400 StoreMemory(uncached,AccessLength_WORD,memval,memval1,paddr,vaddr,isREAL);
5408 010001,10,3.FMT,00000,5.FS,5.FD,001001:COP1:64::TRUNC.L.fmt
5409 "trunc.l.%s<FMT> f<FD>, f<FS>"
5413 // start-sanitize-vr4320
5415 // end-sanitize-vr4320
5416 // start-sanitize-vr5400
5418 // end-sanitize-vr5400
5419 // start-sanitize-r5900
5421 // end-sanitize-r5900
5423 // start-sanitize-tx19
5425 // end-sanitize-tx19
5427 unsigned32 instruction = instruction_0;
5428 int destreg = ((instruction >> 6) & 0x0000001F);
5429 int fs = ((instruction >> 11) & 0x0000001F);
5430 int format = ((instruction >> 21) & 0x00000007);
5432 if ((format != fmt_single) && (format != fmt_double))
5433 SignalException(ReservedInstruction,instruction);
5435 StoreFPR(destreg,fmt_long,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_long));
5440 010001,10,3.FMT,00000,5.FS,5.FD,001101:COP1:32::TRUNC.W
5441 "trunc.w.%s<FMT> f<FD>, f<FS>"
5446 // start-sanitize-vr4320
5448 // end-sanitize-vr4320
5449 // start-sanitize-vr5400
5451 // end-sanitize-vr5400
5452 // start-sanitize-r5900
5454 // end-sanitize-r5900
5456 // start-sanitize-tx19
5458 // end-sanitize-tx19
5460 unsigned32 instruction = instruction_0;
5461 int destreg = ((instruction >> 6) & 0x0000001F);
5462 int fs = ((instruction >> 11) & 0x0000001F);
5463 int format = ((instruction >> 21) & 0x00000007);
5465 if ((format != fmt_single) && (format != fmt_double))
5466 SignalException(ReservedInstruction,instruction);
5468 StoreFPR(destreg,fmt_word,Convert(FP_RM_TOZERO,ValueFPR(fs,format),format,fmt_word));
5474 // MIPS Architecture:
5476 // System Control Instruction Set (COP0)
5480 010000,01000,00000,16.OFFSET:COP0:32::BC0F
5482 *mipsI,mipsII,mipsIII,mipsIV:
5484 // start-sanitize-vr4320
5486 // end-sanitize-vr4320
5487 // start-sanitize-vr5400
5489 // end-sanitize-vr5400
5490 // start-sanitize-r5900
5492 // end-sanitize-r5900
5495 010000,01000,00010,16.OFFSET:COP0:32::BC0FL
5497 *mipsI,mipsII,mipsIII,mipsIV:
5499 // start-sanitize-vr4320
5501 // end-sanitize-vr4320
5502 // start-sanitize-vr5400
5504 // end-sanitize-vr5400
5505 // start-sanitize-r5900
5507 // end-sanitize-r5900
5510 010000,01000,00001,16.OFFSET:COP0:32::BC0T
5512 *mipsI,mipsII,mipsIII,mipsIV:
5513 // start-sanitize-r5900
5515 // end-sanitize-r5900
5519 010000,01000,00011,16.OFFSET:COP0:32::BC0TL
5521 *mipsI,mipsII,mipsIII,mipsIV:
5523 // start-sanitize-vr4320
5525 // end-sanitize-vr4320
5526 // start-sanitize-vr5400
5528 // end-sanitize-vr5400
5529 // start-sanitize-r5900
5531 // end-sanitize-r5900
5534 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE
5538 // start-sanitize-vr4320
5540 // end-sanitize-vr4320
5541 // start-sanitize-vr5400
5543 // end-sanitize-vr5400
5544 // start-sanitize-r5900
5546 // end-sanitize-r5900
5548 // start-sanitize-tx19
5550 // end-sanitize-tx19
5552 unsigned32 instruction = instruction_0;
5553 signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
5554 int hint = ((instruction >> 16) & 0x0000001F);
5555 signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5557 address_word vaddr = (op1 + offset);
5560 if (AddressTranslation(vaddr,isDATA,isLOAD,&paddr,&uncached,isTARGET,isREAL))
5561 CacheOp(hint,vaddr,paddr,instruction);
5566 010000,10000,000000000000000,111001:COP0:32::DI
5568 *mipsI,mipsII,mipsIII,mipsIV:
5570 // start-sanitize-vr4320
5572 // end-sanitize-vr4320
5573 // start-sanitize-vr5400
5575 // end-sanitize-vr5400
5576 // start-sanitize-r5900
5578 // end-sanitize-r5900
5581 010000,10000,000000000000000,111000:COP0:32::EI
5583 *mipsI,mipsII,mipsIII,mipsIV:
5585 // start-sanitize-vr4320
5587 // end-sanitize-vr4320
5588 // start-sanitize-vr5400
5590 // end-sanitize-vr5400
5591 // start-sanitize-r5900
5593 // end-sanitize-r5900
5596 010000,10000,000000000000000,011000:COP0:32::ERET
5601 // start-sanitize-vr4320
5603 // end-sanitize-vr4320
5604 // start-sanitize-vr5400
5606 // end-sanitize-vr5400
5607 // start-sanitize-r5900
5609 // end-sanitize-r5900
5612 010000,00000,5.RT,5.RD,00000,6.REGX:COP0:32::MFC0
5613 "mfc0 r<RT>, r<RD> # <REGX>"
5614 *mipsI,mipsII,mipsIII,mipsIV:
5616 // start-sanitize-vr4320
5618 // end-sanitize-vr4320
5619 // start-sanitize-vr5400
5621 // end-sanitize-vr5400
5622 // start-sanitize-r5900
5624 // end-sanitize-r5900
5626 DecodeCoproc (instruction_0);
5629 010000,00100,5.RT,5.RD,00000,6.REGX:COP0:32::MTC0
5630 "mtc0 r<RT>, r<RD> # <REGX>"
5631 *mipsI,mipsII,mipsIII,mipsIV:
5633 // start-sanitize-vr4320
5635 // end-sanitize-vr4320
5636 // start-sanitize-vr5400
5638 // end-sanitize-vr5400
5639 // start-sanitize-r5900
5641 // end-sanitize-r5900
5643 DecodeCoproc (instruction_0);
5647 010000,10000,000000000000000,001000:COP0:32::TLBP
5649 *mipsI,mipsII,mipsIII,mipsIV:
5651 // start-sanitize-vr4320
5653 // end-sanitize-vr4320
5654 // start-sanitize-vr5400
5656 // end-sanitize-vr5400
5657 // start-sanitize-r5900
5659 // end-sanitize-r5900
5662 010000,10000,000000000000000,000001:COP0:32::TLBR
5664 *mipsI,mipsII,mipsIII,mipsIV:
5666 // start-sanitize-vr4320
5668 // end-sanitize-vr4320
5669 // start-sanitize-vr5400
5671 // end-sanitize-vr5400
5672 // start-sanitize-r5900
5674 // end-sanitize-r5900
5677 010000,10000,000000000000000,000010:COP0:32::TLBWI
5679 *mipsI,mipsII,mipsIII,mipsIV:
5681 // start-sanitize-vr4320
5683 // end-sanitize-vr4320
5684 // start-sanitize-vr5400
5686 // end-sanitize-vr5400
5687 // start-sanitize-r5900
5689 // end-sanitize-r5900
5692 010000,10000,000000000000000,000110:COP0:32::TLBWR
5694 *mipsI,mipsII,mipsIII,mipsIV:
5696 // start-sanitize-vr4320
5698 // end-sanitize-vr4320
5699 // start-sanitize-vr5400
5701 // end-sanitize-vr5400
5702 // start-sanitize-r5900
5704 // end-sanitize-r5900
5707 :include:16::m16.igen
5708 // start-sanitize-vr4320
5709 :include::vr4320:vr4320.igen
5710 // end-sanitize-vr4320
5711 // start-sanitize-vr5400
5712 :include::vr5400:vr5400.igen
5713 :include:64,f::mdmx.igen
5714 // end-sanitize-vr5400
5715 // start-sanitize-r5900
5716 :include::r5900:r5900.igen
5717 // end-sanitize-r5900
5719 // start-sanitize-cygnus-never
5721 // // FIXME FIXME FIXME What is this instruction?
5722 // 111011,5.RS,5.RT,16.OFFSET:NORMAL:32::<INT>
5727 // // start-sanitize-r5900
5729 // // end-sanitize-r5900
5731 // // start-sanitize-tx19
5733 // // end-sanitize-tx19
5735 // unsigned32 instruction = instruction_0;
5736 // signed_word offset = SIGNEXTEND((signed_word)((instruction >> 0) & 0x0000FFFF),16);
5737 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5738 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5740 // if (CoProcPresent(3))
5741 // SignalException(CoProcessorUnusable);
5743 // SignalException(ReservedInstruction,instruction);
5747 // end-sanitize-cygnus-never
5748 // start-sanitize-cygnus-never
5750 // // FIXME FIXME FIXME What is this?
5751 // 11100,******,00001:RR:16::SDBBP
5754 // unsigned32 instruction = instruction_0;
5755 // if (have_extendval)
5756 // SignalException (ReservedInstruction, instruction);
5758 // SignalException(DebugBreakPoint,instruction);
5762 // end-sanitize-cygnus-never
5763 // start-sanitize-cygnus-never
5765 // // FIXME FIXME FIXME What is this?
5766 // 000000,********************,001110:SPECIAL:32::SDBBP
5769 // unsigned32 instruction = instruction_0;
5771 // SignalException(DebugBreakPoint,instruction);
5775 // end-sanitize-cygnus-never
5776 // start-sanitize-cygnus-never
5778 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5779 // // isn't yet reconized by this simulator.
5780 // 000000,5.RS,5.RT,0000000000101000:SPECIAL:32::MADD16
5783 // unsigned32 instruction = instruction_0;
5784 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5785 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5787 // CHECKHILO("Multiply-Add");
5789 // unsigned64 temp = (op1 * op2);
5790 // temp += (SET64HI(VL4_8(HI)) | VL4_8(LO));
5791 // LO = SIGNEXTEND((unsigned64)VL4_8(temp),32);
5792 // HI = SIGNEXTEND((unsigned64)VH4_8(temp),32);
5797 // end-sanitize-cygnus-never
5798 // start-sanitize-cygnus-never
5800 // // FIXME FIXME FIXME This apparently belongs to the vr4100 which
5801 // // isn't yet reconized by this simulator.
5802 // 000000,5.RS,5.RT,0000000000101001:SPECIAL:64::DMADD16
5805 // unsigned32 instruction = instruction_0;
5806 // signed_word op2 = GPR[((instruction >> 16) & 0x0000001F)];
5807 // signed_word op1 = GPR[((instruction >> 21) & 0x0000001F)];
5809 // CHECKHILO("Multiply-Add");
5811 // unsigned64 temp = (op1 * op2);
5817 // end-sanitize-cygnus-never