| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
| 6 #include "src/compiler/common-operator.h" | 6 #include "src/compiler/common-operator.h" |
| 7 #include "src/compiler/graph-inl.h" | 7 #include "src/compiler/graph-inl.h" |
| 8 #include "src/compiler/js-generic-lowering.h" | 8 #include "src/compiler/js-generic-lowering.h" |
| 9 #include "src/compiler/machine-operator.h" | 9 #include "src/compiler/machine-operator.h" |
| 10 #include "src/compiler/node-aux-data-inl.h" | 10 #include "src/compiler/node-aux-data-inl.h" |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 UNIMPLEMENTED(); \ | 285 UNIMPLEMENTED(); \ |
| 286 return node; \ | 286 return node; \ |
| 287 } | 287 } |
| 288 REPLACE_UNIMPLEMENTED(JSToString) | 288 REPLACE_UNIMPLEMENTED(JSToString) |
| 289 REPLACE_UNIMPLEMENTED(JSToName) | 289 REPLACE_UNIMPLEMENTED(JSToName) |
| 290 REPLACE_UNIMPLEMENTED(JSYield) | 290 REPLACE_UNIMPLEMENTED(JSYield) |
| 291 REPLACE_UNIMPLEMENTED(JSDebugger) | 291 REPLACE_UNIMPLEMENTED(JSDebugger) |
| 292 #undef REPLACE_UNIMPLEMENTED | 292 #undef REPLACE_UNIMPLEMENTED |
| 293 | 293 |
| 294 | 294 |
| 295 static CallDescriptor::DeoptimizationSupport DeoptimizationSupportForNode( | |
| 296 Node* node) { | |
| 297 return OperatorProperties::CanLazilyDeoptimize(node->op()) | |
| 298 ? CallDescriptor::kCanDeoptimize | |
| 299 : CallDescriptor::kCannotDeoptimize; | |
| 300 } | |
| 301 | |
| 302 | |
| 303 void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token, | 295 void JSGenericLowering::ReplaceWithCompareIC(Node* node, Token::Value token, |
| 304 bool pure) { | 296 bool pure) { |
| 305 BinaryOpICStub stub(isolate(), Token::ADD); // TODO(mstarzinger): Hack. | 297 BinaryOpICStub stub(isolate(), Token::ADD); // TODO(mstarzinger): Hack. |
| 306 CodeStubInterfaceDescriptor* d = stub.GetInterfaceDescriptor(); | 298 CodeStubInterfaceDescriptor* d = stub.GetInterfaceDescriptor(); |
| 307 CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor(d); | 299 CallDescriptor* desc_compare = linkage()->GetStubCallDescriptor(d); |
| 308 Handle<Code> ic = CompareIC::GetUninitialized(isolate(), token); | 300 Handle<Code> ic = CompareIC::GetUninitialized(isolate(), token); |
| 309 Node* compare; | 301 Node* compare; |
| 310 if (pure) { | 302 if (pure) { |
| 311 // A pure (strict) comparison doesn't have an effect or control. | 303 // A pure (strict) comparison doesn't have an effect or control. |
| 312 // But for the graph, we need to add these inputs. | 304 // But for the graph, we need to add these inputs. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 325 } | 317 } |
| 326 node->ReplaceInput(0, compare); | 318 node->ReplaceInput(0, compare); |
| 327 node->ReplaceInput(1, SmiConstant(token)); | 319 node->ReplaceInput(1, SmiConstant(token)); |
| 328 ReplaceWithRuntimeCall(node, Runtime::kBooleanize); | 320 ReplaceWithRuntimeCall(node, Runtime::kBooleanize); |
| 329 } | 321 } |
| 330 | 322 |
| 331 | 323 |
| 332 void JSGenericLowering::ReplaceWithICStubCall(Node* node, | 324 void JSGenericLowering::ReplaceWithICStubCall(Node* node, |
| 333 HydrogenCodeStub* stub) { | 325 HydrogenCodeStub* stub) { |
| 334 CodeStubInterfaceDescriptor* d = stub->GetInterfaceDescriptor(); | 326 CodeStubInterfaceDescriptor* d = stub->GetInterfaceDescriptor(); |
| 335 CallDescriptor* desc = linkage()->GetStubCallDescriptor( | 327 CallDescriptor* desc = linkage()->GetStubCallDescriptor(d); |
| 336 d, 0, DeoptimizationSupportForNode(node)); | |
| 337 Node* stub_code = CodeConstant(stub->GetCode()); | 328 Node* stub_code = CodeConstant(stub->GetCode()); |
| 338 PatchInsertInput(node, 0, stub_code); | 329 PatchInsertInput(node, 0, stub_code); |
| 339 PatchOperator(node, common()->Call(desc)); | 330 PatchOperator(node, common()->Call(desc)); |
| 340 } | 331 } |
| 341 | 332 |
| 342 | 333 |
| 343 void JSGenericLowering::ReplaceWithBuiltinCall(Node* node, | 334 void JSGenericLowering::ReplaceWithBuiltinCall(Node* node, |
| 344 Builtins::JavaScript id, | 335 Builtins::JavaScript id, |
| 345 int nargs) { | 336 int nargs) { |
| 346 CallFunctionStub stub(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS); | 337 CallFunctionStub stub(isolate(), nargs - 1, NO_CALL_FUNCTION_FLAGS); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 357 PatchOperator(node, common()->Call(desc)); | 348 PatchOperator(node, common()->Call(desc)); |
| 358 } | 349 } |
| 359 | 350 |
| 360 | 351 |
| 361 void JSGenericLowering::ReplaceWithRuntimeCall(Node* node, | 352 void JSGenericLowering::ReplaceWithRuntimeCall(Node* node, |
| 362 Runtime::FunctionId f, | 353 Runtime::FunctionId f, |
| 363 int nargs_override) { | 354 int nargs_override) { |
| 364 Operator::Property props = node->op()->properties(); | 355 Operator::Property props = node->op()->properties(); |
| 365 const Runtime::Function* fun = Runtime::FunctionForId(f); | 356 const Runtime::Function* fun = Runtime::FunctionForId(f); |
| 366 int nargs = (nargs_override < 0) ? fun->nargs : nargs_override; | 357 int nargs = (nargs_override < 0) ? fun->nargs : nargs_override; |
| 367 CallDescriptor* desc = linkage()->GetRuntimeCallDescriptor( | 358 CallDescriptor::DeoptimizationSupport deopt = |
| 368 f, nargs, props, DeoptimizationSupportForNode(node)); | 359 OperatorProperties::CanLazilyDeoptimize(node->op()) |
| 360 ? CallDescriptor::kCanDeoptimize |
| 361 : CallDescriptor::kCannotDeoptimize; |
| 362 CallDescriptor* desc = |
| 363 linkage()->GetRuntimeCallDescriptor(f, nargs, props, deopt); |
| 369 Node* ref = ExternalConstant(ExternalReference(f, isolate())); | 364 Node* ref = ExternalConstant(ExternalReference(f, isolate())); |
| 370 Node* arity = Int32Constant(nargs); | 365 Node* arity = Int32Constant(nargs); |
| 371 if (!centrystub_constant_.is_set()) { | 366 if (!centrystub_constant_.is_set()) { |
| 372 centrystub_constant_.set(CodeConstant(CEntryStub(isolate(), 1).GetCode())); | 367 centrystub_constant_.set(CodeConstant(CEntryStub(isolate(), 1).GetCode())); |
| 373 } | 368 } |
| 374 PatchInsertInput(node, 0, centrystub_constant_.get()); | 369 PatchInsertInput(node, 0, centrystub_constant_.get()); |
| 375 PatchInsertInput(node, nargs + 1, ref); | 370 PatchInsertInput(node, nargs + 1, ref); |
| 376 PatchInsertInput(node, nargs + 2, arity); | 371 PatchInsertInput(node, nargs + 2, arity); |
| 377 PatchOperator(node, common()->Call(desc)); | 372 PatchOperator(node, common()->Call(desc)); |
| 378 } | 373 } |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index()))); | 501 node->ReplaceInput(1, Int32Constant(Context::SlotOffset(access.index()))); |
| 507 PatchOperator(node, machine()->Store(kMachineTagged, kFullWriteBarrier)); | 502 PatchOperator(node, machine()->Store(kMachineTagged, kFullWriteBarrier)); |
| 508 return node; | 503 return node; |
| 509 } | 504 } |
| 510 | 505 |
| 511 | 506 |
| 512 Node* JSGenericLowering::LowerJSCallConstruct(Node* node) { | 507 Node* JSGenericLowering::LowerJSCallConstruct(Node* node) { |
| 513 int arity = OpParameter<int>(node); | 508 int arity = OpParameter<int>(node); |
| 514 CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS); | 509 CallConstructStub stub(isolate(), NO_CALL_CONSTRUCTOR_FLAGS); |
| 515 CodeStubInterfaceDescriptor* d = GetInterfaceDescriptor(isolate(), &stub); | 510 CodeStubInterfaceDescriptor* d = GetInterfaceDescriptor(isolate(), &stub); |
| 516 CallDescriptor* desc = linkage()->GetStubCallDescriptor( | 511 CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, arity); |
| 517 d, arity, DeoptimizationSupportForNode(node)); | |
| 518 Node* stub_code = CodeConstant(stub.GetCode()); | 512 Node* stub_code = CodeConstant(stub.GetCode()); |
| 519 Node* construct = NodeProperties::GetValueInput(node, 0); | 513 Node* construct = NodeProperties::GetValueInput(node, 0); |
| 520 PatchInsertInput(node, 0, stub_code); | 514 PatchInsertInput(node, 0, stub_code); |
| 521 PatchInsertInput(node, 1, Int32Constant(arity - 1)); | 515 PatchInsertInput(node, 1, Int32Constant(arity - 1)); |
| 522 PatchInsertInput(node, 2, construct); | 516 PatchInsertInput(node, 2, construct); |
| 523 PatchInsertInput(node, 3, jsgraph()->UndefinedConstant()); | 517 PatchInsertInput(node, 3, jsgraph()->UndefinedConstant()); |
| 524 PatchOperator(node, common()->Call(desc)); | 518 PatchOperator(node, common()->Call(desc)); |
| 525 return node; | 519 return node; |
| 526 } | 520 } |
| 527 | 521 |
| 528 | 522 |
| 529 Node* JSGenericLowering::LowerJSCallFunction(Node* node) { | 523 Node* JSGenericLowering::LowerJSCallFunction(Node* node) { |
| 530 CallParameters p = OpParameter<CallParameters>(node); | 524 CallParameters p = OpParameter<CallParameters>(node); |
| 531 CallFunctionStub stub(isolate(), p.arity - 2, p.flags); | 525 CallFunctionStub stub(isolate(), p.arity - 2, p.flags); |
| 532 CodeStubInterfaceDescriptor* d = GetInterfaceDescriptor(isolate(), &stub); | 526 CodeStubInterfaceDescriptor* d = GetInterfaceDescriptor(isolate(), &stub); |
| 533 CallDescriptor* desc = linkage()->GetStubCallDescriptor( | 527 CallDescriptor* desc = linkage()->GetStubCallDescriptor(d, p.arity - 1); |
| 534 d, p.arity - 1, DeoptimizationSupportForNode(node)); | |
| 535 Node* stub_code = CodeConstant(stub.GetCode()); | 528 Node* stub_code = CodeConstant(stub.GetCode()); |
| 536 PatchInsertInput(node, 0, stub_code); | 529 PatchInsertInput(node, 0, stub_code); |
| 537 PatchOperator(node, common()->Call(desc)); | 530 PatchOperator(node, common()->Call(desc)); |
| 538 return node; | 531 return node; |
| 539 } | 532 } |
| 540 | 533 |
| 541 | 534 |
| 542 Node* JSGenericLowering::LowerJSCallRuntime(Node* node) { | 535 Node* JSGenericLowering::LowerJSCallRuntime(Node* node) { |
| 543 Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node); | 536 Runtime::FunctionId function = OpParameter<Runtime::FunctionId>(node); |
| 544 int arity = OperatorProperties::GetValueInputCount(node->op()); | 537 int arity = OperatorProperties::GetValueInputCount(node->op()); |
| 545 ReplaceWithRuntimeCall(node, function, arity); | 538 ReplaceWithRuntimeCall(node, function, arity); |
| 546 return node; | 539 return node; |
| 547 } | 540 } |
| 548 } | 541 } |
| 549 } | 542 } |
| 550 } // namespace v8::internal::compiler | 543 } // namespace v8::internal::compiler |
| OLD | NEW |