Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Side by Side Diff: src/crankshaft/hydrogen.cc

Issue 2353303002: [crankshaft] HCallWithDescriptor is now able to pass arguments on the stack. (Closed)
Patch Set: arm64 fix Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/crankshaft/arm64/lithium-codegen-arm64.cc ('k') | src/crankshaft/hydrogen-instructions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 3474 matching lines...) Expand 10 before | Expand all | Expand 10 after
3485 use_optimistic_licm_(false), 3485 use_optimistic_licm_(false),
3486 depends_on_empty_array_proto_elements_(false), 3486 depends_on_empty_array_proto_elements_(false),
3487 depends_on_string_length_overflow_(false), 3487 depends_on_string_length_overflow_(false),
3488 type_change_checksum_(0), 3488 type_change_checksum_(0),
3489 maximum_environment_size_(0), 3489 maximum_environment_size_(0),
3490 no_side_effects_scope_count_(0), 3490 no_side_effects_scope_count_(0),
3491 disallow_adding_new_values_(false), 3491 disallow_adding_new_values_(false),
3492 inlined_function_infos_(info->zone()) { 3492 inlined_function_infos_(info->zone()) {
3493 if (info->IsStub()) { 3493 if (info->IsStub()) {
3494 // For stubs, explicitly add the context to the environment. 3494 // For stubs, explicitly add the context to the environment.
3495 start_environment_ = new (zone_) 3495 start_environment_ =
3496 HEnvironment(zone_, descriptor.GetRegisterParameterCount() + 1); 3496 new (zone_) HEnvironment(zone_, descriptor.GetParameterCount() + 1);
3497 } else { 3497 } else {
3498 start_environment_ = 3498 start_environment_ =
3499 new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); 3499 new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_);
3500 } 3500 }
3501 start_environment_->set_ast_id(BailoutId::FunctionContext()); 3501 start_environment_->set_ast_id(BailoutId::FunctionContext());
3502 entry_block_ = CreateBasicBlock(); 3502 entry_block_ = CreateBasicBlock();
3503 entry_block_->SetInitialEnvironment(start_environment_); 3503 entry_block_->SetInitialEnvironment(start_environment_);
3504 } 3504 }
3505 3505
3506 3506
(...skipping 5716 matching lines...) Expand 10 before | Expand all | Expand 10 after
9223 Handle<Object> call_data_obj(api_call_info->data(), isolate()); 9223 Handle<Object> call_data_obj(api_call_info->data(), isolate());
9224 bool call_data_undefined = call_data_obj->IsUndefined(isolate()); 9224 bool call_data_undefined = call_data_obj->IsUndefined(isolate());
9225 HValue* call_data = Add<HConstant>(call_data_obj); 9225 HValue* call_data = Add<HConstant>(call_data_obj);
9226 ApiFunction fun(v8::ToCData<Address>(api_call_info->callback())); 9226 ApiFunction fun(v8::ToCData<Address>(api_call_info->callback()));
9227 ExternalReference ref = ExternalReference(&fun, 9227 ExternalReference ref = ExternalReference(&fun,
9228 ExternalReference::DIRECT_API_CALL, 9228 ExternalReference::DIRECT_API_CALL,
9229 isolate()); 9229 isolate());
9230 HValue* api_function_address = Add<HConstant>(ExternalReference(ref)); 9230 HValue* api_function_address = Add<HConstant>(ExternalReference(ref));
9231 9231
9232 HValue* op_vals[] = {context(), Add<HConstant>(function), call_data, holder, 9232 HValue* op_vals[] = {context(), Add<HConstant>(function), call_data, holder,
9233 api_function_address, nullptr}; 9233 api_function_address};
9234 9234
9235 HInstruction* call = nullptr; 9235 HInstruction* call = nullptr;
9236 CHECK(argc <= CallApiCallbackStub::kArgMax); 9236 CHECK(argc <= CallApiCallbackStub::kArgMax);
9237 if (!is_function) { 9237 if (!is_function) {
9238 CallApiCallbackStub stub(isolate(), is_store, call_data_undefined, 9238 CallApiCallbackStub stub(isolate(), is_store, call_data_undefined,
9239 !optimization.is_constant_call()); 9239 !optimization.is_constant_call());
9240 Handle<Code> code = stub.GetCode(); 9240 Handle<Code> code = stub.GetCode();
9241 HConstant* code_value = Add<HConstant>(code); 9241 HConstant* code_value = Add<HConstant>(code);
9242 call = New<HCallWithDescriptor>( 9242 call = New<HCallWithDescriptor>(
9243 code_value, argc + 1, stub.GetCallInterfaceDescriptor(), 9243 code_value, argc + 1, stub.GetCallInterfaceDescriptor(),
9244 Vector<HValue*>(op_vals, arraysize(op_vals) - 1), 9244 Vector<HValue*>(op_vals, arraysize(op_vals)), syntactic_tail_call_mode);
9245 syntactic_tail_call_mode);
9246 } else { 9245 } else {
9247 CallApiCallbackStub stub(isolate(), argc, call_data_undefined, false); 9246 CallApiCallbackStub stub(isolate(), argc, call_data_undefined, false);
9248 Handle<Code> code = stub.GetCode(); 9247 Handle<Code> code = stub.GetCode();
9249 HConstant* code_value = Add<HConstant>(code); 9248 HConstant* code_value = Add<HConstant>(code);
9250 call = New<HCallWithDescriptor>( 9249 call = New<HCallWithDescriptor>(
9251 code_value, argc + 1, stub.GetCallInterfaceDescriptor(), 9250 code_value, argc + 1, stub.GetCallInterfaceDescriptor(),
9252 Vector<HValue*>(op_vals, arraysize(op_vals) - 1), 9251 Vector<HValue*>(op_vals, arraysize(op_vals)), syntactic_tail_call_mode);
9253 syntactic_tail_call_mode);
9254 Drop(1); // Drop function. 9252 Drop(1); // Drop function.
9255 } 9253 }
9256 9254
9257 ast_context()->ReturnInstruction(call, ast_id); 9255 ast_context()->ReturnInstruction(call, ast_id);
9258 return true; 9256 return true;
9259 } 9257 }
9260 9258
9261 9259
9262 void HOptimizedGraphBuilder::HandleIndirectCall(Call* expr, HValue* function, 9260 void HOptimizedGraphBuilder::HandleIndirectCall(Call* expr, HValue* function,
9263 int arguments_count) { 9261 int arguments_count) {
(...skipping 3047 matching lines...) Expand 10 before | Expand all | Expand 10 after
12311 HValue* char_code = Pop(); 12309 HValue* char_code = Pop();
12312 HInstruction* result = NewUncasted<HStringCharFromCode>(char_code); 12310 HInstruction* result = NewUncasted<HStringCharFromCode>(char_code);
12313 return ast_context()->ReturnInstruction(result, call->id()); 12311 return ast_context()->ReturnInstruction(result, call->id());
12314 } 12312 }
12315 12313
12316 12314
12317 // Fast support for SubString. 12315 // Fast support for SubString.
12318 void HOptimizedGraphBuilder::GenerateSubString(CallRuntime* call) { 12316 void HOptimizedGraphBuilder::GenerateSubString(CallRuntime* call) {
12319 DCHECK_EQ(3, call->arguments()->length()); 12317 DCHECK_EQ(3, call->arguments()->length());
12320 CHECK_ALIVE(VisitExpressions(call->arguments())); 12318 CHECK_ALIVE(VisitExpressions(call->arguments()));
12321 PushArgumentsFromEnvironment(call->arguments()->length());
12322 Callable callable = CodeFactory::SubString(isolate()); 12319 Callable callable = CodeFactory::SubString(isolate());
12323 HValue* stub = Add<HConstant>(callable.code()); 12320 HValue* stub = Add<HConstant>(callable.code());
12324 HValue* values[] = {context()}; 12321 HValue* to = Pop();
12325 HInstruction* result = 12322 HValue* from = Pop();
12326 New<HCallWithDescriptor>(stub, call->arguments()->length(), 12323 HValue* string = Pop();
12327 callable.descriptor(), ArrayVector(values)); 12324 HValue* values[] = {context(), string, from, to};
12325 HInstruction* result = New<HCallWithDescriptor>(
12326 stub, 0, callable.descriptor(), ArrayVector(values));
12328 result->set_type(HType::String()); 12327 result->set_type(HType::String());
12329 return ast_context()->ReturnInstruction(result, call->id()); 12328 return ast_context()->ReturnInstruction(result, call->id());
12330 } 12329 }
12331 12330
12332 // Support for direct creation of new objects. 12331 // Support for direct creation of new objects.
12333 void HOptimizedGraphBuilder::GenerateNewObject(CallRuntime* call) { 12332 void HOptimizedGraphBuilder::GenerateNewObject(CallRuntime* call) {
12334 DCHECK_EQ(2, call->arguments()->length()); 12333 DCHECK_EQ(2, call->arguments()->length());
12335 CHECK_ALIVE(VisitExpressions(call->arguments())); 12334 CHECK_ALIVE(VisitExpressions(call->arguments()));
12336 FastNewObjectStub stub(isolate()); 12335 FastNewObjectStub stub(isolate());
12337 FastNewObjectDescriptor descriptor(isolate()); 12336 FastNewObjectDescriptor descriptor(isolate());
12338 HValue* values[] = {context(), Pop(), Pop()}; 12337 HValue* values[] = {context(), Pop(), Pop()};
12339 HConstant* stub_value = Add<HConstant>(stub.GetCode()); 12338 HConstant* stub_value = Add<HConstant>(stub.GetCode());
12340 HInstruction* result = 12339 HInstruction* result =
12341 New<HCallWithDescriptor>(stub_value, 0, descriptor, ArrayVector(values)); 12340 New<HCallWithDescriptor>(stub_value, 0, descriptor, ArrayVector(values));
12342 return ast_context()->ReturnInstruction(result, call->id()); 12341 return ast_context()->ReturnInstruction(result, call->id());
12343 } 12342 }
12344 12343
12345 // Support for direct calls from JavaScript to native RegExp code. 12344 // Support for direct calls from JavaScript to native RegExp code.
12346 void HOptimizedGraphBuilder::GenerateRegExpExec(CallRuntime* call) { 12345 void HOptimizedGraphBuilder::GenerateRegExpExec(CallRuntime* call) {
12347 DCHECK_EQ(4, call->arguments()->length()); 12346 DCHECK_EQ(4, call->arguments()->length());
12348 CHECK_ALIVE(VisitExpressions(call->arguments())); 12347 CHECK_ALIVE(VisitExpressions(call->arguments()));
12349 PushArgumentsFromEnvironment(call->arguments()->length());
12350 Callable callable = CodeFactory::RegExpExec(isolate()); 12348 Callable callable = CodeFactory::RegExpExec(isolate());
12349 HValue* last_match_info = Pop();
12350 HValue* index = Pop();
12351 HValue* subject = Pop();
12352 HValue* regexp_object = Pop();
12351 HValue* stub = Add<HConstant>(callable.code()); 12353 HValue* stub = Add<HConstant>(callable.code());
12352 HValue* values[] = {context()}; 12354 HValue* values[] = {context(), regexp_object, subject, index,
12353 HInstruction* result = 12355 last_match_info};
12354 New<HCallWithDescriptor>(stub, call->arguments()->length(), 12356 HInstruction* result = New<HCallWithDescriptor>(
12355 callable.descriptor(), ArrayVector(values)); 12357 stub, 0, callable.descriptor(), ArrayVector(values));
12356 return ast_context()->ReturnInstruction(result, call->id()); 12358 return ast_context()->ReturnInstruction(result, call->id());
12357 } 12359 }
12358 12360
12359 12361
12360 void HOptimizedGraphBuilder::GenerateRegExpFlags(CallRuntime* call) { 12362 void HOptimizedGraphBuilder::GenerateRegExpFlags(CallRuntime* call) {
12361 DCHECK_EQ(1, call->arguments()->length()); 12363 DCHECK_EQ(1, call->arguments()->length());
12362 CHECK_ALIVE(VisitExpressions(call->arguments())); 12364 CHECK_ALIVE(VisitExpressions(call->arguments()));
12363 HValue* regexp = Pop(); 12365 HValue* regexp = Pop();
12364 HInstruction* result = 12366 HInstruction* result =
12365 New<HLoadNamedField>(regexp, nullptr, HObjectAccess::ForJSRegExpFlags()); 12367 New<HLoadNamedField>(regexp, nullptr, HObjectAccess::ForJSRegExpFlags());
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after
13283 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13285 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13284 } 13286 }
13285 13287
13286 #ifdef DEBUG 13288 #ifdef DEBUG
13287 graph_->Verify(false); // No full verify. 13289 graph_->Verify(false); // No full verify.
13288 #endif 13290 #endif
13289 } 13291 }
13290 13292
13291 } // namespace internal 13293 } // namespace internal
13292 } // namespace v8 13294 } // namespace v8
OLDNEW
« no previous file with comments | « src/crankshaft/arm64/lithium-codegen-arm64.cc ('k') | src/crankshaft/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698