- if (branch_at_addr)
- ds_next_pc = int_branch(&inter2, pc, op_next, branch_taken);
- else
- ds_next_pc = (*int_standard[inter2.op->i.op])(&inter2);
+ ds_next_pc = (*int_standard[inter2.op->i.op])(&inter2);
+
+ if (branch_at_addr) {
+ if (op_next.i.op == OP_SPECIAL)
+ /* TODO: Handle JALR setting $ra */
+ ds_next_pc = old_rs;
+ else if (op_next.i.op == OP_J || op_next.i.op == OP_JAL)
+ /* TODO: Handle JAL setting $ra */
+ ds_next_pc = (pc & 0xf0000000) | (op_next.j.imm << 2);
+ else
+ ds_next_pc = pc + 4 + ((s16)op_next.i.imm << 2);
+ }