diff options
author | notaz | 2011-06-22 16:26:38 +0300 |
---|---|---|
committer | notaz | 2011-07-08 00:15:07 +0300 |
commit | f776eb14d490a2c4391666ce5beefe058e7e03d5 (patch) | |
tree | 364408b5cd66d08e19f861ffe848c1929ad19e6d /libpcsxcore/new_dynarec/assem_arm.c | |
parent | ea3d2e6e638ffd02aee0be8bdd27d8a9babd179f (diff) | |
download | pcsx_rearmed-f776eb14d490a2c4391666ce5beefe058e7e03d5.tar.gz pcsx_rearmed-f776eb14d490a2c4391666ce5beefe058e7e03d5.tar.bz2 pcsx_rearmed-f776eb14d490a2c4391666ce5beefe058e7e03d5.zip |
drc: merge Ari64's patch: 15_dirty_registers_fix
Diffstat (limited to 'libpcsxcore/new_dynarec/assem_arm.c')
-rw-r--r-- | libpcsxcore/new_dynarec/assem_arm.c | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/libpcsxcore/new_dynarec/assem_arm.c b/libpcsxcore/new_dynarec/assem_arm.c index 2b0ef9c..af45ce3 100644 --- a/libpcsxcore/new_dynarec/assem_arm.c +++ b/libpcsxcore/new_dynarec/assem_arm.c @@ -762,15 +762,20 @@ void alloc_reg_temp(struct regstat *cur,int i,signed char reg) void alloc_arm_reg(struct regstat *cur,int i,signed char reg,char hr) { int n; + int dirty=0; // see if it's already allocated (and dealloc it) for(n=0;n<HOST_REGS;n++) { - if(n!=EXCLUDE_REG&&cur->regmap[n]==reg) {cur->regmap[n]=-1;} + if(n!=EXCLUDE_REG&&cur->regmap[n]==reg) { + dirty=(cur->dirty>>n)&1; + cur->regmap[n]=-1; + } } cur->regmap[hr]=reg; cur->dirty&=~(1<<hr); + cur->dirty|=dirty<<hr; cur->isconst&=~(1<<hr); } @@ -4798,7 +4803,7 @@ void wb_valid(signed char pre[],signed char entry[],u_int dirty_pre,u_int dirty, if(hr!=EXCLUDE_REG) { reg=pre[hr]; if(((~u)>>(reg&63))&1) { - if(reg==entry[hr]||(reg>0&&entry[hr]<0)) { + if(reg>0) { if(((dirty_pre&~dirty)>>hr)&1) { if(reg>0&®<34) { emit_storereg(reg,hr); @@ -4812,21 +4817,6 @@ void wb_valid(signed char pre[],signed char entry[],u_int dirty_pre,u_int dirty, } } } - else // Check if register moved to a different register - if((new_hr=get_reg(entry,reg))>=0) { - if((dirty_pre>>hr)&(~dirty>>new_hr)&1) { - if(reg>0&®<34) { - emit_storereg(reg,hr); - if( ((is32_pre&~uu)>>reg)&1 ) { - emit_sarimm(hr,31,HOST_TEMPREG); - emit_storereg(reg|64,HOST_TEMPREG); - } - } - else if(reg>=64) { - emit_storereg(reg,hr); - } - } - } } } } |