7#if V8_TARGET_ARCH_ARM64
14#include <libkern/OSCacheControl.h>
27#if !defined(V8_HOST_ARCH_ARM64) || defined(V8_OS_WIN) || defined(__APPLE__)
28 cache_type_register_ = 0;
31 __asm__ __volatile__(
"mrs %x[ctr], ctr_el0"
32 : [ctr]
"=r"(cache_type_register_));
36 uint32_t icache_line_size()
const {
return ExtractCacheLineSize(0); }
37 uint32_t dcache_line_size()
const {
return ExtractCacheLineSize(16); }
40 uint32_t ExtractCacheLineSize(
int cache_line_size_shift)
const {
43 return 4 << ((cache_type_register_ >> cache_line_size_shift) & 0xF);
46 uint32_t cache_type_register_;
50#if defined(V8_HOST_ARCH_ARM64)
53#elif defined(V8_OS_DARWIN)
54 sys_icache_invalidate(address, length);
55#elif defined(V8_OS_LINUX)
56 char*
begin =
reinterpret_cast<char*
>(address);
58 __builtin___clear_cache(begin, begin + length);
64 uintptr_t
start =
reinterpret_cast<uintptr_t
>(address);
67 uintptr_t dsize = sizes.dcache_line_size();
68 uintptr_t isize = sizes.icache_line_size();
72 uintptr_t dstart =
start & ~(dsize - 1);
73 uintptr_t istart =
start & ~(isize - 1);
88 "dc civac, %[dline] \n\t"
89 "add %[dline], %[dline], %[dsize] \n\t"
90 "cmp %[dline], %[end] \n\t"
107 "ic ivau, %[iline] \n\t"
108 "add %[iline], %[iline], %[isize] \n\t"
109 "cmp %[iline], %[end] \n\t"
118 : [dline]
"+r"(dstart), [iline]
"+r"(istart)
119 : [dsize]
"r"(dsize), [isize]
"r"(isize), [
end]
"r"(
end)
friend void V8_EXPORT_PRIVATE FlushInstructionCache(void *, size_t)
static void FlushICache(void *start, size_t size)
Node::Uses::const_iterator begin(const Node::Uses &uses)
V8_EXPORT_PRIVATE int CountSetBits(uint64_t value, int width)
#define DCHECK_EQ(v1, v2)