| Index: src/ia32/assembler-ia32.cc
|
| ===================================================================
|
| --- src/ia32/assembler-ia32.cc (revision 7267)
|
| +++ src/ia32/assembler-ia32.cc (working copy)
|
| @@ -48,16 +48,17 @@
|
| // -----------------------------------------------------------------------------
|
| // 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;
|
| +CpuFeatures::CpuFeatures()
|
| + : supported_(0),
|
| + enabled_(0),
|
| + 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(bool portable) {
|
| - ASSERT(Heap::HasBeenSetup());
|
| + ASSERT(HEAP->HasBeenSetup());
|
| ASSERT(supported_ == 0);
|
| if (portable && Serializer::enabled()) {
|
| supported_ |= OS::CpuFeaturesImpliedByPlatform();
|
| @@ -120,16 +121,16 @@
|
|
|
| CodeDesc desc;
|
| assm.GetCode(&desc);
|
| -
|
| Object* code;
|
| - { MaybeObject* maybe_code = Heap::CreateCode(desc,
|
| + { MaybeObject* maybe_code = HEAP->CreateCode(desc,
|
| Code::ComputeFlags(Code::STUB),
|
| Handle<Code>::null());
|
| if (!maybe_code->ToObject(&code)) return;
|
| }
|
| if (!code->IsCode()) return;
|
|
|
| - PROFILE(CodeCreateEvent(Logger::BUILTIN_TAG,
|
| + PROFILE(ISOLATE,
|
| + CodeCreateEvent(Logger::BUILTIN_TAG,
|
| Code::cast(code), "CpuFeatures::Probe"));
|
| typedef uint64_t (*F0)();
|
| F0 probe = FUNCTION_CAST<F0>(Code::cast(code)->entry());
|
| @@ -295,20 +296,18 @@
|
| static void InitCoverageLog();
|
| #endif
|
|
|
| -// Spare buffer.
|
| -byte* Assembler::spare_buffer_ = NULL;
|
| -
|
| Assembler::Assembler(void* buffer, int buffer_size)
|
| : positions_recorder_(this),
|
| emit_debug_code_(FLAG_debug_code) {
|
| + Isolate* isolate = Isolate::Current();
|
| 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;
|
| + if (isolate->assembler_spare_buffer() != NULL) {
|
| + buffer = isolate->assembler_spare_buffer();
|
| + isolate->set_assembler_spare_buffer(NULL);
|
| }
|
| }
|
| if (buffer == NULL) {
|
| @@ -348,9 +347,11 @@
|
|
|
|
|
| Assembler::~Assembler() {
|
| + Isolate* isolate = Isolate::Current();
|
| if (own_buffer_) {
|
| - if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) {
|
| - spare_buffer_ = buffer_;
|
| + if (isolate->assembler_spare_buffer() == NULL &&
|
| + buffer_size_ == kMinimalBufferSize) {
|
| + isolate->set_assembler_spare_buffer(buffer_);
|
| } else {
|
| DeleteArray(buffer_);
|
| }
|
| @@ -369,7 +370,7 @@
|
| desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos();
|
| desc->origin = this;
|
|
|
| - Counters::reloc_info_size.Increment(desc->reloc_size);
|
| + COUNTERS->reloc_info_size()->Increment(desc->reloc_size);
|
| }
|
|
|
|
|
| @@ -387,7 +388,7 @@
|
|
|
|
|
| void Assembler::cpuid() {
|
| - ASSERT(CpuFeatures::IsEnabled(CPUID));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(CPUID));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x0F);
|
| @@ -748,7 +749,7 @@
|
|
|
|
|
| void Assembler::cmov(Condition cc, Register dst, int32_t imm32) {
|
| - ASSERT(CpuFeatures::IsEnabled(CMOV));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(CMOV));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| UNIMPLEMENTED();
|
| @@ -759,7 +760,7 @@
|
|
|
|
|
| void Assembler::cmov(Condition cc, Register dst, Handle<Object> handle) {
|
| - ASSERT(CpuFeatures::IsEnabled(CMOV));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(CMOV));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| UNIMPLEMENTED();
|
| @@ -770,7 +771,7 @@
|
|
|
|
|
| void Assembler::cmov(Condition cc, Register dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CMOV));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(CMOV));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| // Opcode: 0f 40 + cc /r.
|
| @@ -1451,7 +1452,7 @@
|
|
|
|
|
| void Assembler::rdtsc() {
|
| - ASSERT(CpuFeatures::IsEnabled(RDTSC));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(RDTSC));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x0F);
|
| @@ -1857,7 +1858,7 @@
|
|
|
|
|
| void Assembler::fisttp_s(const Operand& adr) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE3));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE3));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xDB);
|
| @@ -1866,7 +1867,7 @@
|
|
|
|
|
| void Assembler::fisttp_d(const Operand& adr) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE3));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE3));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xDD);
|
| @@ -2135,7 +2136,7 @@
|
|
|
|
|
| void Assembler::cvttss2si(Register dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF3);
|
| @@ -2146,7 +2147,7 @@
|
|
|
|
|
| void Assembler::cvttsd2si(Register dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2157,7 +2158,7 @@
|
|
|
|
|
| void Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2168,7 +2169,7 @@
|
|
|
|
|
| void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF3);
|
| @@ -2179,7 +2180,7 @@
|
|
|
|
|
| void Assembler::addsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2190,7 +2191,7 @@
|
|
|
|
|
| void Assembler::mulsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2201,7 +2202,7 @@
|
|
|
|
|
| void Assembler::subsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2212,7 +2213,7 @@
|
|
|
|
|
| void Assembler::divsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2223,7 +2224,7 @@
|
|
|
|
|
| void Assembler::xorpd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2254,7 +2255,7 @@
|
|
|
|
|
| void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2265,7 +2266,7 @@
|
|
|
|
|
| void Assembler::movmskpd(Register dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2276,7 +2277,7 @@
|
|
|
|
|
| void Assembler::cmpltsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2288,7 +2289,7 @@
|
|
|
|
|
| void Assembler::movaps(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x0F);
|
| @@ -2298,7 +2299,7 @@
|
|
|
|
|
| void Assembler::movdqa(const Operand& dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2309,7 +2310,7 @@
|
|
|
|
|
| void Assembler::movdqa(XMMRegister dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2320,7 +2321,7 @@
|
|
|
|
|
| void Assembler::movdqu(const Operand& dst, XMMRegister src ) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF3);
|
| @@ -2331,7 +2332,7 @@
|
|
|
|
|
| void Assembler::movdqu(XMMRegister dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF3);
|
| @@ -2342,7 +2343,7 @@
|
|
|
|
|
| void Assembler::movntdqa(XMMRegister dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE4_1));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE4_1));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2354,7 +2355,7 @@
|
|
|
|
|
| void Assembler::movntdq(const Operand& dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2390,7 +2391,7 @@
|
|
|
|
|
| void Assembler::movsd(const Operand& dst, XMMRegister src ) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2); // double
|
| @@ -2401,7 +2402,7 @@
|
|
|
|
|
| void Assembler::movsd(XMMRegister dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2); // double
|
| @@ -2412,7 +2413,7 @@
|
|
|
|
|
| void Assembler::movsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2423,7 +2424,7 @@
|
|
|
|
|
| void Assembler::movd(XMMRegister dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2434,7 +2435,7 @@
|
|
|
|
|
| void Assembler::movd(const Operand& dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2445,7 +2446,7 @@
|
|
|
|
|
| void Assembler::pand(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2456,7 +2457,7 @@
|
|
|
|
|
| void Assembler::pxor(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2467,7 +2468,7 @@
|
|
|
|
|
| void Assembler::por(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2478,7 +2479,7 @@
|
|
|
|
|
| void Assembler::ptest(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE4_1));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE4_1));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2490,7 +2491,7 @@
|
|
|
|
|
| void Assembler::psllq(XMMRegister reg, int8_t shift) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2502,7 +2503,7 @@
|
|
|
|
|
| void Assembler::psllq(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2513,7 +2514,7 @@
|
|
|
|
|
| void Assembler::psrlq(XMMRegister reg, int8_t shift) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2525,7 +2526,7 @@
|
|
|
|
|
| void Assembler::psrlq(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2536,7 +2537,7 @@
|
|
|
|
|
| void Assembler::pshufd(XMMRegister dst, XMMRegister src, int8_t shuffle) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2548,7 +2549,7 @@
|
|
|
|
|
| void Assembler::pextrd(const Operand& dst, XMMRegister src, int8_t offset) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE4_1));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE4_1));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2561,7 +2562,7 @@
|
|
|
|
|
| void Assembler::pinsrd(XMMRegister dst, const Operand& src, int8_t offset) {
|
| - ASSERT(CpuFeatures::IsEnabled(SSE4_1));
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE4_1));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2617,6 +2618,7 @@
|
|
|
|
|
| void Assembler::GrowBuffer() {
|
| + Isolate* isolate = Isolate::Current();
|
| ASSERT(overflow());
|
| if (!own_buffer_) FATAL("external code buffer is too small");
|
|
|
| @@ -2630,7 +2632,7 @@
|
| // Some internal data structures overflow for very large buffers,
|
| // they must ensure that kMaximalBufferSize is not too large.
|
| if ((desc.buffer_size > kMaximalBufferSize) ||
|
| - (desc.buffer_size > Heap::MaxOldGenerationSize())) {
|
| + (desc.buffer_size > HEAP->MaxOldGenerationSize())) {
|
| V8::FatalProcessOutOfMemory("Assembler::GrowBuffer");
|
| }
|
|
|
| @@ -2653,8 +2655,9 @@
|
| reloc_info_writer.pos(), desc.reloc_size);
|
|
|
| // Switch buffers.
|
| - if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) {
|
| - spare_buffer_ = buffer_;
|
| + if (isolate->assembler_spare_buffer() == NULL &&
|
| + buffer_size_ == kMinimalBufferSize) {
|
| + isolate->set_assembler_spare_buffer(buffer_);
|
| } else {
|
| DeleteArray(buffer_);
|
| }
|
|
|