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 <sstream> | 5 #include <sstream> |
6 | 6 |
7 #if V8_TARGET_ARCH_X87 | 7 #if V8_TARGET_ARCH_X87 |
8 | 8 |
9 #include "src/hydrogen-osr.h" | 9 #include "src/hydrogen-osr.h" |
10 #include "src/lithium-inl.h" | 10 #include "src/lithium-inl.h" |
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
973 // x87 register alive. To ensure all other values are still spilled, we | 973 // x87 register alive. To ensure all other values are still spilled, we |
974 // insert a fpu register barrier right before. | 974 // insert a fpu register barrier right before. |
975 LClobberDoubles* clobber = new(zone()) LClobberDoubles(isolate()); | 975 LClobberDoubles* clobber = new(zone()) LClobberDoubles(isolate()); |
976 clobber->set_hydrogen_value(hydrogen_val); | 976 clobber->set_hydrogen_value(hydrogen_val); |
977 chunk_->AddInstruction(clobber, current_block_); | 977 chunk_->AddInstruction(clobber, current_block_); |
978 } | 978 } |
979 chunk_->AddInstruction(instr, current_block_); | 979 chunk_->AddInstruction(instr, current_block_); |
980 | 980 |
981 if (instr->IsCall()) { | 981 if (instr->IsCall()) { |
982 HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; | 982 HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; |
983 LInstruction* instruction_needing_environment = NULL; | |
984 if (hydrogen_val->HasObservableSideEffects()) { | 983 if (hydrogen_val->HasObservableSideEffects()) { |
985 HSimulate* sim = HSimulate::cast(hydrogen_val->next()); | 984 HSimulate* sim = HSimulate::cast(hydrogen_val->next()); |
986 instruction_needing_environment = instr; | |
987 sim->ReplayEnvironment(current_block_->last_environment()); | 985 sim->ReplayEnvironment(current_block_->last_environment()); |
988 hydrogen_value_for_lazy_bailout = sim; | 986 hydrogen_value_for_lazy_bailout = sim; |
989 } | 987 } |
990 LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); | 988 LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); |
991 bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); | 989 bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); |
992 chunk_->AddInstruction(bailout, current_block_); | 990 chunk_->AddInstruction(bailout, current_block_); |
993 if (instruction_needing_environment != NULL) { | |
994 // Store the lazy deopt environment with the instruction if needed. | |
995 // Right now it is only used for LInstanceOfKnownGlobal. | |
996 instruction_needing_environment-> | |
997 SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); | |
998 } | |
999 } | 991 } |
1000 } | 992 } |
1001 | 993 |
1002 | 994 |
1003 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { | 995 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { |
1004 return new(zone()) LGoto(instr->FirstSuccessor()); | 996 return new(zone()) LGoto(instr->FirstSuccessor()); |
1005 } | 997 } |
1006 | 998 |
1007 | 999 |
1008 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { | 1000 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1045 } | 1037 } |
1046 | 1038 |
1047 | 1039 |
1048 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { | 1040 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { |
1049 info()->MarkAsRequiresFrame(); | 1041 info()->MarkAsRequiresFrame(); |
1050 return DefineAsRegister(new(zone()) LArgumentsElements); | 1042 return DefineAsRegister(new(zone()) LArgumentsElements); |
1051 } | 1043 } |
1052 | 1044 |
1053 | 1045 |
1054 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { | 1046 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { |
1055 LOperand* left = UseFixed(instr->left(), InstanceofStub::left()); | 1047 LOperand* left = |
1056 LOperand* right = UseFixed(instr->right(), InstanceofStub::right()); | 1048 UseFixed(instr->left(), InstanceOfDescriptor::LeftRegister()); |
| 1049 LOperand* right = |
| 1050 UseFixed(instr->right(), InstanceOfDescriptor::RightRegister()); |
1057 LOperand* context = UseFixed(instr->context(), esi); | 1051 LOperand* context = UseFixed(instr->context(), esi); |
1058 LInstanceOf* result = new(zone()) LInstanceOf(context, left, right); | 1052 LInstanceOf* result = new (zone()) LInstanceOf(context, left, right); |
1059 return MarkAsCall(DefineFixed(result, eax), instr); | 1053 return MarkAsCall(DefineFixed(result, eax), instr); |
1060 } | 1054 } |
1061 | 1055 |
1062 | 1056 |
1063 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( | 1057 LInstruction* LChunkBuilder::DoHasInPrototypeChainAndBranch( |
1064 HInstanceOfKnownGlobal* instr) { | 1058 HHasInPrototypeChainAndBranch* instr) { |
1065 LInstanceOfKnownGlobal* result = | 1059 LOperand* object = UseRegister(instr->object()); |
1066 new(zone()) LInstanceOfKnownGlobal( | 1060 LOperand* prototype = UseRegister(instr->prototype()); |
1067 UseFixed(instr->context(), esi), | 1061 LOperand* temp = TempRegister(); |
1068 UseFixed(instr->left(), InstanceofStub::left()), | 1062 return new (zone()) LHasInPrototypeChainAndBranch(object, prototype, temp); |
1069 FixedTemp(edi)); | |
1070 return MarkAsCall(DefineFixed(result, eax), instr); | |
1071 } | 1063 } |
1072 | 1064 |
1073 | 1065 |
1074 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { | 1066 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { |
1075 LOperand* receiver = UseRegister(instr->receiver()); | 1067 LOperand* receiver = UseRegister(instr->receiver()); |
1076 LOperand* function = UseRegister(instr->function()); | 1068 LOperand* function = UseRegister(instr->function()); |
1077 LOperand* temp = TempRegister(); | 1069 LOperand* temp = TempRegister(); |
1078 LWrapReceiver* result = | 1070 LWrapReceiver* result = |
1079 new(zone()) LWrapReceiver(receiver, function, temp); | 1071 new(zone()) LWrapReceiver(receiver, function, temp); |
1080 return AssignEnvironment(DefineSameAsFirst(result)); | 1072 return AssignEnvironment(DefineSameAsFirst(result)); |
(...skipping 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2780 LAllocateBlockContext* result = | 2772 LAllocateBlockContext* result = |
2781 new(zone()) LAllocateBlockContext(context, function); | 2773 new(zone()) LAllocateBlockContext(context, function); |
2782 return MarkAsCall(DefineFixed(result, esi), instr); | 2774 return MarkAsCall(DefineFixed(result, esi), instr); |
2783 } | 2775 } |
2784 | 2776 |
2785 | 2777 |
2786 } // namespace internal | 2778 } // namespace internal |
2787 } // namespace v8 | 2779 } // namespace v8 |
2788 | 2780 |
2789 #endif // V8_TARGET_ARCH_X87 | 2781 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |