nulldc-360/nullDC/emitter/regalloc/regalloc.h

86 lines
No EOL
3.5 KiB
C++

#pragma once
#include "emitter/emitter.h"
#include "dc/sh4/rec_v1/basicblock.h"
#define RALLOC_R 1
#define RALLOC_W 2
#define RALLOC_RW (RALLOC_R|RALLOC_W)
#define RA_DEFAULT 0
#define RA_NODATA 1
#define RA_FORCE 2
class IntegerRegAllocator
{
public :
#define T ppc_gpr_reg
//DoAllocation : do allocation on the block
virtual void DoAllocation(BasicBlock* bb,ppc_block* x86e)=0;
//BeforeEmit : generate any code needed before the main emittion begins (other register allocators may have emited code tho)
virtual void BeforeEmit()=0;
//BeforeTrail : generate any code needed after the main emittion has ended (other register allocators may emit code after that tho)
virtual void BeforeTrail()=0;
//AfterTrail : generate code after the native block end (after the ret) , can be used to emit helper functions (other register allocators may emit code after that tho)
virtual void AfterTrail()=0;
//IsRegAllocated : *couh* yea .. :P
virtual bool IsRegAllocated(u32 sh4_reg)=0;
//Carefull w/ register state , we may need to implement state push/pop
//GetRegister : Get the register , needs flag for mode
virtual T GetRegister(T d_reg,u32 sh4_reg,u32 mode)=0;
//Save registers
virtual void SaveRegister(u32 reg,T from)=0;
//FlushRegister : write reg to reg location , and dealloc it
virtual void FlushRegister(u32 sh4_reg)=0;
//Flush all regs
virtual void FlushRegCache()=0;
//WriteBackRegister : write reg to reg location
virtual void WriteBackRegister(u32 sh4_reg)=0;
//ReloadRegister : read reg from reg location , discard old result
virtual void ReloadRegister(u32 sh4_reg)=0;
virtual void SaveRegister(u32 reg,u32 from)=0;
virtual void SaveRegister(u32 to,u32* from)=0;
virtual void SaveRegister(u32 to,s16* from)=0;
virtual void SaveRegister(u32 to,s8* from)=0;
virtual void MarkDirty(u32 reg)=0;
#undef T
};
class FloatRegAllocator
{
public :
#define T ppc_fpr_reg
//DoAllocation : do allocation on the block
virtual void DoAllocation(BasicBlock* bb,ppc_block* x86e)=0;
//BeforeEmit : generate any code needed before the main emittion begins (other register allocators may have emited code tho)
virtual void BeforeEmit()=0;
//BeforeTrail : generate any code needed after the main emittion has ended (other register allocators may emit code after that tho)
virtual void BeforeTrail()=0;
//AfterTrail : generate code after the native block end (after the ret) , can be used to emit helper functions (other register allocators may emit code after that tho)
virtual void AfterTrail()=0;
//IsRegAllocated : *couh* yea .. :P
virtual bool IsRegAllocated(u32 sh4_reg)=0;
//Carefull w/ register state , we may need to implement state push/pop
//GetRegister : Get the register , needs flag for mode
virtual T GetRegister(T d_reg,u32 sh4_reg,u32 mode)=0;
//Save registers
virtual void SaveRegister(u32 reg,T from)=0;
//FlushRegister : write reg to reg location , and dealloc it
virtual void FlushRegister(u32 sh4_reg)=0;
//Flush all regs
virtual void FlushRegCache()=0;
//WriteBackRegister : write reg to reg location
virtual void WriteBackRegister(u32 sh4_reg)=0;
//ReloadRegister : read reg from reg location , discard old result
virtual void ReloadRegister(u32 sh4_reg)=0;
virtual void SaveRegister(u32 to,float* from)=0;
virtual void FlushRegister_xmm(ppc_fpr_reg reg)=0;
virtual void SaveRegisterGPR(u32 to,ppc_reg from)=0;
virtual void LoadRegisterGPR(ppc_reg to,u32 from)=0;
#undef T
};
u32* GetRegPtr(u32 reg);
u32* GetRegPtr(Sh4RegType reg);
FloatRegAllocator * GetFloatAllocator();
IntegerRegAllocator* GetGPRtAllocator();