mirror of
https://github.com/izzy2lost/PSX2.git
synced 2026-07-05 15:18:36 -07:00
Android project - Modifying recompiler related code
This commit is contained in:
@@ -58,6 +58,7 @@ namespace a64 = vixl::aarch64;
|
||||
// fastmem
|
||||
#define RFASTMEMBASE a64::x25
|
||||
|
||||
// iopMem->Main
|
||||
#define RSTATE_x26 a64::x26
|
||||
|
||||
// CPU(iR5900), PSX(iR3000A), FPU(iFPU, iFPUd)
|
||||
@@ -69,7 +70,7 @@ namespace a64 = vixl::aarch64;
|
||||
#define RSTATE_MVU a64::x28
|
||||
#define PTR_MVU(field) a64::MemOperand(RSTATE_MVU, offsetof(vuRegistersPack, field))
|
||||
|
||||
// iopMem->Main
|
||||
// recLUT, psxRecLUT
|
||||
#define RSTATE_x29 a64::x29
|
||||
|
||||
// eeHw[Ps2MemSize::Hardware]
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include "R3000ADef.h"
|
||||
#include "VUDef.h"
|
||||
#include "vtlbDef.h"
|
||||
#include "arm64/ShuffleLanes.h"
|
||||
#include "ShuffleLanes.h"
|
||||
|
||||
struct cpuRegistersPack
|
||||
{
|
||||
|
||||
@@ -229,7 +229,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
#define PC_GETBLOCK_(x, reclut) ((BASEBLOCK*)(reclut[((u32)(x)) >> 16] + (x) * (sizeof(BASEBLOCK) / 4)))
|
||||
#define PC_GETBLOCK_(x, reclut) ((BASEBLOCK*)(reclut[((u32)(x)) >> 16] + (x) * (sizeof(BASEBLOCK) >> 2))) // (sizeof(BASEBLOCK) / 4)
|
||||
|
||||
/**
|
||||
* Add a page to the recompiler lookup table
|
||||
|
||||
@@ -42,15 +42,13 @@ static void _setupBranchTest()
|
||||
// everything except the lower 10 bits away.
|
||||
|
||||
// xMOV(eax, ptr[(&psHu32(DMAC_PCR))]);
|
||||
armAsm->Ldr(RWVIXLSCRATCH, a64::MemOperand(RSTATE_x26, psHu(DMAC_PCR)));
|
||||
armAsm->Uxtw(EAX, RWVIXLSCRATCH);
|
||||
armAsm->Mov(EAX, psHu32(DMAC_PCR));
|
||||
// xMOV(ecx, 0x3ff); // ECX is our 10-bit mask var
|
||||
armAsm->Mov(ECX, 0x3ff);
|
||||
// xNOT(eax);
|
||||
armAsm->Mvn(EAX, EAX);
|
||||
// xOR(eax, ptr[(&psHu32(DMAC_STAT))]);
|
||||
armAsm->Ldr(RWVIXLSCRATCH, a64::MemOperand(RSTATE_x26, psHu(DMAC_STAT)));
|
||||
armAsm->Orr(EAX, EAX, a64::Operand(RWVIXLSCRATCH, a64::Extend::UXTW));
|
||||
armAsm->Orr(EAX, EAX, armLoadPtr(&psHu32(DMAC_STAT)));
|
||||
// xAND(eax, ecx);
|
||||
armAsm->And(EAX, EAX, ECX);
|
||||
// xCMP(eax, ecx);
|
||||
|
||||
@@ -183,13 +183,13 @@ static const void* _DynGen_JITCompile()
|
||||
// xJMP(ptrNative[rbx * (wordsize / 4) + rcx]);
|
||||
|
||||
armLoad(EAX, PTR_CPU(psxRegs.pc));
|
||||
armAsm->Lsr(ECX, EAX, 16);
|
||||
armAsm->Lsr(EAX, EAX, 2);
|
||||
// armMoveAddressToReg(RDX, &psxRecLUT);
|
||||
armAsm->Mov(RDX, (uptr)&psxRecLUT);
|
||||
armAsm->Ldr(RCX, a64::MemOperand(RDX, RCX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Lsr(ECX, EAX, 16);
|
||||
armAsm->Ldr(RCX, a64::MemOperand(RSTATE_x29, RCX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Lsr(EAX, EAX, 2);
|
||||
armAsm->Ldr(RAX, a64::MemOperand(RCX, RAX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Br(RAX);
|
||||
|
||||
return retval;
|
||||
@@ -208,13 +208,13 @@ static const void* _DynGen_DispatcherReg()
|
||||
// xJMP(ptrNative[rbx * (wordsize / 4) + rcx]);
|
||||
|
||||
armLoad(EAX, PTR_CPU(psxRegs.pc));
|
||||
armAsm->Lsr(ECX, EAX, 16);
|
||||
armAsm->Lsr(EAX, EAX, 2);
|
||||
// armMoveAddressToReg(RDX, &psxRecLUT);
|
||||
armAsm->Mov(RDX, (uptr)&psxRecLUT);
|
||||
armAsm->Ldr(RCX, a64::MemOperand(RDX, RCX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Lsr(ECX, EAX, 16);
|
||||
armAsm->Ldr(RCX, a64::MemOperand(RSTATE_x29, RCX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Lsr(EAX, EAX, 2);
|
||||
armAsm->Ldr(RAX, a64::MemOperand(RCX, RAX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Br(RAX);
|
||||
|
||||
return retval;
|
||||
@@ -239,8 +239,8 @@ static const void* _DynGen_EnterRecompiledCode()
|
||||
// xScopedStackFrame frame(false, true);
|
||||
armBeginStackFrame();
|
||||
#endif
|
||||
armMoveAddressToReg(RSTATE_x29, iopMem->Main);
|
||||
// armAsm->Mov(RSTATE_CPU, (uptr)&g_cpuRegistersPack);
|
||||
armMoveAddressToReg(RSTATE_x26, iopMem->Main);
|
||||
armMoveAddressToReg(RSTATE_x29, &psxRecLUT);
|
||||
|
||||
// xJMP((void*)iopDispatcherReg);
|
||||
armEmitJmp(iopDispatcherReg);
|
||||
|
||||
@@ -1403,7 +1403,7 @@ static void rpsxLoad(int size, bool sign)
|
||||
armAsm->And(EAX, EAX, 0x1fffff);
|
||||
|
||||
// auto addr = xComplexAddress(rax, iopMem->Main, arg1reg);
|
||||
const auto addr = a64::MemOperand(RSTATE_x29, RAX);
|
||||
const auto addr = a64::MemOperand(RSTATE_x26, RAX);
|
||||
switch (size)
|
||||
{
|
||||
case 8:
|
||||
|
||||
@@ -412,13 +412,13 @@ static const void* _DynGen_JITCompile()
|
||||
// xJMP(ptrNative[rbx * (wordsize / 4) + rcx]);
|
||||
|
||||
armLoad(EAX, PTR_CPU(cpuRegs.pc));
|
||||
armAsm->Lsr(ECX, EAX, 16);
|
||||
armAsm->Lsr(EAX, EAX, 2);
|
||||
// armMoveAddressToReg(RDX, &recLUT);
|
||||
armAsm->Mov(RDX, (uptr)&recLUT);
|
||||
armAsm->Ldr(RCX, a64::MemOperand(RDX, RCX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Lsr(ECX, EAX, 16);
|
||||
armAsm->Ldr(RCX, a64::MemOperand(RSTATE_x29, RCX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Lsr(EAX, EAX, 2);
|
||||
armAsm->Ldr(RAX, a64::MemOperand(RCX, RAX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Br(RAX);
|
||||
|
||||
return retval;
|
||||
@@ -441,13 +441,13 @@ static const void* _DynGen_DispatcherReg()
|
||||
// xJMP(ptrNative[rbx * (wordsize / 4) + rcx]);
|
||||
|
||||
armLoad(EAX, PTR_CPU(cpuRegs.pc));
|
||||
armAsm->Lsr(ECX, EAX, 16);
|
||||
armAsm->Lsr(EAX, EAX, 2);
|
||||
// armMoveAddressToReg(RDX, &recLUT);
|
||||
armAsm->Mov(RDX, (uptr)&recLUT);
|
||||
armAsm->Ldr(RCX, a64::MemOperand(RDX, RCX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Lsr(ECX, EAX, 16);
|
||||
armAsm->Ldr(RCX, a64::MemOperand(RSTATE_x29, RCX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Lsr(EAX, EAX, 2);
|
||||
armAsm->Ldr(RAX, a64::MemOperand(RCX, RAX, a64::LSL, 3));
|
||||
////
|
||||
armAsm->Br(RAX);
|
||||
|
||||
return retval;
|
||||
@@ -492,7 +492,7 @@ static const void* _DynGen_EnterRecompiledCode()
|
||||
// From memory to registry
|
||||
armMoveAddressToReg(RSTATE_PSX, &psxRegs);
|
||||
armMoveAddressToReg(RSTATE_CPU, &g_cpuRegistersPack);
|
||||
armMoveAddressToReg(RSTATE_x26, &eeHw);
|
||||
armMoveAddressToReg(RSTATE_x29, &recLUT);
|
||||
|
||||
if (CHECK_FASTMEM) {
|
||||
// xMOV(RFASTMEMBASE, ptrNative[&vtlb_private::vtlbdata.fastmem_base]);
|
||||
|
||||
@@ -600,7 +600,7 @@ int vtlb_DynGenReadNonQuad_Const(u32 bits, bool sign, bool xmm, u32 addr_const,
|
||||
// Shortcut for the INTC_STAT register, which many games like to spin on heavily.
|
||||
if ((bits == 32) && !EmuConfig.Speedhacks.IntcStat && (paddr == INTC_STAT))
|
||||
{
|
||||
armAsm->Ldr(RWVIXLSCRATCH, a64::MemOperand(RSTATE_x26, psHu(INTC_STAT)));
|
||||
auto mop = armMemOperandPtr(&psHu32(INTC_STAT));
|
||||
|
||||
// x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeX86reg(eax), eax.GetId());
|
||||
x86_dest_reg = dest_reg_alloc ? dest_reg_alloc() : (_freeX86reg(EAX), EAX.GetCode());
|
||||
@@ -609,18 +609,17 @@ int vtlb_DynGenReadNonQuad_Const(u32 bits, bool sign, bool xmm, u32 addr_const,
|
||||
auto regX = a64::XRegister(x86_dest_reg);
|
||||
if (sign) {
|
||||
// xMOVSX(xRegister64(x86_dest_reg), ptr32[&psHu32(INTC_STAT)]);
|
||||
armAsm->Sxtw(regX, RWVIXLSCRATCH);
|
||||
armAsm->Ldr(regX, mop);
|
||||
}
|
||||
else {
|
||||
// xMOV(xRegister32(x86_dest_reg), ptr32[&psHu32(INTC_STAT)]);
|
||||
armAsm->Uxtw(regX.W(), RWVIXLSCRATCH);
|
||||
armAsm->Ldr(regX.W(), mop);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// xMOVDZX(xRegisterSSE(x86_dest_reg), ptr32[&psHu32(INTC_STAT)]);
|
||||
armAsm->Uxtw(RWVIXLSCRATCH, RWVIXLSCRATCH);
|
||||
armAsm->Fmov(a64::QRegister(x86_dest_reg).S(), RWVIXLSCRATCH);
|
||||
armAsm->Ldr(a64::QRegister(x86_dest_reg).S(), mop);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user