- switch(inst & 0x3f) {
- case 0x08: /* jr */
- tgt = *os_context_register_addr(context, r1);
- break;
- case 0x09: /* jalr */
- tgt = *os_context_register_addr(context, r1);
- *os_context_register_addr(context, r3)
- = *os_context_pc_addr(context) + 4;
- break;
- }
- break;
- case 0x1: /* bltz, bgez, bltzal, bgezal */
- switch((inst >> 16) & 0x1f) {
- case 0x00: /* bltz */
- if(*os_context_register_addr(context, r1) < 0)
- tgt += disp;
- break;
- case 0x01: /* bgez */
- if(*os_context_register_addr(context, r1) >= 0)
- tgt += disp;
- break;
- case 0x10: /* bltzal */
- if(*os_context_register_addr(context, r1) < 0)
- tgt += disp;
- *os_context_register_addr(context, 31)
- = *os_context_pc_addr(context) + 4;
- break;
- case 0x11: /* bgezal */
- if(*os_context_register_addr(context, r1) >= 0)
- tgt += disp;
- *os_context_register_addr(context, 31)
- = *os_context_pc_addr(context) + 4;
- break;
- }
- break;
+ switch(inst & 0x3f) {
+ case 0x08: /* jr */
+ tgt = os_context_register(context, r1);
+ break;
+ case 0x09: /* jalr */
+ tgt = os_context_register(context, r1);
+ *os_context_register_addr(context, r3)
+ = os_context_pc(context) + INSN_LEN;
+ break;
+ default:
+ tgt += INSN_LEN;
+ break;
+ }
+ break;
+ case 0x1: /* bltz, bgez, bltzal, bgezal, ... */
+ switch(r2) {
+ case 0x00: /* bltz */
+ case 0x02: /* bltzl */
+ if(os_context_register(context, r1) < 0)
+ tgt += disp;
+ else
+ tgt += INSN_LEN;
+ break;
+ case 0x01: /* bgez */
+ case 0x03: /* bgezl */
+ if(os_context_register(context, r1) >= 0)
+ tgt += disp;
+ else
+ tgt += INSN_LEN;
+ break;
+ case 0x10: /* bltzal */
+ case 0x12: /* bltzall */
+ if(os_context_register(context, r1) < 0) {
+ tgt += disp;
+ *os_context_register_addr(context, 31)
+ = os_context_pc(context) + INSN_LEN;
+ } else
+ tgt += INSN_LEN;
+ break;
+ case 0x11: /* bgezal */
+ case 0x13: /* bgezall */
+ if(os_context_register(context, r1) >= 0) {
+ tgt += disp;
+ *os_context_register_addr(context, 31)
+ = os_context_pc(context) + INSN_LEN;
+ } else
+ tgt += INSN_LEN;
+ break;
+ default:
+ tgt += INSN_LEN;
+ break;
+ }
+ break;
+ case 0x2: /* j */
+ tgt = jtgt;
+ break;
+ case 0x3: /* jal */
+ tgt = jtgt;
+ *os_context_register_addr(context, 31)
+ = os_context_pc(context) + INSN_LEN;
+ break;