Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index 07e355f5cb60ece132bafbcf47a1a853f21bc842..28164c7aaf13f0751562b2bad7ba5893f0d3ba07 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -2087,10 +2087,12 @@ int LCodeGen::GetNextEmittedBlock() const { |
} |
-void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) { |
+template<class InstrType> |
+void LCodeGen::EmitBranch(InstrType instr, Condition cc) { |
+ int right_block = instr->FalseDestination(chunk_); |
+ int left_block = instr->TrueDestination(chunk_); |
+ |
int next_block = GetNextEmittedBlock(); |
- right_block = chunk_->LookupDestination(right_block); |
- left_block = chunk_->LookupDestination(left_block); |
if (right_block == left_block) { |
EmitGoto(left_block); |
@@ -2106,22 +2108,19 @@ void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) { |
void LCodeGen::DoBranch(LBranch* instr) { |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- |
Representation r = instr->hydrogen()->value()->representation(); |
if (r.IsSmiOrInteger32()) { |
ASSERT(!info()->IsStub()); |
Register reg = ToRegister(instr->value()); |
__ test(reg, Operand(reg)); |
- EmitBranch(true_block, false_block, not_zero); |
+ EmitBranch(instr, not_zero); |
} else if (r.IsDouble()) { |
ASSERT(!info()->IsStub()); |
CpuFeatureScope scope(masm(), SSE2); |
XMMRegister reg = ToDoubleRegister(instr->value()); |
__ xorps(xmm0, xmm0); |
__ ucomisd(reg, xmm0); |
- EmitBranch(true_block, false_block, not_equal); |
+ EmitBranch(instr, not_equal); |
} else { |
ASSERT(r.IsTagged()); |
Register reg = ToRegister(instr->value()); |
@@ -2129,15 +2128,12 @@ void LCodeGen::DoBranch(LBranch* instr) { |
if (type.IsBoolean()) { |
ASSERT(!info()->IsStub()); |
__ cmp(reg, factory()->true_value()); |
- EmitBranch(true_block, false_block, equal); |
+ EmitBranch(instr, equal); |
} else if (type.IsSmi()) { |
ASSERT(!info()->IsStub()); |
__ test(reg, Operand(reg)); |
- EmitBranch(true_block, false_block, not_equal); |
+ EmitBranch(instr, not_equal); |
} else { |
- Label* true_label = chunk_->GetAssemblyLabel(true_block); |
- Label* false_label = chunk_->GetAssemblyLabel(false_block); |
- |
ToBooleanStub::Types expected = instr->hydrogen()->expected_input_types(); |
// Avoid deopts in the case where we've never executed this path before. |
if (expected.IsEmpty()) expected = ToBooleanStub::all_types(); |
@@ -2145,27 +2141,27 @@ void LCodeGen::DoBranch(LBranch* instr) { |
if (expected.Contains(ToBooleanStub::UNDEFINED)) { |
// undefined -> false. |
__ cmp(reg, factory()->undefined_value()); |
- __ j(equal, false_label); |
+ __ j(equal, instr->FalseLabel(chunk_)); |
} |
if (expected.Contains(ToBooleanStub::BOOLEAN)) { |
// true -> true. |
__ cmp(reg, factory()->true_value()); |
- __ j(equal, true_label); |
+ __ j(equal, instr->TrueLabel(chunk_)); |
// false -> false. |
__ cmp(reg, factory()->false_value()); |
- __ j(equal, false_label); |
+ __ j(equal, instr->FalseLabel(chunk_)); |
} |
if (expected.Contains(ToBooleanStub::NULL_TYPE)) { |
// 'null' -> false. |
__ cmp(reg, factory()->null_value()); |
- __ j(equal, false_label); |
+ __ j(equal, instr->FalseLabel(chunk_)); |
} |
if (expected.Contains(ToBooleanStub::SMI)) { |
// Smis: 0 -> false, all other -> true. |
__ test(reg, Operand(reg)); |
- __ j(equal, false_label); |
- __ JumpIfSmi(reg, true_label); |
+ __ j(equal, instr->FalseLabel(chunk_)); |
+ __ JumpIfSmi(reg, instr->TrueLabel(chunk_)); |
} else if (expected.NeedsMap()) { |
// If we need a map later and have a Smi -> deopt. |
__ test(reg, Immediate(kSmiTagMask)); |
@@ -2182,14 +2178,14 @@ void LCodeGen::DoBranch(LBranch* instr) { |
// Undetectable -> false. |
__ test_b(FieldOperand(map, Map::kBitFieldOffset), |
1 << Map::kIsUndetectable); |
- __ j(not_zero, false_label); |
+ __ j(not_zero, instr->FalseLabel(chunk_)); |
} |
} |
if (expected.Contains(ToBooleanStub::SPEC_OBJECT)) { |
// spec object -> true. |
__ CmpInstanceType(map, FIRST_SPEC_OBJECT_TYPE); |
- __ j(above_equal, true_label); |
+ __ j(above_equal, instr->TrueLabel(chunk_)); |
} |
if (expected.Contains(ToBooleanStub::STRING)) { |
@@ -2198,15 +2194,15 @@ void LCodeGen::DoBranch(LBranch* instr) { |
__ CmpInstanceType(map, FIRST_NONSTRING_TYPE); |
__ j(above_equal, ¬_string, Label::kNear); |
__ cmp(FieldOperand(reg, String::kLengthOffset), Immediate(0)); |
- __ j(not_zero, true_label); |
- __ jmp(false_label); |
+ __ j(not_zero, instr->TrueLabel(chunk_)); |
+ __ jmp(instr->FalseLabel(chunk_)); |
__ bind(¬_string); |
} |
if (expected.Contains(ToBooleanStub::SYMBOL)) { |
// Symbol value -> true. |
__ CmpInstanceType(map, SYMBOL_TYPE); |
- __ j(equal, true_label); |
+ __ j(equal, instr->TrueLabel(chunk_)); |
} |
if (expected.Contains(ToBooleanStub::HEAP_NUMBER)) { |
@@ -2224,8 +2220,8 @@ void LCodeGen::DoBranch(LBranch* instr) { |
__ fld_d(FieldOperand(reg, HeapNumber::kValueOffset)); |
__ FCmp(); |
} |
- __ j(zero, false_label); |
- __ jmp(true_label); |
+ __ j(zero, instr->FalseLabel(chunk_)); |
+ __ jmp(instr->TrueLabel(chunk_)); |
__ bind(¬_heap_number); |
} |
@@ -2238,7 +2234,7 @@ void LCodeGen::DoBranch(LBranch* instr) { |
void LCodeGen::EmitGoto(int block) { |
if (!IsNextEmittedBlock(block)) { |
- __ jmp(chunk_->GetAssemblyLabel(chunk_->LookupDestination(block))); |
+ __ jmp(chunk_->GetAssemblyLabel(LookupDestination(block))); |
} |
} |
@@ -2279,17 +2275,14 @@ Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) { |
void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) { |
LOperand* left = instr->left(); |
LOperand* right = instr->right(); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
Condition cc = TokenToCondition(instr->op(), instr->is_double()); |
if (left->IsConstantOperand() && right->IsConstantOperand()) { |
// We can statically evaluate the comparison. |
double left_val = ToDouble(LConstantOperand::cast(left)); |
double right_val = ToDouble(LConstantOperand::cast(right)); |
- int next_block = |
- EvalComparison(instr->op(), left_val, right_val) ? true_block |
- : false_block; |
+ int next_block = EvalComparison(instr->op(), left_val, right_val) ? |
+ instr->TrueDestination(chunk_) : instr->FalseDestination(chunk_); |
EmitGoto(next_block); |
} else { |
if (instr->is_double()) { |
@@ -2297,7 +2290,7 @@ void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) { |
// Don't base result on EFLAGS when a NaN is involved. Instead |
// jump to the false block. |
__ ucomisd(ToDoubleRegister(left), ToDoubleRegister(right)); |
- __ j(parity_even, chunk_->GetAssemblyLabel(false_block)); |
+ __ j(parity_even, instr->FalseLabel(chunk_)); |
} else { |
if (right->IsConstantOperand()) { |
int32_t const_value = ToInteger32(LConstantOperand::cast(right)); |
@@ -2319,15 +2312,13 @@ void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) { |
__ cmp(ToRegister(left), ToOperand(right)); |
} |
} |
- EmitBranch(true_block, false_block, cc); |
+ EmitBranch(instr, cc); |
} |
} |
void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) { |
Register left = ToRegister(instr->left()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
if (instr->right()->IsConstantOperand()) { |
Handle<Object> right = ToHandle(LConstantOperand::cast(instr->right())); |
@@ -2336,17 +2327,15 @@ void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) { |
Operand right = ToOperand(instr->right()); |
__ cmp(left, right); |
} |
- EmitBranch(true_block, false_block, equal); |
+ EmitBranch(instr, equal); |
} |
void LCodeGen::DoCmpConstantEqAndBranch(LCmpConstantEqAndBranch* instr) { |
Register left = ToRegister(instr->left()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
__ cmp(left, instr->hydrogen()->right()); |
- EmitBranch(true_block, false_block, equal); |
+ EmitBranch(instr, equal); |
} |
@@ -2377,14 +2366,10 @@ void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) { |
Register reg = ToRegister(instr->value()); |
Register temp = ToRegister(instr->temp()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- Label* true_label = chunk_->GetAssemblyLabel(true_block); |
- Label* false_label = chunk_->GetAssemblyLabel(false_block); |
- |
- Condition true_cond = EmitIsObject(reg, temp, false_label, true_label); |
+ Condition true_cond = EmitIsObject( |
+ reg, temp, instr->FalseLabel(chunk_), instr->TrueLabel(chunk_)); |
- EmitBranch(true_block, false_block, true_cond); |
+ EmitBranch(instr, true_cond); |
} |
@@ -2403,24 +2388,17 @@ void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) { |
Register reg = ToRegister(instr->value()); |
Register temp = ToRegister(instr->temp()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- Label* false_label = chunk_->GetAssemblyLabel(false_block); |
+ Condition true_cond = EmitIsString(reg, temp, instr->FalseLabel(chunk_)); |
- Condition true_cond = EmitIsString(reg, temp, false_label); |
- |
- EmitBranch(true_block, false_block, true_cond); |
+ EmitBranch(instr, true_cond); |
} |
void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { |
Operand input = ToOperand(instr->value()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- |
__ test(input, Immediate(kSmiTagMask)); |
- EmitBranch(true_block, false_block, zero); |
+ EmitBranch(instr, zero); |
} |
@@ -2428,15 +2406,12 @@ void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { |
Register input = ToRegister(instr->value()); |
Register temp = ToRegister(instr->temp()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- |
STATIC_ASSERT(kSmiTag == 0); |
- __ JumpIfSmi(input, chunk_->GetAssemblyLabel(false_block)); |
+ __ JumpIfSmi(input, instr->FalseLabel(chunk_)); |
__ mov(temp, FieldOperand(input, HeapObject::kMapOffset)); |
__ test_b(FieldOperand(temp, Map::kBitFieldOffset), |
1 << Map::kIsUndetectable); |
- EmitBranch(true_block, false_block, not_zero); |
+ EmitBranch(instr, not_zero); |
} |
@@ -2462,8 +2437,6 @@ static Condition ComputeCompareCondition(Token::Value op) { |
void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { |
Token::Value op = instr->op(); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
Handle<Code> ic = CompareIC::GetUninitialized(isolate(), op); |
CallCode(ic, RelocInfo::CODE_TARGET, instr); |
@@ -2471,7 +2444,7 @@ void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { |
Condition condition = ComputeCompareCondition(op); |
__ test(eax, Operand(eax)); |
- EmitBranch(true_block, false_block, condition); |
+ EmitBranch(instr, condition); |
} |
@@ -2499,15 +2472,10 @@ void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { |
Register input = ToRegister(instr->value()); |
Register temp = ToRegister(instr->temp()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- |
- Label* false_label = chunk_->GetAssemblyLabel(false_block); |
- |
- __ JumpIfSmi(input, false_label); |
+ __ JumpIfSmi(input, instr->FalseLabel(chunk_)); |
__ CmpObjectType(input, TestType(instr->hydrogen()), temp); |
- EmitBranch(true_block, false_block, BranchCondition(instr->hydrogen())); |
+ EmitBranch(instr, BranchCondition(instr->hydrogen())); |
} |
@@ -2526,12 +2494,9 @@ void LCodeGen::DoHasCachedArrayIndexAndBranch( |
LHasCachedArrayIndexAndBranch* instr) { |
Register input = ToRegister(instr->value()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- |
__ test(FieldOperand(input, String::kHashFieldOffset), |
Immediate(String::kContainsCachedArrayIndexMask)); |
- EmitBranch(true_block, false_block, equal); |
+ EmitBranch(instr, equal); |
} |
@@ -2607,25 +2572,17 @@ void LCodeGen::DoClassOfTestAndBranch(LClassOfTestAndBranch* instr) { |
Handle<String> class_name = instr->hydrogen()->class_name(); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
+ EmitClassOfTest(instr->TrueLabel(chunk_), instr->FalseLabel(chunk_), |
+ class_name, input, temp, temp2); |
- Label* true_label = chunk_->GetAssemblyLabel(true_block); |
- Label* false_label = chunk_->GetAssemblyLabel(false_block); |
- |
- EmitClassOfTest(true_label, false_label, class_name, input, temp, temp2); |
- |
- EmitBranch(true_block, false_block, equal); |
+ EmitBranch(instr, equal); |
} |
void LCodeGen::DoCmpMapAndBranch(LCmpMapAndBranch* instr) { |
Register reg = ToRegister(instr->value()); |
- int true_block = instr->true_block_id(); |
- int false_block = instr->false_block_id(); |
- |
__ cmp(FieldOperand(reg, HeapObject::kMapOffset), instr->map()); |
- EmitBranch(true_block, false_block, equal); |
+ EmitBranch(instr, equal); |
} |
@@ -6243,15 +6200,12 @@ void LCodeGen::DoTypeof(LTypeof* instr) { |
void LCodeGen::DoTypeofIsAndBranch(LTypeofIsAndBranch* instr) { |
Register input = ToRegister(instr->value()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
- Label* true_label = chunk_->GetAssemblyLabel(true_block); |
- Label* false_label = chunk_->GetAssemblyLabel(false_block); |
Condition final_branch_condition = |
- EmitTypeofIs(true_label, false_label, input, instr->type_literal()); |
+ EmitTypeofIs(instr->TrueLabel(chunk_), instr->FalseLabel(chunk_), |
+ input, instr->type_literal()); |
if (final_branch_condition != no_condition) { |
- EmitBranch(true_block, false_block, final_branch_condition); |
+ EmitBranch(instr, final_branch_condition); |
} |
} |
@@ -6332,11 +6286,9 @@ Condition LCodeGen::EmitTypeofIs(Label* true_label, |
void LCodeGen::DoIsConstructCallAndBranch(LIsConstructCallAndBranch* instr) { |
Register temp = ToRegister(instr->temp()); |
- int true_block = chunk_->LookupDestination(instr->true_block_id()); |
- int false_block = chunk_->LookupDestination(instr->false_block_id()); |
EmitIsConstructCall(temp); |
- EmitBranch(true_block, false_block, equal); |
+ EmitBranch(instr, equal); |
} |