6 * Mips-specific debugger interface
9 static char *mipsexcep(Map*, Rgetter);
10 static int mipsfoll(Map*, uvlong, Rgetter, uvlong*);
11 static int mipsinst(Map*, uvlong, char, char*, int);
12 static int mipsdas(Map*, uvlong, char*, int);
13 static int mipsinstlen(Map*, uvlong);
20 {0, 0, 0, 0xD}, /* break point */
21 4, /* break point size */
23 beswab, /* short to local byte order */
24 beswal, /* long to local byte order */
25 beswav, /* vlong to local byte order */
26 risctrace, /* C traceback */
27 riscframe, /* Frame finder */
28 mipsexcep, /* print exception */
29 0, /* breakpoint fixup */
30 beieeesftos, /* single precision float printer */
31 beieeedftos, /* double precisioin float printer */
32 mipsfoll, /* following addresses */
33 mipsinst, /* print instruction */
34 mipsdas, /* dissembler */
35 mipsinstlen, /* instruction size */
40 {0, 0, 0, 0xD}, /* break point */
41 4, /* break point size */
43 leswab, /* short to local byte order */
44 leswal, /* long to local byte order */
45 leswav, /* vlong to local byte order */
46 risctrace, /* C traceback */
47 riscframe, /* Frame finder */
48 mipsexcep, /* print exception */
49 0, /* breakpoint fixup */
50 leieeesftos, /* single precision float printer */
51 leieeedftos, /* double precisioin float printer */
52 mipsfoll, /* following addresses */
53 mipsinst, /* print instruction */
54 mipsdas, /* dissembler */
55 mipsinstlen, /* instruction size */
59 * mips r4k little-endian
61 Machdata mipsmach2le =
63 {0, 0, 0, 0xD}, /* break point */
64 4, /* break point size */
66 leswab, /* short to local byte order */
67 leswal, /* long to local byte order */
68 leswav, /* vlong to local byte order */
69 risctrace, /* C traceback */
70 riscframe, /* Frame finder */
71 mipsexcep, /* print exception */
72 0, /* breakpoint fixup */
73 leieeesftos, /* single precision float printer */
74 leieeedftos, /* double precisioin float printer */
75 mipsfoll, /* following addresses */
76 mipsinst, /* print instruction */
77 mipsdas, /* dissembler */
78 mipsinstlen, /* instruction size */
84 Machdata mipsmach2be =
86 {0, 0, 0, 0xD}, /* break point */
87 4, /* break point size */
89 beswab, /* short to local byte order */
90 beswal, /* long to local byte order */
91 beswav, /* vlong to local byte order */
92 risctrace, /* C traceback */
93 riscframe, /* Frame finder */
94 mipsexcep, /* print exception */
95 0, /* breakpoint fixup */
96 beieeesftos, /* single precision float printer */
97 beieeedftos, /* double precisioin float printer */
98 mipsfoll, /* following addresses */
99 mipsinst, /* print instruction */
100 mipsdas, /* dissembler */
101 mipsinstlen, /* instruction size */
105 static char *excname[] =
107 "external interrupt",
109 "TLB miss (load or fetch)",
111 "address error (load or fetch)",
112 "address error (store)",
114 "bus error (data load or store)",
117 "reserved instruction",
118 "coprocessor unusable",
119 "arithmetic overflow",
123 /* the following is made up */
124 "floating point exception" /* FPEXC */
128 mipsexcep(Map *map, Rgetter rget)
133 c = (*rget)(map, "CAUSE");
134 if(c & 0x00002000) /* INTR3 */
135 e = 16; /* Floating point exception */
141 /* mips disassembler and related functions */
143 static char FRAMENAME[] = ".frame";
147 uchar op; /* bits 31-26 */
148 uchar rs; /* bits 25-21 */
149 uchar rt; /* bits 20-16 */
150 uchar rd; /* bits 15-11 */
151 uchar sa; /* bits 10-6 */
152 uchar function; /* bits 5-0 */
153 long immediate; /* bits 15-0 */
154 ulong cofun; /* bits 24-0 */
155 ulong target; /* bits 25-0 */
158 int size; /* instruction size */
159 char *curr; /* fill point in buffer */
160 char *end; /* end of buffer */
161 char *err; /* error message */
167 decode(uvlong pc, Instr *i)
171 if (get4(mymap, pc, &w) < 0) {
172 werrstr("can't read instruction: %r");
178 i->op = (w >> 26) & 0x3F;
179 i->rs = (w >> 21) & 0x1F;
180 i->rt = (w >> 16) & 0x1F;
181 i->rd = (w >> 11) & 0x1F;
182 i->sa = (w >> 6) & 0x1F;
183 i->function = w & 0x3F;
184 i->immediate = w & 0x0000FFFF;
185 if (i->immediate & 0x8000)
186 i->immediate |= ~0x0000FFFF;
187 i->cofun = w & 0x01FFFFFF;
188 i->target = w & 0x03FFFFFF;
194 mkinstr(uvlong pc, Instr *i)
198 if (decode(pc, i) < 0)
201 * if it's a LUI followed by an ORI,
202 * it's an immediate load of a large constant.
203 * fix the LUI immediate in any case.
206 if (decode(pc+4, &x) < 0)
209 if (x.op == 0x0D && x.rs == x.rt && x.rt == i->rt) {
210 i->immediate |= (x.immediate & 0xFFFF);
217 * if it's a LWC1 followed by another LWC1
218 * into an adjacent register, it's a load of
219 * a floating point double.
221 else if (i->op == 0x31 && (i->rt & 0x01)) {
222 if (decode(pc+4, &x) < 0)
224 if (x.op == 0x31 && x.rt == (i->rt - 1) && x.rs == i->rs) {
232 * similarly for double stores
234 else if (i->op == 0x39 && (i->rt & 0x01)) {
235 if (decode(pc+4, &x) < 0)
237 if (x.op == 0x39 && x.rt == (i->rt - 1) && x.rs == i->rs) {
246 #pragma varargck argpos bprint 2
249 bprint(Instr *i, char *fmt, ...)
254 i->curr = vseprint(i->curr, i->end, fmt, arg);
258 typedef struct Opcode Opcode;
262 void (*f)(Opcode *, Instr *);
266 static void format(char *, Instr *, char *);
269 branch(Opcode *o, Instr *i)
271 if (i->rs == 0 && i->rt == 0)
272 format("JMP", i, "%b");
274 format(o->mnemonic, i, "R%t,%b");
276 format(o->mnemonic, i, "R%s,%b");
278 format(o->mnemonic, i, "R%s,R%t,%b");
282 addi(Opcode *o, Instr *i)
285 format(o->mnemonic, i, "%i,R%t");
287 format("MOVW", i, "%i,R%t");
288 else if (i->rs == 30) {
289 bprint(i, "MOVW\t$");
290 i->curr += symoff(i->curr, i->end-i->curr,
291 i->immediate+mach->sb, CANY);
292 bprint(i, "(SB),R%d", i->rt);
295 format(o->mnemonic, i, o->ken);
299 andi(Opcode *o, Instr *i)
302 format(o->mnemonic, i, "%i,R%t");
304 format(o->mnemonic, i, o->ken);
308 plocal(Instr *i, char *m, char r, int store)
314 if (!findsym(i->addr, CTEXT, &s) || !findlocal(&s, FRAMENAME, &s))
316 if (s.value > i->immediate) {
317 if(!getauto(&s, s.value-i->immediate, CAUTO, &s))
320 offset = i->immediate;
322 offset = i->immediate-s.value;
323 if (!getauto(&s, offset-4, CPARAM, &s))
328 bprint(i, "%s\t%c%d,%s+%d%s", m, r, i->rt, s.name, offset, reg);
330 bprint(i, "%s\t%s+%d%s,%c%d", m, s.name, offset, reg, r, i->rt);
335 lw(Opcode *o, Instr *i, char r)
347 if (i->rs == 29 && plocal(i, m, r, 0))
350 if (i->rs == 30 && mach->sb) {
351 bprint(i, "%s\t", m);
352 i->curr += symoff(i->curr, i->end-i->curr, i->immediate+mach->sb, CANY);
353 bprint(i, "(SB),%c%d", r, i->rt);
357 format(m, i, "%l,F%t");
359 format(m, i, o->ken);
363 load(Opcode *o, Instr *i)
369 lwc1(Opcode *o, Instr *i)
375 sw(Opcode *o, Instr *i, char r)
387 if (i->rs == 29 && plocal(i, m, r, 1))
390 if (i->rs == 30 && mach->sb) {
391 bprint(i, "%s\t%c%d,", m, r, i->rt);
392 i->curr += symoff(i->curr, i->end-i->curr, i->immediate+mach->sb, CANY);
397 format(m, i, "F%t,%l");
399 format(m, i, o->ken);
403 store(Opcode *o, Instr *i)
409 swc1(Opcode *o, Instr *i)
415 sll(Opcode *o, Instr *i)
419 else if (i->rd == i->rt)
420 format(o->mnemonic, i, "$%a,R%d");
422 format(o->mnemonic, i, o->ken);
426 sl32(Opcode *o, Instr *i)
430 format(o->mnemonic, i, "$%a,R%d");
432 format(o->mnemonic, i, o->ken);
436 sllv(Opcode *o, Instr *i)
439 format(o->mnemonic, i, "R%s,R%d");
441 format(o->mnemonic, i, o->ken);
445 jal(Opcode *o, Instr *i)
448 format("JAL", i, "(R%s)");
450 format(o->mnemonic, i, o->ken);
454 add(Opcode *o, Instr *i)
457 format(o->mnemonic, i, "R%t,R%d");
458 else if (i->rd == i->rt)
459 format(o->mnemonic, i, "R%s,R%d");
461 format(o->mnemonic, i, o->ken);
465 sub(Opcode *o, Instr *i)
468 format(o->mnemonic, i, "R%t,R%d");
470 format(o->mnemonic, i, o->ken);
474 or(Opcode *o, Instr *i)
476 if (i->rs == 0 && i->rt == 0)
477 format("MOVW", i, "$0,R%d");
479 format("MOVW", i, "R%t,R%d");
481 format("MOVW", i, "R%s,R%d");
487 nor(Opcode *o, Instr *i)
489 if (i->rs == 0 && i->rt == 0 && i->rd == 0)
495 static char mipscoload[] = "r%t,%l";
496 static char mipsload[] = "%l,R%t";
497 static char mipsstore[] = "R%t,%l";
498 static char mipsalui[] = "%i,R%s,R%t";
499 static char mipsalu3op[] = "R%t,R%s,R%d";
500 static char mipsrtrs[] = "R%t,R%s";
501 static char mipscorsrt[] = "r%s,r%t";
502 static char mipscorsi[] = "r%s,%i";
503 static char mipscoxxx[] = "%w";
504 static char mipscofp3[] = "f%a,f%d,f%t"; /* fd,fs,ft */
505 static char mipsfp3[] = "F%t,F%d,F%a";
506 static char mipscofp2[] = "f%a,f%d"; /* fd,fs */
507 static char mipsfp2[] = "F%d,F%a";
508 static char mipscofpc[] = "f%d,f%t"; /* fs,ft */
509 static char mipsfpc[] = "F%t,F%d";
511 static Opcode opcodes[64] = {
520 "ADD", addi, mipsalui,
521 "ADDU", addi, mipsalui,
524 "AND", andi, mipsalui,
525 "OR", andi, mipsalui,
526 "XOR", andi, mipsalui,
527 "MOVW", 0, "$%u,R%t",
536 "instr18", 0, mipscoxxx,
537 "instr19", 0, mipscoxxx,
538 "MOVVL", load, mipsload,
539 "MOVVR", load, mipsload,
540 "instr1C", 0, mipscoxxx,
541 "instr1D", 0, mipscoxxx,
542 "instr1E", 0, mipscoxxx,
543 "instr1F", 0, mipscoxxx,
544 "MOVB", load, mipsload,
545 "MOVH", load, mipsload,
546 "lwl", 0, mipscoload,
547 "MOVW", load, mipsload,
548 "MOVBU", load, mipsload,
549 "MOVHU", load, mipsload,
550 "lwr", 0, mipscoload,
551 "instr27", 0, mipscoxxx,
552 "MOVB", store, mipsstore,
553 "MOVH", store, mipsstore,
554 "swl", 0, mipscoload,
555 "MOVW", store, mipsstore,
556 "MOVVL", store, mipsstore,
557 "MOVVR", store, mipsstore,
558 "swr", 0, mipscoload,
561 "MOVW", lwc1, mipscoload,
562 "lwc2", 0, mipscoload,
563 "lwc3", 0, mipscoload,
564 "instr34", 0, mipscoxxx,
565 "ldc1", 0, mipscoload,
566 "ldc2", 0, mipscoload,
567 "MOVV", load, mipsload,
569 "swc1", swc1, mipscoload,
570 "swc2", 0, mipscoload,
571 "swc3", 0, mipscoload,
572 "instr3C", 0, mipscoxxx,
573 "sdc1", 0, mipscoload,
574 "sdc2", 0, mipscoload,
575 "MOVV", store, mipsstore,
578 static Opcode sopcodes[64] = {
579 "SLL", sll, "$%a,R%t,R%d",
580 "special01", 0, mipscoxxx,
581 "SRL", sll, "$%a,R%t,R%d",
582 "SRA", sll, "$%a,R%t,R%d",
583 "SLL", sllv, "R%s,R%t,R%d",
584 "special05", 0, mipscoxxx,
585 "SRL", sllv, "R%s,R%t,R%d",
586 "SRA", sllv, "R%s,R%t,R%d",
588 "jal", jal, "r%d,r%s",
589 "special0A", 0, mipscoxxx,
590 "special0B", 0, mipscoxxx,
593 "special0E", 0, mipscoxxx,
599 "SLLV", sllv, "R%s,R%t,R%d",
600 "special15", 0, mipscoxxx,
601 "SRLV", sllv, "R%s,R%t,R%d",
602 "SRAV", sllv, "R%s,R%t,R%d",
607 "special1C", 0, mipscoxxx,
608 "special1D", 0, mipscoxxx,
609 "DDIV", 0, "R%s,R%t",
610 "special1F", 0, mipscoxxx,
611 "ADD", add, mipsalu3op,
612 "ADDU", add, mipsalu3op,
613 "SUB", sub, mipsalu3op,
614 "SUBU", sub, mipsalu3op,
615 "AND", add, mipsalu3op,
616 "OR", or, mipsalu3op,
617 "XOR", add, mipsalu3op,
618 "NOR", nor, mipsalu3op,
619 "special28", 0, mipscoxxx,
620 "special29", 0, mipscoxxx,
621 "SGT", 0, mipsalu3op,
622 "SGTU", 0, mipsalu3op,
623 "special2C", 0, mipscoxxx,
624 "special2D", 0, mipscoxxx,
625 "special2E", 0, mipscoxxx,
626 "DSUBU", 0, "R%s,R%t,R%d",
627 "tge", 0, mipscorsrt,
628 "tgeu", 0, mipscorsrt,
629 "tlt", 0, mipscorsrt,
630 "tltu", 0, mipscorsrt,
631 "teq", 0, mipscorsrt,
632 "special35", 0, mipscoxxx,
633 "tne", 0, mipscorsrt,
634 "special37", 0, mipscoxxx,
635 "SLLV", sll, "$%a,R%t,R%d",
636 "special39", 0, mipscoxxx,
637 "SRLV", sll, "$%a,R%t,R%d",
638 "SRAV", sll, "$%a,R%t,R%d",
639 "SLLV", sl32, "$%a,R%t,R%d",
640 "special3D", 0, mipscoxxx,
641 "SRLV", sl32, "$%a,R%t,R%d",
642 "SRAV", sl32, "$%a,R%t,R%d",
645 static Opcode ropcodes[32] = {
650 "regimm04", 0, mipscoxxx,
651 "regimm05", 0, mipscoxxx,
652 "regimm06", 0, mipscoxxx,
653 "regimm07", 0, mipscoxxx,
654 "tgei", 0, mipscorsi,
655 "tgeiu", 0, mipscorsi,
656 "tlti", 0, mipscorsi,
657 "tltiu", 0, mipscorsi,
658 "teqi", 0, mipscorsi,
659 "regimm0D", 0, mipscoxxx,
660 "tnei", 0, mipscorsi,
661 "regimm0F", 0, mipscoxxx,
664 "BLTZALL", branch, 0,
665 "BGEZALL", branch, 0,
666 "regimm14", 0, mipscoxxx,
667 "regimm15", 0, mipscoxxx,
668 "regimm16", 0, mipscoxxx,
669 "regimm17", 0, mipscoxxx,
670 "regimm18", 0, mipscoxxx,
671 "regimm19", 0, mipscoxxx,
672 "regimm1A", 0, mipscoxxx,
673 "regimm1B", 0, mipscoxxx,
674 "regimm1C", 0, mipscoxxx,
675 "regimm1D", 0, mipscoxxx,
676 "regimm1E", 0, mipscoxxx,
677 "regimm1F", 0, mipscoxxx,
680 static Opcode fopcodes[64] = {
685 "sqrt.%f", 0, mipscofp2,
689 "finstr08", 0, mipscoxxx,
690 "finstr09", 0, mipscoxxx,
691 "finstr0A", 0, mipscoxxx,
692 "finstr0B", 0, mipscoxxx,
693 "round.w.%f", 0, mipscofp2,
694 "trunc.w%f", 0, mipscofp2,
695 "ceil.w%f", 0, mipscofp2,
696 "floor.w%f", 0, mipscofp2,
697 "finstr10", 0, mipscoxxx,
698 "finstr11", 0, mipscoxxx,
699 "finstr12", 0, mipscoxxx,
700 "finstr13", 0, mipscoxxx,
701 "finstr14", 0, mipscoxxx,
702 "finstr15", 0, mipscoxxx,
703 "finstr16", 0, mipscoxxx,
704 "finstr17", 0, mipscoxxx,
705 "finstr18", 0, mipscoxxx,
706 "finstr19", 0, mipscoxxx,
707 "finstr1A", 0, mipscoxxx,
708 "finstr1B", 0, mipscoxxx,
709 "finstr1C", 0, mipscoxxx,
710 "finstr1D", 0, mipscoxxx,
711 "finstr1E", 0, mipscoxxx,
712 "finstr1F", 0, mipscoxxx,
713 "cvt.s.%f", 0, mipscofp2,
714 "cvt.d.%f", 0, mipscofp2,
715 "cvt.e.%f", 0, mipscofp2,
716 "cvt.q.%f", 0, mipscofp2,
717 "cvt.w.%f", 0, mipscofp2,
718 "finstr25", 0, mipscoxxx,
719 "finstr26", 0, mipscoxxx,
720 "finstr27", 0, mipscoxxx,
721 "finstr28", 0, mipscoxxx,
722 "finstr29", 0, mipscoxxx,
723 "finstr2A", 0, mipscoxxx,
724 "finstr2B", 0, mipscoxxx,
725 "finstr2C", 0, mipscoxxx,
726 "finstr2D", 0, mipscoxxx,
727 "finstr2E", 0, mipscoxxx,
728 "finstr2F", 0, mipscoxxx,
729 "c.f.%f", 0, mipscofpc,
730 "c.un.%f", 0, mipscofpc,
731 "CMPEQ%f", 0, mipsfpc,
732 "c.ueq.%f", 0, mipscofpc,
733 "c.olt.%f", 0, mipscofpc,
734 "c.ult.%f", 0, mipscofpc,
735 "c.ole.%f", 0, mipscofpc,
736 "c.ule.%f", 0, mipscofpc,
737 "c.sf.%f", 0, mipscofpc,
738 "c.ngle.%f", 0, mipscofpc,
739 "c.seq.%f", 0, mipscofpc,
740 "c.ngl.%f", 0, mipscofpc,
741 "CMPGT%f", 0, mipsfpc,
742 "c.nge.%f", 0, mipscofpc,
743 "CMPGE%f", 0, mipsfpc,
744 "c.ngt.%f", 0, mipscofpc,
747 static char *cop0regs[32] = {
748 "INDEX", "RANDOM", "TLBPHYS", "EntryLo0",
749 "CONTEXT", "PageMask", "Wired", "Error",
750 "BADVADDR", "Count", "TLBVIRT", "Compare",
751 "STATUS", "CAUSE", "EPC", "PRID",
752 "Config", "LLadr", "WatchLo", "WatchHi",
753 "20", "21", "22", "23",
754 "24", "25", "26", "CacheErr",
755 "TagLo", "TagHi", "ErrorEPC", "31"
758 static char fsub[16] = {
759 'F', 'D', 'e', 'q', 'W', '?', '?', '?',
760 '?', '?', '?', '?', '?', '?', '?', '?'
763 static char *cacheps[] = {
767 static char *cacheop[] = {
768 "IWBI", "ILT", "IST", "CDE", "HI", "HWBI", "HWB", "HSV"
772 format(char *mnemonic, Instr *i, char *f)
775 format(0, i, mnemonic);
779 if (i->curr < i->end)
781 for ( ; *f && i->curr < i->end; f++) {
789 bprint(i, "%d", i->rs);
793 bprint(i, "%d", i->rt);
797 bprint(i, "%d", i->rd);
801 bprint(i, "%d", i->sa);
805 bprint(i, "%lx(R%d)",i->immediate, i->rs);
809 bprint(i, "$%lx", i->immediate);
813 i->curr += symoff(i->curr, i->end-i->curr, i->immediate, CANY);
818 i->curr += symoff(i->curr, i->end-i->curr,
819 (i->target<<2)|(i->addr & 0xF0000000), CANY);
824 i->curr += symoff(i->curr, i->end-i->curr,
825 (i->immediate<<2)+i->addr+4, CANY);
829 bprint(i, "$%lx", i->cofun);
833 bprint(i, "[%lux]", i->w0);
837 bprint(i, "M(%s)", cop0regs[i->rd]);
841 *i->curr++ = fsub[i->rs & 0x0F];
845 bprint(i, "%s%s", cacheps[i->rt & 3], cacheop[(i->rt>>2) & 7]);
853 bprint(i, "%%%c", *f);
861 copz(int cop, Instr *i)
863 char *f, *m, buf[16];
870 sprint(buf, "mfc%d", cop);
874 sprint(buf, "cfc%d", cop);
878 sprint(buf, "mtc%d", cop);
882 sprint(buf, "ctc%d", cop);
890 sprint(buf, "bc%df", cop);
894 sprint(buf, "bc%dt", cop);
898 sprint(buf, "bc%dfl", cop);
902 sprint(buf, "bc%dtl", cop);
906 sprint(buf, "cop%d", cop);
913 sprint(buf, "cop%d", cop);
933 format("MOVW", i, "%m,R%t");
938 format("MOVW", i, "R%t,%m");
942 else if (i->rs >= 0x10) {
985 format(m, i, "F%d,R%t");
989 format(m, i, "FCR%d,R%t");
993 format(m, i, "R%t,F%d");
997 format(m, i, "R%t,FCR%d");
1004 format("BFPF", i, "%b");
1008 format("BFPT", i, "%b");
1017 printins(Map *map, uvlong pc, char *buf, int n)
1026 if (mkinstr(pc, &i) < 0)
1030 case 0x00: /* SPECIAL */
1035 case 0x01: /* REGIMM */
1040 case 0x10: /* COP0 */
1044 case 0x11: /* COP1 */
1053 case 0x12: /* COP2 */
1054 case 0x13: /* COP3 */
1055 copz(i.op-0x10, &i);
1064 (*o[op].f)(&o[op], &i);
1066 format(o[op].mnemonic, &i, o[op].ken);
1070 extern int _mipscoinst(Map *, uvlong, char*, int);
1072 /* modifier 'I' toggles the default disassembler type */
1074 mipsinst(Map *map, uvlong pc, char modifier, char *buf, int n)
1076 if ((asstype == AMIPSCO && modifier == 'i')
1077 || (asstype == AMIPS && modifier == 'I'))
1078 return _mipscoinst(map, pc, buf, n);
1080 return printins(map, pc, buf, n);
1084 mipsdas(Map *map, uvlong pc, char *buf, int n)
1091 if (mkinstr(pc, &i) < 0)
1093 if (i.end-i.curr > 8)
1094 i.curr = _hexify(buf, i.w0, 7);
1095 if (i.size == 2 && i.end-i.curr > 9) {
1097 i.curr = _hexify(i.curr, i.w1, 7);
1104 mipsinstlen(Map *map, uvlong pc)
1109 if (mkinstr(pc, &i) < 0)
1115 mipsfoll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
1122 if (mkinstr(pc, &i) < 0)
1125 if((w&0xF3600000) == 0x41000000){ /* branch on coprocessor */
1128 l = ((w&0xFFFF)<<2);
1135 l = (w&0xFC000000)>>26;
1137 case 0: /* SPECIAL */
1138 if((w&0x3E) == 0x08){ /* JR, JALR */
1139 sprint(buf, "R%ld", (w>>21)&0x1F);
1140 foll[0] = (*rget)(map, buf);
1143 foll[0] = pc+i.size*4;
1145 case 0x30: /* Load-Linked followed by NOP, STC */
1154 case 22: /* BLEZL */
1156 case 23: /* BGTZL */
1160 foll[0] = (pc&0xF0000000) | ((w&0x03FFFFFF)<<2);
1164 foll[0] = pc+i.size*4;