diff options
author | notaz | 2011-01-12 15:59:41 +0200 |
---|---|---|
committer | notaz | 2011-01-16 00:03:52 +0200 |
commit | f18c0f46b9aabbbb7fc71cdbd308b6523adcb759 (patch) | |
tree | 59aebbb0bb3b9a53d72d54786e954dfcf94f2468 /libpcsxcore/new_dynarec/assem_arm.c | |
parent | 576bbd8f94b6163abfc4c02b65002249d768da00 (diff) | |
download | pcsx_rearmed-f18c0f46b9aabbbb7fc71cdbd308b6523adcb759.tar.gz pcsx_rearmed-f18c0f46b9aabbbb7fc71cdbd308b6523adcb759.tar.bz2 pcsx_rearmed-f18c0f46b9aabbbb7fc71cdbd308b6523adcb759.zip |
drc: don't read readmem_dword to r0 or on dummy reads
Diffstat (limited to 'libpcsxcore/new_dynarec/assem_arm.c')
-rw-r--r-- | libpcsxcore/new_dynarec/assem_arm.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/libpcsxcore/new_dynarec/assem_arm.c b/libpcsxcore/new_dynarec/assem_arm.c index a22c3c0..b6b856a 100644 --- a/libpcsxcore/new_dynarec/assem_arm.c +++ b/libpcsxcore/new_dynarec/assem_arm.c @@ -2563,14 +2563,11 @@ do_readstub(int n) rth=get_reg(i_regmap,rt1[i]|64); rt=get_reg(i_regmap,rt1[i]); } -#ifdef PCSX - if(rt<0) - // assume forced dummy read - rt=get_reg(i_regmap,-1); -#endif assert(rs>=0); - assert(rt>=0); if(addr<0) addr=rt; + if(addr<0) + // assume dummy read, no alloced reg + addr=get_reg(i_regmap,-1); assert(addr>=0); int ftable=0; if(type==LOADB_STUB||type==LOADBU_STUB) @@ -2623,19 +2620,22 @@ do_readstub(int n) //if((cc=get_reg(regmap,CCREG))>=0) { // emit_loadreg(CCREG,cc); //} - if(type==LOADB_STUB) - emit_movsbl((int)&readmem_dword,rt); - if(type==LOADBU_STUB) - emit_movzbl((int)&readmem_dword,rt); - if(type==LOADH_STUB) - emit_movswl((int)&readmem_dword,rt); - if(type==LOADHU_STUB) - emit_movzwl((int)&readmem_dword,rt); - if(type==LOADW_STUB) - emit_readword((int)&readmem_dword,rt); - if(type==LOADD_STUB) { - emit_readword((int)&readmem_dword,rt); - if(rth>=0) emit_readword(((int)&readmem_dword)+4,rth); + if(itype[i]==C1LS||itype[i]==C2LS||(rt>=0&&rt1[i]!=0)) { + assert(rt>=0); + if(type==LOADB_STUB) + emit_movsbl((int)&readmem_dword,rt); + if(type==LOADBU_STUB) + emit_movzbl((int)&readmem_dword,rt); + if(type==LOADH_STUB) + emit_movswl((int)&readmem_dword,rt); + if(type==LOADHU_STUB) + emit_movzwl((int)&readmem_dword,rt); + if(type==LOADW_STUB) + emit_readword((int)&readmem_dword,rt); + if(type==LOADD_STUB) { + emit_readword((int)&readmem_dword,rt); + if(rth>=0) emit_readword(((int)&readmem_dword)+4,rth); + } } emit_jmp(stubs[n][2]); // return address } |