Play-/Source/BasicBlock.h

102 lines
1.9 KiB
C
Raw Normal View History

#pragma once
#include "MIPS.h"
#include "MemoryFunction.h"
#ifdef AOT_BUILD_CACHE
#include "StdStream.h"
#include <mutex>
#endif
struct AOT_BLOCK_KEY
{
2018-04-30 21:01:23 +01:00
uint32 crc;
uint32 begin;
uint32 end;
2018-04-30 21:01:23 +01:00
bool operator<(const AOT_BLOCK_KEY& k2) const
{
const auto& k1 = (*this);
if(k1.crc == k2.crc)
{
if(k1.begin == k2.begin)
{
return k1.end < k2.end;
}
else
{
return k1.begin < k2.begin;
}
}
else
{
return k1.crc < k2.crc;
}
}
};
static_assert(sizeof(AOT_BLOCK_KEY) == 0x0C, "AOT_BLOCK_KEY must be 12 bytes long.");
namespace Jitter
{
class CJitter;
};
class CBasicBlock
{
public:
2018-06-27 08:20:55 -04:00
enum LINK_SLOT
{
LINK_SLOT_NEXT,
LINK_SLOT_BRANCH,
LINK_SLOT_MAX,
};
2018-06-05 13:26:17 -04:00
CBasicBlock(CMIPS&, uint32 = MIPS_INVALID_PC, uint32 = MIPS_INVALID_PC);
2018-04-30 21:01:23 +01:00
virtual ~CBasicBlock() = default;
void Execute();
2018-04-30 21:01:23 +01:00
void Compile();
2018-04-30 21:01:23 +01:00
uint32 GetBeginAddress() const;
uint32 GetEndAddress() const;
bool IsCompiled() const;
2018-06-05 13:26:17 -04:00
bool IsEmpty() const;
uint32 GetLinkTargetAddress(LINK_SLOT);
void SetLinkTargetAddress(LINK_SLOT, uint32);
2018-06-27 08:20:55 -04:00
void LinkBlock(LINK_SLOT, CBasicBlock*);
void UnlinkBlock(LINK_SLOT);
2018-06-14 06:35:56 -04:00
#ifdef AOT_BUILD_CACHE
2018-04-30 21:01:23 +01:00
static void SetAotBlockOutputStream(Framework::CStdStream*);
#endif
protected:
2018-04-30 21:01:23 +01:00
uint32 m_begin;
uint32 m_end;
CMIPS& m_context;
2018-04-30 21:01:23 +01:00
virtual void CompileRange(CMipsJitter*);
2018-07-17 18:51:31 -04:00
void CompileEpilog(CMipsJitter*);
private:
2018-06-14 06:35:56 -04:00
void HandleExternalFunctionReference(uintptr_t, uint32);
2018-06-05 13:26:17 -04:00
static void EmptyBlockHandler(CMIPS*);
2018-06-14 06:35:56 -04:00
static void NextBlockTrampoline(CMIPS*);
2018-06-05 13:26:17 -04:00
#ifdef AOT_BUILD_CACHE
2018-04-30 21:01:23 +01:00
static Framework::CStdStream* m_aotBlockOutputStream;
static std::mutex m_aotBlockOutputStreamMutex;
#endif
#ifndef AOT_USE_CACHE
2018-04-30 21:01:23 +01:00
CMemoryFunction m_function;
#else
2018-04-30 21:01:23 +01:00
void (*m_function)(void*);
#endif
uint32 m_linkTargetAddress[LINK_SLOT_MAX];
2018-06-27 08:20:55 -04:00
uint32 m_linkBlockTrampolineOffset[LINK_SLOT_MAX];
#ifdef _DEBUG
CBasicBlock* m_linkBlock[LINK_SLOT_MAX];
#endif
};