7 #if V8_TARGET_ARCH_ARM64 9 #include "src/arm64/utils-arm64.h" 10 #include "src/assembler.h" 15 class CacheLineSizes {
18 #if defined(USE_SIMULATOR) || defined(V8_OS_WIN) 19 cache_type_register_ = 0;
22 __asm__ __volatile__(
"mrs %x[ctr], ctr_el0" 23 : [ctr]
"=r"(cache_type_register_));
27 uint32_t icache_line_size()
const {
return ExtractCacheLineSize(0); }
28 uint32_t dcache_line_size()
const {
return ExtractCacheLineSize(16); }
31 uint32_t ExtractCacheLineSize(
int cache_line_size_shift)
const {
34 return 4 << ((cache_type_register_ >> cache_line_size_shift) & 0xF);
40 void CpuFeatures::FlushICache(
void* address,
size_t length) {
41 #if defined(V8_OS_WIN) 42 FlushInstructionCache(GetCurrentProcess(), address, length);
43 #elif defined(V8_HOST_ARCH_ARM64) 51 uintptr_t dsize = sizes.dcache_line_size();
52 uintptr_t isize = sizes.icache_line_size();
54 DCHECK_EQ(CountSetBits(dsize, 64), 1);
55 DCHECK_EQ(CountSetBits(isize, 64), 1);
60 __asm__ __volatile__ (
72 "dc civac, %[dline] \n\t" 73 "add %[dline], %[dline], %[dsize] \n\t" 74 "cmp %[dline], %[end] \n\t" 92 "ic ivau, %[iline] \n\t" 93 "add %[iline], %[iline], %[isize] \n\t" 94 "cmp %[iline], %[end] \n\t" 103 : [dline]
"+r" (dstart),
104 [iline]
"+r" (istart)
105 : [dsize]
"r" (dsize),
112 #endif // V8_HOST_ARCH_ARM64 118 #endif // V8_TARGET_ARCH_ARM64