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