Index: src/arm64/cpu-arm64.cc |
diff --git a/src/arm64/cpu-arm64.cc b/src/arm64/cpu-arm64.cc |
index c360f0afb7be5210e51834c797674bff43043ffd..0e1ed91be40996b642a41d524dae24ad4ddccc68 100644 |
--- a/src/arm64/cpu-arm64.cc |
+++ b/src/arm64/cpu-arm64.cc |
@@ -18,19 +18,37 @@ namespace internal { |
bool CpuFeatures::initialized_ = false; |
#endif |
unsigned CpuFeatures::supported_ = 0; |
-unsigned CpuFeatures::found_by_runtime_probing_only_ = 0; |
unsigned CpuFeatures::cross_compile_ = 0; |
-// Initialise to smallest possible cache size. |
-unsigned CpuFeatures::dcache_line_size_ = 1; |
-unsigned CpuFeatures::icache_line_size_ = 1; |
+class CacheLineSizes { |
+ public: |
+ CacheLineSizes() { |
+#ifdef USE_SIMULATOR |
+ cache_type_register_ = 0; |
+#else |
+ // Copy the content of the cache type register to a core register. |
+ __asm__ __volatile__ ("mrs %[ctr], ctr_el0" // NOLINT |
+ : [ctr] "=r" (cache_type_register_)); |
+#endif |
+ }; |
-void CPU::FlushICache(void* address, size_t length) { |
- if (length == 0) { |
- return; |
+ uint32_t icache_line_size() const { return ExtractCacheLineSize(0); } |
+ uint32_t dcache_line_size() const { return ExtractCacheLineSize(16); } |
+ |
+ private: |
+ uint32_t ExtractCacheLineSize(int cache_line_size_shift) const { |
+ // The cache type register holds the size of the caches as a power of two. |
+ return 1 << ((cache_type_register_ >> cache_line_size_shift) & 0xf); |
Rodolph Perfetta
2014/05/02 13:12:07
Argh, the original code was wrong (my bad), the si
Sven Panne
2014/05/05 07:57:33
So the "1 << ..." should be replaced by a "4 << ..
|
} |
+ uint32_t cache_type_register_; |
+}; |
+ |
+ |
+void CPU::FlushICache(void* address, size_t length) { |
+ if (length == 0) return; |
+ |
#ifdef USE_SIMULATOR |
// TODO(all): consider doing some cache simulation to ensure every address |
// run has been synced. |
@@ -43,8 +61,9 @@ void CPU::FlushICache(void* address, size_t length) { |
uintptr_t start = reinterpret_cast<uintptr_t>(address); |
// Sizes will be used to generate a mask big enough to cover a pointer. |
- uintptr_t dsize = static_cast<uintptr_t>(CpuFeatures::dcache_line_size()); |
- uintptr_t isize = static_cast<uintptr_t>(CpuFeatures::icache_line_size()); |
+ CacheLineSizes sizes; |
+ uintptr_t dsize = sizes.dcache_line_size(); |
+ uintptr_t isize = sizes.icache_line_size(); |
// Cache line sizes are always a power of 2. |
ASSERT(CountSetBits(dsize, 64) == 1); |
ASSERT(CountSetBits(isize, 64) == 1); |
@@ -107,25 +126,6 @@ void CPU::FlushICache(void* address, size_t length) { |
void CpuFeatures::Probe(bool serializer_enabled) { |
- // Compute I and D cache line size. The cache type register holds |
- // information about the caches. |
- uint32_t cache_type_register = GetCacheType(); |
- |
- static const int kDCacheLineSizeShift = 16; |
- static const int kICacheLineSizeShift = 0; |
- static const uint32_t kDCacheLineSizeMask = 0xf << kDCacheLineSizeShift; |
- static const uint32_t kICacheLineSizeMask = 0xf << kICacheLineSizeShift; |
- |
- // The cache type register holds the size of the I and D caches as a power of |
- // two. |
- uint32_t dcache_line_size_power_of_two = |
- (cache_type_register & kDCacheLineSizeMask) >> kDCacheLineSizeShift; |
- uint32_t icache_line_size_power_of_two = |
- (cache_type_register & kICacheLineSizeMask) >> kICacheLineSizeShift; |
- |
- dcache_line_size_ = 1 << dcache_line_size_power_of_two; |
- icache_line_size_ = 1 << icache_line_size_power_of_two; |
- |
// AArch64 has no configuration options, no further probing is required. |
supported_ = 0; |
@@ -135,32 +135,6 @@ void CpuFeatures::Probe(bool serializer_enabled) { |
} |
-unsigned CpuFeatures::dcache_line_size() { |
- ASSERT(initialized_); |
- return dcache_line_size_; |
-} |
- |
- |
-unsigned CpuFeatures::icache_line_size() { |
- ASSERT(initialized_); |
- return icache_line_size_; |
-} |
- |
- |
-uint32_t CpuFeatures::GetCacheType() { |
-#ifdef USE_SIMULATOR |
- // This will lead to a cache with 1 byte long lines, which is fine since the |
- // simulator will not need this information. |
- return 0; |
-#else |
- uint32_t cache_type_register; |
- // Copy the content of the cache type register to a core register. |
- __asm__ __volatile__ ("mrs %[ctr], ctr_el0" // NOLINT |
- : [ctr] "=r" (cache_type_register)); |
- return cache_type_register; |
-#endif |
-} |
- |
} } // namespace v8::internal |
#endif // V8_TARGET_ARCH_ARM64 |