aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotaz2011-10-25 17:13:06 +0300
committernotaz2011-10-30 23:48:08 +0200
commit042c72873a51a9807a9b233b5b28c97c3d72f5d5 (patch)
treef9ac166051b2d3aea31a4636b3378de84936a6a4
parent4e9dcd7fcb8c6710b343f81ff89d691a0fd1a5e6 (diff)
downloadpcsx_rearmed-042c72873a51a9807a9b233b5b28c97c3d72f5d5.tar.gz
pcsx_rearmed-042c72873a51a9807a9b233b5b28c97c3d72f5d5.tar.bz2
pcsx_rearmed-042c72873a51a9807a9b233b5b28c97c3d72f5d5.zip
drc: fix various register trashing in mtc0
-rw-r--r--libpcsxcore/new_dynarec/assem_arm.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/libpcsxcore/new_dynarec/assem_arm.c b/libpcsxcore/new_dynarec/assem_arm.c
index dda2a27..984b0ce 100644
--- a/libpcsxcore/new_dynarec/assem_arm.c
+++ b/libpcsxcore/new_dynarec/assem_arm.c
@@ -4218,6 +4218,7 @@ void cop0_assemble(int i,struct regstat *i_regs)
emit_loadreg(rs1[i],1);
emit_movimm(copr,0);
emit_call((int)pcsx_mtc0_ds);
+ emit_loadreg(rs1[i],s);
return;
}
#endif
@@ -4240,23 +4241,21 @@ void cop0_assemble(int i,struct regstat *i_regs)
#endif
if(copr==9||copr==11||copr==12||copr==13) {
emit_readword((int)&Count,HOST_CCREG);
- emit_readword((int)&next_interupt,ECX);
+ emit_readword((int)&next_interupt,HOST_TEMPREG);
emit_addimm(HOST_CCREG,-CLOCK_ADJUST(ccadj[i]),HOST_CCREG);
- emit_sub(HOST_CCREG,ECX,HOST_CCREG);
- emit_writeword(ECX,(int)&last_count);
+ emit_sub(HOST_CCREG,HOST_TEMPREG,HOST_CCREG);
+ emit_writeword(HOST_TEMPREG,(int)&last_count);
emit_storereg(CCREG,HOST_CCREG);
}
if(copr==12||copr==13) {
assert(!is_delayslot);
emit_readword((int)&pending_exception,14);
+ emit_test(14,14);
+ emit_jne((int)&do_interrupt);
}
emit_loadreg(rs1[i],s);
if(get_reg(i_regs->regmap,rs1[i]|64)>=0)
emit_loadreg(rs1[i]|64,get_reg(i_regs->regmap,rs1[i]|64));
- if(copr==12||copr==13) {
- emit_test(14,14);
- emit_jne((int)&do_interrupt);
- }
cop1_usable=0;
}
else