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_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
8 | 8 |
9 #include "src/hydrogen-osr.h" | 9 #include "src/hydrogen-osr.h" |
10 #include "src/ia32/lithium-codegen-ia32.h" | 10 #include "src/ia32/lithium-codegen-ia32.h" |
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
957 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { | 957 if (FLAG_stress_pointer_maps && !instr->HasPointerMap()) { |
958 instr = AssignPointerMap(instr); | 958 instr = AssignPointerMap(instr); |
959 } | 959 } |
960 if (FLAG_stress_environments && !instr->HasEnvironment()) { | 960 if (FLAG_stress_environments && !instr->HasEnvironment()) { |
961 instr = AssignEnvironment(instr); | 961 instr = AssignEnvironment(instr); |
962 } | 962 } |
963 chunk_->AddInstruction(instr, current_block_); | 963 chunk_->AddInstruction(instr, current_block_); |
964 | 964 |
965 if (instr->IsCall()) { | 965 if (instr->IsCall()) { |
966 HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; | 966 HValue* hydrogen_value_for_lazy_bailout = hydrogen_val; |
967 LInstruction* instruction_needing_environment = NULL; | |
968 if (hydrogen_val->HasObservableSideEffects()) { | 967 if (hydrogen_val->HasObservableSideEffects()) { |
969 HSimulate* sim = HSimulate::cast(hydrogen_val->next()); | 968 HSimulate* sim = HSimulate::cast(hydrogen_val->next()); |
970 instruction_needing_environment = instr; | |
971 sim->ReplayEnvironment(current_block_->last_environment()); | 969 sim->ReplayEnvironment(current_block_->last_environment()); |
972 hydrogen_value_for_lazy_bailout = sim; | 970 hydrogen_value_for_lazy_bailout = sim; |
973 } | 971 } |
974 LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); | 972 LInstruction* bailout = AssignEnvironment(new(zone()) LLazyBailout()); |
975 bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); | 973 bailout->set_hydrogen_value(hydrogen_value_for_lazy_bailout); |
976 chunk_->AddInstruction(bailout, current_block_); | 974 chunk_->AddInstruction(bailout, current_block_); |
977 if (instruction_needing_environment != NULL) { | |
978 // Store the lazy deopt environment with the instruction if needed. | |
979 // Right now it is only used for LInstanceOfKnownGlobal. | |
980 instruction_needing_environment-> | |
981 SetDeferredLazyDeoptimizationEnvironment(bailout->environment()); | |
982 } | |
983 } | 975 } |
984 } | 976 } |
985 | 977 |
986 | 978 |
987 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { | 979 LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { |
988 return new(zone()) LGoto(instr->FirstSuccessor()); | 980 return new(zone()) LGoto(instr->FirstSuccessor()); |
989 } | 981 } |
990 | 982 |
991 | 983 |
992 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { | 984 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 } | 1019 } |
1028 | 1020 |
1029 | 1021 |
1030 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { | 1022 LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { |
1031 info()->MarkAsRequiresFrame(); | 1023 info()->MarkAsRequiresFrame(); |
1032 return DefineAsRegister(new(zone()) LArgumentsElements); | 1024 return DefineAsRegister(new(zone()) LArgumentsElements); |
1033 } | 1025 } |
1034 | 1026 |
1035 | 1027 |
1036 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { | 1028 LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) { |
1037 LOperand* left = UseFixed(instr->left(), InstanceofStub::left()); | 1029 LOperand* left = |
1038 LOperand* right = UseFixed(instr->right(), InstanceofStub::right()); | 1030 UseFixed(instr->left(), InstanceOfDescriptor::LeftRegister()); |
| 1031 LOperand* right = |
| 1032 UseFixed(instr->right(), InstanceOfDescriptor::RightRegister()); |
1039 LOperand* context = UseFixed(instr->context(), esi); | 1033 LOperand* context = UseFixed(instr->context(), esi); |
1040 LInstanceOf* result = new(zone()) LInstanceOf(context, left, right); | 1034 LInstanceOf* result = new (zone()) LInstanceOf(context, left, right); |
1041 return MarkAsCall(DefineFixed(result, eax), instr); | 1035 return MarkAsCall(DefineFixed(result, eax), instr); |
1042 } | 1036 } |
1043 | 1037 |
1044 | 1038 |
1045 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( | 1039 LInstruction* LChunkBuilder::DoHasInPrototypeChainAndBranch( |
1046 HInstanceOfKnownGlobal* instr) { | 1040 HHasInPrototypeChainAndBranch* instr) { |
1047 LInstanceOfKnownGlobal* result = | 1041 LOperand* object = UseRegister(instr->object()); |
1048 new(zone()) LInstanceOfKnownGlobal( | 1042 LOperand* prototype = UseRegister(instr->prototype()); |
1049 UseFixed(instr->context(), esi), | 1043 LOperand* temp = TempRegister(); |
1050 UseFixed(instr->left(), InstanceofStub::left()), | 1044 return new (zone()) LHasInPrototypeChainAndBranch(object, prototype, temp); |
1051 FixedTemp(edi)); | |
1052 return MarkAsCall(DefineFixed(result, eax), instr); | |
1053 } | 1045 } |
1054 | 1046 |
1055 | 1047 |
1056 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { | 1048 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { |
1057 LOperand* receiver = UseRegister(instr->receiver()); | 1049 LOperand* receiver = UseRegister(instr->receiver()); |
1058 LOperand* function = UseRegister(instr->function()); | 1050 LOperand* function = UseRegister(instr->function()); |
1059 LOperand* temp = TempRegister(); | 1051 LOperand* temp = TempRegister(); |
1060 LWrapReceiver* result = | 1052 LWrapReceiver* result = |
1061 new(zone()) LWrapReceiver(receiver, function, temp); | 1053 new(zone()) LWrapReceiver(receiver, function, temp); |
1062 return AssignEnvironment(DefineSameAsFirst(result)); | 1054 return AssignEnvironment(DefineSameAsFirst(result)); |
(...skipping 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2776 LAllocateBlockContext* result = | 2768 LAllocateBlockContext* result = |
2777 new(zone()) LAllocateBlockContext(context, function); | 2769 new(zone()) LAllocateBlockContext(context, function); |
2778 return MarkAsCall(DefineFixed(result, esi), instr); | 2770 return MarkAsCall(DefineFixed(result, esi), instr); |
2779 } | 2771 } |
2780 | 2772 |
2781 | 2773 |
2782 } // namespace internal | 2774 } // namespace internal |
2783 } // namespace v8 | 2775 } // namespace v8 |
2784 | 2776 |
2785 #endif // V8_TARGET_ARCH_IA32 | 2777 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |