mirror of
https://github.com/gligli/nulldc-360.git
synced 2025-04-02 11:11:56 -04:00
86 lines
No EOL
3.5 KiB
C++
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(); |