aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore/new_dynarec/assem_arm.c
diff options
context:
space:
mode:
authornotaz2011-06-22 16:26:38 +0300
committernotaz2011-07-08 00:15:07 +0300
commitf776eb14d490a2c4391666ce5beefe058e7e03d5 (patch)
tree364408b5cd66d08e19f861ffe848c1929ad19e6d /libpcsxcore/new_dynarec/assem_arm.c
parentea3d2e6e638ffd02aee0be8bdd27d8a9babd179f (diff)
downloadpcsx_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.c24
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&&reg<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&&reg<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);
- }
- }
- }
}
}
}