Index: src/ia32/lithium-ia32.cc |
=================================================================== |
--- src/ia32/lithium-ia32.cc (revision 6471) |
+++ src/ia32/lithium-ia32.cc (working copy) |
@@ -29,6 +29,7 @@ |
#if defined(V8_TARGET_ARCH_IA32) |
+#include "lithium-allocator-inl.h" |
#include "ia32/lithium-ia32.h" |
#include "ia32/lithium-codegen-ia32.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()) { |
@@ -391,7 +416,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()) { |
@@ -407,7 +432,6 @@ |
pointer_maps_.Add(instr->pointer_map()); |
instr->pointer_map()->set_lithium_position(index); |
} |
- return index; |
} |
@@ -659,7 +683,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()) { |
@@ -684,7 +711,7 @@ |
LInstruction* LChunkBuilder::MarkAsSaveDoubles(LInstruction* instr) { |
- allocator_->MarkAsSaveDoubles(); |
+ instr->MarkAsSaveDoubles(); |
return instr; |
} |
@@ -893,7 +920,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); |
@@ -916,11 +942,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; |
} |