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