Index: src/ia32/assembler-ia32.cc |
=================================================================== |
--- src/ia32/assembler-ia32.cc (revision 3427) |
+++ src/ia32/assembler-ia32.cc (working copy) |
@@ -46,19 +46,14 @@ |
// ----------------------------------------------------------------------------- |
// Implementation of CpuFeatures |
-// Safe default is no features. |
-uint64_t CpuFeatures::supported_ = 0; |
-uint64_t CpuFeatures::enabled_ = 0; |
-uint64_t CpuFeatures::found_by_runtime_probing_ = 0; |
- |
- |
// The Probe method needs executable memory, so it uses Heap::CreateCode. |
// Allocation failure is silent and leads to safe default. |
void CpuFeatures::Probe() { |
+ AssemblerData* data = v8_context()->assembler_data_; |
ASSERT(Heap::HasBeenSetup()); |
- ASSERT(supported_ == 0); |
+ ASSERT(data->supported_ == 0); |
if (Serializer::enabled()) { |
- supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
+ data->supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
return; // No features if we might serialize. |
} |
@@ -94,11 +89,11 @@ |
// safe here. |
__ bind(&cpuid); |
__ mov(eax, 1); |
- supported_ = (1 << CPUID); |
+ data->supported_ = (1 << CPUID); |
{ Scope fscope(CPUID); |
__ cpuid(); |
} |
- supported_ = 0; |
+ data->supported_ = 0; |
// Move the result from ecx:edx to edx:eax and make sure to mark the |
// CPUID feature as supported. |
@@ -127,11 +122,11 @@ |
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_; |
+ data->supported_ = probe(); |
+ data->found_by_runtime_probing_ = data->supported_; |
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; |
} |
@@ -278,18 +273,16 @@ |
static void InitCoverageLog(); |
#endif |
-// spare_buffer_ |
-byte* Assembler::spare_buffer_ = NULL; |
Assembler::Assembler(void* buffer, int buffer_size) { |
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) { |
@@ -334,8 +327,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_); |
} |
@@ -355,7 +349,7 @@ |
desc->reloc_size = (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); |
} |
@@ -2152,9 +2146,10 @@ |
memmove(rc_delta + reloc_info_writer.pos(), |
reloc_info_writer.pos(), desc.reloc_size); |
+ AssemblerData* const data = v8_context()->assembler_data_; |
// switch buffers |
- if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
- spare_buffer_ = buffer_; |
+ if (data->spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
+ data->spare_buffer_ = buffer_; |
} else { |
DeleteArray(buffer_); |
} |
@@ -2264,7 +2259,14 @@ |
reloc_info_writer.Write(&rinfo); |
} |
+void Assembler::PostConstruct() { |
+ v8_context()->assembler_data_ = new AssemblerData(); |
+} |
+void Assembler::PreDestroy() { |
+ delete v8_context()->assembler_data_; |
+} |
+ |
#ifdef GENERATED_CODE_COVERAGE |
static FILE* coverage_log = NULL; |