Index: src/x64/assembler-x64.cc |
=================================================================== |
--- src/x64/assembler-x64.cc (revision 3427) |
+++ src/x64/assembler-x64.cc (working copy) |
@@ -78,15 +78,20 @@ |
// The required user mode extensions in X64 are (from AMD64 ABI Table A.1): |
// fpu, tsc, cx8, cmov, mmx, sse, sse2, fxsr, syscall |
-uint64_t CpuFeatures::supported_ = kDefaultCpuFeatures; |
-uint64_t CpuFeatures::enabled_ = 0; |
-uint64_t CpuFeatures::found_by_runtime_probing_ = 0; |
+AssemblerData::AssemblerData() |
+ :BasicAssemblerData(), |
+ spare_buffer_(NULL), |
+ supported_(CpuFeatures::kDefaultCpuFeatures), |
+ enabled_(0), |
+ found_by_runtime_probing_(0) { |
+} |
void CpuFeatures::Probe() { |
+ AssemblerData* data = v8_context()->assembler_data_; |
ASSERT(Heap::HasBeenSetup()); |
- ASSERT(supported_ == kDefaultCpuFeatures); |
+ ASSERT(data->supported_ == kDefaultCpuFeatures); |
if (Serializer::enabled()) { |
- supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
+ data->supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
return; // No features if we might serialize. |
} |
@@ -121,7 +126,7 @@ |
// safe here. |
__ bind(&cpuid); |
__ movq(rax, Immediate(1)); |
- supported_ = kDefaultCpuFeatures | (1 << CPUID); |
+ data->supported_ = kDefaultCpuFeatures | (1 << CPUID); |
{ Scope fscope(CPUID); |
__ cpuid(); |
// Move the result from ecx:edx to rdi. |
@@ -133,7 +138,7 @@ |
__ movq(rax, 0x80000001, RelocInfo::NONE); |
__ cpuid(); |
} |
- supported_ = kDefaultCpuFeatures; |
+ data->supported_ = kDefaultCpuFeatures; |
// Put the CPU flags in rax. |
// rax = (rcx & 1) | (rdi & ~1) | (1 << CPUID). |
@@ -163,12 +168,12 @@ |
Code::cast(code), "CpuFeatures::Probe")); |
typedef uint64_t (*F0)(); |
F0 probe = FUNCTION_CAST<F0>(Code::cast(code)->entry()); |
- supported_ = probe(); |
- found_by_runtime_probing_ = supported_; |
- found_by_runtime_probing_ &= ~kDefaultCpuFeatures; |
+ data->supported_ = probe(); |
+ data->found_by_runtime_probing_ = data->supported_; |
+ data->found_by_runtime_probing_ &= ~kDefaultCpuFeatures; |
uint64_t os_guarantees = OS::CpuFeaturesImpliedByPlatform(); |
- supported_ |= os_guarantees; |
- found_by_runtime_probing_ &= ~os_guarantees; |
+ data->supported_ |= os_guarantees; |
+ data->found_by_runtime_probing_ &= ~os_guarantees; |
// SSE2 and CMOV must be available on an X64 CPU. |
ASSERT(IsSupported(CPUID)); |
ASSERT(IsSupported(SSE2)); |
@@ -271,18 +276,16 @@ |
static void InitCoverageLog(); |
#endif |
-byte* Assembler::spare_buffer_ = NULL; |
- |
Assembler::Assembler(void* buffer, int buffer_size) |
: code_targets_(100) { |
if (buffer == NULL) { |
// do our own buffer management |
if (buffer_size <= kMinimalBufferSize) { |
buffer_size = kMinimalBufferSize; |
- |
- if (spare_buffer_ != NULL) { |
- buffer = spare_buffer_; |
- spare_buffer_ = NULL; |
+ AssemblerData* const data = v8_context()->assembler_data_; |
+ if (data->spare_buffer_ != NULL) { |
+ buffer = data->spare_buffer_; |
+ data->spare_buffer_ = NULL; |
} |
} |
if (buffer == NULL) { |
@@ -327,8 +330,9 @@ |
Assembler::~Assembler() { |
if (own_buffer_) { |
- if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
- spare_buffer_ = buffer_; |
+ AssemblerData* const data = v8_context()->assembler_data_; |
+ if (data->spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
+ data->spare_buffer_ = buffer_; |
} else { |
DeleteArray(buffer_); |
} |
@@ -350,7 +354,7 @@ |
static_cast<int>((buffer_ + buffer_size_) - reloc_info_writer.pos()); |
desc->origin = this; |
- Counters::reloc_info_size.Increment(desc->reloc_size); |
+ INCREMENT_COUNTER(reloc_info_size, desc->reloc_size); |
} |
@@ -428,8 +432,9 @@ |
reloc_info_writer.pos(), desc.reloc_size); |
// switch buffers |
- if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
- spare_buffer_ = buffer_; |
+ AssemblerData* const data = v8_context()->assembler_data_; |
+ if (data->spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
+ data->spare_buffer_ = buffer_; |
} else { |
DeleteArray(buffer_); |
} |
@@ -2536,4 +2541,12 @@ |
1 << RelocInfo::INTERNAL_REFERENCE | |
1 << RelocInfo::JS_RETURN; |
+void Assembler::PostConstruct() { |
+ v8_context()->assembler_data_ = new AssemblerData(); |
+} |
+ |
+void Assembler::PreDestroy() { |
+ delete v8_context()->assembler_data_; |
+} |
+ |
} } // namespace v8::internal |