| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "lithium-allocator-inl.h" | 7 #include "lithium-allocator-inl.h" |
| 8 #include "mips/lithium-mips.h" | 8 #include "mips/lithium-mips.h" |
| 9 #include "mips/lithium-codegen-mips.h" | 9 #include "mips/lithium-codegen-mips.h" |
| 10 #include "hydrogen-osr.h" | 10 #include "hydrogen-osr.h" |
| (...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 842 LDummyUse(UseAny(current->OperandAt(0)))); | 842 LDummyUse(UseAny(current->OperandAt(0)))); |
| 843 } | 843 } |
| 844 for (int i = 1; i < current->OperandCount(); ++i) { | 844 for (int i = 1; i < current->OperandCount(); ++i) { |
| 845 if (current->OperandAt(i)->IsControlInstruction()) continue; | 845 if (current->OperandAt(i)->IsControlInstruction()) continue; |
| 846 LInstruction* dummy = | 846 LInstruction* dummy = |
| 847 new(zone()) LDummyUse(UseAny(current->OperandAt(i))); | 847 new(zone()) LDummyUse(UseAny(current->OperandAt(i))); |
| 848 dummy->set_hydrogen_value(current); | 848 dummy->set_hydrogen_value(current); |
| 849 chunk_->AddInstruction(dummy, current_block_); | 849 chunk_->AddInstruction(dummy, current_block_); |
| 850 } | 850 } |
| 851 } else { | 851 } else { |
| 852 instr = current->CompileToLithium(this); | 852 HBasicBlock* successor; |
| 853 if (current->IsControlInstruction() && |
| 854 HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) && |
| 855 successor != NULL) { |
| 856 instr = new(zone()) LGoto(successor); |
| 857 } else { |
| 858 instr = current->CompileToLithium(this); |
| 859 } |
| 853 } | 860 } |
| 854 | 861 |
| 855 argument_count_ += current->argument_delta(); | 862 argument_count_ += current->argument_delta(); |
| 856 ASSERT(argument_count_ >= 0); | 863 ASSERT(argument_count_ >= 0); |
| 857 | 864 |
| 858 if (instr != NULL) { | 865 if (instr != NULL) { |
| 859 AddInstruction(instr, current); | 866 AddInstruction(instr, current); |
| 860 } | 867 } |
| 861 | 868 |
| 862 current_instruction_ = old_current; | 869 current_instruction_ = old_current; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 928 } | 935 } |
| 929 } | 936 } |
| 930 | 937 |
| 931 | 938 |
| 932 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { | 939 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { |
| 933 return new(zone()) LGoto(instr->FirstSuccessor()); | 940 return new(zone()) LGoto(instr->FirstSuccessor()); |
| 934 } | 941 } |
| 935 | 942 |
| 936 | 943 |
| 937 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { | 944 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { |
| 938 LInstruction* goto_instr = CheckElideControlInstruction(instr); | |
| 939 if (goto_instr != NULL) return goto_instr; | |
| 940 | |
| 941 HValue* value = instr->value(); | 945 HValue* value = instr->value(); |
| 942 Representation r = value->representation(); | 946 Representation r = value->representation(); |
| 943 HType type = value->type(); | 947 HType type = value->type(); |
| 944 ToBooleanStub::Types expected = instr->expected_input_types(); | 948 ToBooleanStub::Types expected = instr->expected_input_types(); |
| 945 if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); | 949 if (expected.IsEmpty()) expected = ToBooleanStub::Types::Generic(); |
| 946 | 950 |
| 947 bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || | 951 bool easy_case = !r.IsTagged() || type.IsBoolean() || type.IsSmi() || |
| 948 type.IsJSArray() || type.IsHeapNumber() || type.IsString(); | 952 type.IsJSArray() || type.IsHeapNumber() || type.IsString(); |
| 949 LInstruction* branch = new(zone()) LBranch(UseRegister(value)); | 953 LInstruction* branch = new(zone()) LBranch(UseRegister(value)); |
| 950 if (!easy_case && | 954 if (!easy_case && |
| 951 ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || | 955 ((!expected.Contains(ToBooleanStub::SMI) && expected.NeedsMap()) || |
| 952 !expected.IsGeneric())) { | 956 !expected.IsGeneric())) { |
| 953 branch = AssignEnvironment(branch); | 957 branch = AssignEnvironment(branch); |
| 954 } | 958 } |
| 955 return branch; | 959 return branch; |
| 956 } | 960 } |
| 957 | 961 |
| 958 | 962 |
| 959 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { | 963 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { |
| 960 LInstruction* goto_instr = CheckElideControlInstruction(instr); | |
| 961 if (goto_instr != NULL) return goto_instr; | |
| 962 | |
| 963 ASSERT(instr->value()->representation().IsTagged()); | 964 ASSERT(instr->value()->representation().IsTagged()); |
| 964 LOperand* value = UseRegisterAtStart(instr->value()); | 965 LOperand* value = UseRegisterAtStart(instr->value()); |
| 965 LOperand* temp = TempRegister(); | 966 LOperand* temp = TempRegister(); |
| 966 return new(zone()) LCmpMapAndBranch(value, temp); | 967 return new(zone()) LCmpMapAndBranch(value, temp); |
| 967 } | 968 } |
| 968 | 969 |
| 969 | 970 |
| 970 LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { | 971 LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { |
| 971 info()->MarkAsRequiresFrame(); | 972 info()->MarkAsRequiresFrame(); |
| 972 return DefineAsRegister( | 973 return DefineAsRegister( |
| (...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1621 LOperand* context = UseFixed(instr->context(), cp); | 1622 LOperand* context = UseFixed(instr->context(), cp); |
| 1622 LOperand* left = UseFixed(instr->left(), a1); | 1623 LOperand* left = UseFixed(instr->left(), a1); |
| 1623 LOperand* right = UseFixed(instr->right(), a0); | 1624 LOperand* right = UseFixed(instr->right(), a0); |
| 1624 LCmpT* result = new(zone()) LCmpT(context, left, right); | 1625 LCmpT* result = new(zone()) LCmpT(context, left, right); |
| 1625 return MarkAsCall(DefineFixed(result, v0), instr); | 1626 return MarkAsCall(DefineFixed(result, v0), instr); |
| 1626 } | 1627 } |
| 1627 | 1628 |
| 1628 | 1629 |
| 1629 LInstruction* LChunkBuilder::DoCompareNumericAndBranch( | 1630 LInstruction* LChunkBuilder::DoCompareNumericAndBranch( |
| 1630 HCompareNumericAndBranch* instr) { | 1631 HCompareNumericAndBranch* instr) { |
| 1631 LInstruction* goto_instr = CheckElideControlInstruction(instr); | |
| 1632 if (goto_instr != NULL) return goto_instr; | |
| 1633 Representation r = instr->representation(); | 1632 Representation r = instr->representation(); |
| 1634 if (r.IsSmiOrInteger32()) { | 1633 if (r.IsSmiOrInteger32()) { |
| 1635 ASSERT(instr->left()->representation().Equals(r)); | 1634 ASSERT(instr->left()->representation().Equals(r)); |
| 1636 ASSERT(instr->right()->representation().Equals(r)); | 1635 ASSERT(instr->right()->representation().Equals(r)); |
| 1637 LOperand* left = UseRegisterOrConstantAtStart(instr->left()); | 1636 LOperand* left = UseRegisterOrConstantAtStart(instr->left()); |
| 1638 LOperand* right = UseRegisterOrConstantAtStart(instr->right()); | 1637 LOperand* right = UseRegisterOrConstantAtStart(instr->right()); |
| 1639 return new(zone()) LCompareNumericAndBranch(left, right); | 1638 return new(zone()) LCompareNumericAndBranch(left, right); |
| 1640 } else { | 1639 } else { |
| 1641 ASSERT(r.IsDouble()); | 1640 ASSERT(r.IsDouble()); |
| 1642 ASSERT(instr->left()->representation().IsDouble()); | 1641 ASSERT(instr->left()->representation().IsDouble()); |
| 1643 ASSERT(instr->right()->representation().IsDouble()); | 1642 ASSERT(instr->right()->representation().IsDouble()); |
| 1644 LOperand* left = UseRegisterAtStart(instr->left()); | 1643 LOperand* left = UseRegisterAtStart(instr->left()); |
| 1645 LOperand* right = UseRegisterAtStart(instr->right()); | 1644 LOperand* right = UseRegisterAtStart(instr->right()); |
| 1646 return new(zone()) LCompareNumericAndBranch(left, right); | 1645 return new(zone()) LCompareNumericAndBranch(left, right); |
| 1647 } | 1646 } |
| 1648 } | 1647 } |
| 1649 | 1648 |
| 1650 | 1649 |
| 1651 LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( | 1650 LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( |
| 1652 HCompareObjectEqAndBranch* instr) { | 1651 HCompareObjectEqAndBranch* instr) { |
| 1653 LInstruction* goto_instr = CheckElideControlInstruction(instr); | |
| 1654 if (goto_instr != NULL) return goto_instr; | |
| 1655 LOperand* left = UseRegisterAtStart(instr->left()); | 1652 LOperand* left = UseRegisterAtStart(instr->left()); |
| 1656 LOperand* right = UseRegisterAtStart(instr->right()); | 1653 LOperand* right = UseRegisterAtStart(instr->right()); |
| 1657 return new(zone()) LCmpObjectEqAndBranch(left, right); | 1654 return new(zone()) LCmpObjectEqAndBranch(left, right); |
| 1658 } | 1655 } |
| 1659 | 1656 |
| 1660 | 1657 |
| 1661 LInstruction* LChunkBuilder::DoCompareHoleAndBranch( | 1658 LInstruction* LChunkBuilder::DoCompareHoleAndBranch( |
| 1662 HCompareHoleAndBranch* instr) { | 1659 HCompareHoleAndBranch* instr) { |
| 1663 LOperand* value = UseRegisterAtStart(instr->value()); | 1660 LOperand* value = UseRegisterAtStart(instr->value()); |
| 1664 return new(zone()) LCmpHoleAndBranch(value); | 1661 return new(zone()) LCmpHoleAndBranch(value); |
| 1665 } | 1662 } |
| 1666 | 1663 |
| 1667 | 1664 |
| 1668 LInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( | 1665 LInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( |
| 1669 HCompareMinusZeroAndBranch* instr) { | 1666 HCompareMinusZeroAndBranch* instr) { |
| 1670 LInstruction* goto_instr = CheckElideControlInstruction(instr); | |
| 1671 if (goto_instr != NULL) return goto_instr; | |
| 1672 LOperand* value = UseRegister(instr->value()); | 1667 LOperand* value = UseRegister(instr->value()); |
| 1673 LOperand* scratch = TempRegister(); | 1668 LOperand* scratch = TempRegister(); |
| 1674 return new(zone()) LCompareMinusZeroAndBranch(value, scratch); | 1669 return new(zone()) LCompareMinusZeroAndBranch(value, scratch); |
| 1675 } | 1670 } |
| 1676 | 1671 |
| 1677 | 1672 |
| 1678 LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { | 1673 LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { |
| 1679 ASSERT(instr->value()->representation().IsTagged()); | 1674 ASSERT(instr->value()->representation().IsTagged()); |
| 1680 LOperand* temp = TempRegister(); | 1675 LOperand* temp = TempRegister(); |
| 1681 return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()), | 1676 return new(zone()) LIsObjectAndBranch(UseRegisterAtStart(instr->value()), |
| (...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2426 | 2421 |
| 2427 | 2422 |
| 2428 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { | 2423 LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { |
| 2429 LOperand* context = UseFixed(instr->context(), cp); | 2424 LOperand* context = UseFixed(instr->context(), cp); |
| 2430 LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), a0)); | 2425 LTypeof* result = new(zone()) LTypeof(context, UseFixed(instr->value(), a0)); |
| 2431 return MarkAsCall(DefineFixed(result, v0), instr); | 2426 return MarkAsCall(DefineFixed(result, v0), instr); |
| 2432 } | 2427 } |
| 2433 | 2428 |
| 2434 | 2429 |
| 2435 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { | 2430 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { |
| 2436 LInstruction* goto_instr = CheckElideControlInstruction(instr); | |
| 2437 if (goto_instr != NULL) return goto_instr; | |
| 2438 | |
| 2439 return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); | 2431 return new(zone()) LTypeofIsAndBranch(UseTempRegister(instr->value())); |
| 2440 } | 2432 } |
| 2441 | 2433 |
| 2442 | 2434 |
| 2443 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( | 2435 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( |
| 2444 HIsConstructCallAndBranch* instr) { | 2436 HIsConstructCallAndBranch* instr) { |
| 2445 return new(zone()) LIsConstructCallAndBranch(TempRegister()); | 2437 return new(zone()) LIsConstructCallAndBranch(TempRegister()); |
| 2446 } | 2438 } |
| 2447 | 2439 |
| 2448 | 2440 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2528 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { | 2520 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { |
| 2529 LOperand* object = UseRegister(instr->object()); | 2521 LOperand* object = UseRegister(instr->object()); |
| 2530 LOperand* index = UseTempRegister(instr->index()); | 2522 LOperand* index = UseTempRegister(instr->index()); |
| 2531 LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); | 2523 LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); |
| 2532 LInstruction* result = DefineSameAsFirst(load); | 2524 LInstruction* result = DefineSameAsFirst(load); |
| 2533 return AssignPointerMap(result); | 2525 return AssignPointerMap(result); |
| 2534 } | 2526 } |
| 2535 | 2527 |
| 2536 | 2528 |
| 2537 } } // namespace v8::internal | 2529 } } // namespace v8::internal |
| OLD | NEW |