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; |
} |