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
drc: rework for 64bit, part 1
[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
8693c2d
..
7641bbc
100644
(file)
--- a/
libpcsxcore/new_dynarec/assem_arm.c
+++ b/
libpcsxcore/new_dynarec/assem_arm.c
@@
-127,26
+127,27
@@
static u_int needs_clear_cache[1<<(TARGET_SIZE_2-17)];
/* Linker */
/* Linker */
-static void set_jump_target(
int addr,u_int target
)
+static void set_jump_target(
void *addr, void *target_
)
{
{
- u_char *ptr=(u_char *)addr;
+ u_int target = (u_int)target_;
+ u_char *ptr = addr;
u_int *ptr2=(u_int *)ptr;
if(ptr[3]==0xe2) {
assert((target-(u_int)ptr2-8)<1024);
u_int *ptr2=(u_int *)ptr;
if(ptr[3]==0xe2) {
assert((target-(u_int)ptr2-8)<1024);
- assert((addr&3)==0);
+ assert((
(uintptr_t)
addr&3)==0);
assert((target&3)==0);
*ptr2=(*ptr2&0xFFFFF000)|((target-(u_int)ptr2-8)>>2)|0xF00;
assert((target&3)==0);
*ptr2=(*ptr2&0xFFFFF000)|((target-(u_int)ptr2-8)>>2)|0xF00;
- //printf("target=%x addr=%
x
insn=%x\n",target,addr,*ptr2);
+ //printf("target=%x addr=%
p
insn=%x\n",target,addr,*ptr2);
}
else if(ptr[3]==0x72) {
// generated by emit_jno_unlikely
if((target-(u_int)ptr2-8)<1024) {
}
else if(ptr[3]==0x72) {
// generated by emit_jno_unlikely
if((target-(u_int)ptr2-8)<1024) {
- assert((addr&3)==0);
+ assert((
(uintptr_t)
addr&3)==0);
assert((target&3)==0);
*ptr2=(*ptr2&0xFFFFF000)|((target-(u_int)ptr2-8)>>2)|0xF00;
}
else if((target-(u_int)ptr2-8)<4096&&!((target-(u_int)ptr2-8)&15)) {
assert((target&3)==0);
*ptr2=(*ptr2&0xFFFFF000)|((target-(u_int)ptr2-8)>>2)|0xF00;
}
else if((target-(u_int)ptr2-8)<4096&&!((target-(u_int)ptr2-8)&15)) {
- assert((addr&3)==0);
+ assert((
(uintptr_t)
addr&3)==0);
assert((target&3)==0);
*ptr2=(*ptr2&0xFFFFF000)|((target-(u_int)ptr2-8)>>4)|0xE00;
}
assert((target&3)==0);
*ptr2=(*ptr2&0xFFFFF000)|((target-(u_int)ptr2-8)>>4)|0xE00;
}
@@
-227,9
+228,9
@@
static int get_pointer(void *stub)
// Find the "clean" entry point from a "dirty" entry point
// by skipping past the call to verify_code
// Find the "clean" entry point from a "dirty" entry point
// by skipping past the call to verify_code
-static
u_int get_clean_addr(int
addr)
+static
void *get_clean_addr(void *
addr)
{
{
-
int *ptr=(int *)
addr;
+
signed int *ptr =
addr;
#ifndef HAVE_ARMV7
ptr+=4;
#else
#ifndef HAVE_ARMV7
ptr+=4;
#else
@@
-239,9
+240,9
@@
static u_int get_clean_addr(int addr)
assert((*ptr&0xFF000000)==0xeb000000); // bl instruction
ptr++;
if((*ptr&0xFF000000)==0xea000000) {
assert((*ptr&0xFF000000)==0xeb000000); // bl instruction
ptr++;
if((*ptr&0xFF000000)==0xea000000) {
- return (
int
)ptr+((*ptr<<8)>>6)+8; // follow jump
+ return (
char *
)ptr+((*ptr<<8)>>6)+8; // follow jump
}
}
- return
(u_int)
ptr;
+ return ptr;
}
static int verify_dirty(u_int *ptr)
}
static int verify_dirty(u_int *ptr)
@@
-278,7
+279,7
@@
static int verify_dirty(u_int *ptr)
// This doesn't necessarily find all clean entry points, just
// guarantees that it's not dirty
// This doesn't necessarily find all clean entry points, just
// guarantees that it's not dirty
-static int isclean(
int
addr)
+static int isclean(
void *
addr)
{
#ifndef HAVE_ARMV7
u_int *ptr=((u_int *)addr)+4;
{
#ifndef HAVE_ARMV7
u_int *ptr=((u_int *)addr)+4;
@@
-2467,10
+2468,10
@@
static void literal_pool_jumpover(int n)
if(n) {
if((int)out-literals[0][0]<4096-n) return;
}
if(n) {
if((int)out-literals[0][0]<4096-n) return;
}
-
int jaddr=(int)
out;
+
void *jaddr =
out;
emit_jmp(0);
literal_pool(0);
emit_jmp(0);
literal_pool(0);
- set_jump_target(jaddr,
(int)
out);
+ set_jump_target(jaddr,
out);
}
static void emit_extjump2(u_int addr, int target, int linker)
}
static void emit_extjump2(u_int addr, int target, int linker)
@@
-2586,7
+2587,7
@@
static void do_readstub(int n)
{
assem_debug("do_readstub %x\n",start+stubs[n][3]*4);
literal_pool(256);
{
assem_debug("do_readstub %x\n",start+stubs[n][3]*4);
literal_pool(256);
- set_jump_target(stubs[n][1],
(int)
out);
+ set_jump_target(stubs[n][1],
out);
int type=stubs[n][0];
int i=stubs[n][3];
int rs=stubs[n][4];
int type=stubs[n][0];
int i=stubs[n][3];
int rs=stubs[n][4];
@@
-2600,7
+2601,8
@@
static void do_readstub(int n)
rt=get_reg(i_regmap,rt1[i]);
}
assert(rs>=0);
rt=get_reg(i_regmap,rt1[i]);
}
assert(rs>=0);
- int r,temp=-1,temp2=HOST_TEMPREG,regs_saved=0,restore_jump=0;
+ int r,temp=-1,temp2=HOST_TEMPREG,regs_saved=0;
+ void *restore_jump = NULL;
reglist|=(1<<rs);
for(r=0;r<=12;r++) {
if(((1<<r)&0x13ff)&&((1<<r)®list)==0) {
reglist|=(1<<rs);
for(r=0;r<=12;r++) {
if(((1<<r)&0x13ff)&&((1<<r)®list)==0) {
@@
-2630,7
+2632,7
@@
static void do_readstub(int n)
}
}
if(regs_saved) {
}
}
if(regs_saved) {
- restore_jump=
(int)
out;
+ restore_jump=out;
emit_jcc(0); // jump to reg restore
}
else
emit_jcc(0); // jump to reg restore
}
else
@@
-2656,7
+2658,7
@@
static void do_readstub(int n)
mov_loadtype_adj(type,0,rt);
}
if(restore_jump)
mov_loadtype_adj(type,0,rt);
}
if(restore_jump)
- set_jump_target(restore_jump,
(int)
out);
+ set_jump_target(restore_jump,
out);
restore_regs(reglist);
emit_jmp(stubs[n][2]); // return address
}
restore_regs(reglist);
emit_jmp(stubs[n][2]); // return address
}
@@
-2773,7
+2775,7
@@
static void do_writestub(int n)
{
assem_debug("do_writestub %x\n",start+stubs[n][3]*4);
literal_pool(256);
{
assem_debug("do_writestub %x\n",start+stubs[n][3]*4);
literal_pool(256);
- set_jump_target(stubs[n][1],
(int)
out);
+ set_jump_target(stubs[n][1],
out);
int type=stubs[n][0];
int i=stubs[n][3];
int rs=stubs[n][4];
int type=stubs[n][0];
int i=stubs[n][3];
int rs=stubs[n][4];
@@
-2788,7
+2790,8
@@
static void do_writestub(int n)
}
assert(rs>=0);
assert(rt>=0);
}
assert(rs>=0);
assert(rt>=0);
- int rtmp,temp=-1,temp2=HOST_TEMPREG,regs_saved=0,restore_jump=0,ra;
+ int rtmp,temp=-1,temp2=HOST_TEMPREG,regs_saved=0,ra;
+ void *restore_jump = NULL;
int reglist2=reglist|(1<<rs)|(1<<rt);
for(rtmp=0;rtmp<=12;rtmp++) {
if(((1<<rtmp)&0x13ff)&&((1<<rtmp)®list2)==0) {
int reglist2=reglist|(1<<rs)|(1<<rt);
for(rtmp=0;rtmp<=12;rtmp++) {
if(((1<<rtmp)&0x13ff)&&((1<<rtmp)®list2)==0) {
@@
-2815,7
+2818,7
@@
static void do_writestub(int n)
default: assert(0);
}
if(regs_saved) {
default: assert(0);
}
if(regs_saved) {
- restore_jump=
(int)
out;
+ restore_jump=out;
emit_jcc(0); // jump to reg restore
}
else
emit_jcc(0); // jump to reg restore
}
else
@@
-2843,7
+2846,7
@@
static void do_writestub(int n)
if(cc<0)
emit_storereg(CCREG,2);
if(restore_jump)
if(cc<0)
emit_storereg(CCREG,2);
if(restore_jump)
- set_jump_target(restore_jump,
(int)
out);
+ set_jump_target(restore_jump,
out);
restore_regs(reglist);
ra=stubs[n][2];
emit_jmp(ra);
restore_regs(reglist);
ra=stubs[n][2];
emit_jmp(ra);
@@
-2889,7
+2892,7
@@
static void do_unalignedwritestub(int n)
{
assem_debug("do_unalignedwritestub %x\n",start+stubs[n][3]*4);
literal_pool(256);
{
assem_debug("do_unalignedwritestub %x\n",start+stubs[n][3]*4);
literal_pool(256);
- set_jump_target(stubs[n][1],
(int)
out);
+ set_jump_target(stubs[n][1],
out);
int i=stubs[n][3];
struct regstat *i_regs=(struct regstat *)stubs[n][4];
int i=stubs[n][3];
struct regstat *i_regs=(struct regstat *)stubs[n][4];
@@
-2977,7
+2980,7
@@
static void do_invstub(int n)
{
literal_pool(20);
u_int reglist=stubs[n][3];
{
literal_pool(20);
u_int reglist=stubs[n][3];
- set_jump_target(stubs[n][1],
(int)
out);
+ set_jump_target(stubs[n][1],
out);
save_regs(reglist);
if(stubs[n][4]!=0) emit_mov(stubs[n][4],0);
emit_call((int)&invalidate_addr);
save_regs(reglist);
if(stubs[n][4]!=0) emit_mov(stubs[n][4],0);
emit_call((int)&invalidate_addr);
@@
-2985,7
+2988,7
@@
static void do_invstub(int n)
emit_jmp(stubs[n][2]); // return address
}
emit_jmp(stubs[n][2]); // return address
}
-
int
do_dirty_stub(int i)
+
void *
do_dirty_stub(int i)
{
assem_debug("do_dirty_stub %x\n",start+i*4);
u_int addr=(u_int)source;
{
assem_debug("do_dirty_stub %x\n",start+i*4);
u_int addr=(u_int)source;
@@
-3003,9
+3006,10
@@
int do_dirty_stub(int i)
#endif
emit_movimm(start+i*4,0);
emit_call((int)start<(int)0xC0000000?(int)&verify_code:(int)&verify_code_vm);
#endif
emit_movimm(start+i*4,0);
emit_call((int)start<(int)0xC0000000?(int)&verify_code:(int)&verify_code_vm);
-
int entry=(int)
out;
+
void *entry =
out;
load_regs_entry(i);
load_regs_entry(i);
- if(entry==(int)out) entry=instr_addr[i];
+ if (entry == out)
+ entry = instr_addr[i];
emit_jmp(instr_addr[i]);
return entry;
}
emit_jmp(instr_addr[i]);
return entry;
}
@@
-3032,7
+3036,7
@@
static void do_cop1stub(int n)
{
literal_pool(256);
assem_debug("do_cop1stub %x\n",start+stubs[n][3]*4);
{
literal_pool(256);
assem_debug("do_cop1stub %x\n",start+stubs[n][3]*4);
- set_jump_target(stubs[n][1],
(int)
out);
+ set_jump_target(stubs[n][1],
out);
int i=stubs[n][3];
// int rs=stubs[n][4];
struct regstat *i_regs=(struct regstat *)stubs[n][5];
int i=stubs[n][3];
// int rs=stubs[n][4];
struct regstat *i_regs=(struct regstat *)stubs[n][5];