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: possibly the missing piece for Vita
[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
87490c6
..
381a541
100644
(file)
--- a/
libpcsxcore/new_dynarec/assem_arm.c
+++ b/
libpcsxcore/new_dynarec/assem_arm.c
@@
-27,12
+27,6
@@
#include "pcnt.h"
#include "arm_features.h"
#include "pcnt.h"
#include "arm_features.h"
-#ifndef __MACH__
-#define CALLER_SAVE_REGS 0x100f
-#else
-#define CALLER_SAVE_REGS 0x120f
-#endif
-
#define unused __attribute__((unused))
#ifdef DRC_DBG
#define unused __attribute__((unused))
#ifdef DRC_DBG
@@
-479,6
+473,7
@@
static void emit_loadlp(u_int imm,u_int rt)
output_w32(0xe5900000|rd_rn_rm(rt,15,0));
}
output_w32(0xe5900000|rd_rn_rm(rt,15,0));
}
+#ifdef HAVE_ARMV7
static void emit_movw(u_int imm,u_int rt)
{
assert(imm<65536);
static void emit_movw(u_int imm,u_int rt)
{
assert(imm<65536);
@@
-491,6
+486,7
@@
static void emit_movt(u_int imm,u_int rt)
assem_debug("movt %s,#%d (0x%x)\n",regname[rt],imm&0xffff0000,imm&0xffff0000);
output_w32(0xe3400000|rd_rn_rm(rt,0,0)|((imm>>16)&0xfff)|((imm>>12)&0xf0000));
}
assem_debug("movt %s,#%d (0x%x)\n",regname[rt],imm&0xffff0000,imm&0xffff0000);
output_w32(0xe3400000|rd_rn_rm(rt,0,0)|((imm>>16)&0xfff)|((imm>>12)&0xf0000));
}
+#endif
static void emit_movimm(u_int imm,u_int rt)
{
static void emit_movimm(u_int imm,u_int rt)
{
@@
-536,17
+532,20
@@
static void emit_loadreg(int r, int hr)
if((r&63)==0)
emit_zeroreg(hr);
else {
if((r&63)==0)
emit_zeroreg(hr);
else {
-
int addr = (int)&psxRegs.GPR.r[r]
;
+
void *addr
;
switch (r) {
//case HIREG: addr = &hi; break;
//case LOREG: addr = &lo; break;
switch (r) {
//case HIREG: addr = &hi; break;
//case LOREG: addr = &lo; break;
- case CCREG: addr = (int)&cycle_count; break;
- case CSREG: addr = (int)&Status; break;
- case INVCP: addr = (int)&invc_ptr; break;
- case ROREG: addr = (int)&ram_offset; break;
- default: assert(r < 34); break;
+ case CCREG: addr = &cycle_count; break;
+ case CSREG: addr = &Status; break;
+ case INVCP: addr = &invc_ptr; break;
+ case ROREG: addr = &ram_offset; break;
+ default:
+ assert(r < 34);
+ addr = &psxRegs.GPR.r[r];
+ break;
}
}
- u_int offset =
addr-(u_int
)&dynarec_local;
+ u_int offset =
(u_char *)addr - (u_char *
)&dynarec_local;
assert(offset<4096);
assem_debug("ldr %s,fp+%d\n",regname[hr],offset);
output_w32(0xe5900000|rd_rn_rm(hr,FP,0)|offset);
assert(offset<4096);
assem_debug("ldr %s,fp+%d\n",regname[hr],offset);
output_w32(0xe5900000|rd_rn_rm(hr,FP,0)|offset);
@@
-955,6
+954,14
@@
static void emit_cmovae_imm(int imm,int rt)
output_w32(0x23a00000|rd_rn_rm(rt,0,0)|armval);
}
output_w32(0x23a00000|rd_rn_rm(rt,0,0)|armval);
}
+static void emit_cmovs_imm(int imm,int rt)
+{
+ assem_debug("movmi %s,#%d\n",regname[rt],imm);
+ u_int armval;
+ genimm_checked(imm,&armval);
+ output_w32(0x43a00000|rd_rn_rm(rt,0,0)|armval);
+}
+
static void emit_cmovne_reg(int rs,int rt)
{
assem_debug("movne %s,%s\n",regname[rt],regname[rs]);
static void emit_cmovne_reg(int rs,int rt)
{
assem_debug("movne %s,%s\n",regname[rt],regname[rs]);
@@
-1527,14
+1534,6
@@
static void emit_orrne_imm(int rs,int imm,int rt)
output_w32(0x13800000|rd_rn_rm(rt,rs,0)|armval);
}
output_w32(0x13800000|rd_rn_rm(rt,rs,0)|armval);
}
-static void emit_andne_imm(int rs,int imm,int rt)
-{
- u_int armval;
- genimm_checked(imm,&armval);
- assem_debug("andne %s,%s,#%d\n",regname[rt],regname[rs],imm);
- output_w32(0x12000000|rd_rn_rm(rt,rs,0)|armval);
-}
-
static unused void emit_addpl_imm(int rs,int imm,int rt)
{
u_int armval;
static unused void emit_addpl_imm(int rs,int imm,int rt)
{
u_int armval;
@@
-1794,7
+1793,7
@@
static void do_readstub(int n)
int cc=get_reg(i_regmap,CCREG);
if(cc<0)
emit_loadreg(CCREG,2);
int cc=get_reg(i_regmap,CCREG);
if(cc<0)
emit_loadreg(CCREG,2);
- emit_addimm(cc<0?2:cc,
CLOCK_ADJUST((int)stubs[n].d)
,2);
+ emit_addimm(cc<0?2:cc,
(int)stubs[n].d
,2);
emit_far_call(handler);
if(dops[i].itype==C1LS||dops[i].itype==C2LS||(rt>=0&&dops[i].rt1!=0)) {
mov_loadtype_adj(type,0,rt);
emit_far_call(handler);
if(dops[i].itype==C1LS||dops[i].itype==C2LS||(rt>=0&&dops[i].rt1!=0)) {
mov_loadtype_adj(type,0,rt);
@@
-1816,7
+1815,7
@@
static void inline_readstub(enum stub_type type, int i, u_int addr,
uintptr_t host_addr = 0;
void *handler;
int cc=get_reg(regmap,CCREG);
uintptr_t host_addr = 0;
void *handler;
int cc=get_reg(regmap,CCREG);
- if(pcsx_direct_read(type,addr,
CLOCK_ADJUST(adj)
,cc,target?rs:-1,rt))
+ if(pcsx_direct_read(type,addr,
adj
,cc,target?rs:-1,rt))
return;
handler = get_direct_memhandler(mem_rtab, addr, type, &host_addr);
if (handler == NULL) {
return;
handler = get_direct_memhandler(mem_rtab, addr, type, &host_addr);
if (handler == NULL) {
@@
-1856,11
+1855,11
@@
static void inline_readstub(enum stub_type type, int i, u_int addr,
emit_loadreg(CCREG,2);
if(is_dynamic) {
emit_movimm(((u_int *)mem_rtab)[addr>>12]<<1,1);
emit_loadreg(CCREG,2);
if(is_dynamic) {
emit_movimm(((u_int *)mem_rtab)[addr>>12]<<1,1);
- emit_addimm(cc<0?2:cc,
CLOCK_ADJUST(adj)
,2);
+ emit_addimm(cc<0?2:cc,
adj
,2);
}
else {
emit_readword(&last_count,3);
}
else {
emit_readword(&last_count,3);
- emit_addimm(cc<0?2:cc,
CLOCK_ADJUST(adj)
,2);
+ emit_addimm(cc<0?2:cc,
adj
,2);
emit_add(2,3,2);
emit_writeword(2,&Count);
}
emit_add(2,3,2);
emit_writeword(2,&Count);
}
@@
-1949,10
+1948,10
@@
static void do_writestub(int n)
int cc=get_reg(i_regmap,CCREG);
if(cc<0)
emit_loadreg(CCREG,2);
int cc=get_reg(i_regmap,CCREG);
if(cc<0)
emit_loadreg(CCREG,2);
- emit_addimm(cc<0?2:cc,
CLOCK_ADJUST((int)stubs[n].d)
,2);
+ emit_addimm(cc<0?2:cc,
(int)stubs[n].d
,2);
// returns new cycle_count
emit_far_call(handler);
// returns new cycle_count
emit_far_call(handler);
- emit_addimm(0,-
CLOCK_ADJUST((int)stubs[n].d)
,cc<0?2:cc);
+ emit_addimm(0,-
(int)stubs[n].d
,cc<0?2:cc);
if(cc<0)
emit_storereg(CCREG,2);
if(restore_jump)
if(cc<0)
emit_storereg(CCREG,2);
if(restore_jump)
@@
-1988,11
+1987,11
@@
static void inline_writestub(enum stub_type type, int i, u_int addr,
int cc=get_reg(regmap,CCREG);
if(cc<0)
emit_loadreg(CCREG,2);
int cc=get_reg(regmap,CCREG);
if(cc<0)
emit_loadreg(CCREG,2);
- emit_addimm(cc<0?2:cc,
CLOCK_ADJUST(adj)
,2);
+ emit_addimm(cc<0?2:cc,
adj
,2);
emit_movimm((u_int)handler,3);
// returns new cycle_count
emit_far_call(jump_handler_write_h);
emit_movimm((u_int)handler,3);
// returns new cycle_count
emit_far_call(jump_handler_write_h);
- emit_addimm(0,-
CLOCK_ADJUST(adj)
,cc<0?2:cc);
+ emit_addimm(0,-
adj
,cc<0?2:cc);
if(cc<0)
emit_storereg(CCREG,2);
restore_regs(reglist);
if(cc<0)
emit_storereg(CCREG,2);
restore_regs(reglist);
@@
-2125,10
+2124,10
@@
static void c2op_assemble(int i, const struct regstat *i_regs)
}
#else
if(cv==3&&shift)
}
#else
if(cv==3&&shift)
- emit_far_call(
(int)
gteMVMVA_part_cv3sh12_arm);
+ emit_far_call(gteMVMVA_part_cv3sh12_arm);
else {
emit_movimm(shift,1);
else {
emit_movimm(shift,1);
- emit_far_call(
(int)(need_flags?gteMVMVA_part_arm:gteMVMVA_part_nf_arm)
);
+ emit_far_call(
need_flags?gteMVMVA_part_arm:gteMVMVA_part_nf_arm
);
}
if(need_flags||need_ir)
c2op_call_MACtoIR(lm,need_flags);
}
if(need_flags||need_ir)
c2op_call_MACtoIR(lm,need_flags);
@@
-2206,11
+2205,11
@@
static void c2op_ctc2_31_assemble(signed char sl, signed char temp)
static void do_mfc2_31_one(u_int copr,signed char temp)
{
emit_readword(®_cop2d[copr],temp);
static void do_mfc2_31_one(u_int copr,signed char temp)
{
emit_readword(®_cop2d[copr],temp);
- emit_
testimm(temp,0x8000); // do we need this?
- emit_
andne_imm(temp,
0,temp);
- emit_cmpimm(temp,0xf80);
- emit_andimm(temp,0xf80,temp);
- emit_cmovae_imm(0xf80,temp);
+ emit_
lsls_imm(temp,16,temp);
+ emit_
cmovs_imm(
0,temp);
+ emit_cmpimm(temp,0xf80
<<16
);
+ emit_andimm(temp,0xf80
<<16
,temp);
+ emit_cmovae_imm(0xf80
<<16
,temp);
}
static void c2op_mfc2_29_assemble(signed char tl, signed char temp)
}
static void c2op_mfc2_29_assemble(signed char tl, signed char temp)
@@
-2220,17
+2219,17
@@
static void c2op_mfc2_29_assemble(signed char tl, signed char temp)
temp = HOST_TEMPREG;
}
do_mfc2_31_one(9,temp);
temp = HOST_TEMPREG;
}
do_mfc2_31_one(9,temp);
- emit_shrimm(temp,7,tl);
+ emit_shrimm(temp,7
+16
,tl);
do_mfc2_31_one(10,temp);
do_mfc2_31_one(10,temp);
- emit_orrshr_imm(temp,2,tl);
+ emit_orrshr_imm(temp,2
+16
,tl);
do_mfc2_31_one(11,temp);
do_mfc2_31_one(11,temp);
- emit_orrsh
l_imm(temp,3
,tl);
+ emit_orrsh
r_imm(temp,-3+16
,tl);
emit_writeword(tl,®_cop2d[29]);
if (temp == HOST_TEMPREG)
host_tempreg_release();
}
emit_writeword(tl,®_cop2d[29]);
if (temp == HOST_TEMPREG)
host_tempreg_release();
}
-static void multdiv_assemble_arm(int i,struct regstat *i_regs)
+static void multdiv_assemble_arm(int i,
const
struct regstat *i_regs)
{
// case 0x18: MULT
// case 0x19: MULTU
{
// case 0x18: MULT
// case 0x19: MULTU