notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dfxvideo: use stricter alignment check
[pcsx_rearmed.git]
/
libpcsxcore
/
new_dynarec
/
assem_arm.c
diff --git
a/libpcsxcore/new_dynarec/assem_arm.c
b/libpcsxcore/new_dynarec/assem_arm.c
index
3a86dba
..
0b7cee8
100644
(file)
--- a/
libpcsxcore/new_dynarec/assem_arm.c
+++ b/
libpcsxcore/new_dynarec/assem_arm.c
@@
-29,6
+29,10
@@
#include "pcnt.h"
#endif
#include "pcnt.h"
#endif
+#ifndef BASE_ADDR_FIXED
+char translation_cache[1 << TARGET_SIZE_2] __attribute__((aligned(4096)));
+#endif
+
extern int cycle_count;
extern int last_count;
extern int pcaddr;
extern int cycle_count;
extern int last_count;
extern int pcaddr;
@@
-2835,7
+2839,7
@@
do_readstub(int n)
temp=r; break;
}
}
temp=r; break;
}
}
- if(rt>=0)
+ if(rt>=0
&&rt1[i]!=0
)
reglist&=~(1<<rt);
if(temp==-1) {
save_regs(reglist);
reglist&=~(1<<rt);
if(temp==-1) {
save_regs(reglist);
@@
-3012,7
+3016,7
@@
inline_readstub(int type, int i, u_int addr, signed char regmap[], int target, i
return;
handler=get_direct_memhandler(mem_rtab,addr,type,&host_addr);
if (handler==0) {
return;
handler=get_direct_memhandler(mem_rtab,addr,type,&host_addr);
if (handler==0) {
- if(rt<0)
+ if(rt<0
||rt1[i]==0
)
return;
if(addr!=host_addr)
emit_movimm_from(addr,rs,host_addr,rs);
return;
if(addr!=host_addr)
emit_movimm_from(addr,rs,host_addr,rs);
@@
-3037,7
+3041,7
@@
inline_readstub(int type, int i, u_int addr, signed char regmap[], int target, i
}
// call a memhandler
}
// call a memhandler
- if(rt>=0)
+ if(rt>=0
&&rt1[i]!=0
)
reglist&=~(1<<rt);
save_regs(reglist);
if(target==0)
reglist&=~(1<<rt);
save_regs(reglist);
if(target==0)
@@
-3068,7
+3072,7
@@
inline_readstub(int type, int i, u_int addr, signed char regmap[], int target, i
else
emit_call(handler);
else
emit_call(handler);
- if(rt>=0) {
+ if(rt>=0
&&rt1[i]!=0
) {
switch(type) {
case LOADB_STUB: emit_signextend8(0,rt); break;
case LOADBU_STUB: emit_andimm(0,0xff,rt); break;
switch(type) {
case LOADB_STUB: emit_signextend8(0,rt); break;
case LOADBU_STUB: emit_andimm(0,0xff,rt); break;
@@
-4215,10
+4219,10
@@
void cop0_assemble(int i,struct regstat *i_regs)
emit_writeword(HOST_CCREG,(int)&last_count);
emit_movimm(0,HOST_CCREG);
emit_storereg(CCREG,HOST_CCREG);
emit_writeword(HOST_CCREG,(int)&last_count);
emit_movimm(0,HOST_CCREG);
emit_storereg(CCREG,HOST_CCREG);
- if(s!=1)
- emit_mov(s,1);
+ emit_loadreg(rs1[i],1);
emit_movimm(copr,0);
emit_call((int)pcsx_mtc0_ds);
emit_movimm(copr,0);
emit_call((int)pcsx_mtc0_ds);
+ emit_loadreg(rs1[i],s);
return;
}
#endif
return;
}
#endif
@@
-4230,7
+4234,9
@@
void cop0_assemble(int i,struct regstat *i_regs)
//else if(copr==12&&is_delayslot) emit_call((int)MTC0_R12);
//else
#ifdef PCSX
//else if(copr==12&&is_delayslot) emit_call((int)MTC0_R12);
//else
#ifdef PCSX
- if(s!=1)
+ if(s==HOST_CCREG)
+ emit_loadreg(rs1[i],1);
+ else if(s!=1)
emit_mov(s,1);
emit_movimm(copr,0);
emit_call((int)pcsx_mtc0);
emit_mov(s,1);
emit_movimm(copr,0);
emit_call((int)pcsx_mtc0);
@@
-4239,23
+4245,21
@@
void cop0_assemble(int i,struct regstat *i_regs)
#endif
if(copr==9||copr==11||copr==12||copr==13) {
emit_readword((int)&Count,HOST_CCREG);
#endif
if(copr==9||copr==11||copr==12||copr==13) {
emit_readword((int)&Count,HOST_CCREG);
- emit_readword((int)&next_interupt,
ECX
);
+ emit_readword((int)&next_interupt,
HOST_TEMPREG
);
emit_addimm(HOST_CCREG,-CLOCK_ADJUST(ccadj[i]),HOST_CCREG);
emit_addimm(HOST_CCREG,-CLOCK_ADJUST(ccadj[i]),HOST_CCREG);
- emit_sub(HOST_CCREG,
ECX
,HOST_CCREG);
- emit_writeword(
ECX
,(int)&last_count);
+ emit_sub(HOST_CCREG,
HOST_TEMPREG
,HOST_CCREG);
+ emit_writeword(
HOST_TEMPREG
,(int)&last_count);
emit_storereg(CCREG,HOST_CCREG);
}
if(copr==12||copr==13) {
assert(!is_delayslot);
emit_readword((int)&pending_exception,14);
emit_storereg(CCREG,HOST_CCREG);
}
if(copr==12||copr==13) {
assert(!is_delayslot);
emit_readword((int)&pending_exception,14);
+ emit_test(14,14);
+ emit_jne((int)&do_interrupt);
}
emit_loadreg(rs1[i],s);
if(get_reg(i_regs->regmap,rs1[i]|64)>=0)
emit_loadreg(rs1[i]|64,get_reg(i_regs->regmap,rs1[i]|64));
}
emit_loadreg(rs1[i],s);
if(get_reg(i_regs->regmap,rs1[i]|64)>=0)
emit_loadreg(rs1[i]|64,get_reg(i_regs->regmap,rs1[i]|64));
- if(copr==12||copr==13) {
- emit_test(14,14);
- emit_jne((int)&do_interrupt);
- }
cop1_usable=0;
}
else
cop1_usable=0;
}
else
@@
-4492,8
+4496,8
@@
static void c2op_assemble(int i,struct regstat *i_regs)
if (gte_handlers[c2op]!=NULL) {
need_flags=!(gte_unneeded[i+1]>>63); // +1 because of how liveness detection works
need_ir=(gte_unneeded[i+1]&0xe00)!=0xe00;
if (gte_handlers[c2op]!=NULL) {
need_flags=!(gte_unneeded[i+1]>>63); // +1 because of how liveness detection works
need_ir=(gte_unneeded[i+1]&0xe00)!=0xe00;
- assem_debug("gte unneeded %016llx, need_flags %d, need_ir %d\n",
- gte_unneeded[i+1],need_flags,need_ir);
+ assem_debug("gte
op %08x,
unneeded %016llx, need_flags %d, need_ir %d\n",
+
source[i],
gte_unneeded[i+1],need_flags,need_ir);
if(new_dynarec_hacks&NDHACK_GTE_NO_FLAGS)
need_flags=0;
int shift = (source[i] >> 19) & 1;
if(new_dynarec_hacks&NDHACK_GTE_NO_FLAGS)
need_flags=0;
int shift = (source[i] >> 19) & 1;
@@
-5680,7
+5684,7
@@
void do_clear_cache()
for(j=0;j<32;j++)
{
if(bitmap&(1<<j)) {
for(j=0;j<32;j++)
{
if(bitmap&(1<<j)) {
- start=BASE_ADDR+i*131072+j*4096;
+ start=
(u_int)
BASE_ADDR+i*131072+j*4096;
end=start+4095;
j++;
while(j<32) {
end=start+4095;
j++;
while(j<32) {