| Index: src/x64/assembler-x64.cc
|
| diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc
|
| index 0744b8a3069fc2a1e60fc64079a043b2317e7ea7..de28ae95859ad2562a06927bdabb572da6ffe416 100644
|
| --- a/src/x64/assembler-x64.cc
|
| +++ b/src/x64/assembler-x64.cc
|
| @@ -38,22 +38,38 @@ namespace internal {
|
| // -----------------------------------------------------------------------------
|
| // Implementation of CpuFeatures
|
|
|
| -CpuFeatures::CpuFeatures()
|
| - : supported_(kDefaultCpuFeatures),
|
| - enabled_(0),
|
| - found_by_runtime_probing_(0) {
|
| -}
|
| +
|
| +#ifdef DEBUG
|
| +bool CpuFeatures::initialized_ = false;
|
| +#endif
|
| +uint64_t CpuFeatures::supported_ = CpuFeatures::kDefaultCpuFeatures;
|
| +uint64_t CpuFeatures::found_by_runtime_probing_ = 0;
|
|
|
|
|
| -void CpuFeatures::Probe(bool portable) {
|
| - ASSERT(HEAP->HasBeenSetup());
|
| +void CpuFeatures::Probe() {
|
| + ASSERT(!initialized_);
|
| +#ifdef DEBUG
|
| + initialized_ = true;
|
| +#endif
|
| supported_ = kDefaultCpuFeatures;
|
| - if (portable && Serializer::enabled()) {
|
| + if (Serializer::enabled()) {
|
| supported_ |= OS::CpuFeaturesImpliedByPlatform();
|
| return; // No features if we might serialize.
|
| }
|
|
|
| - Assembler assm(NULL, 0);
|
| + const int kBufferSize = 4 * KB;
|
| + VirtualMemory* memory = new VirtualMemory(kBufferSize);
|
| + if (!memory->IsReserved()) {
|
| + delete memory;
|
| + return;
|
| + }
|
| + ASSERT(memory->size() >= static_cast<size_t>(kBufferSize));
|
| + if (!memory->Commit(memory->address(), kBufferSize, true/*executable*/)) {
|
| + delete memory;
|
| + return;
|
| + }
|
| +
|
| + Assembler assm(NULL, memory->address(), kBufferSize);
|
| Label cpuid, done;
|
| #define __ assm.
|
| // Save old rsp, since we are going to modify the stack.
|
| @@ -117,31 +133,20 @@ void CpuFeatures::Probe(bool portable) {
|
| __ ret(0);
|
| #undef __
|
|
|
| - CodeDesc desc;
|
| - assm.GetCode(&desc);
|
| - Isolate* isolate = Isolate::Current();
|
| - MaybeObject* maybe_code =
|
| - isolate->heap()->CreateCode(desc,
|
| - Code::ComputeFlags(Code::STUB),
|
| - Handle<Object>());
|
| - Object* code;
|
| - if (!maybe_code->ToObject(&code)) return;
|
| - if (!code->IsCode()) return;
|
| - PROFILE(isolate,
|
| - CodeCreateEvent(Logger::BUILTIN_TAG,
|
| - Code::cast(code), "CpuFeatures::Probe"));
|
| typedef uint64_t (*F0)();
|
| - F0 probe = FUNCTION_CAST<F0>(Code::cast(code)->entry());
|
| + F0 probe = FUNCTION_CAST<F0>(reinterpret_cast<Address>(memory->address()));
|
| supported_ = probe();
|
| found_by_runtime_probing_ = supported_;
|
| found_by_runtime_probing_ &= ~kDefaultCpuFeatures;
|
| uint64_t os_guarantees = OS::CpuFeaturesImpliedByPlatform();
|
| supported_ |= os_guarantees;
|
| - found_by_runtime_probing_ &= portable ? ~os_guarantees : 0;
|
| + found_by_runtime_probing_ &= ~os_guarantees;
|
| // SSE2 and CMOV must be available on an X64 CPU.
|
| ASSERT(IsSupported(CPUID));
|
| ASSERT(IsSupported(SSE2));
|
| ASSERT(IsSupported(CMOV));
|
| +
|
| + delete memory;
|
| }
|
|
|
|
|
| @@ -339,8 +344,8 @@ bool Operand::AddressUsesRegister(Register reg) const {
|
| static void InitCoverageLog();
|
| #endif
|
|
|
| -Assembler::Assembler(void* buffer, int buffer_size)
|
| - : AssemblerBase(Isolate::Current()),
|
| +Assembler::Assembler(Isolate* arg_isolate, void* buffer, int buffer_size)
|
| + : AssemblerBase(arg_isolate),
|
| code_targets_(100),
|
| positions_recorder_(this),
|
| emit_debug_code_(FLAG_debug_code) {
|
| @@ -349,7 +354,7 @@ Assembler::Assembler(void* buffer, int buffer_size)
|
| if (buffer_size <= kMinimalBufferSize) {
|
| buffer_size = kMinimalBufferSize;
|
|
|
| - if (isolate()->assembler_spare_buffer() != NULL) {
|
| + if (isolate() != NULL && isolate()->assembler_spare_buffer() != NULL) {
|
| buffer = isolate()->assembler_spare_buffer();
|
| isolate()->set_assembler_spare_buffer(NULL);
|
| }
|
| @@ -393,7 +398,8 @@ Assembler::Assembler(void* buffer, int buffer_size)
|
|
|
| Assembler::~Assembler() {
|
| if (own_buffer_) {
|
| - if (isolate()->assembler_spare_buffer() == NULL &&
|
| + if (isolate() != NULL &&
|
| + isolate()->assembler_spare_buffer() == NULL &&
|
| buffer_size_ == kMinimalBufferSize) {
|
| isolate()->set_assembler_spare_buffer(buffer_);
|
| } else {
|
| @@ -516,7 +522,8 @@ void Assembler::GrowBuffer() {
|
| reloc_info_writer.pos(), desc.reloc_size);
|
|
|
| // Switch buffers.
|
| - if (isolate()->assembler_spare_buffer() == NULL &&
|
| + if (isolate() != NULL &&
|
| + isolate()->assembler_spare_buffer() == NULL &&
|
| buffer_size_ == kMinimalBufferSize) {
|
| isolate()->set_assembler_spare_buffer(buffer_);
|
| } else {
|
| @@ -1037,7 +1044,7 @@ void Assembler::cmpb_al(Immediate imm8) {
|
|
|
|
|
| void Assembler::cpuid() {
|
| - ASSERT(isolate()->cpu_features()->IsEnabled(CPUID));
|
| + ASSERT(CpuFeatures::IsEnabled(CPUID));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| emit(0x0F);
|
| @@ -2388,7 +2395,7 @@ void Assembler::fistp_s(const Operand& adr) {
|
|
|
|
|
| void Assembler::fisttp_s(const Operand& adr) {
|
| - ASSERT(isolate()->cpu_features()->IsEnabled(SSE3));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE3));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| emit_optional_rex_32(adr);
|
| @@ -2398,7 +2405,7 @@ void Assembler::fisttp_s(const Operand& adr) {
|
|
|
|
|
| void Assembler::fisttp_d(const Operand& adr) {
|
| - ASSERT(isolate()->cpu_features()->IsEnabled(SSE3));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE3));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| emit_optional_rex_32(adr);
|
| @@ -2716,7 +2723,7 @@ void Assembler::movq(Register dst, XMMRegister src) {
|
|
|
|
|
| void Assembler::movdqa(const Operand& dst, XMMRegister src) {
|
| - ASSERT(isolate()->cpu_features()->IsEnabled(SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| emit(0x66);
|
| @@ -2728,7 +2735,7 @@ void Assembler::movdqa(const Operand& dst, XMMRegister src) {
|
|
|
|
|
| void Assembler::movdqa(XMMRegister dst, const Operand& src) {
|
| - ASSERT(isolate()->cpu_features()->IsEnabled(SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| emit(0x66);
|
|
|