mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-01-30 13:07:18 -03:00
PPCRec: Move IML optimizer file
This commit is contained in:
parent
101a2ef911
commit
e53c6ad2e9
8 changed files with 27 additions and 63 deletions
|
@ -74,10 +74,10 @@ add_library(CemuCafe
|
|||
HW/Espresso/Recompiler/IML/IMLInstruction.h
|
||||
HW/Espresso/Recompiler/IML/IMLDebug.cpp
|
||||
HW/Espresso/Recompiler/IML/IMLAnalyzer.cpp
|
||||
HW/Espresso/Recompiler/IML/IMLOptimizer.cpp
|
||||
HW/Espresso/Recompiler/PPCRecompilerImlGen.cpp
|
||||
HW/Espresso/Recompiler/PPCRecompilerImlGenFPU.cpp
|
||||
HW/Espresso/Recompiler/PPCRecompilerIml.h
|
||||
HW/Espresso/Recompiler/PPCRecompilerImlOptimizer.cpp
|
||||
HW/Espresso/Recompiler/PPCRecompilerImlRanges.cpp
|
||||
HW/Espresso/Recompiler/PPCRecompilerImlRanges.h
|
||||
HW/Espresso/Recompiler/PPCRecompilerImlRegisterAllocator.cpp
|
||||
|
|
|
@ -14,6 +14,16 @@ bool IMLAnalyzer_IsTightFiniteLoop(IMLSegment* imlSegment);
|
|||
bool IMLAnalyzer_CanTypeWriteCR(IMLInstruction* imlInstruction);
|
||||
void IMLAnalyzer_GetCRTracking(IMLInstruction* imlInstruction, PPCRecCRTracking_t* crTracking);
|
||||
|
||||
// optimizer passes
|
||||
// todo - rename
|
||||
bool PPCRecompiler_reduceNumberOfFPRRegisters(ppcImlGenContext_t* ppcImlGenContext);
|
||||
bool PPCRecompiler_manageFPRRegisters(ppcImlGenContext_t* ppcImlGenContext);
|
||||
void PPCRecompiler_removeRedundantCRUpdates(ppcImlGenContext_t* ppcImlGenContext);
|
||||
void PPCRecompiler_optimizeDirectFloatCopies(ppcImlGenContext_t* ppcImlGenContext);
|
||||
void PPCRecompiler_optimizeDirectIntegerCopies(ppcImlGenContext_t* ppcImlGenContext);
|
||||
void PPCRecompiler_optimizePSQLoadAndStore(ppcImlGenContext_t* ppcImlGenContext);
|
||||
void PPCRecompiler_reorderConditionModifyInstructions(ppcImlGenContext_t* ppcImlGenContext);
|
||||
|
||||
// debug
|
||||
void IMLDebug_DumpSegment(struct IMLSegment* imlSegment, sint32 segmentIndex, bool printLivenessRangeInfo = false);
|
||||
void IMLDebug_Dump(struct ppcImlGenContext_t* ppcImlGenContext);
|
||||
|
|
|
@ -434,7 +434,7 @@ sint32 replaceRegisterMultiple(sint32 reg, sint32 match[4], sint32 replaced[4])
|
|||
return reg;
|
||||
}
|
||||
|
||||
void IMLInstruction::ReplaceGPRRegisterUsageMultiple(sint32 gprRegisterSearched[4], sint32 gprRegisterReplaced[4])
|
||||
void IMLInstruction::ReplaceGPR(sint32 gprRegisterSearched[4], sint32 gprRegisterReplaced[4])
|
||||
{
|
||||
if (type == PPCREC_IML_TYPE_R_NAME)
|
||||
{
|
||||
|
@ -609,7 +609,7 @@ void IMLInstruction::ReplaceGPRRegisterUsageMultiple(sint32 gprRegisterSearched[
|
|||
}
|
||||
}
|
||||
|
||||
void IMLInstruction::ReplaceFPRRegisterUsageMultiple(sint32 fprRegisterSearched[4], sint32 fprRegisterReplaced[4])
|
||||
void IMLInstruction::ReplaceFPRs(sint32 fprRegisterSearched[4], sint32 fprRegisterReplaced[4])
|
||||
{
|
||||
if (type == PPCREC_IML_TYPE_R_NAME)
|
||||
{
|
||||
|
@ -727,7 +727,7 @@ void IMLInstruction::ReplaceFPRRegisterUsageMultiple(sint32 fprRegisterSearched[
|
|||
}
|
||||
}
|
||||
|
||||
void IMLInstruction::ReplaceFPRRegisterUsage(sint32 fprRegisterSearched, sint32 fprRegisterReplaced)
|
||||
void IMLInstruction::ReplaceFPR(sint32 fprRegisterSearched, sint32 fprRegisterReplaced)
|
||||
{
|
||||
if (type == PPCREC_IML_TYPE_R_NAME)
|
||||
{
|
||||
|
|
|
@ -440,7 +440,7 @@ struct IMLInstruction
|
|||
|
||||
void CheckRegisterUsage(IMLUsedRegisters* registersUsed) const;
|
||||
|
||||
void ReplaceGPRRegisterUsageMultiple(sint32 gprRegisterSearched[4], sint32 gprRegisterReplaced[4]);
|
||||
void ReplaceFPRRegisterUsageMultiple(sint32 fprRegisterSearched[4], sint32 fprRegisterReplaced[4]);
|
||||
void ReplaceFPRRegisterUsage(sint32 fprRegisterSearched, sint32 fprRegisterReplaced);
|
||||
void ReplaceGPR(sint32 gprRegisterSearched[4], sint32 gprRegisterReplaced[4]);
|
||||
void ReplaceFPRs(sint32 fprRegisterSearched[4], sint32 fprRegisterReplaced[4]);
|
||||
void ReplaceFPR(sint32 fprRegisterSearched, sint32 fprRegisterReplaced);
|
||||
};
|
|
@ -1,11 +1,12 @@
|
|||
#include "../Interpreter/PPCInterpreterInternal.h"
|
||||
#include "Cafe/HW/Espresso/Interpreter/PPCInterpreterInternal.h"
|
||||
#include "Cafe/HW/Espresso/Recompiler/IML/IML.h"
|
||||
#include "Cafe/HW/Espresso/Recompiler/IML/IMLInstruction.h"
|
||||
#include "PPCRecompiler.h"
|
||||
#include "PPCRecompilerIml.h"
|
||||
#include "PPCRecompilerX64.h"
|
||||
|
||||
typedef struct
|
||||
#include "../PPCRecompiler.h"
|
||||
#include "../PPCRecompilerIml.h"
|
||||
#include "../PPCRecompilerX64.h"
|
||||
|
||||
struct replacedRegisterTracker_t
|
||||
{
|
||||
struct
|
||||
{
|
||||
|
@ -17,40 +18,7 @@ typedef struct
|
|||
bool nameMustBeMaintained; // must be stored before replacement and loaded after replacement ends
|
||||
}replacedRegisterEntry[PPC_X64_GPR_USABLE_REGISTERS];
|
||||
sint32 count;
|
||||
}replacedRegisterTracker_t;
|
||||
|
||||
bool PPCRecompiler_checkIfGPRRegisterIsAccessed(IMLUsedRegisters* registersUsed, sint32 gprRegister)
|
||||
{
|
||||
if( registersUsed->readNamedReg1 == gprRegister )
|
||||
return true;
|
||||
if( registersUsed->readNamedReg2 == gprRegister )
|
||||
return true;
|
||||
if( registersUsed->readNamedReg3 == gprRegister )
|
||||
return true;
|
||||
if( registersUsed->writtenNamedReg1 == gprRegister )
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns index of register to replace
|
||||
* If no register needs to be replaced, -1 is returned
|
||||
*/
|
||||
sint32 PPCRecompiler_getNextRegisterToReplace(IMLUsedRegisters* registersUsed)
|
||||
{
|
||||
// get index of register to replace
|
||||
sint32 gprToReplace = -1;
|
||||
if( registersUsed->readNamedReg1 >= PPC_X64_GPR_USABLE_REGISTERS )
|
||||
gprToReplace = registersUsed->readNamedReg1;
|
||||
else if( registersUsed->readNamedReg2 >= PPC_X64_GPR_USABLE_REGISTERS )
|
||||
gprToReplace = registersUsed->readNamedReg2;
|
||||
else if( registersUsed->readNamedReg3 >= PPC_X64_GPR_USABLE_REGISTERS )
|
||||
gprToReplace = registersUsed->readNamedReg3;
|
||||
else if( registersUsed->writtenNamedReg1 >= PPC_X64_GPR_USABLE_REGISTERS )
|
||||
gprToReplace = registersUsed->writtenNamedReg1;
|
||||
// return
|
||||
return gprToReplace;
|
||||
}
|
||||
};
|
||||
|
||||
bool PPCRecompiler_findAvailableRegisterDepr(ppcImlGenContext_t* ppcImlGenContext, IMLSegment* imlSegment, sint32 imlIndexStart, replacedRegisterTracker_t* replacedRegisterTracker, sint32* registerIndex, sint32* registerName, bool* isUsed)
|
||||
{
|
||||
|
@ -216,7 +184,7 @@ bool PPCRecompiler_reduceNumberOfFPRRegisters(ppcImlGenContext_t* ppcImlGenConte
|
|||
replacedRegisterIsUsed = segIt->ppcFPRUsed[unusedRegisterName-PPCREC_NAME_FPR0];
|
||||
}
|
||||
// replace registers that are out of range
|
||||
segIt->imlList[imlIndex].ReplaceFPRRegisterUsage(fprToReplace, unusedRegisterIndex);
|
||||
segIt->imlList[imlIndex].ReplaceFPR(fprToReplace, unusedRegisterIndex);
|
||||
// add load/store name after instruction
|
||||
PPCRecompiler_pushBackIMLInstructions(segIt, imlIndex+1, 2);
|
||||
// add load/store before current instruction
|
||||
|
@ -449,7 +417,7 @@ bool PPCRecompiler_manageFPRRegistersForSegment(ppcImlGenContext_t* ppcImlGenCon
|
|||
}
|
||||
if (numReplacedOperands > 0)
|
||||
{
|
||||
imlSegment->imlList[idx].ReplaceFPRRegisterUsageMultiple(fprMatch, fprReplace);
|
||||
imlSegment->imlList[idx].ReplaceFPRs(fprMatch, fprReplace);
|
||||
}
|
||||
// next
|
||||
idx++;
|
|
@ -122,19 +122,6 @@ void PPCRecompilerIML_isolateEnterableSegments(ppcImlGenContext_t* ppcImlGenCont
|
|||
|
||||
IMLInstruction* PPCRecompilerIML_getLastInstruction(IMLSegment* imlSegment);
|
||||
|
||||
// IML optimizer
|
||||
bool PPCRecompiler_reduceNumberOfFPRRegisters(ppcImlGenContext_t* ppcImlGenContext);
|
||||
|
||||
bool PPCRecompiler_manageFPRRegisters(ppcImlGenContext_t* ppcImlGenContext);
|
||||
|
||||
void PPCRecompiler_removeRedundantCRUpdates(ppcImlGenContext_t* ppcImlGenContext);
|
||||
void PPCRecompiler_optimizeDirectFloatCopies(ppcImlGenContext_t* ppcImlGenContext);
|
||||
void PPCRecompiler_optimizeDirectIntegerCopies(ppcImlGenContext_t* ppcImlGenContext);
|
||||
|
||||
void PPCRecompiler_optimizePSQLoadAndStore(ppcImlGenContext_t* ppcImlGenContext);
|
||||
|
||||
// IML register allocator
|
||||
void PPCRecompilerImm_allocateRegisters(ppcImlGenContext_t* ppcImlGenContext);
|
||||
|
||||
// late optimizations
|
||||
void PPCRecompiler_reorderConditionModifyInstructions(ppcImlGenContext_t* ppcImlGenContext);
|
||||
|
|
|
@ -3881,7 +3881,6 @@ bool PPCRecompiler_decodePPCInstruction(ppcImlGenContext_t* ppcImlGenContext)
|
|||
|
||||
bool PPCRecompiler_generateIntermediateCode(ppcImlGenContext_t& ppcImlGenContext, PPCRecFunction_t* ppcRecFunc, std::set<uint32>& entryAddresses)
|
||||
{
|
||||
//ppcImlGenContext_t ppcImlGenContext = { 0 };
|
||||
ppcImlGenContext.functionRef = ppcRecFunc;
|
||||
// add entire range
|
||||
ppcRecRange_t recRange;
|
||||
|
|
|
@ -853,7 +853,7 @@ void PPCRecRA_generateSegmentInstructions(ppcImlGenContext_t* ppcImlGenContext,
|
|||
replaceGpr[f] = virtualReg2PhysReg[virtualRegister];
|
||||
cemu_assert_debug(replaceGpr[f] >= 0);
|
||||
}
|
||||
imlSegment->imlList[index].ReplaceGPRRegisterUsageMultiple(inputGpr, replaceGpr);
|
||||
imlSegment->imlList[index].ReplaceGPR(inputGpr, replaceGpr);
|
||||
}
|
||||
// next iml instruction
|
||||
index++;
|
||||
|
|
Loading…
Add table
Reference in a new issue