OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 "src/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
(...skipping 2219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2230 | 2230 |
2231 return Pop(); | 2231 return Pop(); |
2232 } | 2232 } |
2233 | 2233 |
2234 HValue* HGraphBuilder::BuildToNumber(HValue* input) { | 2234 HValue* HGraphBuilder::BuildToNumber(HValue* input) { |
2235 if (input->type().IsTaggedNumber()) { | 2235 if (input->type().IsTaggedNumber()) { |
2236 return input; | 2236 return input; |
2237 } | 2237 } |
2238 Callable callable = CodeFactory::ToNumber(isolate()); | 2238 Callable callable = CodeFactory::ToNumber(isolate()); |
2239 HValue* stub = Add<HConstant>(callable.code()); | 2239 HValue* stub = Add<HConstant>(callable.code()); |
2240 HValue* values[] = {context(), input}; | 2240 HValue* values[] = {input}; |
2241 HCallWithDescriptor* instr = Add<HCallWithDescriptor>( | 2241 HCallWithDescriptor* instr = Add<HCallWithDescriptor>( |
2242 stub, 0, callable.descriptor(), ArrayVector(values)); | 2242 stub, 0, callable.descriptor(), ArrayVector(values)); |
2243 instr->set_type(HType::TaggedNumber()); | 2243 instr->set_type(HType::TaggedNumber()); |
2244 return instr; | 2244 return instr; |
2245 } | 2245 } |
2246 | 2246 |
2247 | 2247 |
2248 HValue* HGraphBuilder::BuildToObject(HValue* receiver) { | 2248 HValue* HGraphBuilder::BuildToObject(HValue* receiver) { |
2249 NoObservableSideEffectsScope scope(this); | 2249 NoObservableSideEffectsScope scope(this); |
2250 | 2250 |
(...skipping 3004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5255 New<HCompareObjectEqAndBranch>(enumerable_map, type, if_fast, if_slow)); | 5255 New<HCompareObjectEqAndBranch>(enumerable_map, type, if_fast, if_slow)); |
5256 set_current_block(if_fast); | 5256 set_current_block(if_fast); |
5257 { | 5257 { |
5258 // The enum cache for enumerable is still valid, no need to check key. | 5258 // The enum cache for enumerable is still valid, no need to check key. |
5259 Push(key); | 5259 Push(key); |
5260 Goto(if_join); | 5260 Goto(if_join); |
5261 } | 5261 } |
5262 set_current_block(if_slow); | 5262 set_current_block(if_slow); |
5263 { | 5263 { |
5264 Callable callable = CodeFactory::ForInFilter(isolate()); | 5264 Callable callable = CodeFactory::ForInFilter(isolate()); |
5265 HValue* values[] = {context(), key, enumerable}; | 5265 HValue* values[] = {key, enumerable}; |
5266 HConstant* stub_value = Add<HConstant>(callable.code()); | 5266 HConstant* stub_value = Add<HConstant>(callable.code()); |
5267 Push(Add<HCallWithDescriptor>(stub_value, 0, callable.descriptor(), | 5267 Push(Add<HCallWithDescriptor>(stub_value, 0, callable.descriptor(), |
5268 ArrayVector(values))); | 5268 ArrayVector(values))); |
5269 Add<HSimulate>(stmt->FilterId()); | 5269 Add<HSimulate>(stmt->FilterId()); |
5270 FinishCurrentBlock(New<HCompareObjectEqAndBranch>( | 5270 FinishCurrentBlock(New<HCompareObjectEqAndBranch>( |
5271 Top(), graph()->GetConstantUndefined(), if_slow_skip, if_slow_pass)); | 5271 Top(), graph()->GetConstantUndefined(), if_slow_skip, if_slow_pass)); |
5272 } | 5272 } |
5273 set_current_block(if_slow_pass); | 5273 set_current_block(if_slow_pass); |
5274 { Goto(if_join); } | 5274 { Goto(if_join); } |
5275 set_current_block(if_slow_skip); | 5275 set_current_block(if_slow_skip); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5363 expr, current_info()->script(), top_info()); | 5363 expr, current_info()->script(), top_info()); |
5364 // We also have a stack overflow if the recursive compilation did. | 5364 // We also have a stack overflow if the recursive compilation did. |
5365 if (HasStackOverflow()) return; | 5365 if (HasStackOverflow()) return; |
5366 // Use the fast case closure allocation code that allocates in new | 5366 // Use the fast case closure allocation code that allocates in new |
5367 // space for nested functions that don't need pretenuring. | 5367 // space for nested functions that don't need pretenuring. |
5368 HConstant* shared_info_value = Add<HConstant>(shared_info); | 5368 HConstant* shared_info_value = Add<HConstant>(shared_info); |
5369 HInstruction* instr; | 5369 HInstruction* instr; |
5370 if (!expr->pretenure()) { | 5370 if (!expr->pretenure()) { |
5371 FastNewClosureStub stub(isolate()); | 5371 FastNewClosureStub stub(isolate()); |
5372 FastNewClosureDescriptor descriptor(isolate()); | 5372 FastNewClosureDescriptor descriptor(isolate()); |
5373 HValue* values[] = {context(), shared_info_value}; | 5373 HValue* values[] = {shared_info_value}; |
5374 HConstant* stub_value = Add<HConstant>(stub.GetCode()); | 5374 HConstant* stub_value = Add<HConstant>(stub.GetCode()); |
5375 instr = New<HCallWithDescriptor>(stub_value, 0, descriptor, | 5375 instr = New<HCallWithDescriptor>(stub_value, 0, descriptor, |
5376 ArrayVector(values)); | 5376 ArrayVector(values)); |
5377 } else { | 5377 } else { |
5378 Add<HPushArguments>(shared_info_value); | 5378 Add<HPushArguments>(shared_info_value); |
5379 Runtime::FunctionId function_id = | 5379 Runtime::FunctionId function_id = |
5380 expr->pretenure() ? Runtime::kNewClosure_Tenured : Runtime::kNewClosure; | 5380 expr->pretenure() ? Runtime::kNewClosure_Tenured : Runtime::kNewClosure; |
5381 instr = New<HCallRuntime>(Runtime::FunctionForId(function_id), 1); | 5381 instr = New<HCallRuntime>(Runtime::FunctionForId(function_id), 1); |
5382 } | 5382 } |
5383 return ast_context()->ReturnInstruction(instr, expr->id()); | 5383 return ast_context()->ReturnInstruction(instr, expr->id()); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5589 } | 5589 } |
5590 } else { | 5590 } else { |
5591 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); | 5591 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); |
5592 | 5592 |
5593 HValue* vector_value = Add<HConstant>(vector); | 5593 HValue* vector_value = Add<HConstant>(vector); |
5594 HValue* slot_value = | 5594 HValue* slot_value = |
5595 Add<HConstant>(vector->GetIndex(expr->VariableFeedbackSlot())); | 5595 Add<HConstant>(vector->GetIndex(expr->VariableFeedbackSlot())); |
5596 Callable callable = CodeFactory::LoadGlobalICInOptimizedCode( | 5596 Callable callable = CodeFactory::LoadGlobalICInOptimizedCode( |
5597 isolate(), ast_context()->typeof_mode()); | 5597 isolate(), ast_context()->typeof_mode()); |
5598 HValue* stub = Add<HConstant>(callable.code()); | 5598 HValue* stub = Add<HConstant>(callable.code()); |
5599 HValue* values[] = {context(), slot_value, vector_value}; | 5599 HValue* values[] = {slot_value, vector_value}; |
5600 HCallWithDescriptor* instr = New<HCallWithDescriptor>( | 5600 HCallWithDescriptor* instr = New<HCallWithDescriptor>( |
5601 stub, 0, callable.descriptor(), ArrayVector(values)); | 5601 stub, 0, callable.descriptor(), ArrayVector(values)); |
5602 return ast_context()->ReturnInstruction(instr, expr->id()); | 5602 return ast_context()->ReturnInstruction(instr, expr->id()); |
5603 } | 5603 } |
5604 } | 5604 } |
5605 | 5605 |
5606 case VariableLocation::PARAMETER: | 5606 case VariableLocation::PARAMETER: |
5607 case VariableLocation::LOCAL: { | 5607 case VariableLocation::LOCAL: { |
5608 HValue* value = LookupAndMakeLive(variable); | 5608 HValue* value = LookupAndMakeLive(variable); |
5609 if (value == graph()->GetConstantHole()) { | 5609 if (value == graph()->GetConstantHole()) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5647 HConstant* instr = New<HConstant>(expr->value()); | 5647 HConstant* instr = New<HConstant>(expr->value()); |
5648 return ast_context()->ReturnInstruction(instr, expr->id()); | 5648 return ast_context()->ReturnInstruction(instr, expr->id()); |
5649 } | 5649 } |
5650 | 5650 |
5651 | 5651 |
5652 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { | 5652 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
5653 DCHECK(!HasStackOverflow()); | 5653 DCHECK(!HasStackOverflow()); |
5654 DCHECK(current_block() != NULL); | 5654 DCHECK(current_block() != NULL); |
5655 DCHECK(current_block()->HasPredecessor()); | 5655 DCHECK(current_block()->HasPredecessor()); |
5656 Callable callable = CodeFactory::FastCloneRegExp(isolate()); | 5656 Callable callable = CodeFactory::FastCloneRegExp(isolate()); |
5657 HValue* values[] = { | 5657 HValue* values[] = {AddThisFunction(), Add<HConstant>(expr->literal_index()), |
5658 context(), AddThisFunction(), Add<HConstant>(expr->literal_index()), | 5658 Add<HConstant>(expr->pattern()), |
5659 Add<HConstant>(expr->pattern()), Add<HConstant>(expr->flags())}; | 5659 Add<HConstant>(expr->flags())}; |
5660 HConstant* stub_value = Add<HConstant>(callable.code()); | 5660 HConstant* stub_value = Add<HConstant>(callable.code()); |
5661 HInstruction* instr = New<HCallWithDescriptor>( | 5661 HInstruction* instr = New<HCallWithDescriptor>( |
5662 stub_value, 0, callable.descriptor(), ArrayVector(values)); | 5662 stub_value, 0, callable.descriptor(), ArrayVector(values)); |
5663 return ast_context()->ReturnInstruction(instr, expr->id()); | 5663 return ast_context()->ReturnInstruction(instr, expr->id()); |
5664 } | 5664 } |
5665 | 5665 |
5666 | 5666 |
5667 static bool CanInlinePropertyAccess(Handle<Map> map) { | 5667 static bool CanInlinePropertyAccess(Handle<Map> map) { |
5668 if (map->instance_type() == HEAP_NUMBER_TYPE) return true; | 5668 if (map->instance_type() == HEAP_NUMBER_TYPE) return true; |
5669 if (map->instance_type() < FIRST_NONSTRING_TYPE) return true; | 5669 if (map->instance_type() < FIRST_NONSTRING_TYPE) return true; |
(...skipping 1117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6787 BuildGetNativeContext(), nullptr, | 6787 BuildGetNativeContext(), nullptr, |
6788 HObjectAccess::ForContextSlot(Context::EXTENSION_INDEX)); | 6788 HObjectAccess::ForContextSlot(Context::EXTENSION_INDEX)); |
6789 Handle<TypeFeedbackVector> vector = | 6789 Handle<TypeFeedbackVector> vector = |
6790 handle(current_feedback_vector(), isolate()); | 6790 handle(current_feedback_vector(), isolate()); |
6791 HValue* name = Add<HConstant>(var->name()); | 6791 HValue* name = Add<HConstant>(var->name()); |
6792 HValue* vector_value = Add<HConstant>(vector); | 6792 HValue* vector_value = Add<HConstant>(vector); |
6793 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); | 6793 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); |
6794 Callable callable = CodeFactory::StoreICInOptimizedCode( | 6794 Callable callable = CodeFactory::StoreICInOptimizedCode( |
6795 isolate(), function_language_mode()); | 6795 isolate(), function_language_mode()); |
6796 HValue* stub = Add<HConstant>(callable.code()); | 6796 HValue* stub = Add<HConstant>(callable.code()); |
6797 HValue* values[] = {context(), global_object, name, | 6797 HValue* values[] = {global_object, name, value, slot_value, vector_value}; |
6798 value, slot_value, vector_value}; | |
6799 HCallWithDescriptor* instr = Add<HCallWithDescriptor>( | 6798 HCallWithDescriptor* instr = Add<HCallWithDescriptor>( |
6800 stub, 0, callable.descriptor(), ArrayVector(values)); | 6799 stub, 0, callable.descriptor(), ArrayVector(values)); |
6801 USE(instr); | 6800 USE(instr); |
6802 DCHECK(instr->HasObservableSideEffects()); | 6801 DCHECK(instr->HasObservableSideEffects()); |
6803 Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); | 6802 Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
6804 } | 6803 } |
6805 } | 6804 } |
6806 | 6805 |
6807 | 6806 |
6808 void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { | 6807 void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7096 DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess, | 7095 DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess, |
7097 Deoptimizer::SOFT); | 7096 Deoptimizer::SOFT); |
7098 } | 7097 } |
7099 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); | 7098 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); |
7100 | 7099 |
7101 HValue* key = Add<HConstant>(name); | 7100 HValue* key = Add<HConstant>(name); |
7102 HValue* vector_value = Add<HConstant>(vector); | 7101 HValue* vector_value = Add<HConstant>(vector); |
7103 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); | 7102 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); |
7104 | 7103 |
7105 if (access_type == LOAD) { | 7104 if (access_type == LOAD) { |
7106 HValue* values[] = {context(), object, key, slot_value, vector_value}; | 7105 HValue* values[] = {object, key, slot_value, vector_value}; |
7107 if (!expr->AsProperty()->key()->IsPropertyName()) { | 7106 if (!expr->AsProperty()->key()->IsPropertyName()) { |
7108 // It's possible that a keyed load of a constant string was converted | 7107 // It's possible that a keyed load of a constant string was converted |
7109 // to a named load. Here, at the last minute, we need to make sure to | 7108 // to a named load. Here, at the last minute, we need to make sure to |
7110 // use a generic Keyed Load if we are using the type vector, because | 7109 // use a generic Keyed Load if we are using the type vector, because |
7111 // it has to share information with full code. | 7110 // it has to share information with full code. |
7112 HLoadKeyedGeneric* result = | 7111 HLoadKeyedGeneric* result = |
7113 New<HLoadKeyedGeneric>(object, key, vector, slot); | 7112 New<HLoadKeyedGeneric>(object, key, vector, slot); |
7114 return result; | 7113 return result; |
7115 } | 7114 } |
7116 | 7115 |
7117 Callable callable = CodeFactory::LoadICInOptimizedCode(isolate()); | 7116 Callable callable = CodeFactory::LoadICInOptimizedCode(isolate()); |
7118 HValue* stub = Add<HConstant>(callable.code()); | 7117 HValue* stub = Add<HConstant>(callable.code()); |
7119 HCallWithDescriptor* result = New<HCallWithDescriptor>( | 7118 HCallWithDescriptor* result = New<HCallWithDescriptor>( |
7120 stub, 0, callable.descriptor(), ArrayVector(values)); | 7119 stub, 0, callable.descriptor(), ArrayVector(values)); |
7121 return result; | 7120 return result; |
7122 | 7121 |
7123 } else { | 7122 } else { |
7124 HValue* values[] = {context(), object, key, | 7123 HValue* values[] = {object, key, value, slot_value, vector_value}; |
7125 value, slot_value, vector_value}; | |
7126 | |
7127 if (vector->GetKind(slot) == FeedbackVectorSlotKind::KEYED_STORE_IC) { | 7124 if (vector->GetKind(slot) == FeedbackVectorSlotKind::KEYED_STORE_IC) { |
7128 // It's possible that a keyed store of a constant string was converted | 7125 // It's possible that a keyed store of a constant string was converted |
7129 // to a named store. Here, at the last minute, we need to make sure to | 7126 // to a named store. Here, at the last minute, we need to make sure to |
7130 // use a generic Keyed Store if we are using the type vector, because | 7127 // use a generic Keyed Store if we are using the type vector, because |
7131 // it has to share information with full code. | 7128 // it has to share information with full code. |
7132 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode( | 7129 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode( |
7133 isolate(), function_language_mode()); | 7130 isolate(), function_language_mode()); |
7134 HValue* stub = Add<HConstant>(callable.code()); | 7131 HValue* stub = Add<HConstant>(callable.code()); |
7135 HCallWithDescriptor* result = New<HCallWithDescriptor>( | 7132 HCallWithDescriptor* result = New<HCallWithDescriptor>( |
7136 stub, 0, callable.descriptor(), ArrayVector(values)); | 7133 stub, 0, callable.descriptor(), ArrayVector(values)); |
(...skipping 14 matching lines...) Expand all Loading... |
7151 HValue* object, HValue* key, HValue* value) { | 7148 HValue* object, HValue* key, HValue* value) { |
7152 Handle<TypeFeedbackVector> vector = | 7149 Handle<TypeFeedbackVector> vector = |
7153 handle(current_feedback_vector(), isolate()); | 7150 handle(current_feedback_vector(), isolate()); |
7154 if (access_type == LOAD) { | 7151 if (access_type == LOAD) { |
7155 HLoadKeyedGeneric* result = | 7152 HLoadKeyedGeneric* result = |
7156 New<HLoadKeyedGeneric>(object, key, vector, slot); | 7153 New<HLoadKeyedGeneric>(object, key, vector, slot); |
7157 return result; | 7154 return result; |
7158 } else { | 7155 } else { |
7159 HValue* vector_value = Add<HConstant>(vector); | 7156 HValue* vector_value = Add<HConstant>(vector); |
7160 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); | 7157 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); |
7161 HValue* values[] = {context(), object, key, | 7158 HValue* values[] = {object, key, value, slot_value, vector_value}; |
7162 value, slot_value, vector_value}; | |
7163 | 7159 |
7164 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode( | 7160 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode( |
7165 isolate(), function_language_mode()); | 7161 isolate(), function_language_mode()); |
7166 HValue* stub = Add<HConstant>(callable.code()); | 7162 HValue* stub = Add<HConstant>(callable.code()); |
7167 HCallWithDescriptor* result = New<HCallWithDescriptor>( | 7163 HCallWithDescriptor* result = New<HCallWithDescriptor>( |
7168 stub, 0, callable.descriptor(), ArrayVector(values)); | 7164 stub, 0, callable.descriptor(), ArrayVector(values)); |
7169 return result; | 7165 return result; |
7170 } | 7166 } |
7171 } | 7167 } |
7172 | 7168 |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7851 HInstruction* HOptimizedGraphBuilder::NewCallFunction( | 7847 HInstruction* HOptimizedGraphBuilder::NewCallFunction( |
7852 HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode, | 7848 HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode, |
7853 ConvertReceiverMode convert_mode, TailCallMode tail_call_mode) { | 7849 ConvertReceiverMode convert_mode, TailCallMode tail_call_mode) { |
7854 if (syntactic_tail_call_mode == TailCallMode::kAllow) { | 7850 if (syntactic_tail_call_mode == TailCallMode::kAllow) { |
7855 BuildEnsureCallable(function); | 7851 BuildEnsureCallable(function); |
7856 } else { | 7852 } else { |
7857 DCHECK_EQ(TailCallMode::kDisallow, tail_call_mode); | 7853 DCHECK_EQ(TailCallMode::kDisallow, tail_call_mode); |
7858 } | 7854 } |
7859 HValue* arity = Add<HConstant>(argument_count - 1); | 7855 HValue* arity = Add<HConstant>(argument_count - 1); |
7860 | 7856 |
7861 HValue* op_vals[] = {context(), function, arity}; | 7857 HValue* op_vals[] = {function, arity}; |
7862 | 7858 |
7863 Callable callable = | 7859 Callable callable = |
7864 CodeFactory::Call(isolate(), convert_mode, tail_call_mode); | 7860 CodeFactory::Call(isolate(), convert_mode, tail_call_mode); |
7865 HConstant* stub = Add<HConstant>(callable.code()); | 7861 HConstant* stub = Add<HConstant>(callable.code()); |
7866 | 7862 |
7867 return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(), | 7863 return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(), |
7868 ArrayVector(op_vals), | 7864 ArrayVector(op_vals), |
7869 syntactic_tail_call_mode); | 7865 syntactic_tail_call_mode); |
7870 } | 7866 } |
7871 | 7867 |
7872 HInstruction* HOptimizedGraphBuilder::NewCallFunctionViaIC( | 7868 HInstruction* HOptimizedGraphBuilder::NewCallFunctionViaIC( |
7873 HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode, | 7869 HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode, |
7874 ConvertReceiverMode convert_mode, TailCallMode tail_call_mode, | 7870 ConvertReceiverMode convert_mode, TailCallMode tail_call_mode, |
7875 FeedbackVectorSlot slot) { | 7871 FeedbackVectorSlot slot) { |
7876 if (syntactic_tail_call_mode == TailCallMode::kAllow) { | 7872 if (syntactic_tail_call_mode == TailCallMode::kAllow) { |
7877 BuildEnsureCallable(function); | 7873 BuildEnsureCallable(function); |
7878 } else { | 7874 } else { |
7879 DCHECK_EQ(TailCallMode::kDisallow, tail_call_mode); | 7875 DCHECK_EQ(TailCallMode::kDisallow, tail_call_mode); |
7880 } | 7876 } |
7881 int arity = argument_count - 1; | 7877 int arity = argument_count - 1; |
7882 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); | 7878 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); |
7883 HValue* arity_val = Add<HConstant>(arity); | 7879 HValue* arity_val = Add<HConstant>(arity); |
7884 HValue* index_val = Add<HConstant>(vector->GetIndex(slot)); | 7880 HValue* index_val = Add<HConstant>(vector->GetIndex(slot)); |
7885 HValue* vector_val = Add<HConstant>(vector); | 7881 HValue* vector_val = Add<HConstant>(vector); |
7886 | 7882 |
7887 HValue* op_vals[] = {context(), function, arity_val, index_val, vector_val}; | 7883 HValue* op_vals[] = {function, arity_val, index_val, vector_val}; |
7888 | |
7889 Callable callable = CodeFactory::CallICInOptimizedCode( | 7884 Callable callable = CodeFactory::CallICInOptimizedCode( |
7890 isolate(), convert_mode, tail_call_mode); | 7885 isolate(), convert_mode, tail_call_mode); |
7891 HConstant* stub = Add<HConstant>(callable.code()); | 7886 HConstant* stub = Add<HConstant>(callable.code()); |
7892 | 7887 |
7893 return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(), | 7888 return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(), |
7894 ArrayVector(op_vals), | 7889 ArrayVector(op_vals), |
7895 syntactic_tail_call_mode); | 7890 syntactic_tail_call_mode); |
7896 } | 7891 } |
7897 | 7892 |
7898 HInstruction* HOptimizedGraphBuilder::NewCallConstantFunction( | 7893 HInstruction* HOptimizedGraphBuilder::NewCallConstantFunction( |
(...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9227 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); | 9222 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); |
9228 Handle<Object> call_data_obj(api_call_info->data(), isolate()); | 9223 Handle<Object> call_data_obj(api_call_info->data(), isolate()); |
9229 bool call_data_undefined = call_data_obj->IsUndefined(isolate()); | 9224 bool call_data_undefined = call_data_obj->IsUndefined(isolate()); |
9230 HValue* call_data = Add<HConstant>(call_data_obj); | 9225 HValue* call_data = Add<HConstant>(call_data_obj); |
9231 ApiFunction fun(v8::ToCData<Address>(api_call_info->callback())); | 9226 ApiFunction fun(v8::ToCData<Address>(api_call_info->callback())); |
9232 ExternalReference ref = ExternalReference(&fun, | 9227 ExternalReference ref = ExternalReference(&fun, |
9233 ExternalReference::DIRECT_API_CALL, | 9228 ExternalReference::DIRECT_API_CALL, |
9234 isolate()); | 9229 isolate()); |
9235 HValue* api_function_address = Add<HConstant>(ExternalReference(ref)); | 9230 HValue* api_function_address = Add<HConstant>(ExternalReference(ref)); |
9236 | 9231 |
9237 HValue* op_vals[] = {context(), Add<HConstant>(function), call_data, holder, | 9232 HValue* op_vals[] = {Add<HConstant>(function), call_data, holder, |
9238 api_function_address}; | 9233 api_function_address}; |
9239 | 9234 |
9240 HInstruction* call = nullptr; | 9235 HInstruction* call = nullptr; |
9241 CHECK(argc <= CallApiCallbackStub::kArgMax); | 9236 CHECK(argc <= CallApiCallbackStub::kArgMax); |
9242 if (!is_function) { | 9237 if (!is_function) { |
9243 CallApiCallbackStub stub(isolate(), is_store, call_data_undefined, | 9238 CallApiCallbackStub stub(isolate(), is_store, call_data_undefined, |
9244 !optimization.is_constant_call()); | 9239 !optimization.is_constant_call()); |
9245 Handle<Code> code = stub.GetCode(); | 9240 Handle<Code> code = stub.GetCode(); |
9246 HConstant* code_value = Add<HConstant>(code); | 9241 HConstant* code_value = Add<HConstant>(code); |
9247 call = New<HCallWithDescriptor>( | 9242 call = New<HCallWithDescriptor>( |
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9966 instr = prev_instr; | 9961 instr = prev_instr; |
9967 } while (instr != check); | 9962 } while (instr != check); |
9968 environment()->SetExpressionStackAt(receiver_index, function); | 9963 environment()->SetExpressionStackAt(receiver_index, function); |
9969 } else { | 9964 } else { |
9970 // The constructor function is both an operand to the instruction and an | 9965 // The constructor function is both an operand to the instruction and an |
9971 // argument to the construct call. | 9966 // argument to the construct call. |
9972 if (TryHandleArrayCall(expr, function)) return; | 9967 if (TryHandleArrayCall(expr, function)) return; |
9973 } | 9968 } |
9974 | 9969 |
9975 HValue* arity = Add<HConstant>(argument_count - 1); | 9970 HValue* arity = Add<HConstant>(argument_count - 1); |
9976 HValue* op_vals[] = {context(), function, function, arity}; | 9971 HValue* op_vals[] = {function, function, arity}; |
9977 Callable callable = CodeFactory::Construct(isolate()); | 9972 Callable callable = CodeFactory::Construct(isolate()); |
9978 HConstant* stub = Add<HConstant>(callable.code()); | 9973 HConstant* stub = Add<HConstant>(callable.code()); |
9979 PushArgumentsFromEnvironment(argument_count); | 9974 PushArgumentsFromEnvironment(argument_count); |
9980 HInstruction* construct = New<HCallWithDescriptor>( | 9975 HInstruction* construct = New<HCallWithDescriptor>( |
9981 stub, argument_count, callable.descriptor(), ArrayVector(op_vals)); | 9976 stub, argument_count, callable.descriptor(), ArrayVector(op_vals)); |
9982 return ast_context()->ReturnInstruction(construct, expr->id()); | 9977 return ast_context()->ReturnInstruction(construct, expr->id()); |
9983 } | 9978 } |
9984 | 9979 |
9985 | 9980 |
9986 void HOptimizedGraphBuilder::BuildInitializeInobjectProperties( | 9981 void HOptimizedGraphBuilder::BuildInitializeInobjectProperties( |
(...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11032 Representation result_rep = RepresentationFor(result_type); | 11027 Representation result_rep = RepresentationFor(result_type); |
11033 | 11028 |
11034 bool is_non_primitive = (left_rep.IsTagged() && !left_rep.IsSmi()) || | 11029 bool is_non_primitive = (left_rep.IsTagged() && !left_rep.IsSmi()) || |
11035 (right_rep.IsTagged() && !right_rep.IsSmi()); | 11030 (right_rep.IsTagged() && !right_rep.IsSmi()); |
11036 | 11031 |
11037 HInstruction* instr = NULL; | 11032 HInstruction* instr = NULL; |
11038 // Only the stub is allowed to call into the runtime, since otherwise we would | 11033 // Only the stub is allowed to call into the runtime, since otherwise we would |
11039 // inline several instructions (including the two pushes) for every tagged | 11034 // inline several instructions (including the two pushes) for every tagged |
11040 // operation in optimized code, which is more expensive, than a stub call. | 11035 // operation in optimized code, which is more expensive, than a stub call. |
11041 if (graph()->info()->IsStub() && is_non_primitive) { | 11036 if (graph()->info()->IsStub() && is_non_primitive) { |
11042 HValue* values[] = {context(), left, right}; | 11037 HValue* values[] = {left, right}; |
11043 #define GET_STUB(Name) \ | 11038 #define GET_STUB(Name) \ |
11044 do { \ | 11039 do { \ |
11045 Callable callable = CodeFactory::Name(isolate()); \ | 11040 Callable callable = CodeFactory::Name(isolate()); \ |
11046 HValue* stub = Add<HConstant>(callable.code()); \ | 11041 HValue* stub = Add<HConstant>(callable.code()); \ |
11047 instr = AddUncasted<HCallWithDescriptor>(stub, 0, callable.descriptor(), \ | 11042 instr = AddUncasted<HCallWithDescriptor>(stub, 0, callable.descriptor(), \ |
11048 ArrayVector(values)); \ | 11043 ArrayVector(values)); \ |
11049 } while (false) | 11044 } while (false) |
11050 | 11045 |
11051 switch (op) { | 11046 switch (op) { |
11052 default: | 11047 default: |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11432 HInstruction* prototype = | 11427 HInstruction* prototype = |
11433 Add<HConstant>(handle(initial_map->prototype(), isolate())); | 11428 Add<HConstant>(handle(initial_map->prototype(), isolate())); |
11434 HHasInPrototypeChainAndBranch* result = | 11429 HHasInPrototypeChainAndBranch* result = |
11435 New<HHasInPrototypeChainAndBranch>(left, prototype); | 11430 New<HHasInPrototypeChainAndBranch>(left, prototype); |
11436 return ast_context()->ReturnControl(result, expr->id()); | 11431 return ast_context()->ReturnControl(result, expr->id()); |
11437 } | 11432 } |
11438 } | 11433 } |
11439 | 11434 |
11440 Callable callable = CodeFactory::InstanceOf(isolate()); | 11435 Callable callable = CodeFactory::InstanceOf(isolate()); |
11441 HValue* stub = Add<HConstant>(callable.code()); | 11436 HValue* stub = Add<HConstant>(callable.code()); |
11442 HValue* values[] = {context(), left, right}; | 11437 HValue* values[] = {left, right}; |
11443 HCallWithDescriptor* result = New<HCallWithDescriptor>( | 11438 HCallWithDescriptor* result = New<HCallWithDescriptor>( |
11444 stub, 0, callable.descriptor(), ArrayVector(values)); | 11439 stub, 0, callable.descriptor(), ArrayVector(values)); |
11445 result->set_type(HType::Boolean()); | 11440 result->set_type(HType::Boolean()); |
11446 return ast_context()->ReturnInstruction(result, expr->id()); | 11441 return ast_context()->ReturnInstruction(result, expr->id()); |
11447 | 11442 |
11448 } else if (op == Token::IN) { | 11443 } else if (op == Token::IN) { |
11449 Callable callable = CodeFactory::HasProperty(isolate()); | 11444 Callable callable = CodeFactory::HasProperty(isolate()); |
11450 HValue* stub = Add<HConstant>(callable.code()); | 11445 HValue* stub = Add<HConstant>(callable.code()); |
11451 HValue* values[] = {context(), left, right}; | 11446 HValue* values[] = {left, right}; |
11452 HInstruction* result = | 11447 HInstruction* result = |
11453 New<HCallWithDescriptor>(stub, 0, callable.descriptor(), | 11448 New<HCallWithDescriptor>(stub, 0, callable.descriptor(), |
11454 Vector<HValue*>(values, arraysize(values))); | 11449 Vector<HValue*>(values, arraysize(values))); |
11455 return ast_context()->ReturnInstruction(result, expr->id()); | 11450 return ast_context()->ReturnInstruction(result, expr->id()); |
11456 } | 11451 } |
11457 | 11452 |
11458 PushBeforeSimulateBehavior push_behavior = | 11453 PushBeforeSimulateBehavior push_behavior = |
11459 ast_context()->IsEffect() ? NO_PUSH_BEFORE_SIMULATE | 11454 ast_context()->IsEffect() ? NO_PUSH_BEFORE_SIMULATE |
11460 : PUSH_BEFORE_SIMULATE; | 11455 : PUSH_BEFORE_SIMULATE; |
11461 HControlInstruction* compare = BuildCompareInstruction( | 11456 HControlInstruction* compare = BuildCompareInstruction( |
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12182 | 12177 |
12183 void HOptimizedGraphBuilder::GenerateToInteger(CallRuntime* call) { | 12178 void HOptimizedGraphBuilder::GenerateToInteger(CallRuntime* call) { |
12184 DCHECK_EQ(1, call->arguments()->length()); | 12179 DCHECK_EQ(1, call->arguments()->length()); |
12185 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12180 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
12186 HValue* input = Pop(); | 12181 HValue* input = Pop(); |
12187 if (input->type().IsSmi()) { | 12182 if (input->type().IsSmi()) { |
12188 return ast_context()->ReturnValue(input); | 12183 return ast_context()->ReturnValue(input); |
12189 } else { | 12184 } else { |
12190 Callable callable = CodeFactory::ToInteger(isolate()); | 12185 Callable callable = CodeFactory::ToInteger(isolate()); |
12191 HValue* stub = Add<HConstant>(callable.code()); | 12186 HValue* stub = Add<HConstant>(callable.code()); |
12192 HValue* values[] = {context(), input}; | 12187 HValue* values[] = {input}; |
12193 HInstruction* result = New<HCallWithDescriptor>( | 12188 HInstruction* result = New<HCallWithDescriptor>( |
12194 stub, 0, callable.descriptor(), ArrayVector(values)); | 12189 stub, 0, callable.descriptor(), ArrayVector(values)); |
12195 return ast_context()->ReturnInstruction(result, call->id()); | 12190 return ast_context()->ReturnInstruction(result, call->id()); |
12196 } | 12191 } |
12197 } | 12192 } |
12198 | 12193 |
12199 | 12194 |
12200 void HOptimizedGraphBuilder::GenerateToObject(CallRuntime* call) { | 12195 void HOptimizedGraphBuilder::GenerateToObject(CallRuntime* call) { |
12201 DCHECK_EQ(1, call->arguments()->length()); | 12196 DCHECK_EQ(1, call->arguments()->length()); |
12202 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12197 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
12203 HValue* value = Pop(); | 12198 HValue* value = Pop(); |
12204 HValue* result = BuildToObject(value); | 12199 HValue* result = BuildToObject(value); |
12205 return ast_context()->ReturnValue(result); | 12200 return ast_context()->ReturnValue(result); |
12206 } | 12201 } |
12207 | 12202 |
12208 | 12203 |
12209 void HOptimizedGraphBuilder::GenerateToString(CallRuntime* call) { | 12204 void HOptimizedGraphBuilder::GenerateToString(CallRuntime* call) { |
12210 DCHECK_EQ(1, call->arguments()->length()); | 12205 DCHECK_EQ(1, call->arguments()->length()); |
12211 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12206 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
12212 HValue* input = Pop(); | 12207 HValue* input = Pop(); |
12213 if (input->type().IsString()) { | 12208 if (input->type().IsString()) { |
12214 return ast_context()->ReturnValue(input); | 12209 return ast_context()->ReturnValue(input); |
12215 } else { | 12210 } else { |
12216 Callable callable = CodeFactory::ToString(isolate()); | 12211 Callable callable = CodeFactory::ToString(isolate()); |
12217 HValue* stub = Add<HConstant>(callable.code()); | 12212 HValue* stub = Add<HConstant>(callable.code()); |
12218 HValue* values[] = {context(), input}; | 12213 HValue* values[] = {input}; |
12219 HInstruction* result = New<HCallWithDescriptor>( | 12214 HInstruction* result = New<HCallWithDescriptor>( |
12220 stub, 0, callable.descriptor(), ArrayVector(values)); | 12215 stub, 0, callable.descriptor(), ArrayVector(values)); |
12221 return ast_context()->ReturnInstruction(result, call->id()); | 12216 return ast_context()->ReturnInstruction(result, call->id()); |
12222 } | 12217 } |
12223 } | 12218 } |
12224 | 12219 |
12225 | 12220 |
12226 void HOptimizedGraphBuilder::GenerateToLength(CallRuntime* call) { | 12221 void HOptimizedGraphBuilder::GenerateToLength(CallRuntime* call) { |
12227 DCHECK_EQ(1, call->arguments()->length()); | 12222 DCHECK_EQ(1, call->arguments()->length()); |
12228 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12223 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
12229 Callable callable = CodeFactory::ToLength(isolate()); | 12224 Callable callable = CodeFactory::ToLength(isolate()); |
12230 HValue* input = Pop(); | 12225 HValue* input = Pop(); |
12231 HValue* stub = Add<HConstant>(callable.code()); | 12226 HValue* stub = Add<HConstant>(callable.code()); |
12232 HValue* values[] = {context(), input}; | 12227 HValue* values[] = {input}; |
12233 HInstruction* result = New<HCallWithDescriptor>( | 12228 HInstruction* result = New<HCallWithDescriptor>( |
12234 stub, 0, callable.descriptor(), ArrayVector(values)); | 12229 stub, 0, callable.descriptor(), ArrayVector(values)); |
12235 return ast_context()->ReturnInstruction(result, call->id()); | 12230 return ast_context()->ReturnInstruction(result, call->id()); |
12236 } | 12231 } |
12237 | 12232 |
12238 | 12233 |
12239 void HOptimizedGraphBuilder::GenerateToNumber(CallRuntime* call) { | 12234 void HOptimizedGraphBuilder::GenerateToNumber(CallRuntime* call) { |
12240 DCHECK_EQ(1, call->arguments()->length()); | 12235 DCHECK_EQ(1, call->arguments()->length()); |
12241 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12236 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
12242 Callable callable = CodeFactory::ToNumber(isolate()); | 12237 Callable callable = CodeFactory::ToNumber(isolate()); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12314 | 12309 |
12315 // Fast support for SubString. | 12310 // Fast support for SubString. |
12316 void HOptimizedGraphBuilder::GenerateSubString(CallRuntime* call) { | 12311 void HOptimizedGraphBuilder::GenerateSubString(CallRuntime* call) { |
12317 DCHECK_EQ(3, call->arguments()->length()); | 12312 DCHECK_EQ(3, call->arguments()->length()); |
12318 CHECK_ALIVE(VisitExpressions(call->arguments())); | 12313 CHECK_ALIVE(VisitExpressions(call->arguments())); |
12319 Callable callable = CodeFactory::SubString(isolate()); | 12314 Callable callable = CodeFactory::SubString(isolate()); |
12320 HValue* stub = Add<HConstant>(callable.code()); | 12315 HValue* stub = Add<HConstant>(callable.code()); |
12321 HValue* to = Pop(); | 12316 HValue* to = Pop(); |
12322 HValue* from = Pop(); | 12317 HValue* from = Pop(); |
12323 HValue* string = Pop(); | 12318 HValue* string = Pop(); |
12324 HValue* values[] = {context(), string, from, to}; | 12319 HValue* values[] = {string, from, to}; |
12325 HInstruction* result = New<HCallWithDescriptor>( | 12320 HInstruction* result = New<HCallWithDescriptor>( |
12326 stub, 0, callable.descriptor(), ArrayVector(values)); | 12321 stub, 0, callable.descriptor(), ArrayVector(values)); |
12327 result->set_type(HType::String()); | 12322 result->set_type(HType::String()); |
12328 return ast_context()->ReturnInstruction(result, call->id()); | 12323 return ast_context()->ReturnInstruction(result, call->id()); |
12329 } | 12324 } |
12330 | 12325 |
12331 // Support for direct creation of new objects. | 12326 // Support for direct creation of new objects. |
12332 void HOptimizedGraphBuilder::GenerateNewObject(CallRuntime* call) { | 12327 void HOptimizedGraphBuilder::GenerateNewObject(CallRuntime* call) { |
12333 DCHECK_EQ(2, call->arguments()->length()); | 12328 DCHECK_EQ(2, call->arguments()->length()); |
12334 CHECK_ALIVE(VisitExpressions(call->arguments())); | 12329 CHECK_ALIVE(VisitExpressions(call->arguments())); |
12335 FastNewObjectStub stub(isolate()); | 12330 FastNewObjectStub stub(isolate()); |
12336 FastNewObjectDescriptor descriptor(isolate()); | 12331 FastNewObjectDescriptor descriptor(isolate()); |
12337 HValue* values[] = {context(), Pop(), Pop()}; | 12332 HValue* values[] = {Pop(), Pop()}; |
12338 HConstant* stub_value = Add<HConstant>(stub.GetCode()); | 12333 HConstant* stub_value = Add<HConstant>(stub.GetCode()); |
12339 HInstruction* result = | 12334 HInstruction* result = |
12340 New<HCallWithDescriptor>(stub_value, 0, descriptor, ArrayVector(values)); | 12335 New<HCallWithDescriptor>(stub_value, 0, descriptor, ArrayVector(values)); |
12341 return ast_context()->ReturnInstruction(result, call->id()); | 12336 return ast_context()->ReturnInstruction(result, call->id()); |
12342 } | 12337 } |
12343 | 12338 |
12344 // Support for direct calls from JavaScript to native RegExp code. | 12339 // Support for direct calls from JavaScript to native RegExp code. |
12345 void HOptimizedGraphBuilder::GenerateRegExpExec(CallRuntime* call) { | 12340 void HOptimizedGraphBuilder::GenerateRegExpExec(CallRuntime* call) { |
12346 DCHECK_EQ(4, call->arguments()->length()); | 12341 DCHECK_EQ(4, call->arguments()->length()); |
12347 CHECK_ALIVE(VisitExpressions(call->arguments())); | 12342 CHECK_ALIVE(VisitExpressions(call->arguments())); |
12348 Callable callable = CodeFactory::RegExpExec(isolate()); | 12343 Callable callable = CodeFactory::RegExpExec(isolate()); |
12349 HValue* last_match_info = Pop(); | 12344 HValue* last_match_info = Pop(); |
12350 HValue* index = Pop(); | 12345 HValue* index = Pop(); |
12351 HValue* subject = Pop(); | 12346 HValue* subject = Pop(); |
12352 HValue* regexp_object = Pop(); | 12347 HValue* regexp_object = Pop(); |
12353 HValue* stub = Add<HConstant>(callable.code()); | 12348 HValue* stub = Add<HConstant>(callable.code()); |
12354 HValue* values[] = {context(), regexp_object, subject, index, | 12349 HValue* values[] = {regexp_object, subject, index, last_match_info}; |
12355 last_match_info}; | |
12356 HInstruction* result = New<HCallWithDescriptor>( | 12350 HInstruction* result = New<HCallWithDescriptor>( |
12357 stub, 0, callable.descriptor(), ArrayVector(values)); | 12351 stub, 0, callable.descriptor(), ArrayVector(values)); |
12358 return ast_context()->ReturnInstruction(result, call->id()); | 12352 return ast_context()->ReturnInstruction(result, call->id()); |
12359 } | 12353 } |
12360 | 12354 |
12361 | 12355 |
12362 void HOptimizedGraphBuilder::GenerateRegExpFlags(CallRuntime* call) { | 12356 void HOptimizedGraphBuilder::GenerateRegExpFlags(CallRuntime* call) { |
12363 DCHECK_EQ(1, call->arguments()->length()); | 12357 DCHECK_EQ(1, call->arguments()->length()); |
12364 CHECK_ALIVE(VisitExpressions(call->arguments())); | 12358 CHECK_ALIVE(VisitExpressions(call->arguments())); |
12365 HValue* regexp = Pop(); | 12359 HValue* regexp = Pop(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12404 | 12398 |
12405 | 12399 |
12406 // Fast support for calls. | 12400 // Fast support for calls. |
12407 void HOptimizedGraphBuilder::GenerateCall(CallRuntime* call) { | 12401 void HOptimizedGraphBuilder::GenerateCall(CallRuntime* call) { |
12408 DCHECK_LE(2, call->arguments()->length()); | 12402 DCHECK_LE(2, call->arguments()->length()); |
12409 CHECK_ALIVE(VisitExpressions(call->arguments())); | 12403 CHECK_ALIVE(VisitExpressions(call->arguments())); |
12410 CallTrampolineDescriptor descriptor(isolate()); | 12404 CallTrampolineDescriptor descriptor(isolate()); |
12411 PushArgumentsFromEnvironment(call->arguments()->length() - 1); | 12405 PushArgumentsFromEnvironment(call->arguments()->length() - 1); |
12412 HValue* trampoline = Add<HConstant>(isolate()->builtins()->Call()); | 12406 HValue* trampoline = Add<HConstant>(isolate()->builtins()->Call()); |
12413 HValue* target = Pop(); | 12407 HValue* target = Pop(); |
12414 HValue* values[] = {context(), target, | 12408 HValue* values[] = {target, Add<HConstant>(call->arguments()->length() - 2)}; |
12415 Add<HConstant>(call->arguments()->length() - 2)}; | |
12416 HInstruction* result = | 12409 HInstruction* result = |
12417 New<HCallWithDescriptor>(trampoline, call->arguments()->length() - 1, | 12410 New<HCallWithDescriptor>(trampoline, call->arguments()->length() - 1, |
12418 descriptor, ArrayVector(values)); | 12411 descriptor, ArrayVector(values)); |
12419 return ast_context()->ReturnInstruction(result, call->id()); | 12412 return ast_context()->ReturnInstruction(result, call->id()); |
12420 } | 12413 } |
12421 | 12414 |
12422 | 12415 |
12423 void HOptimizedGraphBuilder::GenerateFixedArrayGet(CallRuntime* call) { | 12416 void HOptimizedGraphBuilder::GenerateFixedArrayGet(CallRuntime* call) { |
12424 DCHECK(call->arguments()->length() == 2); | 12417 DCHECK(call->arguments()->length() == 2); |
12425 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12418 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13284 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13277 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13285 } | 13278 } |
13286 | 13279 |
13287 #ifdef DEBUG | 13280 #ifdef DEBUG |
13288 graph_->Verify(false); // No full verify. | 13281 graph_->Verify(false); // No full verify. |
13289 #endif | 13282 #endif |
13290 } | 13283 } |
13291 | 13284 |
13292 } // namespace internal | 13285 } // namespace internal |
13293 } // namespace v8 | 13286 } // namespace v8 |
OLD | NEW |