RSP: Create CRSPRecompiler
This commit is contained in:
parent
f7ab608976
commit
762d1b1566
|
@ -26,7 +26,6 @@ uint32_t CompilePC, JumpTableSize, BlockID = 0;
|
||||||
uint32_t dwBuffer = MainBuffer;
|
uint32_t dwBuffer = MainBuffer;
|
||||||
bool ChangedPC;
|
bool ChangedPC;
|
||||||
|
|
||||||
RSP_BLOCK CurrentBlock;
|
|
||||||
RSP_CODE RspCode;
|
RSP_CODE RspCode;
|
||||||
RSP_COMPILER Compiler;
|
RSP_COMPILER Compiler;
|
||||||
|
|
||||||
|
@ -41,6 +40,11 @@ p_Recompfunc RSP_Recomp_Vector[64];
|
||||||
p_Recompfunc RSP_Recomp_Lc2[32];
|
p_Recompfunc RSP_Recomp_Lc2[32];
|
||||||
p_Recompfunc RSP_Recomp_Sc2[32];
|
p_Recompfunc RSP_Recomp_Sc2[32];
|
||||||
|
|
||||||
|
CRSPRecompiler::CRSPRecompiler(CRSPSystem & System) :
|
||||||
|
m_System(System)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void BuildRecompilerCPU(void)
|
void BuildRecompilerCPU(void)
|
||||||
{
|
{
|
||||||
RSP_Recomp_Opcode[0] = &CRSPRecompilerOps::SPECIAL;
|
RSP_Recomp_Opcode[0] = &CRSPRecompilerOps::SPECIAL;
|
||||||
|
@ -506,7 +510,7 @@ void ReOrderInstructions(uint32_t StartPC, uint32_t EndPC)
|
||||||
CPU_Message("");
|
CPU_Message("");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReOrderSubBlock(RSP_BLOCK * Block)
|
void CRSPRecompiler::ReOrderSubBlock(RSP_BLOCK * Block)
|
||||||
{
|
{
|
||||||
uint32_t end = 0x0ffc;
|
uint32_t end = 0x0ffc;
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
|
@ -641,7 +645,7 @@ Description:
|
||||||
Resolves all the collected branches, x86 style
|
Resolves all the collected branches, x86 style
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void LinkBranches(RSP_BLOCK * Block)
|
void CRSPRecompiler::LinkBranches(RSP_BLOCK * Block)
|
||||||
{
|
{
|
||||||
uint32_t OrigPrgCount = *PrgCount;
|
uint32_t OrigPrgCount = *PrgCount;
|
||||||
uint32_t Count, Target;
|
uint32_t Count, Target;
|
||||||
|
@ -649,15 +653,15 @@ void LinkBranches(RSP_BLOCK * Block)
|
||||||
uint8_t * X86Code;
|
uint8_t * X86Code;
|
||||||
RSP_BLOCK Save;
|
RSP_BLOCK Save;
|
||||||
|
|
||||||
if (!CurrentBlock.ResolveCount)
|
if (!m_CurrentBlock.ResolveCount)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CPU_Message("***** Linking branches (%i) *****", CurrentBlock.ResolveCount);
|
CPU_Message("***** Linking branches (%i) *****", m_CurrentBlock.ResolveCount);
|
||||||
|
|
||||||
for (Count = 0; Count < CurrentBlock.ResolveCount; Count++)
|
for (Count = 0; Count < m_CurrentBlock.ResolveCount; Count++)
|
||||||
{
|
{
|
||||||
Target = CurrentBlock.BranchesToResolve[Count].TargetPC;
|
Target = m_CurrentBlock.BranchesToResolve[Count].TargetPC;
|
||||||
X86Code = (uint8_t *)*(JumpTable + (Target >> 2));
|
X86Code = (uint8_t *)*(JumpTable + (Target >> 2));
|
||||||
|
|
||||||
if (!X86Code)
|
if (!X86Code)
|
||||||
|
@ -677,7 +681,7 @@ void LinkBranches(RSP_BLOCK * Block)
|
||||||
X86Code = (uint8_t *)*(JumpTable + (Target >> 2));
|
X86Code = (uint8_t *)*(JumpTable + (Target >> 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
JumpWord = CurrentBlock.BranchesToResolve[Count].X86JumpLoc;
|
JumpWord = m_CurrentBlock.BranchesToResolve[Count].X86JumpLoc;
|
||||||
x86_SetBranch32b(JumpWord, (uint32_t *)X86Code);
|
x86_SetBranch32b(JumpWord, (uint32_t *)X86Code);
|
||||||
|
|
||||||
CPU_Message("Linked RSP branch from x86: %08X, to RSP: %X / x86: %08X",
|
CPU_Message("Linked RSP branch from x86: %08X, to RSP: %X / x86: %08X",
|
||||||
|
@ -786,18 +790,18 @@ void CompilerLinkBlocks(void)
|
||||||
x86_SetBranch32b(RecompPos - 4, KnownCode);
|
x86_SetBranch32b(RecompPos - 4, KnownCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompilerRSPBlock(void)
|
void CRSPRecompiler::CompilerRSPBlock(void)
|
||||||
{
|
{
|
||||||
CRSPRecompilerOps RecompilerOps(RSPSystem);
|
CRSPRecompilerOps RecompilerOps(RSPSystem, *this);
|
||||||
|
|
||||||
uint8_t * IMEM_SAVE = (uint8_t *)malloc(0x1000);
|
uint8_t * IMEM_SAVE = (uint8_t *)malloc(0x1000);
|
||||||
const size_t X86BaseAddress = (size_t)RecompPos;
|
const size_t X86BaseAddress = (size_t)RecompPos;
|
||||||
NextInstruction = RSPPIPELINE_NORMAL;
|
NextInstruction = RSPPIPELINE_NORMAL;
|
||||||
CompilePC = *PrgCount;
|
CompilePC = *PrgCount;
|
||||||
|
|
||||||
memset(&CurrentBlock, 0, sizeof(CurrentBlock));
|
memset(&m_CurrentBlock, 0, sizeof(m_CurrentBlock));
|
||||||
CurrentBlock.StartPC = CompilePC;
|
m_CurrentBlock.StartPC = CompilePC;
|
||||||
CurrentBlock.CurrPC = CompilePC;
|
m_CurrentBlock.CurrPC = CompilePC;
|
||||||
|
|
||||||
// Align the block to a boundary
|
// Align the block to a boundary
|
||||||
if (X86BaseAddress & 7)
|
if (X86BaseAddress & 7)
|
||||||
|
@ -815,13 +819,13 @@ void CompilerRSPBlock(void)
|
||||||
CPU_Message("====== Block %d ======", BlockID++);
|
CPU_Message("====== Block %d ======", BlockID++);
|
||||||
CPU_Message("x86 code at: %X", RecompPos);
|
CPU_Message("x86 code at: %X", RecompPos);
|
||||||
CPU_Message("Jump table: %X", Table);
|
CPU_Message("Jump table: %X", Table);
|
||||||
CPU_Message("Start of block: %X", CurrentBlock.StartPC);
|
CPU_Message("Start of block: %X", m_CurrentBlock.StartPC);
|
||||||
CPU_Message("====== Recompiled code ======");
|
CPU_Message("====== Recompiled code ======");
|
||||||
|
|
||||||
if (Compiler.bReOrdering)
|
if (Compiler.bReOrdering)
|
||||||
{
|
{
|
||||||
memcpy(IMEM_SAVE, RSPInfo.IMEM, 0x1000);
|
memcpy(IMEM_SAVE, RSPInfo.IMEM, 0x1000);
|
||||||
ReOrderSubBlock(&CurrentBlock);
|
ReOrderSubBlock(&m_CurrentBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is for the block about to be compiled
|
// This is for the block about to be compiled
|
||||||
|
@ -843,8 +847,8 @@ void CompilerRSPBlock(void)
|
||||||
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
||||||
|
|
||||||
// Reorder from here to next label or branch
|
// Reorder from here to next label or branch
|
||||||
CurrentBlock.CurrPC = CompilePC;
|
m_CurrentBlock.CurrPC = CompilePC;
|
||||||
ReOrderSubBlock(&CurrentBlock);
|
ReOrderSubBlock(&m_CurrentBlock);
|
||||||
}
|
}
|
||||||
else if (NextInstruction != RSPPIPELINE_DELAY_SLOT_DONE)
|
else if (NextInstruction != RSPPIPELINE_DELAY_SLOT_DONE)
|
||||||
{
|
{
|
||||||
|
@ -918,9 +922,9 @@ void CompilerRSPBlock(void)
|
||||||
CPU_Message("***** Continuing static SubBlock (jump table entry added for PC: %04X at X86: %08X) *****", CompilePC, RecompPos);
|
CPU_Message("***** Continuing static SubBlock (jump table entry added for PC: %04X at X86: %08X) *****", CompilePC, RecompPos);
|
||||||
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
*(JumpTable + (CompilePC >> 2)) = RecompPos;
|
||||||
|
|
||||||
CurrentBlock.CurrPC = CompilePC;
|
m_CurrentBlock.CurrPC = CompilePC;
|
||||||
// Reorder from after delay to next label or branch
|
// Reorder from after delay to next label or branch
|
||||||
ReOrderSubBlock(&CurrentBlock);
|
ReOrderSubBlock(&m_CurrentBlock);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -955,7 +959,7 @@ void CompilerRSPBlock(void)
|
||||||
free(IMEM_SAVE);
|
free(IMEM_SAVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t RunRecompilerCPU(uint32_t Cycles)
|
uint32_t CRSPRecompiler::RunCPU(uint32_t Cycles)
|
||||||
{
|
{
|
||||||
#ifndef EXCEPTION_EXECUTE_HANDLER
|
#ifndef EXCEPTION_EXECUTE_HANDLER
|
||||||
#define EXCEPTION_EXECUTE_HANDLER 1
|
#define EXCEPTION_EXECUTE_HANDLER 1
|
||||||
|
@ -1005,7 +1009,7 @@ uint32_t RunRecompilerCPU(uint32_t Cycles)
|
||||||
// to fill in still either from this block, or jumps
|
// to fill in still either from this block, or jumps
|
||||||
// that go out of it, let's rock
|
// that go out of it, let's rock
|
||||||
|
|
||||||
LinkBranches(&CurrentBlock);
|
LinkBranches(&m_CurrentBlock);
|
||||||
if (Profiling && !IndvidualBlock)
|
if (Profiling && !IndvidualBlock)
|
||||||
{
|
{
|
||||||
StopTimer();
|
StopTimer();
|
||||||
|
@ -1046,3 +1050,28 @@ uint32_t RunRecompilerCPU(uint32_t Cycles)
|
||||||
}
|
}
|
||||||
return Cycles;
|
return Cycles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CRSPRecompiler::Branch_AddRef(uint32_t Target, uint32_t * X86Loc)
|
||||||
|
{
|
||||||
|
if (m_CurrentBlock.ResolveCount >= 150)
|
||||||
|
{
|
||||||
|
CompilerWarning("Out of branch reference space");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint8_t * KnownCode = (uint8_t *)(*(JumpTable + (Target >> 2)));
|
||||||
|
|
||||||
|
if (KnownCode == NULL)
|
||||||
|
{
|
||||||
|
uint32_t i = m_CurrentBlock.ResolveCount;
|
||||||
|
m_CurrentBlock.BranchesToResolve[i].TargetPC = Target;
|
||||||
|
m_CurrentBlock.BranchesToResolve[i].X86JumpLoc = X86Loc;
|
||||||
|
m_CurrentBlock.ResolveCount += 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CPU_Message(" (static jump to %X)", KnownCode);
|
||||||
|
x86_SetBranch32b((uint32_t *)X86Loc, (uint32_t *)KnownCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,44 @@
|
||||||
#include <Project64-rsp-core/cpu/RspTypes.h>
|
#include <Project64-rsp-core/cpu/RspTypes.h>
|
||||||
#include <Settings/Settings.h>
|
#include <Settings/Settings.h>
|
||||||
|
|
||||||
|
class CRSPSystem;
|
||||||
|
|
||||||
|
class CRSPRecompiler
|
||||||
|
{
|
||||||
|
friend class CRSPRecompilerOps;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t StartPC, CurrPC; // Block start
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t TargetPC; // Target for this unknown branch
|
||||||
|
uint32_t * X86JumpLoc; // Our x86 uint32_t to fill
|
||||||
|
} BranchesToResolve[200]; // Branches inside or outside block
|
||||||
|
|
||||||
|
uint32_t ResolveCount; // Branches with NULL jump table
|
||||||
|
} RSP_BLOCK;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CRSPRecompiler(CRSPSystem & System);
|
||||||
|
|
||||||
|
uint32_t RunCPU(uint32_t Cycles);
|
||||||
|
void Branch_AddRef(uint32_t Target, uint32_t * X86Loc);
|
||||||
|
|
||||||
|
private:
|
||||||
|
CRSPRecompiler();
|
||||||
|
CRSPRecompiler(const CRSPRecompiler &);
|
||||||
|
CRSPRecompiler & operator=(const CRSPRecompiler &);
|
||||||
|
|
||||||
|
void CompilerRSPBlock(void);
|
||||||
|
void LinkBranches(RSP_BLOCK * Block);
|
||||||
|
void ReOrderSubBlock(RSP_BLOCK * Block);
|
||||||
|
|
||||||
|
CRSPSystem & m_System;
|
||||||
|
RSP_BLOCK m_CurrentBlock;
|
||||||
|
};
|
||||||
|
|
||||||
extern uint32_t CompilePC, NextInstruction, JumpTableSize;
|
extern uint32_t CompilePC, NextInstruction, JumpTableSize;
|
||||||
extern bool ChangedPC;
|
extern bool ChangedPC;
|
||||||
|
|
||||||
|
@ -28,33 +66,13 @@ bool IsOpcodeNop(uint32_t PC);
|
||||||
bool IsNextInstructionMmx(uint32_t PC);
|
bool IsNextInstructionMmx(uint32_t PC);
|
||||||
bool IsRegisterConstant(uint32_t Reg, uint32_t * Constant);
|
bool IsRegisterConstant(uint32_t Reg, uint32_t * Constant);
|
||||||
|
|
||||||
void RSP_Element2Mmx(int MmxReg);
|
|
||||||
void RSP_MultiElement2Mmx(int MmxReg1, int MmxReg2);
|
|
||||||
|
|
||||||
#define MainBuffer 0
|
#define MainBuffer 0
|
||||||
#define SecondaryBuffer 1
|
#define SecondaryBuffer 1
|
||||||
|
|
||||||
uint32_t RunRecompilerCPU(uint32_t Cycles);
|
|
||||||
void BuildRecompilerCPU(void);
|
void BuildRecompilerCPU(void);
|
||||||
|
|
||||||
void CompilerRSPBlock(void);
|
|
||||||
void CompilerToggleBuffer(void);
|
void CompilerToggleBuffer(void);
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32_t StartPC, CurrPC; // Block start
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
uint32_t TargetPC; // Target for this unknown branch
|
|
||||||
uint32_t * X86JumpLoc; // Our x86 uint32_t to fill
|
|
||||||
} BranchesToResolve[200]; // Branches inside or outside block
|
|
||||||
|
|
||||||
uint32_t ResolveCount; // Branches with NULL jump table
|
|
||||||
} RSP_BLOCK;
|
|
||||||
|
|
||||||
extern RSP_BLOCK CurrentBlock;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
bool bIsRegConst[32]; // bool toggle for constant
|
bool bIsRegConst[32]; // bool toggle for constant
|
||||||
|
|
|
@ -98,31 +98,6 @@ extern p_Recompfunc RSP_Recomp_Vector[64];
|
||||||
extern p_Recompfunc RSP_Recomp_Lc2[32];
|
extern p_Recompfunc RSP_Recomp_Lc2[32];
|
||||||
extern p_Recompfunc RSP_Recomp_Sc2[32];
|
extern p_Recompfunc RSP_Recomp_Sc2[32];
|
||||||
|
|
||||||
void Branch_AddRef(uint32_t Target, uint32_t * X86Loc)
|
|
||||||
{
|
|
||||||
if (CurrentBlock.ResolveCount >= 150)
|
|
||||||
{
|
|
||||||
CompilerWarning("Out of branch reference space");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uint8_t * KnownCode = (uint8_t *)(*(JumpTable + (Target >> 2)));
|
|
||||||
|
|
||||||
if (KnownCode == NULL)
|
|
||||||
{
|
|
||||||
uint32_t i = CurrentBlock.ResolveCount;
|
|
||||||
CurrentBlock.BranchesToResolve[i].TargetPC = Target;
|
|
||||||
CurrentBlock.BranchesToResolve[i].X86JumpLoc = X86Loc;
|
|
||||||
CurrentBlock.ResolveCount += 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CPU_Message(" (static jump to %X)", KnownCode);
|
|
||||||
x86_SetBranch32b((uint32_t *)X86Loc, (uint32_t *)KnownCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CRSPRecompilerOps::Cheat_r4300iOpcode(RSPOp::Func FunctAddress, const char * FunctName)
|
void CRSPRecompilerOps::Cheat_r4300iOpcode(RSPOp::Func FunctAddress, const char * FunctName)
|
||||||
{
|
{
|
||||||
CPU_Message(" %X %s", CompilePC, RSPInstruction(CompilePC, RSPOpC.Value).NameAndParam().c_str());
|
CPU_Message(" %X %s", CompilePC, RSPInstruction(CompilePC, RSPOpC.Value).NameAndParam().c_str());
|
||||||
|
@ -183,8 +158,9 @@ void CompileBranchExit(uint32_t TargetPC, uint32_t ContinuePC)
|
||||||
Ret();
|
Ret();
|
||||||
}
|
}
|
||||||
|
|
||||||
CRSPRecompilerOps::CRSPRecompilerOps(CRSPSystem & System) :
|
CRSPRecompilerOps::CRSPRecompilerOps(CRSPSystem & System, CRSPRecompiler & Recompiler) :
|
||||||
m_System(System),
|
m_System(System),
|
||||||
|
m_Recompiler(Recompiler),
|
||||||
m_Reg(System.m_Reg),
|
m_Reg(System.m_Reg),
|
||||||
m_GPR(System.m_Reg.m_GPR),
|
m_GPR(System.m_Reg.m_GPR),
|
||||||
m_ACCUM(System.m_Reg.m_ACCUM),
|
m_ACCUM(System.m_Reg.m_ACCUM),
|
||||||
|
@ -215,7 +191,7 @@ void CRSPRecompilerOps::J(void)
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_DONE)
|
||||||
{
|
{
|
||||||
JmpLabel32("BranchToJump", 0);
|
JmpLabel32("BranchToJump", 0);
|
||||||
Branch_AddRef((RSPOpC.target << 2) & 0xFFC, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef((RSPOpC.target << 2) & 0xFFC, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -253,7 +229,7 @@ void CRSPRecompilerOps::JAL(void)
|
||||||
Pop(x86_EAX);
|
Pop(x86_EAX);
|
||||||
}
|
}
|
||||||
JmpLabel32("BranchToJump", 0);
|
JmpLabel32("BranchToJump", 0);
|
||||||
Branch_AddRef((RSPOpC.target << 2) & 0xFFC, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef((RSPOpC.target << 2) & 0xFFC, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -311,7 +287,7 @@ void CRSPRecompilerOps::BEQ(void)
|
||||||
if (RSPOpC.rs == 0 && RSPOpC.rt == 0)
|
if (RSPOpC.rs == 0 && RSPOpC.rt == 0)
|
||||||
{
|
{
|
||||||
JmpLabel32("BranchToJump", 0);
|
JmpLabel32("BranchToJump", 0);
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -338,7 +314,7 @@ void CRSPRecompilerOps::BEQ(void)
|
||||||
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
||||||
JeLabel32("BranchEqual", 0);
|
JeLabel32("BranchEqual", 0);
|
||||||
}
|
}
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -422,7 +398,7 @@ void CRSPRecompilerOps::BNE(void)
|
||||||
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
||||||
JeLabel32("BranchNotEqual", 0);
|
JeLabel32("BranchNotEqual", 0);
|
||||||
}
|
}
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -466,7 +442,7 @@ void CRSPRecompilerOps::BLEZ(void)
|
||||||
if (RSPOpC.rs == 0)
|
if (RSPOpC.rs == 0)
|
||||||
{
|
{
|
||||||
JmpLabel32("BranchToJump", 0);
|
JmpLabel32("BranchToJump", 0);
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -482,7 +458,7 @@ void CRSPRecompilerOps::BLEZ(void)
|
||||||
JeLabel32("BranchLessEqual", 0);
|
JeLabel32("BranchLessEqual", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -539,7 +515,7 @@ void CRSPRecompilerOps::BGTZ(void)
|
||||||
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
||||||
JeLabel32("BranchGreater", 0);
|
JeLabel32("BranchGreater", 0);
|
||||||
}
|
}
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -2002,7 +1978,7 @@ void CRSPRecompilerOps::RegImm_BLTZ(void)
|
||||||
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
||||||
JeLabel32("BranchLess", 0);
|
JeLabel32("BranchLess", 0);
|
||||||
}
|
}
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -2046,7 +2022,7 @@ void CRSPRecompilerOps::RegImm_BGEZ(void)
|
||||||
if (RSPOpC.rs == 0)
|
if (RSPOpC.rs == 0)
|
||||||
{
|
{
|
||||||
JmpLabel32("BranchToJump", 0);
|
JmpLabel32("BranchToJump", 0);
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2061,7 +2037,7 @@ void CRSPRecompilerOps::RegImm_BGEZ(void)
|
||||||
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
||||||
JeLabel32("BranchGreaterEqual", 0);
|
JeLabel32("BranchGreaterEqual", 0);
|
||||||
}
|
}
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -2105,7 +2081,7 @@ void CRSPRecompilerOps::RegImm_BLTZAL(void)
|
||||||
// Take a look at the branch compare variable
|
// Take a look at the branch compare variable
|
||||||
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
||||||
JeLabel32("BranchLessEqual", 0);
|
JeLabel32("BranchLessEqual", 0);
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
@ -2151,7 +2127,7 @@ void CRSPRecompilerOps::RegImm_BGEZAL(void)
|
||||||
if (RSPOpC.rs == 0)
|
if (RSPOpC.rs == 0)
|
||||||
{
|
{
|
||||||
JmpLabel32("BranchToJump", 0);
|
JmpLabel32("BranchToJump", 0);
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2167,7 +2143,7 @@ void CRSPRecompilerOps::RegImm_BGEZAL(void)
|
||||||
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
CompConstToVariable(true, &BranchCompare, "BranchCompare");
|
||||||
JeLabel32("BranchGreaterEqual", 0);
|
JeLabel32("BranchGreaterEqual", 0);
|
||||||
}
|
}
|
||||||
Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
m_Recompiler.Branch_AddRef(Target, (uint32_t *)(RecompPos - 4));
|
||||||
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
NextInstruction = RSPPIPELINE_FINISH_SUB_BLOCK;
|
||||||
}
|
}
|
||||||
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
else if (NextInstruction == RSPPIPELINE_DELAY_SLOT_EXIT_DONE)
|
||||||
|
|
|
@ -7,7 +7,7 @@ class CRSPRegisters;
|
||||||
class CRSPRecompilerOps
|
class CRSPRecompilerOps
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CRSPRecompilerOps(CRSPSystem & System);
|
CRSPRecompilerOps(CRSPSystem & System, CRSPRecompiler & Recompiler);
|
||||||
|
|
||||||
void SPECIAL(void);
|
void SPECIAL(void);
|
||||||
void REGIMM(void);
|
void REGIMM(void);
|
||||||
|
@ -203,6 +203,7 @@ private:
|
||||||
|
|
||||||
CRSPSystem & m_System;
|
CRSPSystem & m_System;
|
||||||
CRSPRegisters & m_Reg;
|
CRSPRegisters & m_Reg;
|
||||||
|
CRSPRecompiler & m_Recompiler;
|
||||||
UWORD32 * m_GPR;
|
UWORD32 * m_GPR;
|
||||||
UDWORD * m_ACCUM;
|
UDWORD * m_ACCUM;
|
||||||
UWORD32 * m_Flags;
|
UWORD32 * m_Flags;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <Project64-rsp-core/Hle/hle.h>
|
#include <Project64-rsp-core/Hle/hle.h>
|
||||||
#include <Project64-rsp-core/RSPDebugger.h>
|
#include <Project64-rsp-core/RSPDebugger.h>
|
||||||
#include <Project64-rsp-core/RSPInfo.h>
|
#include <Project64-rsp-core/RSPInfo.h>
|
||||||
|
#include <Project64-rsp-core/Recompiler/RspRecompilerCPU.h>
|
||||||
#include <Project64-rsp-core/Settings/RspSettings.h>
|
#include <Project64-rsp-core/Settings/RspSettings.h>
|
||||||
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
#include <Project64-rsp-core/cpu/RSPRegisters.h>
|
||||||
#include <Project64-rsp-core/cpu/RspSystem.h>
|
#include <Project64-rsp-core/cpu/RspSystem.h>
|
||||||
|
@ -112,9 +113,6 @@ be greater than the number of cycles that the RSP should have performed.
|
||||||
(this value is ignored if the RSP has been stopped)
|
(this value is ignored if the RSP has been stopped)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint32_t RunInterpreterCPU(uint32_t Cycles);
|
|
||||||
uint32_t RunRecompilerCPU(uint32_t Cycles);
|
|
||||||
|
|
||||||
#define MI_INTR_SP 0x01 /* Bit 0: SP intr */
|
#define MI_INTR_SP 0x01 /* Bit 0: SP intr */
|
||||||
|
|
||||||
uint32_t DoRspCycles(uint32_t Cycles)
|
uint32_t DoRspCycles(uint32_t Cycles)
|
||||||
|
@ -183,7 +181,7 @@ uint32_t DoRspCycles(uint32_t Cycles)
|
||||||
switch (g_CPUCore)
|
switch (g_CPUCore)
|
||||||
{
|
{
|
||||||
case RecompilerCPU:
|
case RecompilerCPU:
|
||||||
RunRecompilerCPU(Cycles);
|
CRSPRecompiler(RSPSystem).RunCPU(Cycles);
|
||||||
break;
|
break;
|
||||||
case InterpreterCPU:
|
case InterpreterCPU:
|
||||||
RSPSystem.RunInterpreterCPU(Cycles);
|
RSPSystem.RunInterpreterCPU(Cycles);
|
||||||
|
|
|
@ -22,5 +22,3 @@ extern uint32_t RSP_JumpTo;
|
||||||
// Returns the new PC, based on whether the condition passes
|
// Returns the new PC, based on whether the condition passes
|
||||||
|
|
||||||
unsigned int RSP_branch_if(int condition);
|
unsigned int RSP_branch_if(int condition);
|
||||||
|
|
||||||
uint32_t RunInterpreterCPU(uint32_t Cycles);
|
|
||||||
|
|
|
@ -6,11 +6,14 @@ class CRSPRegisters;
|
||||||
|
|
||||||
class RSPOp
|
class RSPOp
|
||||||
{
|
{
|
||||||
|
friend class CRSPSystem;
|
||||||
|
friend class CRSPRecompilerOps;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RSPOp(CRSPSystem & System);
|
RSPOp(CRSPSystem & System);
|
||||||
~RSPOp();
|
~RSPOp();
|
||||||
|
|
||||||
public:
|
private:
|
||||||
RSPOp();
|
RSPOp();
|
||||||
RSPOp(const RSPOp &);
|
RSPOp(const RSPOp &);
|
||||||
RSPOp & operator=(const RSPOp &);
|
RSPOp & operator=(const RSPOp &);
|
||||||
|
|
Loading…
Reference in New Issue