| Index: src/x64/lithium-x64.cc
|
| ===================================================================
|
| --- src/x64/lithium-x64.cc (revision 6471)
|
| +++ src/x64/lithium-x64.cc (working copy)
|
| @@ -29,6 +29,7 @@
|
|
|
| #if defined(V8_TARGET_ARCH_X64)
|
|
|
| +#include "lithium-allocator-inl.h"
|
| #include "x64/lithium-x64.h"
|
| #include "x64/lithium-codegen-x64.h"
|
|
|
| @@ -68,12 +69,36 @@
|
| }
|
|
|
|
|
| +#ifdef DEBUG
|
| +void LInstruction::VerifyCall() {
|
| + // Call instructions can use only fixed registers as
|
| + // temporaries and outputs because all registers
|
| + // are blocked by the calling convention.
|
| + // Inputs can use either fixed register or have a short lifetime (be
|
| + // used at start of the instruction).
|
| + ASSERT(Output() == NULL ||
|
| + LUnallocated::cast(Output())->HasFixedPolicy() ||
|
| + !LUnallocated::cast(Output())->HasRegisterPolicy());
|
| + for (UseIterator it(this); it.HasNext(); it.Advance()) {
|
| + LOperand* operand = it.Next();
|
| + ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() ||
|
| + LUnallocated::cast(operand)->IsUsedAtStart() ||
|
| + !LUnallocated::cast(operand)->HasRegisterPolicy());
|
| + }
|
| + for (TempIterator it(this); it.HasNext(); it.Advance()) {
|
| + LOperand* operand = it.Next();
|
| + ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() ||
|
| + !LUnallocated::cast(operand)->HasRegisterPolicy());
|
| + }
|
| +}
|
| +#endif
|
| +
|
| +
|
| void LInstruction::PrintTo(StringStream* stream) {
|
| stream->Add("%s ", this->Mnemonic());
|
| - if (HasResult()) {
|
| - PrintOutputOperandTo(stream);
|
| - }
|
|
|
| + PrintOutputOperandTo(stream);
|
| +
|
| PrintDataTo(stream);
|
|
|
| if (HasEnvironment()) {
|
| @@ -386,7 +411,7 @@
|
| }
|
|
|
|
|
| -int LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) {
|
| +void LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) {
|
| LGap* gap = new LGap(block);
|
| int index = -1;
|
| if (instr->IsControl()) {
|
| @@ -402,7 +427,6 @@
|
| pointer_maps_.Add(instr->pointer_map());
|
| instr->pointer_map()->set_lithium_position(index);
|
| }
|
| - return index;
|
| }
|
|
|
|
|
| @@ -654,7 +678,10 @@
|
| LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr,
|
| HInstruction* hinstr,
|
| CanDeoptimize can_deoptimize) {
|
| - allocator_->MarkAsCall();
|
| +#ifdef DEBUG
|
| + instr->VerifyCall();
|
| +#endif
|
| + instr->MarkAsCall();
|
| instr = AssignPointerMap(instr);
|
|
|
| if (hinstr->HasSideEffects()) {
|
| @@ -679,7 +706,7 @@
|
|
|
|
|
| LInstruction* LChunkBuilder::MarkAsSaveDoubles(LInstruction* instr) {
|
| - allocator_->MarkAsSaveDoubles();
|
| + instr->MarkAsSaveDoubles();
|
| return instr;
|
| }
|
|
|
| @@ -820,7 +847,6 @@
|
| void LChunkBuilder::VisitInstruction(HInstruction* current) {
|
| HInstruction* old_current = current_instruction_;
|
| current_instruction_ = current;
|
| - allocator_->BeginInstruction();
|
| if (current->has_position()) position_ = current->position();
|
| LInstruction* instr = current->CompileToLithium(this);
|
|
|
| @@ -843,11 +869,7 @@
|
| instr->set_hydrogen_value(current);
|
| }
|
|
|
| - int index = chunk_->AddInstruction(instr, current_block_);
|
| - allocator_->SummarizeInstruction(index);
|
| - } else {
|
| - // This instruction should be omitted.
|
| - allocator_->OmitInstruction();
|
| + chunk_->AddInstruction(instr, current_block_);
|
| }
|
| current_instruction_ = old_current;
|
| }
|
|
|