Index: src/x64/lithium-x64.cc |
=================================================================== |
--- src/x64/lithium-x64.cc (revision 8460) |
+++ src/x64/lithium-x64.cc (working copy) |
@@ -267,12 +267,6 @@ |
} |
-void LTypeofIs::PrintDataTo(StringStream* stream) { |
- InputAt(0)->PrintTo(stream); |
- stream->Add(" == \"%s\"", *hydrogen()->type_literal()->ToCString()); |
-} |
- |
- |
void LTypeofIsAndBranch::PrintDataTo(StringStream* stream) { |
stream->Add("if typeof "); |
InputAt(0)->PrintTo(stream); |
@@ -342,13 +336,6 @@ |
} |
-void LClassOfTest::PrintDataTo(StringStream* stream) { |
- stream->Add("= class_of_test("); |
- InputAt(0)->PrintTo(stream); |
- stream->Add(", \"%o\")", *hydrogen()->class_name()); |
-} |
- |
- |
void LAccessArgumentsAt::PrintDataTo(StringStream* stream) { |
arguments()->PrintTo(stream); |
@@ -985,18 +972,7 @@ |
if (FLAG_stress_environments && !instr->HasEnvironment()) { |
instr = AssignEnvironment(instr); |
} |
- if (current->IsTest() && !instr->IsGoto()) { |
- ASSERT(instr->IsControl()); |
- HTest* test = HTest::cast(current); |
- instr->set_hydrogen_value(test->value()); |
- HBasicBlock* first = test->FirstSuccessor(); |
- HBasicBlock* second = test->SecondSuccessor(); |
- ASSERT(first != NULL && second != NULL); |
- instr->SetBranchTargets(first->block_id(), second->block_id()); |
- } else { |
- instr->set_hydrogen_value(current); |
- } |
- |
+ instr->set_hydrogen_value(current); |
chunk_->AddInstruction(instr, current_block_); |
} |
current_instruction_ = old_current; |
@@ -1041,81 +1017,17 @@ |
} |
-LInstruction* LChunkBuilder::DoTest(HTest* instr) { |
+LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { |
HValue* v = instr->value(); |
- if (!v->EmitAtUses()) return new LBranch(UseRegisterAtStart(v)); |
- ASSERT(!v->HasSideEffects()); |
- if (v->IsClassOfTest()) { |
- HClassOfTest* compare = HClassOfTest::cast(v); |
- ASSERT(compare->value()->representation().IsTagged()); |
- return new LClassOfTestAndBranch(UseTempRegister(compare->value()), |
- TempRegister()); |
- } else if (v->IsCompare()) { |
- HCompare* compare = HCompare::cast(v); |
- HValue* left = compare->left(); |
- HValue* right = compare->right(); |
- Representation r = compare->GetInputRepresentation(); |
- if (r.IsInteger32()) { |
- ASSERT(left->representation().IsInteger32()); |
- ASSERT(right->representation().IsInteger32()); |
- return new LCmpIDAndBranch(UseRegisterAtStart(left), |
- UseOrConstantAtStart(right)); |
- } else { |
- ASSERT(r.IsDouble()); |
- ASSERT(left->representation().IsDouble()); |
- ASSERT(right->representation().IsDouble()); |
- return new LCmpIDAndBranch(UseRegisterAtStart(left), |
- UseRegisterAtStart(right)); |
- } |
- } else if (v->IsIsSmi()) { |
- HIsSmi* compare = HIsSmi::cast(v); |
- ASSERT(compare->value()->representation().IsTagged()); |
- return new LIsSmiAndBranch(Use(compare->value())); |
- } else if (v->IsIsUndetectable()) { |
- HIsUndetectable* compare = HIsUndetectable::cast(v); |
- ASSERT(compare->value()->representation().IsTagged()); |
- return new LIsUndetectableAndBranch(UseRegisterAtStart(compare->value()), |
- TempRegister()); |
- } else if (v->IsHasInstanceType()) { |
- HHasInstanceType* compare = HHasInstanceType::cast(v); |
- ASSERT(compare->value()->representation().IsTagged()); |
- return new LHasInstanceTypeAndBranch(UseRegisterAtStart(compare->value())); |
- } else if (v->IsHasCachedArrayIndex()) { |
- HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); |
- ASSERT(compare->value()->representation().IsTagged()); |
- return new LHasCachedArrayIndexAndBranch( |
- UseRegisterAtStart(compare->value())); |
- } else if (v->IsIsNull()) { |
- HIsNull* compare = HIsNull::cast(v); |
- ASSERT(compare->value()->representation().IsTagged()); |
- // We only need a temp register for non-strict compare. |
- LOperand* temp = compare->is_strict() ? NULL : TempRegister(); |
- return new LIsNullAndBranch(UseRegisterAtStart(compare->value()), temp); |
- } else if (v->IsIsObject()) { |
- HIsObject* compare = HIsObject::cast(v); |
- ASSERT(compare->value()->representation().IsTagged()); |
- return new LIsObjectAndBranch(UseRegisterAtStart(compare->value())); |
- } else if (v->IsCompareObjectEq()) { |
- HCompareObjectEq* compare = HCompareObjectEq::cast(v); |
- return new LCmpObjectEqAndBranch(UseRegisterAtStart(compare->left()), |
- UseRegisterAtStart(compare->right())); |
- } else if (v->IsCompareConstantEq()) { |
- HCompareConstantEq* compare = HCompareConstantEq::cast(v); |
- return new LCmpConstantEqAndBranch(UseRegisterAtStart(compare->value())); |
- } else if (v->IsTypeofIs()) { |
- HTypeofIs* typeof_is = HTypeofIs::cast(v); |
- return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); |
- } else if (v->IsIsConstructCall()) { |
- return new LIsConstructCallAndBranch(TempRegister()); |
- } else if (v->IsConstant()) { |
+ if (v->EmitAtUses()) { |
+ ASSERT(v->IsConstant()); |
+ ASSERT(!v->representation().IsDouble()); |
HBasicBlock* successor = HConstant::cast(v)->ToBoolean() |
? instr->FirstSuccessor() |
: instr->SecondSuccessor(); |
return new LGoto(successor->block_id()); |
- } else { |
- Abort("Undefined compare before branch"); |
- return NULL; |
} |
+ return new LBranch(UseRegisterAtStart(v)); |
} |
@@ -1468,85 +1380,83 @@ |
} |
-LInstruction* LChunkBuilder::DoCompare(HCompare* instr) { |
+LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) { |
Token::Value op = instr->token(); |
+ ASSERT(instr->left()->representation().IsTagged()); |
+ ASSERT(instr->right()->representation().IsTagged()); |
+ bool reversed = (op == Token::GT || op == Token::LTE); |
+ LOperand* left = UseFixed(instr->left(), reversed ? rax : rdx); |
+ LOperand* right = UseFixed(instr->right(), reversed ? rdx : rax); |
+ LCmpT* result = new LCmpT(left, right); |
+ return MarkAsCall(DefineFixed(result, rax), instr); |
+} |
+ |
+ |
+LInstruction* LChunkBuilder::DoCompareIDAndBranch( |
+ HCompareIDAndBranch* instr) { |
Representation r = instr->GetInputRepresentation(); |
if (r.IsInteger32()) { |
ASSERT(instr->left()->representation().IsInteger32()); |
ASSERT(instr->right()->representation().IsInteger32()); |
LOperand* left = UseRegisterAtStart(instr->left()); |
LOperand* right = UseOrConstantAtStart(instr->right()); |
- return DefineAsRegister(new LCmpID(left, right)); |
- } else if (r.IsDouble()) { |
+ return new LCmpIDAndBranch(left, right); |
+ } else { |
+ ASSERT(r.IsDouble()); |
ASSERT(instr->left()->representation().IsDouble()); |
ASSERT(instr->right()->representation().IsDouble()); |
LOperand* left = UseRegisterAtStart(instr->left()); |
LOperand* right = UseRegisterAtStart(instr->right()); |
- return DefineAsRegister(new LCmpID(left, right)); |
- } else { |
- ASSERT(instr->left()->representation().IsTagged()); |
- ASSERT(instr->right()->representation().IsTagged()); |
- bool reversed = (op == Token::GT || op == Token::LTE); |
- LOperand* left = UseFixed(instr->left(), reversed ? rax : rdx); |
- LOperand* right = UseFixed(instr->right(), reversed ? rdx : rax); |
- LCmpT* result = new LCmpT(left, right); |
- return MarkAsCall(DefineFixed(result, rax), instr); |
+ return new LCmpIDAndBranch(left, right); |
} |
} |
-LInstruction* LChunkBuilder::DoCompareObjectEq(HCompareObjectEq* instr) { |
+LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( |
+ HCompareObjectEqAndBranch* instr) { |
LOperand* left = UseRegisterAtStart(instr->left()); |
LOperand* right = UseRegisterAtStart(instr->right()); |
- LCmpObjectEq* result = new LCmpObjectEq(left, right); |
- return DefineAsRegister(result); |
+ return new LCmpObjectEqAndBranch(left, right); |
} |
-LInstruction* LChunkBuilder::DoCompareConstantEq( |
- HCompareConstantEq* instr) { |
- LOperand* left = UseRegisterAtStart(instr->value()); |
- return DefineAsRegister(new LCmpConstantEq(left)); |
+LInstruction* LChunkBuilder::DoCompareConstantEqAndBranch( |
+ HCompareConstantEqAndBranch* instr) { |
+ return new LCmpConstantEqAndBranch(UseRegisterAtStart(instr->value())); |
} |
-LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) { |
+LInstruction* LChunkBuilder::DoIsNullAndBranch(HIsNullAndBranch* instr) { |
ASSERT(instr->value()->representation().IsTagged()); |
- LOperand* value = UseRegisterAtStart(instr->value()); |
- |
- return DefineAsRegister(new LIsNull(value)); |
+ LOperand* temp = instr->is_strict() ? NULL : TempRegister(); |
+ return new LIsNullAndBranch(UseRegisterAtStart(instr->value()), temp); |
} |
-LInstruction* LChunkBuilder::DoIsObject(HIsObject* instr) { |
+LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { |
ASSERT(instr->value()->representation().IsTagged()); |
- LOperand* value = UseRegister(instr->value()); |
- |
- return DefineAsRegister(new LIsObject(value)); |
+ return new LIsObjectAndBranch(UseRegisterAtStart(instr->value())); |
} |
-LInstruction* LChunkBuilder::DoIsSmi(HIsSmi* instr) { |
+LInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) { |
ASSERT(instr->value()->representation().IsTagged()); |
- LOperand* value = UseAtStart(instr->value()); |
- |
- return DefineAsRegister(new LIsSmi(value)); |
+ return new LIsSmiAndBranch(Use(instr->value())); |
} |
-LInstruction* LChunkBuilder::DoIsUndetectable(HIsUndetectable* instr) { |
+LInstruction* LChunkBuilder::DoIsUndetectableAndBranch( |
+ HIsUndetectableAndBranch* instr) { |
ASSERT(instr->value()->representation().IsTagged()); |
- LOperand* value = UseRegisterAtStart(instr->value()); |
- |
- return DefineAsRegister(new LIsUndetectable(value)); |
+ return new LIsUndetectableAndBranch(UseRegisterAtStart(instr->value()), |
+ TempRegister()); |
} |
-LInstruction* LChunkBuilder::DoHasInstanceType(HHasInstanceType* instr) { |
+LInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch( |
+ HHasInstanceTypeAndBranch* instr) { |
ASSERT(instr->value()->representation().IsTagged()); |
- LOperand* value = UseRegisterAtStart(instr->value()); |
- |
- return DefineAsRegister(new LHasInstanceType(value)); |
+ return new LHasInstanceTypeAndBranch(UseRegisterAtStart(instr->value())); |
} |
@@ -1559,17 +1469,17 @@ |
} |
-LInstruction* LChunkBuilder::DoHasCachedArrayIndex( |
- HHasCachedArrayIndex* instr) { |
+LInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( |
+ HHasCachedArrayIndexAndBranch* instr) { |
ASSERT(instr->value()->representation().IsTagged()); |
- LOperand* value = UseRegister(instr->value()); |
- return DefineAsRegister(new LHasCachedArrayIndex(value)); |
+ return new LHasCachedArrayIndexAndBranch(UseRegisterAtStart(instr->value())); |
} |
-LInstruction* LChunkBuilder::DoClassOfTest(HClassOfTest* instr) { |
- Abort("Unimplemented: %s", "DoClassOfTest"); |
- return NULL; |
+LInstruction* LChunkBuilder::DoClassOfTestAndBranch( |
+ HClassOfTestAndBranch* instr) { |
+ return new LClassOfTestAndBranch(UseTempRegister(instr->value()), |
+ TempRegister()); |
} |
@@ -2152,13 +2062,14 @@ |
} |
-LInstruction* LChunkBuilder::DoTypeofIs(HTypeofIs* instr) { |
- return DefineSameAsFirst(new LTypeofIs(UseRegister(instr->value()))); |
+LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { |
+ return new LTypeofIsAndBranch(UseTempRegister(instr->value())); |
} |
-LInstruction* LChunkBuilder::DoIsConstructCall(HIsConstructCall* instr) { |
- return DefineAsRegister(new LIsConstructCall); |
+LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( |
+ HIsConstructCallAndBranch* instr) { |
+ return new LIsConstructCallAndBranch(TempRegister()); |
} |