diff options
-rw-r--r-- | libpcsxcore/new_dynarec/assem_arm.c | 1 | ||||
-rw-r--r-- | libpcsxcore/new_dynarec/new_dynarec.c | 22 |
2 files changed, 14 insertions, 9 deletions
diff --git a/libpcsxcore/new_dynarec/assem_arm.c b/libpcsxcore/new_dynarec/assem_arm.c index dd4b070..2b0ef9c 100644 --- a/libpcsxcore/new_dynarec/assem_arm.c +++ b/libpcsxcore/new_dynarec/assem_arm.c @@ -3413,6 +3413,7 @@ void loadlr_assemble_arm(int i,struct regstat *i_regs) } map=get_reg(i_regs->regmap,TLREG); assert(map>=0); + reglist&=~(1<<map); map=do_tlb_r(addr,temp2,map,0,a,c?-1:temp,c,constmap[i][s]+offset); if(c) { if (opcode[i]==0x22||opcode[i]==0x26) { diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c index 9592dd2..7d4a3d9 100644 --- a/libpcsxcore/new_dynarec/new_dynarec.c +++ b/libpcsxcore/new_dynarec/new_dynarec.c @@ -2840,6 +2840,7 @@ void load_assemble(int i,struct regstat *i_regs) if (opcode[i]==0x21||opcode[i]==0x25) x=2; // LH/LHU map=get_reg(i_regs->regmap,TLREG); assert(map>=0); + reglist&=~(1<<map); map=do_tlb_r(addr,tl,map,x,-1,-1,c,constmap[i][s]+offset); do_tlb_r_branch(map,c,constmap[i][s]+offset,&jaddr); } @@ -3162,6 +3163,7 @@ void store_assemble(int i,struct regstat *i_regs) if (opcode[i]==0x29) x=2; // SH map=get_reg(i_regs->regmap,TLREG); assert(map>=0); + reglist&=~(1<<map); map=do_tlb_w(addr,temp,map,x,c,constmap[i][s]+offset); do_tlb_w_branch(map,c,constmap[i][s]+offset,&jaddr); } @@ -3352,6 +3354,7 @@ void storelr_assemble(int i,struct regstat *i_regs) }else{ // using tlb int map=get_reg(i_regs->regmap,TLREG); assert(map>=0); + reglist&=~(1<<map); map=do_tlb_w(c||s<0||offset?temp:s,temp,map,0,c,constmap[i][s]+offset); if(!c&&!offset&&s>=0) emit_mov(s,temp); do_tlb_w_branch(map,c,constmap[i][s]+offset,&jaddr); @@ -3602,6 +3605,7 @@ void c1ls_assemble(int i,struct regstat *i_regs) { map=get_reg(i_regs->regmap,TLREG); assert(map>=0); + reglist&=~(1<<map); if (opcode[i]==0x31||opcode[i]==0x35) { // LWC1/LDC1 map=do_tlb_r(offset||c||s<0?ar:s,ar,map,0,-1,-1,c,constmap[i][s]+offset); } @@ -4479,7 +4483,7 @@ void load_all_regs(signed char i_regmap[]) emit_zeroreg(hr); } else - if(i_regmap[hr]>0 && i_regmap[hr]!=CCREG) + if(i_regmap[hr]>0 && (i_regmap[hr]&63)<TEMPREG && i_regmap[hr]!=CCREG) { emit_loadreg(i_regmap[hr],hr); } @@ -4498,7 +4502,7 @@ void load_needed_regs(signed char i_regmap[],signed char next_regmap[]) emit_zeroreg(hr); } else - if(i_regmap[hr]>0 && i_regmap[hr]!=CCREG) + if(i_regmap[hr]>0 && (i_regmap[hr]&63)<TEMPREG && i_regmap[hr]!=CCREG) { emit_loadreg(i_regmap[hr],hr); } @@ -4518,7 +4522,7 @@ void load_regs_entry(int t) } // Load 32-bit regs for(hr=0;hr<HOST_REGS;hr++) { - if(regs[t].regmap_entry[hr]>=0&®s[t].regmap_entry[hr]<64) { + if(regs[t].regmap_entry[hr]>=0&®s[t].regmap_entry[hr]<TEMPREG) { if(regs[t].regmap_entry[hr]==0) { emit_zeroreg(hr); } @@ -4530,7 +4534,7 @@ void load_regs_entry(int t) } // Load 64-bit regs for(hr=0;hr<HOST_REGS;hr++) { - if(regs[t].regmap_entry[hr]>=64) { + if(regs[t].regmap_entry[hr]>=64&®s[t].regmap_entry[hr]<TEMPREG+64) { assert(regs[t].regmap_entry[hr]!=64); if((regs[t].was32>>(regs[t].regmap_entry[hr]&63))&1) { int lr=get_reg(regs[t].regmap_entry,regs[t].regmap_entry[hr]-64); @@ -4610,7 +4614,7 @@ void load_regs_bt(signed char i_regmap[],uint64_t i_is32,uint64_t i_dirty,int ad } // Load 32-bit regs for(hr=0;hr<HOST_REGS;hr++) { - if(hr!=EXCLUDE_REG&®s[t].regmap_entry[hr]>=0&®s[t].regmap_entry[hr]<64) { + if(hr!=EXCLUDE_REG&®s[t].regmap_entry[hr]>=0&®s[t].regmap_entry[hr]<TEMPREG) { #ifdef DESTRUCTIVE_WRITEBACK if(i_regmap[hr]!=regs[t].regmap_entry[hr] || ( !((regs[t].dirty>>hr)&1) && ((i_dirty>>hr)&1) && (((i_is32&~unneeded_reg_upper[t])>>i_regmap[hr])&1) ) || (((i_is32&~regs[t].was32&~unneeded_reg_upper[t])>>(i_regmap[hr]&63))&1)) { #else @@ -4628,7 +4632,7 @@ void load_regs_bt(signed char i_regmap[],uint64_t i_is32,uint64_t i_dirty,int ad } //Load 64-bit regs for(hr=0;hr<HOST_REGS;hr++) { - if(hr!=EXCLUDE_REG&®s[t].regmap_entry[hr]>=64) { + if(hr!=EXCLUDE_REG&®s[t].regmap_entry[hr]>=64&®s[t].regmap_entry[hr]<TEMPREG+64) { if(i_regmap[hr]!=regs[t].regmap_entry[hr]) { assert(regs[t].regmap_entry[hr]!=64); if((i_is32>>(regs[t].regmap_entry[hr]&63))&1) { @@ -4669,19 +4673,19 @@ int match_bt(signed char i_regmap[],uint64_t i_is32,uint64_t i_dirty,int addr) { if(i_regmap[hr]!=regs[t].regmap_entry[hr]) { - if(regs[t].regmap_entry[hr]!=-1) + if(regs[t].regmap_entry[hr]>=0&&(regs[t].regmap_entry[hr]|64)<TEMPREG+64) { return 0; } else if((i_dirty>>hr)&1) { - if(i_regmap[hr]<64) + if(i_regmap[hr]<TEMPREG) { if(!((unneeded_reg[t]>>i_regmap[hr])&1)) return 0; } - else + else if(i_regmap[hr]>=64&&i_regmap[hr]<TEMPREG+64) { if(!((unneeded_reg_upper[t]>>(i_regmap[hr]&63))&1)) return 0; |