- case 0x0900: // BT label 10001001dddddddd
- case 0x0b00: { // BF label 10001011dddddddd
- // jmp_cond ~ cond when guest doesn't jump
- int jmp_cond = (op & 0x0200) ? DCOND_NE : DCOND_EQ;
- int insn_cond = (op & 0x0200) ? DCOND_EQ : DCOND_NE;
- signed int offs = ((signed int)(op << 24) >> 23);
- sr = rcache_get_reg(SHR_SR, RC_GR_RMW);
- if (find_in_array(branch_target_pc, branch_target_count, pc + offs + 2) >= 0) {
- branch_patch_pc[branch_patch_count] = pc + offs + 2;
- branch_patch_cond = insn_cond;
- goto end_op;
- }
-
- // can't resolve branch, cause end of block
- tmp = rcache_get_reg(SHR_PC, RC_GR_WRITE);
- emith_move_r_imm(tmp, pc + (drcf.delayed_op ? 2 : 0));
- emith_tst_r_imm(sr, T);
- EMITH_SJMP_START(jmp_cond);
- if (!drcf.delayed_op)
- offs += 2;
- if (offs < 0) {
- emith_sub_r_imm_c(insn_cond, tmp, -offs);
- } else
- emith_add_r_imm_c(insn_cond, tmp, offs);
- EMITH_SJMP_END(jmp_cond);
+ case 0x0900: // BT label 10001001dddddddd
+ case 0x0b00: // BF label 10001011dddddddd
+ // will handle conditional branches later
+ pending_branch_cond = (op & 0x0200) ? DCOND_EQ : DCOND_NE;
+ i = ((signed int)(op << 24) >> 23);
+ pending_branch_pc = pc + i + 2;