diff options
author | notaz | 2011-01-18 00:33:16 +0200 |
---|---|---|
committer | notaz | 2011-01-18 00:33:16 +0200 |
commit | b372a952e5938e8b406122454b37a958ce6c576b (patch) | |
tree | 6e4cd0c302aa247ed8ded5409f5684ef7009cc63 /libpcsxcore/new_dynarec/new_dynarec.c | |
parent | b1f390b38ff77b8229e33968d768eabdad433082 (diff) | |
download | pcsx_rearmed-b372a952e5938e8b406122454b37a958ce6c576b.tar.gz pcsx_rearmed-b372a952e5938e8b406122454b37a958ce6c576b.tar.bz2 pcsx_rearmed-b372a952e5938e8b406122454b37a958ce6c576b.zip |
drc: Ari64's fix for loop reg allocation problem
Diffstat (limited to 'libpcsxcore/new_dynarec/new_dynarec.c')
-rw-r--r-- | libpcsxcore/new_dynarec/new_dynarec.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c index f1a0def..3a96035 100644 --- a/libpcsxcore/new_dynarec/new_dynarec.c +++ b/libpcsxcore/new_dynarec/new_dynarec.c @@ -9686,13 +9686,35 @@ int new_recompile_block(int addr) f_regmap[hr]=regs[i].regmap[hr]; else f_regmap[hr]=-1; } - else if(regs[i].regmap[hr]>=0) f_regmap[hr]=regs[i].regmap[hr]; + else if(regs[i].regmap[hr]>=0) { + if(f_regmap[hr]!=regs[i].regmap[hr]) { + // dealloc old register + int n; + for(n=0;n<HOST_REGS;n++) + { + if(f_regmap[n]==regs[i].regmap[hr]) {f_regmap[n]=-1;} + } + // and alloc new one + f_regmap[hr]=regs[i].regmap[hr]; + } + } if(branch_regs[i].regmap[hr]>64) { if(!((branch_regs[i].dirty>>hr)&1)) f_regmap[hr]=branch_regs[i].regmap[hr]; else f_regmap[hr]=-1; } - else if(branch_regs[i].regmap[hr]>=0) f_regmap[hr]=branch_regs[i].regmap[hr]; + else if(branch_regs[i].regmap[hr]>=0) { + if(f_regmap[hr]!=branch_regs[i].regmap[hr]) { + // dealloc old register + int n; + for(n=0;n<HOST_REGS;n++) + { + if(f_regmap[n]==branch_regs[i].regmap[hr]) {f_regmap[n]=-1;} + } + // and alloc new one + f_regmap[hr]=branch_regs[i].regmap[hr]; + } + } if(itype[i+1]==STORE||itype[i+1]==STORELR||itype[i+1]==C1LS ||itype[i+1]==SHIFT||itype[i+1]==COP1||itype[i+1]==FLOAT ||itype[i+1]==FCOMP||itype[i+1]==FCONV @@ -9878,7 +9900,18 @@ int new_recompile_block(int addr) if(!((regs[i].dirty>>hr)&1)) f_regmap[hr]=regs[i].regmap[hr]; } - else if(regs[i].regmap[hr]>=0) f_regmap[hr]=regs[i].regmap[hr]; + else if(regs[i].regmap[hr]>=0) { + if(f_regmap[hr]!=regs[i].regmap[hr]) { + // dealloc old register + int n; + for(n=0;n<HOST_REGS;n++) + { + if(f_regmap[n]==regs[i].regmap[hr]) {f_regmap[n]=-1;} + } + // and alloc new one + f_regmap[hr]=regs[i].regmap[hr]; + } + } else if(regs[i].regmap[hr]<0) count++; } } |