backend\A64\emitter: Fix Windows build
constify constify2 constify3: the uncostification
This commit is contained in:
parent
8e0ec356c0
commit
0d66d30d42
@ -8,10 +8,6 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
|
||||||
#include <libkern/OSCacheControl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <mcl/assert.hpp>
|
#include <mcl/assert.hpp>
|
||||||
#include <mcl/bit_cast.hpp>
|
#include <mcl/bit_cast.hpp>
|
||||||
#include <mcl/bit/bit_count.hpp>
|
#include <mcl/bit/bit_count.hpp>
|
||||||
@ -20,6 +16,13 @@
|
|||||||
#include "a64_emitter.h"
|
#include "a64_emitter.h"
|
||||||
#include "dynarmic/common/math_util.h"
|
#include "dynarmic/common/math_util.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <Windows.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __APPLE__
|
||||||
|
# include <libkern/OSCacheControl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Dynarmic::BackendA64::Arm64Gen {
|
namespace Dynarmic::BackendA64::Arm64Gen {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -37,6 +40,7 @@ int CountLeadingZeros(u64 value, int width) {
|
|||||||
return __builtin_clzll(value);
|
return __builtin_clzll(value);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO(jbramley): Optimize this for ARM64 hosts.
|
// TODO(jbramley): Optimize this for ARM64 hosts.
|
||||||
int count = 0;
|
int count = 0;
|
||||||
uint64_t bit_test = 1ULL << (width - 1);
|
uint64_t bit_test = 1ULL << (width - 1);
|
||||||
@ -367,10 +371,11 @@ void ARM64XEmitter::FlushIcacheSection(const u8* start, const u8* end) {
|
|||||||
if (start == end)
|
if (start == end)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(IOS) || defined(__APPLE__)
|
||||||
// Header file says this is equivalent to: sys_icache_invalidate(start, end -
|
// Header file says this is equivalent to: sys_icache_invalidate(start, end - start);
|
||||||
// start);
|
|
||||||
sys_cache_control(kCacheFunctionPrepareForExecution, const_cast<u8*>(start), end - start);
|
sys_cache_control(kCacheFunctionPrepareForExecution, const_cast<u8*>(start), end - start);
|
||||||
|
#elif defined(WIN32)
|
||||||
|
FlushInstructionCache(GetCurrentProcess(), start, end - start);
|
||||||
#else
|
#else
|
||||||
// Don't rely on GCC's __clear_cache implementation, as it caches
|
// Don't rely on GCC's __clear_cache implementation, as it caches
|
||||||
// icache/dcache cache line sizes, that can vary between cores on
|
// icache/dcache cache line sizes, that can vary between cores on
|
||||||
|
@ -82,7 +82,13 @@ public:
|
|||||||
// it'll do the job.
|
// it'll do the job.
|
||||||
void FreeCodeSpace() {
|
void FreeCodeSpace() {
|
||||||
ASSERT(!m_is_child);
|
ASSERT(!m_is_child);
|
||||||
ASSERT(munmap(region, total_region_size) == 0);
|
if (region) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
ASSERT(VirtualFree(region, 0, MEM_RELEASE));
|
||||||
|
#else
|
||||||
|
ASSERT(munmap(region, total_region_size) == 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
region = nullptr;
|
region = nullptr;
|
||||||
region_size = 0;
|
region_size = 0;
|
||||||
total_region_size = 0;
|
total_region_size = 0;
|
||||||
@ -96,12 +102,7 @@ public:
|
|||||||
bool IsInSpace(const u8* ptr) const {
|
bool IsInSpace(const u8* ptr) const {
|
||||||
return ptr >= region && ptr < (region + region_size);
|
return ptr >= region && ptr < (region + region_size);
|
||||||
}
|
}
|
||||||
// Cannot currently be undone. Will write protect the entire code region.
|
|
||||||
// Start over if you need to change the code (call FreeCodeSpace(),
|
|
||||||
// AllocCodeSpace()).
|
|
||||||
void WriteProtect() {
|
|
||||||
ASSERT(mprotect(region, region_size, PROT_READ | PROT_EXEC) != 0);
|
|
||||||
}
|
|
||||||
void ResetCodePtr() {
|
void ResetCodePtr() {
|
||||||
T::SetCodePtr(region);
|
T::SetCodePtr(region);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user