- int op = orig_inst >> 26;
- int reg_a = (orig_inst >> 21) & 0x1f;
- int reg_b = (orig_inst >> 16) & 0x1f;
- int disp = (orig_inst&(1<<20)) ? orig_inst | (-1 << 21) : orig_inst&0x1fffff;
- int next_pc = *os_context_pc_addr(context);
- int branch = 0; /* was NULL; */
-
- switch(op) {
- case 0x1a: /* jmp, jsr, jsr_coroutine, ret */
- *os_context_register_addr(context,reg_a)=*os_context_pc_addr(context);
- *os_context_pc_addr(context)=*os_context_register_addr(context,reg_b)& ~3;
- break;
- case 0x30: /* br */
- *os_context_register_addr(context,reg_a)=*os_context_pc_addr(context);
- branch = 1;
- break;
- case 0x31: /* fbeq */
- if(*(os_context_fpregister_addr(context,reg_a))==0) branch = 1;
- break;
- case 0x32: /* fblt */
- if(*os_context_fpregister_addr(context,reg_a)<0) branch = 1;
- break;
- case 0x33: /* fble */
- if(*os_context_fpregister_addr(context,reg_a)<=0) branch = 1;
- break;
- case 0x34: /* bsr */
- *os_context_register_addr(context,reg_a)=*os_context_pc_addr(context);
- branch = 1;
- break;
- case 0x35: /* fbne */
- if(*os_context_register_addr(context,reg_a)!=0) branch = 1;
- break;
- case 0x36: /* fbge */
- if(*os_context_fpregister_addr(context,reg_a)>=0) branch = 1;
- break;
- case 0x37: /* fbgt */
- if(*os_context_fpregister_addr(context,reg_a)>0) branch = 1;
- break;
- case 0x38: /* blbc */
- if((*os_context_register_addr(context,reg_a)&1) == 0) branch = 1;
- break;
- case 0x39: /* beq */
- if(*os_context_register_addr(context,reg_a)==0) branch = 1;
- break;
- case 0x3a: /* blt */
- if(*os_context_register_addr(context,reg_a)<0) branch = 1;
- break;
- case 0x3b: /* ble */
- if(*os_context_register_addr(context,reg_a)<=0) branch = 1;
- break;
- case 0x3c: /* blbs */
- if((*os_context_register_addr(context,reg_a)&1)!=0) branch = 1;
- break;
- case 0x3d: /* bne */
- if(*os_context_register_addr(context,reg_a)!=0) branch = 1;
- break;
- case 0x3e: /* bge */
- if(*os_context_register_addr(context,reg_a)>=0) branch = 1;
- break;
- case 0x3f: /* bgt */
- if(*os_context_register_addr(context,reg_a)>0) branch = 1;
- break;
- }
- if(branch) next_pc += disp*4;
- return next_pc;
+ int op = orig_inst >> 26;
+ int reg_a = (orig_inst >> 21) & 0x1f;
+ int reg_b = (orig_inst >> 16) & 0x1f;
+ int disp =
+ (orig_inst&(1<<20)) ?
+ orig_inst | (-1 << 21) :
+ orig_inst&0x1fffff;
+ int next_pc = *os_context_pc_addr(context);
+ int branch = 0; /* was NULL; */
+
+ switch(op) {
+ case 0x1a: /* jmp, jsr, jsr_coroutine, ret */
+ *os_context_register_addr(context,reg_a) =
+ *os_context_pc_addr(context);
+ *os_context_pc_addr(context) =
+ *os_context_register_addr(context,reg_b)& ~3;
+ break;
+ case 0x30: /* br */
+ *os_context_register_addr(context,reg_a)=*os_context_pc_addr(context);
+ branch = 1;
+ break;
+ case 0x31: /* fbeq */
+ if (*(os_context_float_register_addr(context,reg_a))==0) branch = 1;
+ break;
+ case 0x32: /* fblt */
+ if (*os_context_float_register_addr(context,reg_a)<0) branch = 1;
+ break;
+ case 0x33: /* fble */
+ if (*os_context_float_register_addr(context,reg_a)<=0) branch = 1;
+ break;
+ case 0x34: /* bsr */
+ *os_context_register_addr(context,reg_a)=*os_context_pc_addr(context);
+ branch = 1;
+ break;
+ case 0x35: /* fbne */
+ if (*os_context_register_addr(context,reg_a)!=0) branch = 1;
+ break;
+ case 0x36: /* fbge */
+ if (*os_context_float_register_addr(context,reg_a)>=0) branch = 1;
+ break;
+ case 0x37: /* fbgt */
+ if (*os_context_float_register_addr(context,reg_a)>0) branch = 1;
+ break;
+ case 0x38: /* blbc */
+ if ((*os_context_register_addr(context,reg_a)&1) == 0) branch = 1;
+ break;
+ case 0x39: /* beq */
+ if (*os_context_register_addr(context,reg_a)==0) branch = 1;
+ break;
+ case 0x3a: /* blt */
+ if (*os_context_register_addr(context,reg_a)<0) branch = 1;
+ break;
+ case 0x3b: /* ble */
+ if (*os_context_register_addr(context,reg_a)<=0) branch = 1;
+ break;
+ case 0x3c: /* blbs */
+ if ((*os_context_register_addr(context,reg_a)&1)!=0) branch = 1;
+ break;
+ case 0x3d: /* bne */
+ if (*os_context_register_addr(context,reg_a)!=0) branch = 1;
+ break;
+ case 0x3e: /* bge */
+ if (*os_context_register_addr(context,reg_a)>=0) branch = 1;
+ break;
+ case 0x3f: /* bgt */
+ if (*os_context_register_addr(context,reg_a)>0) branch = 1;
+ break;
+ }
+ if (branch)
+ next_pc += disp*4;
+ return next_pc;