46 { Ibcond, "bcond", Ibranch },
48 { Ijal, "jal", Ibranch },
49 { Ibeq, "beq", Ibranch },
50 { Ibne, "bne", Ibranch },
51 { Iblez, "blez", Ibranch },
52 { Ibgtz, "bgtz", Ibranch },
53 { Iaddi, "addi", Iarith }, /* 8 */
54 { Iaddiu, "addiu", Iarith },
55 { Islti, "slti", Iarith },
56 { Isltiu, "sltiu", Iarith },
57 { Iandi, "andi", Iarith },
58 { Iori, "ori", Iarith },
59 { Ixori, "xori", Iarith },
60 { Ilui, "lui", Iload }, /* 15 */
62 { Icop1, "cop1", Ifloat },
79 { Ilwl, "lwl", Iload },
81 { Ilbu, "lbu", Iload },
82 { Ilhu, "lhu", Iload },
83 { Ilwr, "lwr", Iload },
85 { Isb, "sb", Istore },
86 { Ish, "sh", Istore },
88 { Isw, "sw", Istore }, /* 43 */
94 { Ilwc1, "lwc1", Ifloat },
101 { Isc, "sc", Istore },
102 { Iswc1, "swc1", Ifloat },
117 for(i = 0; i < 32; i++)
119 Bprint(bioout, "R%.2d %.8lux\n", i, reg.r[i]);
127 reg.ir = ifetch(reg.pc);
131 brkchk(reg.pc, Instruction);
143 if((reg.ir>>26) == 0)
144 Bprint(bioout, "special=%d,%d table=%d\n",
145 (reg.ir>>3)&0x7, reg.ir&0x7, reg.ir&0x3f);
147 Bprint(bioout, "code=%d,%d table=%d\n",
148 reg.ir>>29, (reg.ir>>26)&0x7, reg.ir>>26);
151 Bprint(bioout, "Undefined Instruction Trap IR %.8lux\n", inst);
161 Getrsrt(rs, rt, inst);
162 imm = (short)(inst&0xffff);
165 itrace("addi\tr%d,r%d,#0x%x", rt, rs, imm);
167 reg.r[rt] = reg.r[rs] + imm;
176 Getrsrt(rs, rt, inst);
180 itrace("andi\tr%d,r%d,#0x%x", rt, rs, imm);
182 reg.r[rt] = reg.r[rs] & imm;
192 Getrbrt(rb, rt, inst);
193 off = (short)(inst&0xffff);
197 itrace("sw\tr%d,0x%x(r%d) %lux=%lux",
198 rt, off, rb, reg.r[rb]+off, v);
200 putmem_w(reg.r[rb]+off, v);
210 Getrbrt(rb, rt, inst);
211 off = (short)(inst&0xffff);
215 itrace("sb\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, reg.r[rb]+off, value);
217 putmem_b(reg.r[rb]+off, value);
227 Getrbrt(rb, rt, inst);
228 off = (short)(inst&0xffff);
232 itrace("sh\tr%d,0x%x(r%d) %lux=%lux",
233 rt, off, rb, reg.r[rb]+off, value&0xffff);
235 putmem_h(reg.r[rb]+off, value);
244 Getrsrt(rs, rt, inst);
249 itrace("lui\tr%d,#0x%x", rt, imm);
260 Getrsrt(rs, rt, inst);
264 itrace("ori\tr%d,r%d,#0x%x", rt, rs, imm);
266 reg.r[rt] = reg.r[rs] | imm;
275 Getrsrt(rs, rt, inst);
279 itrace("xori\tr%d,r%d,#0x%x", rt, rs, imm);
281 reg.r[rt] = reg.r[rs] ^ imm;
291 Getrbrt(rb, rt, inst);
292 off = (short)(inst&0xffff);
300 itrace("lw\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, va, v);
303 reg.r[rt] = getmem_w(va);
313 Getrbrt(rb, rt, inst);
314 off = (short)(inst&0xffff);
321 v = getmem_w(va & ~3) << ((va & 3) << 3);
322 itrace("lwl\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, va, v);
325 v = getmem_w(va & ~3);
331 reg.r[rt] = (v<<8) | (reg.r[rt] & 0xff);
334 reg.r[rt] = (v<<16) | (reg.r[rt] & 0xffff);
337 reg.r[rt] = (v<<24) | (reg.r[rt] & 0xffffff);
349 Getrbrt(rb, rt, inst);
350 off = (short)(inst&0xffff);
357 v = getmem_w(va & ~3) << ((va & 3) << 3);
358 itrace("lwr\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, va, v);
361 v = getmem_w(va & ~3);
366 reg.r[rt] = (v>>24) | (reg.r[rt] & 0xffffff00);
369 reg.r[rt] = (v>>16) | (reg.r[rt] & 0xffff0000);
372 reg.r[rt] = (v>>8) | (reg.r[rt] & 0xff000000);
384 Getrbrt(rb, rt, inst);
385 off = (short)(inst&0xffff);
392 v = (short)getmem_h(va);
393 itrace("lw\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, va, v);
396 reg.r[rt] = (short)getmem_h(va);
406 Getrbrt(rb, rt, inst);
407 off = (short)(inst&0xffff);
414 v = getmem_h(va) & 0xffff;
415 itrace("lhu\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, va, v);
418 reg.r[rt] = getmem_h(va) & 0xffff;
428 Getrbrt(rb, rt, inst);
429 off = (short)(inst&0xffff);
436 v = (schar)getmem_b(va);
437 itrace("lb\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, va, v);
440 reg.r[rt] = (schar)getmem_b(va);
450 Getrbrt(rb, rt, inst);
451 off = (short)(inst&0xffff);
458 v = getmem_b(va) & 0xff;
459 itrace("lbu\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, va, v);
462 reg.r[rt] = getmem_b(va) & 0xff;
471 npc = (reg.pc&0xF0000000)|((inst&0x3FFFFFF)<<2);
473 itrace("jal\t0x%lux", npc);
475 reg.r[31] = reg.pc+8;
476 /* Do the delay slot */
477 reg.ir = ifetch(reg.pc+4);
482 findsym(npc, CTEXT, &s);
483 Bprint(bioout, "%8lux %s(", reg.pc, s.name);
484 printparams(&s, reg.r[29]);
485 Bprint(bioout, "from ");
498 npc = (reg.pc&0xF0000000)|((inst&0x3FFFFFF)<<2);
500 itrace("j\t0x%lux", npc);
502 /* Do the delay slot */
503 reg.ir = ifetch(reg.pc+4);
516 Getrsrt(rs, rt, inst);
517 off = (short)(inst&0xffff);
519 npc = reg.pc + (off<<2) + 4;
521 itrace("beq\tr%d,r%d,0x%lux", rs, rt, npc);
523 if(reg.r[rs] == reg.r[rt]) {
524 /* Do the delay slot */
525 reg.ir = ifetch(reg.pc+4);
539 Getrsrt(rs, rt, inst);
540 off = (short)(inst&0xffff);
542 npc = reg.pc + (off<<2) + 4;
544 itrace("beq\tr%d,r%d,0x%lux", rs, rt, npc);
546 if(reg.r[rs] == reg.r[rt]) {
547 /* Do the delay slot */
548 reg.ir = ifetch(reg.pc+4);
563 rs = (inst>>21)&0x1f;
564 off = (short)(inst&0xffff);
566 npc = reg.pc + (off<<2) + 4;
568 itrace("bgtz\tr%d,0x%lux", rs, npc);
571 if(!(r&SIGNBIT) && r != 0) {
572 /* Do the delay slot */
573 reg.ir = ifetch(reg.pc+4);
586 rs = (inst>>21)&0x1f;
587 off = (short)(inst&0xffff);
589 npc = reg.pc + (off<<2) + 4;
591 itrace("bgtz\tr%d,0x%lux", rs, npc);
594 if(!(r&SIGNBIT) && r != 0) {
595 /* Do the delay slot */
596 reg.ir = ifetch(reg.pc+4);
610 rs = (inst>>21)&0x1f;
611 off = (short)(inst&0xffff);
613 npc = reg.pc + (off<<2) + 4;
615 itrace("blez\tr%d,0x%lux", rs, npc);
618 if((r&SIGNBIT) || r == 0) {
619 /* Do the delay slot */
620 reg.ir = ifetch(reg.pc+4);
634 rs = (inst>>21)&0x1f;
635 off = (short)(inst&0xffff);
637 npc = reg.pc + (off<<2) + 4;
639 itrace("blez\tr%d,0x%lux", rs, npc);
642 if((r&SIGNBIT) || r == 0) {
643 /* Do the delay slot */
644 reg.ir = ifetch(reg.pc+4);
659 Getrsrt(rs, rt, inst);
660 off = (short)(inst&0xffff);
662 npc = reg.pc + (off<<2) + 4;
664 itrace("bne\tr%d,r%d,0x%lux", rs, rt, npc);
666 if(reg.r[rs] != reg.r[rt]) {
667 /* Do the delay slot */
668 reg.ir = ifetch(reg.pc+4);
682 Getrsrt(rs, rt, inst);
683 off = (short)(inst&0xffff);
685 npc = reg.pc + (off<<2) + 4;
687 itrace("bne\tr%d,r%d,0x%lux", rs, rt, npc);
689 if(reg.r[rs] != reg.r[rt]) {
690 /* Do the delay slot */
691 reg.ir = ifetch(reg.pc+4);
705 Getrsrt(rs, rt, inst);
706 imm = (short)(inst&0xffff);
709 itrace("addiu\tr%d,r%d,#0x%x", rt, rs, imm);
711 reg.r[rt] = reg.r[rs]+imm;
720 Getrsrt(rs, rt, inst);
721 imm = (short)(inst&0xffff);
724 itrace("slti\tr%d,r%d,#0x%x", rt, rs, imm);
726 reg.r[rt] = reg.r[rs] < imm ? 1 : 0;
735 Getrsrt(rs, rt, inst);
736 imm = (short)(inst&0xffff);
739 itrace("sltiu\tr%d,r%d,#0x%x", rt, rs, imm);
741 reg.r[rt] = (ulong)reg.r[rs] < (ulong)imm ? 1 : 0;
744 /* ll and sc are implemented as lw and sw, since we simulate a uniprocessor */
753 Getrbrt(rb, rt, inst);
754 off = (short)(inst&0xffff);
762 itrace("ll\tr%d,0x%x(r%d) %lux=%lux", rt, off, rb, va, v);
765 reg.r[rt] = getmem_w(va);
775 Getrbrt(rb, rt, inst);
776 off = (short)(inst&0xffff);
780 itrace("sc\tr%d,0x%x(r%d) %lux=%lux",
781 rt, off, rb, reg.r[rb]+off, v);
783 putmem_w(reg.r[rb]+off, v);
798 static char *sbcond[] =
814 int off, doit, likely;
817 rs = (inst>>21)&0x1f;
818 bran = (inst>>16)&0x1f;
819 off = (short)(inst&0xffff);
823 npc = reg.pc + (off<<2) + 4;
826 Bprint(bioout, "bcond=%d\n", bran);
831 if(reg.r[rs]&SIGNBIT)
837 if(!(reg.r[rs]&SIGNBIT))
843 reg.r[31] = reg.pc+8;
844 if(reg.r[rs]&SIGNBIT)
850 reg.r[31] = reg.pc+8;
851 if(!(reg.r[rs]&SIGNBIT))
857 itrace("b%s\tr%d,0x%lux", sbcond[bran], rs, npc);
860 /* Do the delay slot */
861 reg.ir = ifetch(reg.pc+4);