6 // CPU Instruction Set (mips16)
9 // The instructions in this section are ordered according
10 // to http://www.sgi.com/MIPS/arch/MIPS16/mips16.pdf.
13 // The MIPS16 codes registers in a special way, map from one to the other.
14 // :<type>:<flags>:<models>:<typedef>:<name>:<field>:<expression>
15 :compute:::int:TRX:RX:((RX < 2) ? (16 + RX) \: RX)
16 :compute:::int:TRY:RY:((RY < 2) ? (16 + RY) \: RY)
17 :compute:::int:TRZ:RZ:((RZ < 2) ? (16 + RZ) \: RZ)
18 :compute:::int:SHIFT:SHAMT:((SHAMT == 0) ? 8 \: SHAMT)
20 :compute:::int:SHAMT:SHAMT_4_0,S5:(LSINSERTED (S5, 5, 5) | SHAMT_4_0)
22 :compute:::address_word:IMMEDIATE:IMM_25_21,IMM_20_16,IMMED_15_0:(LSINSERTED (IMM_25_21, 25, 21) | LSINSERTED (IMM_20_16, 20, 16) | LSINSERTED (IMMED_15_0, 15, 0))
23 :compute:::int:R32:R32L,R32H:((R32H << 3) | R32L)
25 :compute:::address_word:IMMEDIATE:IMM_10_5,IMM_15_11,IMM_4_0:(LSINSERTED (IMM_10_5, 10, 5) | LSINSERTED (IMM_15_11, 15, 11) | LSINSERTED (IMM_4_0, 4, 0))
27 :compute:::address_word:IMMEDIATE:IMM_10_4,IMM_14_11,IMM_3_0:(LSINSERTED (IMM_10_4, 10, 4) | LSINSERTED (IMM_14_11, 14, 11) | LSINSERTED (IMM_3_0, 3, 0))
31 // Only the `LB' instruction is implemented. It should be used as a guideline
32 // when implementing other instructions.
34 // How to handle delayslots (for jumps) and extended lwpc instructions
35 // has not been resolved.
38 // Load and Store Instructions
41 10000,3.RX,3.RY,5.IMMED:RRI:16::LB
42 "lb r<TRY>, <IMMED> (r<TRX>)"
44 // start-sanitize-tx19
48 GPR[TRY] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[TRX], IMMED));
51 11110,6.IMM_10_5,5.IMM_15_11 + 10000,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::LB
52 "lb r<TRY>, <IMMEDIATE> (r<TRX>)"
54 // start-sanitize-tx19
58 GPR[TRY] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[TRX], EXTEND16 (IMMEDIATE)));
63 10100,3.RX,3.RY,5.IMMED:RRI:16::LBU
64 "lbu r<TRY>, <IMMED> (r<TRX>)"
66 // start-sanitize-tx19
70 GPR[TRY] = do_load (SD_, AccessLength_BYTE, GPR[TRX], IMMED);
73 11110,6.IMM_10_5,5.IMM_15_11 + 10100,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::LBU
74 "lbu r<TRY>, <IMMEDIATE> (r<TRX>)"
76 // start-sanitize-tx19
80 GPR[TRY] = do_load (SD_, AccessLength_BYTE, GPR[TRX], EXTEND16 (IMMEDIATE));
85 10001,3.RX,3.RY,5.IMMED:RRI:16::LH
86 "lh r<TRY>, <IMMED> (r<TRX>)"
88 // start-sanitize-tx19
92 GPR[TRY] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[TRX], IMMED << 1));
95 11110,6.IMM_10_5,5.IMM_15_11 + 10001,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::LH
96 "lh r<TRY>, <IMMEDIATE> (r<TRX>)"
98 // start-sanitize-tx19
102 GPR[TRY] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[TRX], EXTEND16 (IMMEDIATE)));
107 10101,3.RX,3.RY,5.IMMED:RRI:16::LHU
108 "lhu r<TRY>, <IMMED> (r<TRX>)"
110 // start-sanitize-tx19
114 GPR[TRY] = do_load (SD_, AccessLength_HALFWORD, GPR[TRX], IMMED << 1);
117 11110,6.IMM_10_5,5.IMM_15_11 + 10101,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::LHU
118 "lhu r<TRY>, <IMMEDIATE> (r<TRX>)"
120 // start-sanitize-tx19
124 GPR[TRY] = do_load (SD_, AccessLength_HALFWORD, GPR[TRX], EXTEND16 (IMMEDIATE));
129 10011,3.RX,3.RY,5.IMMED:RRI:16::LW
130 "lw r<TRY>, <IMMED> (r<TRX>)"
132 // start-sanitize-tx19
136 GPR[TRY] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[TRX], IMMED << 2));
139 11110,6.IMM_10_5,5.IMM_15_11 + 10011,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::LW
140 "lw r<TRY>, <IMMEDIATE> (r<TRX>)"
142 // start-sanitize-tx19
146 GPR[TRY] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[TRX], EXTEND16 (IMMEDIATE)));
151 10110,3.RX,8.IMMED:RI:16::LWPC
152 "lw r<TRX>, <IMMED> (PC)"
154 // start-sanitize-tx19
158 GPR[TRX] = EXTEND32 (do_load (SD_, AccessLength_WORD,
159 basepc (SD_) & ~3, IMMED << 2));
162 11110,6.IMM_10_5,5.IMM_15_11 + 10110,3.RX,000,5.IMM_4_0:EXT-RI:16::LWPC
163 "lw r<TRX>, <IMMEDIATE> (PC)"
165 // start-sanitize-tx19
169 GPR[TRX] = EXTEND32 (do_load (SD_, AccessLength_WORD, basepc (SD_) & ~3, EXTEND16 (IMMEDIATE)));
174 10010,3.RX,8.IMMED:RI:16::LWSP
175 "lw r<TRX>, <IMMED> (SP)"
177 // start-sanitize-tx19
181 GPR[TRX] = EXTEND32 (do_load (SD_, AccessLength_WORD, SP, IMMED << 2));
184 11110,6.IMM_10_5,5.IMM_15_11 + 10010,3.RX,000,5.IMM_4_0:EXT-RI:16::LWSP
185 "lw r<TRX>, <IMMEDIATE> (SP)"
187 // start-sanitize-tx19
191 GPR[TRX] = EXTEND32 (do_load (SD_, AccessLength_WORD, SP, EXTEND16 (IMMEDIATE)));
196 10111,3.RX,3.RY,5.IMMED:RRI:16::LWU
197 "lwu r<TRY>, <IMMED> (r<TRX>)"
199 // start-sanitize-tx19
203 GPR[TRY] = do_load (SD_, AccessLength_WORD, GPR[TRX], IMMED << 2);
206 11110,6.IMM_10_5,5.IMM_15_11 + 10111,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::LWU
207 "lwu r<TRY>, <IMMEDIATE> (r<TRX>)"
209 // start-sanitize-tx19
213 GPR[TRY] = do_load (SD_, AccessLength_WORD, GPR[TRX], EXTEND16 (IMMEDIATE));
218 00111,3.RX,3.RY,5.IMMED:RRI:16,64::LD
219 "ld r<TRY>, <IMMED> (r<TRX>)"
221 // start-sanitize-tx19
225 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD, GPR[TRX], IMMED << 3);
228 11110,6.IMM_10_5,5.IMM_15_11 + 00111,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16,64::LD
229 "ld r<TRY>, <IMMED> (r<TRX>)"
231 // start-sanitize-tx19
235 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD, GPR[TRX], EXTEND16 (IMMEDIATE));
240 11111,100,3.RY,5.IMMED:RI64:16::LDPC
241 "ld r<TRY>, <IMMED> (PC)"
243 // start-sanitize-tx19
247 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD,
248 basepc (SD_) & ~7, IMMED << 3);
251 11110,6.IMM_10_5,5.IMM_15_11 + 11111,100,3.RY,5.IMM_4_0:EXT-RI64:16::LDPC
252 "ld r<TRY>, <IMMEDIATE> (PC)"
254 // start-sanitize-tx19
258 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD, basepc (SD_) & ~7, EXTEND16 (IMMEDIATE));
263 11111,000,3.RY,5.IMMED:RI64:16::LDSP
264 "ld r<TRY>, <IMMED> (SP)"
266 // start-sanitize-tx19
270 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD, SP, IMMED << 3);
273 11110,6.IMM_10_5,5.IMM_15_11 + 11111,000,3.RY,5.IMM_4_0:EXT-RI64:16::LDSP
274 "ld r<TRY>, <IMMEDIATE> (SP)"
276 // start-sanitize-tx19
280 GPR[TRY] = do_load (SD_, AccessLength_DOUBLEWORD, SP, EXTEND16 (IMMEDIATE));
285 11000,3.RX,3.RY,5.IMMED:RRI:16::SB
286 "sb r<TRY>, <IMMED> (r<TRX>)"
288 // start-sanitize-tx19
292 do_store (SD_, AccessLength_BYTE, GPR[TRX], IMMED, GPR[TRY]);
295 11110,6.IMM_10_5,5.IMM_15_11 + 11000,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::SB
296 "sb r<TRY>, <IMMEDIATE> (r<TRX>)"
298 // start-sanitize-tx19
302 do_store (SD_, AccessLength_BYTE, GPR[TRX], EXTEND16 (IMMEDIATE), GPR[TRY]);
307 11001,3.RX,3.RY,5.IMMED:RRI:16::SH
308 "sh r<TRY>, <IMMED> (r<TRX>)"
310 // start-sanitize-tx19
314 do_store (SD_, AccessLength_HALFWORD, GPR[TRX], IMMED << 1, GPR[TRY]);
317 11110,6.IMM_10_5,5.IMM_15_11 + 11001,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::SH
318 "sh r<TRY>, <IMMEDIATE> (r<TRX>)"
320 // start-sanitize-tx19
324 do_store (SD_, AccessLength_HALFWORD, GPR[TRX], EXTEND16 (IMMEDIATE), GPR[TRY]);
329 11011,3.RX,3.RY,5.IMMED:RRI:16::SW
330 "sw r<TRY>, <IMMED> (r<TRX>)"
332 // start-sanitize-tx19
336 do_store (SD_, AccessLength_WORD, GPR[TRX], IMMED << 2, GPR[TRY]);
339 11110,6.IMM_10_5,5.IMM_15_11 + 11011,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::SW
340 "sw r<TRY>, <IMMEDIATE> (r<TRX>)"
342 // start-sanitize-tx19
346 do_store (SD_, AccessLength_WORD, GPR[TRX], EXTEND16 (IMMEDIATE), GPR[TRY]);
351 11010,3.RX,8.IMMED:RI:16::SWSP
352 "sw r<TRX>, <IMMED> (SP)"
354 // start-sanitize-tx19
358 do_store (SD_, AccessLength_WORD, SP, IMMED << 2, GPR[TRX]);
361 11110,6.IMM_10_5,5.IMM_15_11 + 11010,3.RX,000,5.IMM_4_0:EXT-RI:16::SWSP
362 "sw r<TRX>, <IMMEDIATE> (SP)"
364 // start-sanitize-tx19
368 do_store (SD_, AccessLength_WORD, SP, EXTEND16 (IMMEDIATE), GPR[TRX]);
373 01100,010,8.IMMED:I8:16::SWRASP
374 "sw r<RAIDX>, <IMMED> (SP)"
376 // start-sanitize-tx19
380 do_store (SD_, AccessLength_WORD, SP, IMMED << 2, RA);
383 11110,6.IMM_10_5,5.IMM_15_11 + 01100,010,000,5.IMM_4_0:EXT-I8:16::SWRASP
384 "sw r<RAIDX>, <IMMEDIATE> (SP)"
386 // start-sanitize-tx19
390 do_store (SD_, AccessLength_WORD, SP, EXTEND16 (IMMEDIATE), RA);
395 01111,3.RX,3.RY,5.IMMED:RRI:16::SD
396 "sd r<TRY>, <IMMED> (r<TRX>)"
398 // start-sanitize-tx19
402 do_store (SD_, AccessLength_DOUBLEWORD, GPR[TRX], IMMED << 3, GPR[TRY]);
405 11110,6.IMM_10_5,5.IMM_15_11 + 01111,3.RX,3.RY,5.IMM_4_0:EXT-RRI:16::SD
406 "sd r<TRY>, <IMMEDIATE> (r<TRX>)"
408 // start-sanitize-tx19
412 do_store (SD_, AccessLength_DOUBLEWORD, GPR[TRX], EXTEND16 (IMMEDIATE), GPR[TRY]);
417 11111,001,3.RY,5.IMMED:RI64:16::SDSP
418 "sd r<TRY>, <IMMED> (SP)"
420 // start-sanitize-tx19
424 do_store (SD_, AccessLength_DOUBLEWORD, SP, IMMED << 3, GPR[TRY]);
427 11110,6.IMM_10_5,5.IMM_15_11 + 11111,001,3.RY,5.IMM_4_0:EXT-RI64:16::SDSP
428 "sd r<TRY>, <IMMEDIATE> (SP)"
430 // start-sanitize-tx19
434 do_store (SD_, AccessLength_DOUBLEWORD, SP, EXTEND16 (IMMEDIATE), GPR[TRY]);
439 11111,010,8.IMMED:I64:16::SDRASP
440 "sd r<RAIDX>, <IMMED> (SP)"
442 // start-sanitize-tx19
446 do_store (SD_, AccessLength_DOUBLEWORD, SP, IMMED << 3, RA);
449 11110,6.IMM_10_5,5.IMM_15_11 + 11111,010,000,5.IMM_4_0:EXT-I64:16::SDRASP
450 "sd r<RAIDX>, <IMMEDIATE> (SP)"
452 // start-sanitize-tx19
456 do_store (SD_, AccessLength_DOUBLEWORD, SP, EXTEND16 (IMMEDIATE), RA);
461 // ALU Immediate Instructions
464 01101,3.RX,8.IMMED:RI:16::LI
467 // start-sanitize-tx19
471 do_ori (SD_, 0, TRX, IMMED);
474 11110,6.IMM_10_5,5.IMM_15_11 + 01101,3.RX,000,5.IMM_4_0:EXT-RI:16::LI
475 "li r<TRX>, <IMMEDIATE>"
477 // start-sanitize-tx19
481 do_ori (SD_, 0, TRX, IMMEDIATE);
486 01000,3.RX,3.RY,0,4.IMMED:RRI-A:16::ADDIU
487 "addiu r<TRY>, r<TRX>, <IMMED>"
489 // start-sanitize-tx19
493 do_addiu (SD_, TRX, TRY, EXTEND4 (IMMED));
496 11110,7.IMM_10_4,4.IMM_14_11 + 01000,3.RX,3.RY,0,4.IMM_3_0:EXT-RRI-A:16::ADDIU
497 "addiu r<TRY>, r<TRX>, <IMMEDIATE>"
499 // start-sanitize-tx19
503 do_addiu (SD_, TRX, TRY, EXTEND15 (IMMEDIATE));
508 01001,3.RX,8.IMMED:RI:16::ADDIU8
509 "addiu r<TRX>, <IMMED>"
511 // start-sanitize-tx19
515 do_addiu (SD_, TRX, TRX, EXTEND8 (IMMED));
518 11110,6.IMM_10_5,5.IMM_15_11 + 01001,3.RX,000,5.IMM_4_0:EXT-RI:16::ADDIU8
519 "addiu r<TRX>, <IMMEDIATE>"
521 // start-sanitize-tx19
525 do_addiu (SD_, TRX, TRX, EXTEND16 (IMMEDIATE));
530 01100,011,8.IMMED:I8:16::ADJSP
533 // start-sanitize-tx19
537 do_addiu (SD_, SPIDX, SPIDX, EXTEND8 (IMMED) << 3);
540 11110,6.IMM_10_5,5.IMM_15_11 + 01100,011,000,5.IMM_4_0:EXT-I8:16::ADJSP
541 "addiu SP, <IMMEDIATE>"
543 // start-sanitize-tx19
547 do_addiu (SD_, SPIDX, SPIDX, EXTEND16 (IMMEDIATE));
552 00001,3.RX,8.IMMED:RI:16::ADDIUPC
553 "addiu r<TRX>, PC, <IMMED>"
555 // start-sanitize-tx19
559 unsigned32 temp = (basepc (SD_) & ~3) + (EXTEND8 (IMMED) << 2);
560 GPR[TRX] = EXTEND32 (temp);
563 11110,6.IMM_10_5,5.IMM_15_11 + 00001,3.RX,000,5.IMM_4_0:EXT-RI:16::ADDIUPC
564 "addiu r<TRX>, PC, <IMMEDIATE>"
566 // start-sanitize-tx19
570 unsigned32 temp = (basepc (SD_) & ~3) + EXTEND16 (IMMEDIATE);
571 GPR[TRX] = EXTEND32 (temp);
576 00000,3.RX,8.IMMED:RI:16::ADDIUSP
577 "addiu r<TRX>, SP, <IMMED>"
579 // start-sanitize-tx19
583 do_addiu (SD_, SPIDX, TRX, EXTEND8 (IMMED) << 2);
586 11110,6.IMM_10_5,5.IMM_15_11 + 00000,3.RX,000,5.IMM_4_0:EXT-RI:16::ADDIUSP
587 "addiu r<TRX>, SP, <IMMEDIATE>"
589 // start-sanitize-tx19
593 do_addiu (SD_, SPIDX, TRX, EXTEND16 (IMMEDIATE));
598 01000,3.RX,3.RY,1,4.IMMED:RRI-A:16,64::DADDIU
599 "daddiu r<TRY>, r<TRX>, <IMMED>"
601 // start-sanitize-tx19
605 do_daddiu (SD_, TRX, TRY, EXTEND4 (IMMED));
608 11110,7.IMM_10_4,4.IMM_14_11 + 01000,3.RX,3.RY,1,4.IMM_3_0:EXT-RRI-A:16,64::DADDIU
609 "daddiu r<TRY>, r<TRX>, <IMMED>"
611 // start-sanitize-tx19
615 do_daddiu (SD_, TRX, TRY, EXTEND15 (IMMEDIATE));
620 11111,101,3.RY,5.IMMED:RI64:16,64::DADDIU5
621 "daddiu r<TRY>, <IMMED>"
623 // start-sanitize-tx19
627 do_daddiu (SD_, TRY, TRY, EXTEND5 (IMMED));
630 11110,6.IMM_10_5,5.IMM_15_11 + 11111,101,3.RY,5.IMM_4_0:EXT-RI64:16,64::DADDIU5
631 "daddiu r<TRY>, <IMMED>"
633 // start-sanitize-tx19
637 do_daddiu (SD_, TRY, TRY, EXTEND5 (IMMEDIATE));
642 11111,011,8.IMMED:I64:16,64::DADJSP
645 // start-sanitize-tx19
649 do_daddiu (SD_, SPIDX, SPIDX, EXTEND8 (IMMED) << 3);
652 11110,6.IMM_10_5,5.IMM_15_11 + 11111,011,000,5.IMM_4_0:EXT-I64:16,64::DADJSP
655 // start-sanitize-tx19
659 do_daddiu (SD_, SPIDX, SPIDX, EXTEND16 (IMMEDIATE));
664 11111,110,3.RY,5.IMMED:RI64:16,64::DADDIUPC
665 "daddiu r<TRY>, PC, <IMMED>"
667 // start-sanitize-tx19
671 GPR[TRY] = (basepc (SD_) & ~3) + (EXTEND5 (IMMED) << 2);
674 11110,6.IMM_10_5,5.IMM_15_11 + 11111,110,3.RY,5.IMM_4_0:EXT-RI64:16,64::DADDIUPC
675 "daddiu r<TRY>, PC, <IMMED>"
677 // start-sanitize-tx19
681 GPR[TRY] = (basepc (SD_) & ~3) + EXTEND5 (IMMED);
686 11111,111,3.RY,5.IMMED:RI64:16,64::DADDIUSP
687 "daddiu r<TRY>, SP, <IMMED>"
689 // start-sanitize-tx19
693 do_daddiu (SD_, SPIDX, TRY, EXTEND5 (IMMED) << 2);
696 11110,6.IMM_10_5,5.IMM_15_11 + 11111,111,3.RY,5.IMM_4_0:EXT-RI64:16,64::DADDIUSP
697 "daddiu r<TRY>, SP, <IMMED>"
699 // start-sanitize-tx19
703 do_daddiu (SD_, SPIDX, TRY, EXTEND5 (IMMED));
708 01010,3.RX,8.IMMED:RI:16::SLTI
709 "slti r<TRX>, <IMMED>"
711 // start-sanitize-tx19
715 do_slti (SD_, TRX, T8IDX, IMMED);
718 11110,6.IMM_10_5,5.IMM_15_11 + 01010,3.RX,000,5.IMM_4_0:EXT-RI:16::SLTI
719 "slti r<TRX>, <IMMEDIATE>"
721 // start-sanitize-tx19
725 do_slti (SD_, TRX, T8IDX, IMMEDIATE);
730 01011,3.RX,8.IMMED:RI:16::SLTIU
731 "sltiu r<TRX>, <IMMED>"
733 // start-sanitize-tx19
737 do_sltiu (SD_, TRX, T8IDX, IMMED);
740 11110,6.IMM_10_5,5.IMM_15_11 + 01011,3.RX,000,5.IMM_4_0:EXT-RI:16::SLTIU
741 "sltiu r<TRX>, <IMMEDIATE>"
743 // start-sanitize-tx19
747 do_sltiu (SD_, TRX, T8IDX, IMMEDIATE);
752 11101,3.RX,3.RY,01010:RR:16::CMP
753 "sltiu r<TRX>, r<TRY>"
755 // start-sanitize-tx19
759 do_xor (SD_, TRX, TRY, T8IDX);
763 01110,3.RX,8.IMMED:RI:16::CMPI
764 "sltiu r<TRX>, <IMMED>"
766 // start-sanitize-tx19
770 do_xori (SD_, TRX, T8IDX, IMMED);
773 11110,6.IMM_10_5,5.IMM_15_11 + 01110,3.RX,000,5.IMM_4_0:EXT-RI:16::CMPI
774 "sltiu r<TRX>, <IMMEDIATE>"
776 // start-sanitize-tx19
780 do_xori (SD_, TRX, T8IDX, IMMEDIATE);
785 // Two/Three Operand, Register-Type
789 11100,3.RX,3.RY,3.RZ,01:RRR:16::ADDU
790 "addu r<TRZ>, r<TRX>, r<TRY>"
792 // start-sanitize-tx19
796 do_addu (SD_, TRX, TRY, TRZ);
801 11100,3.RX,3.RY,3.RZ,11:RRR:16::SUBU
802 "subu r<TRZ>, r<TRX>, r<TRY>"
804 // start-sanitize-tx19
808 do_subu (SD_, TRX, TRY, TRZ);
813 11100,3.RX,3.RY,3.RZ,00:RRR:16,64::DADDU
814 "daddu r<TRZ>, r<TRX>, r<TRY>"
816 // start-sanitize-tx19
820 do_daddu (SD_, TRX, TRY, TRZ);
825 11100,3.RX,3.RY,3.RZ,10:RRR:16,64::DSUBU
826 "dsubu r<TRZ>, r<TRX>, r<TRY>"
828 // start-sanitize-tx19
832 do_dsubu (SD_, TRX, TRY, TRZ);
837 11101,3.RX,3.RY,00010:RR:16::SLT
840 // start-sanitize-tx19
844 do_slt (SD_, TRX, TRY, T8IDX);
849 11101,3.RX,3.RY,00011:RR:16::SLTU
850 "sltu r<TRX>, r<TRY>"
852 // start-sanitize-tx19
856 do_sltu (SD_, TRX, TRY, T8IDX);
861 11101,3.RX,3.RY,01011:RR:16::NEG
864 // start-sanitize-tx19
868 do_subu (SD_, 0, TRY, TRX);
873 11101,3.RX,3.RY,01100:RR:16::AND
876 // start-sanitize-tx19
880 do_and (SD_, TRX, TRY, TRX);
885 11101,3.RX,3.RY,01101:RR:16::OR
888 // start-sanitize-tx19
892 do_or (SD_, TRX, TRY, TRX);
897 11101,3.RX,3.RY,01110:RR:16::XOR
900 // start-sanitize-tx19
904 do_xor (SD_, TRX, TRY, TRX);
909 11101,3.RX,3.RY,01111:RR:16::NOT
912 // start-sanitize-tx19
916 do_nor (SD_, 0, TRY, TRX);
921 01100,111,3.RY,5.R32:I8_MOVR32:16::MOVR32
922 "move r<TRY>, r<R32>"
924 // start-sanitize-tx19
928 do_or (SD_, R32, 0, TRY);
933 01100,101,3.R32L,2.R32H,3.RZ:I8_MOV32R:16::MOV32R
934 "move r<R32>, r<TRZ>"
936 // start-sanitize-tx19
940 do_or (SD_, TRZ, 0, R32);
945 00110,3.RX,3.RY,3.SHAMT,00:SHIFT:16::SLL
946 "sll r<TRX>, r<TRY>, <SHIFT>"
948 // start-sanitize-tx19
952 do_sll (SD_, TRY, TRX, SHIFT);
955 11110,5.SHAMT,0,00000 + 00110,3.RX,3.RY,000,00:EXT-SHIFT:16::SLL
956 "sll r<TRX>, r<TRY>, <SHIFT>"
958 // start-sanitize-tx19
962 do_sll (SD_, TRY, TRX, SHAMT);
967 00110,3.RX,3.RY,3.SHAMT,10:SHIFT:16::SRL
968 "srl r<TRX>, r<TRY>, <SHIFT>"
970 // start-sanitize-tx19
974 do_srl (SD_, TRY, TRX, SHIFT);
977 11110,5.SHAMT,0,00000 + 00110,3.RX,3.RY,000,10:EXT-SHIFT:16::SRL
978 "srl r<TRX>, r<TRY>, <SHIFT>"
980 // start-sanitize-tx19
984 do_srl (SD_, TRY, TRX, SHAMT);
989 00110,3.RX,3.RY,3.SHAMT,11:SHIFT:16::SRA
990 "sra r<TRX>, r<TRY>, <SHIFT>"
992 // start-sanitize-tx19
996 do_sra (SD_, TRY, TRX, SHIFT);
999 11110,5.SHAMT,0,00000 + 00110,3.RX,3.RY,000,11:EXT-SHIFT:16::SRA
1000 "sra r<TRX>, r<TRY>, <SHIFT>"
1002 // start-sanitize-tx19
1004 // end-sanitize-tx19
1006 do_sra (SD_, TRY, TRX, SHAMT);
1011 11101,3.RX,3.RY,00100:RR:16::SLLV
1012 "sllv r<TRY>, r<TRX>"
1014 // start-sanitize-tx19
1016 // end-sanitize-tx19
1018 do_sllv (SD_, TRX, TRY, TRY);
1022 11101,3.RX,3.RY,00110:RR:16::SRLV
1023 "srlv r<TRY>, r<TRX>"
1025 // start-sanitize-tx19
1027 // end-sanitize-tx19
1029 do_srlv (SD_, TRX, TRY, TRY);
1033 11101,3.RX,3.RY,00111:RR:16::SRAV
1034 "srav r<TRY>, r<TRX>"
1036 // start-sanitize-tx19
1038 // end-sanitize-tx19
1040 do_srav (SD_, TRX, TRY, TRY);
1044 00110,3.RX,3.RY,3.SHAMT,01:SHIFT:16,64::DSLL
1045 "dsll r<TRY>, r<TRX>, <SHIFT>"
1047 // start-sanitize-tx19
1049 // end-sanitize-tx19
1051 do_dsll (SD_, 0, TRY, TRX, SHIFT);
1054 11110,5.SHAMT_4_0,1.S5,00000 + 00110,3.RX,3.RY,000,01:EXT-SHIFT:16,64::DSLL
1055 "dsll r<TRY>, r<TRX>, <SHAMT>"
1057 // start-sanitize-tx19
1059 // end-sanitize-tx19
1061 do_dsll (SD_, 0, TRY, TRX, SHAMT);
1066 11101,3.SHAMT,3.RY,01000:SHIFT64:16,64::DSRL
1067 "dsrl r<TRY>, <SHIFT>"
1069 // start-sanitize-tx19
1071 // end-sanitize-tx19
1073 do_dsrl (SD_, 0, TRY, TRY, SHIFT);
1076 11110,5.SHAMT_4_0,1.S5,00000 + 11101,000,3.RY,01000:EXT-SHIFT64:16,64::DSRL
1077 "dsrl r<TRY>, <SHIFT>"
1079 // start-sanitize-tx19
1081 // end-sanitize-tx19
1083 do_dsrl (SD_, 0, TRY, TRY, SHIFT);
1088 11101,3.SHAMT,3.RY,10011:SHIFT64:16,64::DSRA
1089 "dsra r<TRY>, <SHIFT>"
1091 // start-sanitize-tx19
1093 // end-sanitize-tx19
1095 do_dsra (SD_, 0, TRY, TRY, SHIFT);
1098 11110,5.SHAMT_4_0,1.S5,00000 + 11101,000,3.RY,10011:EXT-SHIFT64:16,64::DSRA
1099 "dsra r<TRY>, <SHIFT>"
1101 // start-sanitize-tx19
1103 // end-sanitize-tx19
1105 do_dsra (SD_, 0, TRY, TRY, SHIFT);
1110 11101,3.RX,3.RY,10100:RR:16,64::DSLLV
1111 "dsra r<TRY>, r<TRX>"
1113 // start-sanitize-tx19
1115 // end-sanitize-tx19
1117 do_dsllv (SD_, TRX, TRY, TRY);
1121 11101,3.RX,3.RY,10110:RR:16,64::DSRLV
1122 "dsrlv r<TRY>, r<TRX>"
1124 // start-sanitize-tx19
1126 // end-sanitize-tx19
1128 do_dsrlv (SD_, TRX, TRY, TRY);
1132 11101,3.RX,3.RY,10111:RR:16,64::DSRAV
1133 "dsrav r<TRY>, r<TRX>"
1135 // start-sanitize-tx19
1137 // end-sanitize-tx19
1139 do_dsrav (SD_, TRX, TRY, TRY);
1143 // Multiply /Divide Instructions
1146 11101,3.RX,3.RY,11000:RR:16::MULT
1147 "mult r<TRX>, r<TRY>"
1149 // start-sanitize-tx19
1151 // end-sanitize-tx19
1153 do_mult (SD_, TRX, TRY, 0);
1157 11101,3.RX,3.RY,11001:RR:16::MULTU
1158 "multu r<TRX>, r<TRY>"
1160 // start-sanitize-tx19
1162 // end-sanitize-tx19
1164 do_multu (SD_, TRX, TRY, 0);
1168 11101,3.RX,3.RY,11010:RR:16::DIV
1169 "div r<TRX>, r<TRY>"
1171 // start-sanitize-tx19
1173 // end-sanitize-tx19
1175 do_div (SD_, TRX, TRY);
1179 11101,3.RX,3.RY,11011:RR:16::DIVU
1180 "divu r<TRX>, r<TRY>"
1182 // start-sanitize-tx19
1184 // end-sanitize-tx19
1186 do_divu (SD_, TRX, TRY);
1190 11101,3.RX,000,10000:RR:16::MFHI
1193 // start-sanitize-tx19
1195 // end-sanitize-tx19
1201 11101,3.RX,000,10010:RR:16::MFLO
1204 // start-sanitize-tx19
1206 // end-sanitize-tx19
1212 11101,3.RX,3.RY,11100:RR:16,64::DMULT
1213 "dmult r<TRX>, r<TRY>"
1215 // start-sanitize-tx19
1217 // end-sanitize-tx19
1219 do_dmult (SD_, TRX, TRY);
1223 11101,3.RX,3.RY,11101:RR:16,64::DMULTU
1224 "dmultu r<TRX>, r<TRY>"
1226 // start-sanitize-tx19
1228 // end-sanitize-tx19
1230 do_dmultu (SD_, TRX, TRY);
1234 11101,3.RX,3.RY,11110:RR:16,64::DDIV
1235 "ddiv r<TRX>, r<TRY>"
1237 // start-sanitize-tx19
1239 // end-sanitize-tx19
1241 do_ddiv (SD_, TRX, TRY);
1245 11101,3.RX,3.RY,11111:RR:16,64::DDIVU
1246 "ddivu r<TRX>, r<TRY>"
1248 // start-sanitize-tx19
1250 // end-sanitize-tx19
1252 do_ddivu (SD_, TRX, TRY);
1256 // Jump and Branch Instructions
1260 // Issue instruction in delay slot of branch
1261 :function:::address_word:delayslot16:address_word nia, address_word target
1263 instruction_word delay_insn;
1264 sim_events_slip (SD, 1);
1265 DSPC = CIA; /* save current PC somewhere */
1266 STATE |= simDELAYSLOT;
1267 delay_insn = IMEM16 (nia); /* NOTE: mips16 */
1268 idecode_issue (CPU_, delay_insn, (nia));
1269 STATE &= ~simDELAYSLOT;
1273 // compute basepc dependant on us being in a delay slot
1274 :function:::address_word:basepc:
1276 if (STATE & simDELAYSLOT)
1278 return DSPC; /* return saved address of preceeding jmp */
1288 00011,0,5.IMM_20_16,5.IMM_25_21 + 16.IMMED_15_0:JAL:16::JAL
1291 // start-sanitize-tx19
1293 // end-sanitize-tx19
1295 address_word region = (NIA & MASK (63, 28));
1296 RA = NIA + 2; /* skip 16 bit delayslot insn */
1297 NIA = delayslot16 (SD_, NIA, (region | (IMMEDIATE << 2))) | 1;
1302 // JALX - 32 and 16 bit versions.
1304 011101,26.IMMED:JALX:32::JALX32
1307 // start-sanitize-tx19
1309 // end-sanitize-tx19
1311 address_word region = (NIA & MASK (63, 28));
1312 RA = NIA + 4; /* skip 32 bit delayslot insn */
1313 NIA = delayslot32 (SD_, (region | (IMMED << 2)) | 1);
1316 00011,1,5.IMM_20_16,5.IMM_25_21 + 16.IMMED_15_0:JALX:16::JALX16
1319 // start-sanitize-tx19
1321 // end-sanitize-tx19
1323 address_word region = (NIA & MASK (63, 28));
1324 RA = NIA + 2; /* 16 bit INSN */
1325 NIA = delayslot16 (SD_, NIA, (region | (IMMEDIATE << 2)) & ~1);
1330 11101,3.RX,000,00000:RR:16::JR
1333 // start-sanitize-tx19
1335 // end-sanitize-tx19
1337 NIA = delayslot16 (SD_, NIA, GPR[TRX]);
1341 11101,000,001,00000:RR:16::JRRA
1344 // start-sanitize-tx19
1346 // end-sanitize-tx19
1348 NIA = delayslot16 (SD_, NIA, RA);
1353 11101,3.RX,010,00000:RR:16::JALR
1356 // start-sanitize-tx19
1358 // end-sanitize-tx19
1361 NIA = delayslot16 (SD_, NIA, GPR[TRX]);
1366 00100,3.RX,8.IMMED:RI:16::BEQZ
1367 "beqz r<TRX>, <IMMED>"
1369 // start-sanitize-tx19
1371 // end-sanitize-tx19
1374 NIA = (NIA + (EXTEND8 (IMMED) << 1));
1377 11110,6.IMM_10_5,5.IMM_15_11 + 00100,3.RX,000,5.IMM_4_0:EXT-RI:16::BEQZ
1378 "beqz r<TRX>, <IMMEDIATE>"
1380 // start-sanitize-tx19
1382 // end-sanitize-tx19
1385 NIA = (NIA + EXTEND16 (IMMEDIATE));
1390 00101,3.RX,8.IMMED:RI:16::BNEZ
1391 "bnez r<TRX>, <IMMED>"
1393 // start-sanitize-tx19
1395 // end-sanitize-tx19
1398 NIA = (NIA + (EXTEND8 (IMMED) << 1));
1401 11110,6.IMM_10_5,5.IMM_15_11 + 00101,3.RX,000,5.IMM_4_0:EXT-RI:16::BNEZ
1402 "bnez r<TRX>, <IMMEDIATE>"
1404 // start-sanitize-tx19
1406 // end-sanitize-tx19
1409 NIA = (NIA + EXTEND16 (IMMEDIATE));
1414 01100,000,8.IMMED:I8:16::BTEQZ
1417 // start-sanitize-tx19
1419 // end-sanitize-tx19
1422 NIA = (NIA + (EXTEND8 (IMMED) << 1));
1425 11110,6.IMM_10_5,5.IMM_15_11 + 01100,000,000,5.IMM_4_0:EXT-I8:16::BTEQZ
1428 // start-sanitize-tx19
1430 // end-sanitize-tx19
1433 NIA = (NIA + EXTEND16 (IMMEDIATE));
1438 01100,001,8.IMMED:I8:16::BTNEZ
1441 // start-sanitize-tx19
1443 // end-sanitize-tx19
1446 NIA = (NIA + (EXTEND8 (IMMED) << 1));
1449 11110,6.IMM_10_5,5.IMM_15_11 + 01100,001,000,5.IMM_4_0:EXT-I8:16::BTNEZ
1452 // start-sanitize-tx19
1454 // end-sanitize-tx19
1457 NIA = (NIA + EXTEND16 (IMMEDIATE));
1462 00010,11.IMMED:I:16::B
1465 // start-sanitize-tx19
1467 // end-sanitize-tx19
1469 NIA = (NIA + (EXTEND8 (IMMED) << 1));
1472 11110,6.IMM_10_5,5.IMM_15_11 + 00010,6.0,5.IMM_4_0:EXT-I:16::B
1475 // start-sanitize-tx19
1477 // end-sanitize-tx19
1479 NIA = (NIA + EXTEND16 (IMMEDIATE));
1484 // Special Instructions
1487 // See the front of the mips16 doc
1488 // -> FIXME need this for most instructions
1489 //// 11110,eeeeeeeeeee:I:16::EXTEND
1491 //// // start-sanitize-tx19
1493 //// // end-sanitize-tx19
1496 // 11101,3.RX,3.RY,00101:RR:16::BREAK
1498 // // start-sanitize-tx19
1500 // // end-sanitize-tx19