System: Refactor main loop
Reduces JIT exits. Improves runahead performance.
This commit is contained in:
@ -209,7 +209,7 @@ void JitCodeBuffer::CommitCode(u32 length)
|
||||
if (length == 0)
|
||||
return;
|
||||
|
||||
#if defined(CPU_AARCH32) || defined(CPU_AARCH64)
|
||||
#if defined(CPU_AARCH32) || defined(CPU_AARCH64) || defined(CPU_RISCV64)
|
||||
// ARM instruction and data caches are not coherent, we need to flush after every block.
|
||||
FlushInstructionCache(m_free_code_ptr, length);
|
||||
#endif
|
||||
@ -224,7 +224,7 @@ void JitCodeBuffer::CommitFarCode(u32 length)
|
||||
if (length == 0)
|
||||
return;
|
||||
|
||||
#if defined(CPU_AARCH32) || defined(CPU_AARCH64)
|
||||
#if defined(CPU_AARCH32) || defined(CPU_AARCH64) || defined(CPU_RISCV64)
|
||||
// ARM instruction and data caches are not coherent, we need to flush after every block.
|
||||
FlushInstructionCache(m_free_far_code_ptr, length);
|
||||
#endif
|
||||
|
||||
@ -21,6 +21,15 @@ public:
|
||||
|
||||
ALWAYS_INLINE u8* GetCodePointer() const { return m_code_ptr; }
|
||||
ALWAYS_INLINE u32 GetTotalSize() const { return m_total_size; }
|
||||
ALWAYS_INLINE float GetUsedPct() const
|
||||
{
|
||||
return (static_cast<float>(m_code_used) / static_cast<float>(m_code_size)) * 100.0f;
|
||||
}
|
||||
ALWAYS_INLINE float GetFarUsedPct() const
|
||||
{
|
||||
return (static_cast<float>(m_far_code_used) / static_cast<float>(m_far_code_size)) * 100.0f;
|
||||
}
|
||||
ALWAYS_INLINE u32 GetTotalUsed() const { return m_code_used + m_far_code_used; }
|
||||
|
||||
ALWAYS_INLINE u8* GetFreeCodePointer() const { return m_free_code_ptr; }
|
||||
ALWAYS_INLINE u32 GetFreeCodeSpace() const { return static_cast<u32>(m_code_size - m_code_used); }
|
||||
|
||||
@ -81,6 +81,14 @@ static bool IsStoreInstruction(const void* ptr)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#elif defined(CPU_RISCV64)
|
||||
static bool IsStoreInstruction(const void* ptr)
|
||||
{
|
||||
u32 bits;
|
||||
std::memcpy(&bits, ptr, sizeof(bits));
|
||||
|
||||
return ((bits & 0x7Fu) == 0b0100011u);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && (defined(CPU_X64) || defined(CPU_AARCH64))
|
||||
@ -143,6 +151,9 @@ static void SIGSEGVHandler(int sig, siginfo_t* info, void* ctx)
|
||||
#elif defined(CPU_AARCH64)
|
||||
void* const exception_pc = reinterpret_cast<void*>(static_cast<ucontext_t*>(ctx)->uc_mcontext.pc);
|
||||
const bool is_write = IsStoreInstruction(exception_pc);
|
||||
#elif defined(CPU_RISCV64)
|
||||
void* const exception_pc = reinterpret_cast<void*>(static_cast<ucontext_t*>(ctx)->uc_mcontext.__gregs[REG_PC]);
|
||||
const bool is_write = IsStoreInstruction(exception_pc);
|
||||
#else
|
||||
void* const exception_pc = nullptr;
|
||||
const bool is_write = false;
|
||||
|
||||
Reference in New Issue
Block a user