| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 operand->set_virtual_register(vreg); | 564 operand->set_virtual_register(vreg); |
| 565 return operand; | 565 return operand; |
| 566 } | 566 } |
| 567 | 567 |
| 568 | 568 |
| 569 int LPlatformChunk::GetNextSpillIndex() { | 569 int LPlatformChunk::GetNextSpillIndex() { |
| 570 return spill_slot_count_++; | 570 return spill_slot_count_++; |
| 571 } | 571 } |
| 572 | 572 |
| 573 | 573 |
| 574 LOperand* LPlatformChunk::GetNextSpillSlot(bool is_double) { | 574 LOperand* LPlatformChunk::GetNextSpillSlot(RegisterKind kind) { |
| 575 int index = GetNextSpillIndex(); | 575 int index = GetNextSpillIndex(); |
| 576 if (is_double) { | 576 if (kind == DOUBLE_REGISTERS) { |
| 577 return LDoubleStackSlot::Create(index, zone()); | 577 return LDoubleStackSlot::Create(index, zone()); |
| 578 } else { | 578 } else { |
| 579 ASSERT(kind == GENERAL_REGISTERS); |
| 579 return LStackSlot::Create(index, zone()); | 580 return LStackSlot::Create(index, zone()); |
| 580 } | 581 } |
| 581 } | 582 } |
| 582 | 583 |
| 583 | 584 |
| 584 LOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { | 585 LOperand* LChunkBuilder::FixedTemp(DoubleRegister reg) { |
| 585 LUnallocated* operand = ToUnallocated(reg); | 586 LUnallocated* operand = ToUnallocated(reg); |
| 586 ASSERT(operand->HasFixedPolicy()); | 587 ASSERT(operand->HasFixedPolicy()); |
| 587 return operand; | 588 return operand; |
| 588 } | 589 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 } | 681 } |
| 681 block->set_argument_count(argument_count_); | 682 block->set_argument_count(argument_count_); |
| 682 current_block_ = NULL; | 683 current_block_ = NULL; |
| 683 } | 684 } |
| 684 | 685 |
| 685 | 686 |
| 686 void LChunkBuilder::VisitInstruction(HInstruction* current) { | 687 void LChunkBuilder::VisitInstruction(HInstruction* current) { |
| 687 HInstruction* old_current = current_instruction_; | 688 HInstruction* old_current = current_instruction_; |
| 688 current_instruction_ = current; | 689 current_instruction_ = current; |
| 689 if (current->has_position()) position_ = current->position(); | 690 if (current->has_position()) position_ = current->position(); |
| 690 LInstruction* instr = current->CompileToLithium(this); | 691 |
| 692 LInstruction* instr = NULL; |
| 693 if (current->CanReplaceWithDummyUses()) { |
| 694 HValue* first_operand = current->OperandCount() == 0 |
| 695 ? graph()->GetConstant1() |
| 696 : current->OperandAt(0); |
| 697 instr = DefineAsRegister(new(zone()) LDummyUse(UseAny(first_operand))); |
| 698 for (int i = 1; i < current->OperandCount(); ++i) { |
| 699 LInstruction* dummy = |
| 700 new(zone()) LDummyUse(UseAny(current->OperandAt(i))); |
| 701 dummy->set_hydrogen_value(current); |
| 702 chunk_->AddInstruction(dummy, current_block_); |
| 703 } |
| 704 } else { |
| 705 instr = current->CompileToLithium(this); |
| 706 } |
| 707 |
| 708 argument_count_ += current->argument_delta(); |
| 709 ASSERT(argument_count_ >= 0); |
| 691 | 710 |
| 692 if (instr != NULL) { | 711 if (instr != NULL) { |
| 712 // Associate the hydrogen instruction first, since we may need it for |
| 713 // the ClobbersRegisters() or ClobbersDoubleRegisters() calls below. |
| 714 instr->set_hydrogen_value(current); |
| 715 |
| 693 #if DEBUG | 716 #if DEBUG |
| 694 // Make sure that the lithium instruction has either no fixed register | 717 // Make sure that the lithium instruction has either no fixed register |
| 695 // constraints in temps or the result OR no uses that are only used at | 718 // constraints in temps or the result OR no uses that are only used at |
| 696 // start. If this invariant doesn't hold, the register allocator can decide | 719 // start. If this invariant doesn't hold, the register allocator can decide |
| 697 // to insert a split of a range immediately before the instruction due to an | 720 // to insert a split of a range immediately before the instruction due to an |
| 698 // already allocated register needing to be used for the instruction's fixed | 721 // already allocated register needing to be used for the instruction's fixed |
| 699 // register constraint. In this case, the register allocator won't see an | 722 // register constraint. In this case, the register allocator won't see an |
| 700 // interference between the split child and the use-at-start (it would if | 723 // interference between the split child and the use-at-start (it would if |
| 701 // the it was just a plain use), so it is free to move the split child into | 724 // the it was just a plain use), so it is free to move the split child into |
| 702 // the same register that is used for the use-at-start. | 725 // the same register that is used for the use-at-start. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 719 } | 742 } |
| 720 #endif | 743 #endif |
| 721 | 744 |
| 722 instr->set_position(position_); | 745 instr->set_position(position_); |
| 723 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { | 746 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { |
| 724 instr = AssignPointerMap(instr); | 747 instr = AssignPointerMap(instr); |
| 725 } | 748 } |
| 726 if (FLAG_stress_environments && !instr->HasEnvironment()) { | 749 if (FLAG_stress_environments && !instr->HasEnvironment()) { |
| 727 instr = AssignEnvironment(instr); | 750 instr = AssignEnvironment(instr); |
| 728 } | 751 } |
| 729 instr->set_hydrogen_value(current); | |
| 730 chunk_->AddInstruction(instr, current_block_); | 752 chunk_->AddInstruction(instr, current_block_); |
| 731 } | 753 } |
| 732 current_instruction_ = old_current; | 754 current_instruction_ = old_current; |
| 733 } | 755 } |
| 734 | 756 |
| 735 | 757 |
| 736 LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { | 758 LInstruction* LChunkBuilder::AssignEnvironment(LInstruction* instr) { |
| 737 HEnvironment* hydrogen_env = current_block_->last_environment(); | 759 HEnvironment* hydrogen_env = current_block_->last_environment(); |
| 738 int argument_index_accumulator = 0; | 760 int argument_index_accumulator = 0; |
| 739 ZoneList<HValue*> objects_to_materialize(0, zone()); | 761 ZoneList<HValue*> objects_to_materialize(0, zone()); |
| (...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 | 1028 |
| 1007 | 1029 |
| 1008 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { | 1030 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { |
| 1009 LOperand* value = UseRegisterOrConstantAtStart(instr->index()); | 1031 LOperand* value = UseRegisterOrConstantAtStart(instr->index()); |
| 1010 LOperand* length = UseRegister(instr->length()); | 1032 LOperand* length = UseRegister(instr->length()); |
| 1011 return AssignEnvironment(new(zone()) LBoundsCheck(value, length)); | 1033 return AssignEnvironment(new(zone()) LBoundsCheck(value, length)); |
| 1012 } | 1034 } |
| 1013 | 1035 |
| 1014 | 1036 |
| 1015 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { | 1037 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { |
| 1038 LInstruction* goto_instr = CheckElideControlInstruction(instr); |
| 1039 if (goto_instr != NULL) return goto_instr; |
| 1040 |
| 1016 HValue* value = instr->value(); | 1041 HValue* value = instr->value(); |
| 1017 | |
| 1018 if (value->EmitAtUses()) { | |
| 1019 // TODO(all): Handle this case with CheckElideControlInstruction once | |
| 1020 // we've done the rebase. | |
| 1021 HBasicBlock* successor = HConstant::cast(value)->BooleanValue() | |
| 1022 ? instr->FirstSuccessor() | |
| 1023 : instr->SecondSuccessor(); | |
| 1024 return new(zone()) LGoto(successor->block_id()); | |
| 1025 } | |
| 1026 | |
| 1027 Representation r = value->representation(); | 1042 Representation r = value->representation(); |
| 1028 HType type = value->type(); | 1043 HType type = value->type(); |
| 1029 | 1044 |
| 1030 if (r.IsInteger32() || r.IsSmi() || r.IsDouble()) { | 1045 if (r.IsInteger32() || r.IsSmi() || r.IsDouble()) { |
| 1031 // These representations have simple checks that cannot deoptimize. | 1046 // These representations have simple checks that cannot deoptimize. |
| 1032 return new(zone()) LBranch(UseRegister(value), NULL, NULL); | 1047 return new(zone()) LBranch(UseRegister(value), NULL, NULL); |
| 1033 } else { | 1048 } else { |
| 1034 ASSERT(r.IsTagged()); | 1049 ASSERT(r.IsTagged()); |
| 1035 if (type.IsBoolean() || type.IsSmi() || type.IsJSArray() || | 1050 if (type.IsBoolean() || type.IsSmi() || type.IsJSArray() || |
| 1036 type.IsHeapNumber()) { | 1051 type.IsHeapNumber()) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1056 } else { | 1071 } else { |
| 1057 return AssignEnvironment( | 1072 return AssignEnvironment( |
| 1058 new(zone()) LBranch(UseRegister(value), temp1, temp2)); | 1073 new(zone()) LBranch(UseRegister(value), temp1, temp2)); |
| 1059 } | 1074 } |
| 1060 } | 1075 } |
| 1061 } | 1076 } |
| 1062 | 1077 |
| 1063 | 1078 |
| 1064 LInstruction* LChunkBuilder::DoCallConstantFunction( | 1079 LInstruction* LChunkBuilder::DoCallConstantFunction( |
| 1065 HCallConstantFunction* instr) { | 1080 HCallConstantFunction* instr) { |
| 1066 argument_count_ -= instr->argument_count(); | |
| 1067 return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, x0), instr); | 1081 return MarkAsCall(DefineFixed(new(zone()) LCallConstantFunction, x0), instr); |
| 1068 } | 1082 } |
| 1069 | 1083 |
| 1070 | 1084 |
| 1071 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { | 1085 LInstruction* LChunkBuilder::DoCallFunction(HCallFunction* instr) { |
| 1072 LOperand* function = UseFixed(instr->function(), x1); | 1086 LOperand* function = UseFixed(instr->function(), x1); |
| 1073 argument_count_ -= instr->argument_count(); | |
| 1074 LInstruction* result = DefineFixed(new(zone()) LCallFunction(function), x0); | 1087 LInstruction* result = DefineFixed(new(zone()) LCallFunction(function), x0); |
| 1075 // TODO(all): Uncomment the following line during the rebase. | 1088 // TODO(all): Uncomment the following line during the rebase. |
| 1076 // if (instr->IsTailCall()) return result; | 1089 // if (instr->IsTailCall()) return result; |
| 1077 return MarkAsCall(result, instr); | 1090 return MarkAsCall(result, instr); |
| 1078 } | 1091 } |
| 1079 | 1092 |
| 1080 | 1093 |
| 1081 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { | 1094 LInstruction* LChunkBuilder::DoCallGlobal(HCallGlobal* instr) { |
| 1082 argument_count_ -= instr->argument_count(); | |
| 1083 return MarkAsCall(DefineFixed(new(zone()) LCallGlobal, x0), instr); | 1095 return MarkAsCall(DefineFixed(new(zone()) LCallGlobal, x0), instr); |
| 1084 } | 1096 } |
| 1085 | 1097 |
| 1086 | 1098 |
| 1087 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { | 1099 LInstruction* LChunkBuilder::DoCallKeyed(HCallKeyed* instr) { |
| 1088 ASSERT(instr->key()->representation().IsTagged()); | 1100 ASSERT(instr->key()->representation().IsTagged()); |
| 1089 argument_count_ -= instr->argument_count(); | |
| 1090 LOperand* key = UseFixed(instr->key(), x2); | 1101 LOperand* key = UseFixed(instr->key(), x2); |
| 1091 return MarkAsCall(DefineFixed(new(zone()) LCallKeyed(key), x0), instr); | 1102 return MarkAsCall(DefineFixed(new(zone()) LCallKeyed(key), x0), instr); |
| 1092 } | 1103 } |
| 1093 | 1104 |
| 1094 | 1105 |
| 1095 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { | 1106 LInstruction* LChunkBuilder::DoCallKnownGlobal(HCallKnownGlobal* instr) { |
| 1096 argument_count_ -= instr->argument_count(); | |
| 1097 return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, x0), instr); | 1107 return MarkAsCall(DefineFixed(new(zone()) LCallKnownGlobal, x0), instr); |
| 1098 } | 1108 } |
| 1099 | 1109 |
| 1100 | 1110 |
| 1101 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { | 1111 LInstruction* LChunkBuilder::DoCallNamed(HCallNamed* instr) { |
| 1102 argument_count_ -= instr->argument_count(); | |
| 1103 return MarkAsCall(DefineFixed(new(zone()) LCallNamed, x0), instr); | 1112 return MarkAsCall(DefineFixed(new(zone()) LCallNamed, x0), instr); |
| 1104 } | 1113 } |
| 1105 | 1114 |
| 1106 | 1115 |
| 1107 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { | 1116 LInstruction* LChunkBuilder::DoCallNew(HCallNew* instr) { |
| 1108 // The call to CallConstructStub will expect the constructor to be in x1. | 1117 // The call to CallConstructStub will expect the constructor to be in x1. |
| 1109 LOperand* constructor = UseFixed(instr->constructor(), x1); | 1118 LOperand* constructor = UseFixed(instr->constructor(), x1); |
| 1110 argument_count_ -= instr->argument_count(); | |
| 1111 LCallNew* result = new(zone()) LCallNew(constructor); | 1119 LCallNew* result = new(zone()) LCallNew(constructor); |
| 1112 return MarkAsCall(DefineFixed(result, x0), instr); | 1120 return MarkAsCall(DefineFixed(result, x0), instr); |
| 1113 } | 1121 } |
| 1114 | 1122 |
| 1115 | 1123 |
| 1116 LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { | 1124 LInstruction* LChunkBuilder::DoCallNewArray(HCallNewArray* instr) { |
| 1117 // The call to ArrayConstructCode will expect the constructor to be in x1. | 1125 // The call to ArrayConstructCode will expect the constructor to be in x1. |
| 1118 LOperand* constructor = UseFixed(instr->constructor(), x1); | 1126 LOperand* constructor = UseFixed(instr->constructor(), x1); |
| 1119 argument_count_ -= instr->argument_count(); | |
| 1120 LCallNewArray* result = new(zone()) LCallNewArray(constructor); | 1127 LCallNewArray* result = new(zone()) LCallNewArray(constructor); |
| 1121 return MarkAsCall(DefineFixed(result, x0), instr); | 1128 return MarkAsCall(DefineFixed(result, x0), instr); |
| 1122 } | 1129 } |
| 1123 | 1130 |
| 1124 | 1131 |
| 1125 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { | 1132 LInstruction* LChunkBuilder::DoCallRuntime(HCallRuntime* instr) { |
| 1126 argument_count_ -= instr->argument_count(); | |
| 1127 return MarkAsCall(DefineFixed(new(zone()) LCallRuntime, x0), instr); | 1133 return MarkAsCall(DefineFixed(new(zone()) LCallRuntime, x0), instr); |
| 1128 } | 1134 } |
| 1129 | 1135 |
| 1130 | 1136 |
| 1131 LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { | 1137 LInstruction* LChunkBuilder::DoCallStub(HCallStub* instr) { |
| 1132 argument_count_ -= instr->argument_count(); | |
| 1133 return MarkAsCall(DefineFixed(new(zone()) LCallStub, x0), instr); | 1138 return MarkAsCall(DefineFixed(new(zone()) LCallStub, x0), instr); |
| 1134 } | 1139 } |
| 1135 | 1140 |
| 1136 | 1141 |
| 1137 LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { | 1142 LInstruction* LChunkBuilder::DoCapturedObject(HCapturedObject* instr) { |
| 1138 instr->ReplayEnvironment(current_block_->last_environment()); | 1143 instr->ReplayEnvironment(current_block_->last_environment()); |
| 1139 | 1144 |
| 1140 // There are no real uses of a captured object. | 1145 // There are no real uses of a captured object. |
| 1141 return NULL; | 1146 return NULL; |
| 1142 } | 1147 } |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1382 return new(zone()) LCmpHoleAndBranchT(value); | 1387 return new(zone()) LCmpHoleAndBranchT(value); |
| 1383 } else { | 1388 } else { |
| 1384 LOperand* temp = TempRegister(); | 1389 LOperand* temp = TempRegister(); |
| 1385 return new(zone()) LCmpHoleAndBranchD(value, temp); | 1390 return new(zone()) LCmpHoleAndBranchD(value, temp); |
| 1386 } | 1391 } |
| 1387 } | 1392 } |
| 1388 | 1393 |
| 1389 | 1394 |
| 1390 LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( | 1395 LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( |
| 1391 HCompareObjectEqAndBranch* instr) { | 1396 HCompareObjectEqAndBranch* instr) { |
| 1397 LInstruction* goto_instr = CheckElideControlInstruction(instr); |
| 1398 if (goto_instr != NULL) return goto_instr; |
| 1399 |
| 1392 LOperand* left = UseRegisterAtStart(instr->left()); | 1400 LOperand* left = UseRegisterAtStart(instr->left()); |
| 1393 LOperand* right = UseRegisterAtStart(instr->right()); | 1401 LOperand* right = UseRegisterAtStart(instr->right()); |
| 1394 return new(zone()) LCmpObjectEqAndBranch(left, right); | 1402 return new(zone()) LCmpObjectEqAndBranch(left, right); |
| 1395 } | 1403 } |
| 1396 | 1404 |
| 1397 | 1405 |
| 1398 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { | 1406 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { |
| 1399 ASSERT(instr->value()->representation().IsTagged()); | 1407 ASSERT(instr->value()->representation().IsTagged()); |
| 1400 LOperand* value = UseRegisterAtStart(instr->value()); | 1408 LOperand* value = UseRegisterAtStart(instr->value()); |
| 1401 LOperand* temp = TempRegister(); | 1409 LOperand* temp = TempRegister(); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1547 } | 1555 } |
| 1548 | 1556 |
| 1549 | 1557 |
| 1550 LInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) { | 1558 LInstruction* LChunkBuilder::DoGlobalReceiver(HGlobalReceiver* instr) { |
| 1551 LOperand* global_object = UseRegisterAtStart(instr->value()); | 1559 LOperand* global_object = UseRegisterAtStart(instr->value()); |
| 1552 return DefineAsRegister(new(zone()) LGlobalReceiver(global_object)); | 1560 return DefineAsRegister(new(zone()) LGlobalReceiver(global_object)); |
| 1553 } | 1561 } |
| 1554 | 1562 |
| 1555 | 1563 |
| 1556 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { | 1564 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { |
| 1557 return new(zone()) LGoto(instr->FirstSuccessor()->block_id()); | 1565 return new(zone()) LGoto(instr->FirstSuccessor()); |
| 1558 } | 1566 } |
| 1559 | 1567 |
| 1560 | 1568 |
| 1561 LInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( | 1569 LInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch( |
| 1562 HHasCachedArrayIndexAndBranch* instr) { | 1570 HHasCachedArrayIndexAndBranch* instr) { |
| 1563 ASSERT(instr->value()->representation().IsTagged()); | 1571 ASSERT(instr->value()->representation().IsTagged()); |
| 1564 return new(zone()) LHasCachedArrayIndexAndBranch( | 1572 return new(zone()) LHasCachedArrayIndexAndBranch( |
| 1565 UseRegisterAtStart(instr->value()), TempRegister()); | 1573 UseRegisterAtStart(instr->value()), TempRegister()); |
| 1566 } | 1574 } |
| 1567 | 1575 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1599 | 1607 |
| 1600 LInstruction* LChunkBuilder::DoInstanceSize(HInstanceSize* instr) { | 1608 LInstruction* LChunkBuilder::DoInstanceSize(HInstanceSize* instr) { |
| 1601 LOperand* object = UseRegisterAtStart(instr->object()); | 1609 LOperand* object = UseRegisterAtStart(instr->object()); |
| 1602 return DefineAsRegister(new(zone()) LInstanceSize(object)); | 1610 return DefineAsRegister(new(zone()) LInstanceSize(object)); |
| 1603 } | 1611 } |
| 1604 | 1612 |
| 1605 | 1613 |
| 1606 LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { | 1614 LInstruction* LChunkBuilder::DoInvokeFunction(HInvokeFunction* instr) { |
| 1607 // The function is required (by MacroAssembler::InvokeFunction) to be in x1. | 1615 // The function is required (by MacroAssembler::InvokeFunction) to be in x1. |
| 1608 LOperand* function = UseFixed(instr->function(), x1); | 1616 LOperand* function = UseFixed(instr->function(), x1); |
| 1609 argument_count_ -= instr->argument_count(); | |
| 1610 LInvokeFunction* result = new(zone()) LInvokeFunction(function); | 1617 LInvokeFunction* result = new(zone()) LInvokeFunction(function); |
| 1611 return MarkAsCall(DefineFixed(result, x0), instr, CANNOT_DEOPTIMIZE_EAGERLY); | 1618 return MarkAsCall(DefineFixed(result, x0), instr, CANNOT_DEOPTIMIZE_EAGERLY); |
| 1612 } | 1619 } |
| 1613 | 1620 |
| 1614 | 1621 |
| 1615 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( | 1622 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( |
| 1616 HIsConstructCallAndBranch* instr) { | 1623 HIsConstructCallAndBranch* instr) { |
| 1617 return new(zone()) LIsConstructCallAndBranch(TempRegister(), TempRegister()); | 1624 return new(zone()) LIsConstructCallAndBranch(TempRegister(), TempRegister()); |
| 1618 } | 1625 } |
| 1619 | 1626 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1649 } | 1656 } |
| 1650 | 1657 |
| 1651 | 1658 |
| 1652 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { | 1659 LInstruction* LChunkBuilder::DoLeaveInlined(HLeaveInlined* instr) { |
| 1653 LInstruction* pop = NULL; | 1660 LInstruction* pop = NULL; |
| 1654 HEnvironment* env = current_block_->last_environment(); | 1661 HEnvironment* env = current_block_->last_environment(); |
| 1655 | 1662 |
| 1656 if (env->entry()->arguments_pushed()) { | 1663 if (env->entry()->arguments_pushed()) { |
| 1657 int argument_count = env->arguments_environment()->parameter_count(); | 1664 int argument_count = env->arguments_environment()->parameter_count(); |
| 1658 pop = new(zone()) LDrop(argument_count); | 1665 pop = new(zone()) LDrop(argument_count); |
| 1659 argument_count_ -= argument_count; | 1666 ASSERT(instr->argument_delta() == -argument_count); |
| 1660 } | 1667 } |
| 1661 | 1668 |
| 1662 HEnvironment* outer = | 1669 HEnvironment* outer = |
| 1663 current_block_->last_environment()->DiscardInlined(false); | 1670 current_block_->last_environment()->DiscardInlined(false); |
| 1664 current_block_->UpdateEnvironment(outer); | 1671 current_block_->UpdateEnvironment(outer); |
| 1665 | 1672 |
| 1666 return pop; | 1673 return pop; |
| 1667 } | 1674 } |
| 1668 | 1675 |
| 1669 | 1676 |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1971 ? UseFixedDouble(instr->right(), d1) | 1978 ? UseFixedDouble(instr->right(), d1) |
| 1972 : UseFixed(instr->right(), x11); | 1979 : UseFixed(instr->right(), x11); |
| 1973 LPower* result = new(zone()) LPower(left, right); | 1980 LPower* result = new(zone()) LPower(left, right); |
| 1974 return MarkAsCall(DefineFixedDouble(result, d0), | 1981 return MarkAsCall(DefineFixedDouble(result, d0), |
| 1975 instr, | 1982 instr, |
| 1976 CAN_DEOPTIMIZE_EAGERLY); | 1983 CAN_DEOPTIMIZE_EAGERLY); |
| 1977 } | 1984 } |
| 1978 | 1985 |
| 1979 | 1986 |
| 1980 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { | 1987 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { |
| 1981 ++argument_count_; | |
| 1982 LOperand* argument = UseRegister(instr->argument()); | 1988 LOperand* argument = UseRegister(instr->argument()); |
| 1983 return new(zone()) LPushArgument(argument); | 1989 return new(zone()) LPushArgument(argument); |
| 1984 } | 1990 } |
| 1985 | 1991 |
| 1986 | 1992 |
| 1987 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { | 1993 LInstruction* LChunkBuilder::DoRegExpLiteral(HRegExpLiteral* instr) { |
| 1988 return MarkAsCall(DefineFixed(new(zone()) LRegExpLiteral, x0), instr); | 1994 return MarkAsCall(DefineFixed(new(zone()) LRegExpLiteral, x0), instr); |
| 1989 } | 1995 } |
| 1990 | 1996 |
| 1991 | 1997 |
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2544 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { | 2550 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { |
| 2545 LOperand* receiver = UseRegister(instr->receiver()); | 2551 LOperand* receiver = UseRegister(instr->receiver()); |
| 2546 LOperand* function = UseRegisterAtStart(instr->function()); | 2552 LOperand* function = UseRegisterAtStart(instr->function()); |
| 2547 LOperand* temp = TempRegister(); | 2553 LOperand* temp = TempRegister(); |
| 2548 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function, temp); | 2554 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function, temp); |
| 2549 return AssignEnvironment(DefineAsRegister(result)); | 2555 return AssignEnvironment(DefineAsRegister(result)); |
| 2550 } | 2556 } |
| 2551 | 2557 |
| 2552 | 2558 |
| 2553 } } // namespace v8::internal | 2559 } } // namespace v8::internal |
| OLD | NEW |