| Index: src/ia32/assembler-ia32.cc
|
| diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc
|
| index 912756fa69dd63035c9d1764b25ec0ac0b582e56..3439fa4c8f5c56f66cb43dd4fcc4a3a6f8ef5227 100644
|
| --- a/src/ia32/assembler-ia32.cc
|
| +++ b/src/ia32/assembler-ia32.cc
|
| @@ -32,7 +32,7 @@
|
|
|
| // The original source code covered by the above license above has been modified
|
| // significantly by Google Inc.
|
| -// Copyright 2006-2008 the V8 project authors. All rights reserved.
|
| +// Copyright 2010 the V8 project authors. All rights reserved.
|
|
|
| #include "v8.h"
|
|
|
| @@ -54,12 +54,13 @@ CpuFeatures::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() {
|
| +void CpuFeatures::Probe(bool portable) {
|
| ASSERT(HEAP->HasBeenSetup());
|
| ASSERT(supported_ == 0);
|
| - if (Serializer::enabled()) {
|
| + if (portable && Serializer::enabled()) {
|
| supported_ |= OS::CpuFeaturesImpliedByPlatform();
|
| return; // No features if we might serialize.
|
| }
|
| @@ -136,7 +137,7 @@ void CpuFeatures::Probe() {
|
| found_by_runtime_probing_ = supported_;
|
| uint64_t os_guarantees = OS::CpuFeaturesImpliedByPlatform();
|
| supported_ |= os_guarantees;
|
| - found_by_runtime_probing_ &= ~os_guarantees;
|
| + found_by_runtime_probing_ &= portable ? ~os_guarantees : 0;
|
| }
|
|
|
|
|
| @@ -434,6 +435,13 @@ void Assembler::push(const Immediate& x) {
|
| }
|
|
|
|
|
| +void Assembler::push_imm32(int32_t imm32) {
|
| + EnsureSpace ensure_space(this);
|
| + EMIT(0x68);
|
| + emit(imm32);
|
| +}
|
| +
|
| +
|
| void Assembler::push(Register src) {
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| @@ -1541,7 +1549,9 @@ void Assembler::bind(NearLabel* L) {
|
| L->bind_to(pc_offset());
|
| }
|
|
|
| +
|
| void Assembler::call(Label* L) {
|
| + positions_recorder()->WriteRecordedPositions();
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| if (L->is_bound()) {
|
| @@ -1560,6 +1570,7 @@ void Assembler::call(Label* L) {
|
|
|
|
|
| void Assembler::call(byte* entry, RelocInfo::Mode rmode) {
|
| + positions_recorder()->WriteRecordedPositions();
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| ASSERT(!RelocInfo::IsCodeTarget(rmode));
|
| @@ -1569,6 +1580,7 @@ void Assembler::call(byte* entry, RelocInfo::Mode rmode) {
|
|
|
|
|
| void Assembler::call(const Operand& adr) {
|
| + positions_recorder()->WriteRecordedPositions();
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xFF);
|
| @@ -2419,6 +2431,17 @@ void Assembler::movd(XMMRegister dst, const Operand& src) {
|
| }
|
|
|
|
|
| +void Assembler::pand(XMMRegister dst, XMMRegister src) {
|
| + ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| + EnsureSpace ensure_space(this);
|
| + last_pc_ = pc_;
|
| + EMIT(0x66);
|
| + EMIT(0x0F);
|
| + EMIT(0xDB);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| void Assembler::pxor(XMMRegister dst, XMMRegister src) {
|
| ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| @@ -2490,7 +2513,7 @@ void Assembler::RecordDebugBreakSlot() {
|
|
|
|
|
| void Assembler::RecordComment(const char* msg) {
|
| - if (FLAG_debug_code) {
|
| + if (FLAG_code_comments) {
|
| EnsureSpace ensure_space(this);
|
| RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg));
|
| }
|
| @@ -2624,9 +2647,15 @@ void Assembler::emit_farith(int b1, int b2, int i) {
|
| }
|
|
|
|
|
| -void Assembler::dd(uint32_t data, RelocInfo::Mode reloc_info) {
|
| +void Assembler::db(uint8_t data) {
|
| + EnsureSpace ensure_space(this);
|
| + EMIT(data);
|
| +}
|
| +
|
| +
|
| +void Assembler::dd(uint32_t data) {
|
| EnsureSpace ensure_space(this);
|
| - emit(data, reloc_info);
|
| + emit(data);
|
| }
|
|
|
|
|
|
|