From b8dd68beef384f2717a70d5d5d0235ee13701e98 Mon Sep 17 00:00:00 2001 From: degasus Date: Sat, 11 Jul 2015 12:22:13 +0200 Subject: JitArm64: Far Code Cache --- Source/Core/Common/Arm64Emitter.cpp | 7 +++++-- Source/Core/Common/Arm64Emitter.h | 4 +--- 2 files changed, 6 insertions(+), 5 deletions(-) (limited to 'Source/Core/Common') diff --git a/Source/Core/Common/Arm64Emitter.cpp b/Source/Core/Common/Arm64Emitter.cpp index 6eaa4fdfca..f5b00de3cc 100644 --- a/Source/Core/Common/Arm64Emitter.cpp +++ b/Source/Core/Common/Arm64Emitter.cpp @@ -271,8 +271,8 @@ bool IsImmLogical(uint64_t value, unsigned int width, unsigned int *n, unsigned void ARM64XEmitter::SetCodePtr(u8* ptr) { m_code = ptr; - m_startcode = m_code; - m_lastCacheFlushEnd = ptr; + if (!m_lastCacheFlushEnd) + m_lastCacheFlushEnd = ptr; } const u8* ARM64XEmitter::GetCodePtr() const @@ -315,6 +315,9 @@ void ARM64XEmitter::FlushIcache() void ARM64XEmitter::FlushIcacheSection(u8* start, u8* end) { + if (start == end) + return; + #if defined(IOS) // Header file says this is equivalent to: sys_icache_invalidate(start, end - start); sys_cache_control(kCacheFunctionPrepareForExecution, start, end - start); diff --git a/Source/Core/Common/Arm64Emitter.h b/Source/Core/Common/Arm64Emitter.h index 6939984308..c4ce6ab253 100644 --- a/Source/Core/Common/Arm64Emitter.h +++ b/Source/Core/Common/Arm64Emitter.h @@ -324,7 +324,6 @@ class ARM64XEmitter private: u8* m_code; - u8* m_startcode; u8* m_lastCacheFlushEnd; void EncodeCompareBranchInst(u32 op, ARM64Reg Rt, const void* ptr); @@ -365,14 +364,13 @@ protected: public: ARM64XEmitter() - : m_code(nullptr), m_startcode(nullptr), m_lastCacheFlushEnd(nullptr) + : m_code(nullptr), m_lastCacheFlushEnd(nullptr) { } ARM64XEmitter(u8* code_ptr) { m_code = code_ptr; m_lastCacheFlushEnd = code_ptr; - m_startcode = code_ptr; } virtual ~ARM64XEmitter() -- cgit v1.2.3 From 6f38d1baa1d6c735ae12b571dd341cd431f6ba73 Mon Sep 17 00:00:00 2001 From: degasus Date: Wed, 15 Jul 2015 08:53:05 +0200 Subject: CodeBlock: Add a shared IsAlmostFull function This function shall keep care about the low watermark of code space. If we ran out of space, the JITs shall clear their block cache. --- Source/Core/Common/CodeBlock.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'Source/Core/Common') diff --git a/Source/Core/Common/CodeBlock.h b/Source/Core/Common/CodeBlock.h index 972fc707d6..5699fc5385 100644 --- a/Source/Core/Common/CodeBlock.h +++ b/Source/Core/Common/CodeBlock.h @@ -72,5 +72,11 @@ public: { return region_size - (T::GetCodePtr() - region); } + + bool IsAlmostFull() const + { + // This should be bigger than the biggest block ever. + return GetSpaceLeft() < 0x10000; + } }; -- cgit v1.2.3