X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fnew_dynarec%2Fnew_dynarec.c;h=573d0cdbfaf2f2b5f5d812b4ec01452a8a9f1ff8;hp=c1fa775d27a8c60730906b04652ebe00b316f34c;hb=748406cf9b74d0cd0537768d68cbae926394ea5b;hpb=311301dc26918fcb95577247257380960f2313ba diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c index c1fa775d..573d0cdb 100644 --- a/libpcsxcore/new_dynarec/new_dynarec.c +++ b/libpcsxcore/new_dynarec/new_dynarec.c @@ -690,6 +690,10 @@ void lsn(u_char hsn[], int i, int *preferred_reg) hsn[RHASH]=1; hsn[RHTBL]=1; } + // due to the way JAL is currently done we need DS not to evict $ra + if(i>0&&itype[i-1]==UJUMP&&rt1[i-1]==31) { + hsn[31]=0; + } // Coprocessor load/store needs FTEMP, even if not declared if(itype[i]==C1LS||itype[i]==C2LS) { hsn[FTEMP]=0; @@ -2766,6 +2770,7 @@ void load_assemble(int i,struct regstat *i_regs) int offset; int jaddr=0; int memtarget=0,c=0; + int fastload_reg_override=0; u_int hr,reglist=0; th=get_reg(i_regs->regmap,rt1[i]|64); tl=get_reg(i_regs->regmap,rt1[i]); @@ -2820,6 +2825,7 @@ void load_assemble(int i,struct regstat *i_regs) if(sp_in_mirror&&rs1[i]==29) { emit_andimm(addr,~0x00e00000,HOST_TEMPREG); emit_cmpimm(HOST_TEMPREG,RAM_SIZE); + fastload_reg_override=HOST_TEMPREG; } else #endif @@ -2864,9 +2870,8 @@ void load_assemble(int i,struct regstat *i_regs) #else if(!c) a=addr; #endif -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(fastload_reg_override) a=fastload_reg_override; + emit_movsbl_indexed_tlb(x,a,map,tl); } } @@ -2892,9 +2897,7 @@ void load_assemble(int i,struct regstat *i_regs) #else if(!c) a=addr; #endif -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(fastload_reg_override) a=fastload_reg_override; //#ifdef //emit_movswl_indexed_tlb(x,tl,map,tl); //else @@ -2920,9 +2923,7 @@ void load_assemble(int i,struct regstat *i_regs) if(!c||memtarget) { if(!dummy) { int a=addr; -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(fastload_reg_override) a=fastload_reg_override; //emit_readword_indexed((int)rdram-0x80000000,addr,tl); #ifdef HOST_IMM_ADDR32 if(c) @@ -2956,9 +2957,8 @@ void load_assemble(int i,struct regstat *i_regs) #else if(!c) a=addr; #endif -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(fastload_reg_override) a=fastload_reg_override; + emit_movzbl_indexed_tlb(x,a,map,tl); } } @@ -2984,9 +2984,7 @@ void load_assemble(int i,struct regstat *i_regs) #else if(!c) a=addr; #endif -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(fastload_reg_override) a=fastload_reg_override; //#ifdef //emit_movzwl_indexed_tlb(x,tl,map,tl); //#else @@ -3013,9 +3011,7 @@ void load_assemble(int i,struct regstat *i_regs) if(!c||memtarget) { if(!dummy) { int a=addr; -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(fastload_reg_override) a=fastload_reg_override; //emit_readword_indexed((int)rdram-0x80000000,addr,tl); #ifdef HOST_IMM_ADDR32 if(c) @@ -3036,9 +3032,7 @@ void load_assemble(int i,struct regstat *i_regs) if(!c||memtarget) { if(!dummy) { int a=addr; -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(fastload_reg_override) a=fastload_reg_override; //gen_tlb_addr_r(tl,map); //if(th>=0) emit_readword_indexed((int)rdram-0x80000000,addr,th); //emit_readword_indexed((int)rdram-0x7FFFFFFC,addr,tl); @@ -3103,6 +3097,7 @@ void store_assemble(int i,struct regstat *i_regs) int jaddr=0,jaddr2,type; int memtarget=0,c=0; int agr=AGEN1+(i&1); + int faststore_reg_override=0; u_int hr,reglist=0; th=get_reg(i_regs->regmap,rs2[i]|64); tl=get_reg(i_regs->regmap,rs2[i]); @@ -3131,6 +3126,7 @@ void store_assemble(int i,struct regstat *i_regs) if(sp_in_mirror&&rs1[i]==29) { emit_andimm(addr,~0x00e00000,HOST_TEMPREG); emit_cmpimm(HOST_TEMPREG,RAM_SIZE); + faststore_reg_override=HOST_TEMPREG; } else #endif @@ -3177,9 +3173,7 @@ void store_assemble(int i,struct regstat *i_regs) #else if(!c) a=addr; #endif -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(faststore_reg_override) a=faststore_reg_override; //gen_tlb_addr_w(temp,map); //emit_writebyte_indexed(tl,(int)rdram-0x80000000,temp); emit_writebyte_indexed_tlb(tl,x,a,map,a); @@ -3195,9 +3189,7 @@ void store_assemble(int i,struct regstat *i_regs) #else if(!c) a=addr; #endif -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(faststore_reg_override) a=faststore_reg_override; //#ifdef //emit_writehword_indexed_tlb(tl,x,temp,map,temp); //#else @@ -3212,9 +3204,7 @@ void store_assemble(int i,struct regstat *i_regs) if (opcode[i]==0x2B) { // SW if(!c||memtarget) { int a=addr; -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(faststore_reg_override) a=faststore_reg_override; //emit_writeword_indexed(tl,(int)rdram-0x80000000,addr); emit_writeword_indexed_tlb(tl,0,a,map,temp); } @@ -3223,9 +3213,7 @@ void store_assemble(int i,struct regstat *i_regs) if (opcode[i]==0x3F) { // SD if(!c||memtarget) { int a=addr; -#ifdef PCSX - if(sp_in_mirror&&rs1[i]==29) a=HOST_TEMPREG; -#endif + if(faststore_reg_override) a=faststore_reg_override; if(rs2[i]) { assert(th>=0); //emit_writeword_indexed(th,(int)rdram-0x80000000,addr); @@ -3274,8 +3262,12 @@ void store_assemble(int i,struct regstat *i_regs) //if(opcode[i]==0x2B) /*if(opcode[i]==0x2B || opcode[i]==0x28 || opcode[i]==0x29 || opcode[i]==0x3F) { - //emit_pusha(); + #ifdef __i386__ + emit_pusha(); + #endif + #ifdef __arm__ save_regs(0x100f); + #endif emit_readword((int)&last_count,ECX); #ifdef __i386__ if(get_reg(i_regs->regmap,CCREG)<0) @@ -3294,8 +3286,12 @@ void store_assemble(int i,struct regstat *i_regs) emit_writeword(0,(int)&Count); #endif emit_call((int)memdebug); - //emit_popa(); + #ifdef __i386__ + emit_popa(); + #endif + #ifdef __arm__ restore_regs(0x100f); + #endif }/**/ } @@ -8243,7 +8239,9 @@ int new_recompile_block(int addr) case 0x24: strcpy(insn[i],"LBU"); type=LOAD; break; case 0x25: strcpy(insn[i],"LHU"); type=LOAD; break; case 0x26: strcpy(insn[i],"LWR"); type=LOADLR; break; +#ifndef FORCE32 case 0x27: strcpy(insn[i],"LWU"); type=LOAD; break; +#endif case 0x28: strcpy(insn[i],"SB"); type=STORE; break; case 0x29: strcpy(insn[i],"SH"); type=STORE; break; case 0x2A: strcpy(insn[i],"SWL"); type=STORELR; break; @@ -8887,8 +8885,6 @@ int new_recompile_block(int addr) clear_const(¤t,rt1[i]); alloc_cc(¤t,i); dirty_reg(¤t,CCREG); - ooo[i]=1; - delayslot_alloc(¤t,i+1); if (rt1[i]==31) { alloc_reg(¤t,i,31); dirty_reg(¤t,31); @@ -8899,6 +8895,8 @@ int new_recompile_block(int addr) #endif //current.is32|=1LL<