| 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/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
| 6 #include "src/code-stubs.h" | 6 #include "src/code-stubs.h" |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/common-operator.h" | 8 #include "src/compiler/common-operator.h" |
| 9 #include "src/compiler/frame.h" | 9 #include "src/compiler/frame.h" |
| 10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 locations.Build(), // location_sig | 359 locations.Build(), // location_sig |
| 360 js_parameter_count, // stack_parameter_count | 360 js_parameter_count, // stack_parameter_count |
| 361 Operator::kNoProperties, // properties | 361 Operator::kNoProperties, // properties |
| 362 kNoCalleeSaved, // callee-saved | 362 kNoCalleeSaved, // callee-saved |
| 363 kNoCalleeSaved, // callee-saved fp | 363 kNoCalleeSaved, // callee-saved fp |
| 364 CallDescriptor::kCanUseRoots | // flags | 364 CallDescriptor::kCanUseRoots | // flags |
| 365 flags, // flags | 365 flags, // flags |
| 366 "js-call"); | 366 "js-call"); |
| 367 } | 367 } |
| 368 | 368 |
| 369 | |
| 370 CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(Zone* zone) { | |
| 371 MachineSignature::Builder types(zone, 0, 6); | |
| 372 LocationSignature::Builder locations(zone, 0, 6); | |
| 373 | |
| 374 // Add registers for fixed parameters passed via interpreter dispatch. | |
| 375 STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter); | |
| 376 types.AddParam(MachineType::AnyTagged()); | |
| 377 locations.AddParam(regloc(kInterpreterAccumulatorRegister)); | |
| 378 | |
| 379 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); | |
| 380 types.AddParam(MachineType::Pointer()); | |
| 381 locations.AddParam(regloc(kInterpreterRegisterFileRegister)); | |
| 382 | |
| 383 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); | |
| 384 types.AddParam(MachineType::IntPtr()); | |
| 385 locations.AddParam(regloc(kInterpreterBytecodeOffsetRegister)); | |
| 386 | |
| 387 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); | |
| 388 types.AddParam(MachineType::AnyTagged()); | |
| 389 locations.AddParam(regloc(kInterpreterBytecodeArrayRegister)); | |
| 390 | |
| 391 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); | |
| 392 types.AddParam(MachineType::Pointer()); | |
| 393 #if defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_X87) | |
| 394 // TODO(rmcilroy): Make the context param the one spilled to the stack once | |
| 395 // Turbofan supports modified stack arguments in tail calls. | |
| 396 locations.AddParam( | |
| 397 LinkageLocation::ForCallerFrameSlot(kInterpreterDispatchTableSpillSlot)); | |
| 398 #else | |
| 399 locations.AddParam(regloc(kInterpreterDispatchTableRegister)); | |
| 400 #endif | |
| 401 | |
| 402 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); | |
| 403 types.AddParam(MachineType::AnyTagged()); | |
| 404 locations.AddParam(regloc(kContextRegister)); | |
| 405 | |
| 406 LinkageLocation target_loc = LinkageLocation::ForAnyRegister(); | |
| 407 return new (zone) CallDescriptor( // -- | |
| 408 CallDescriptor::kCallCodeObject, // kind | |
| 409 MachineType::None(), // target MachineType | |
| 410 target_loc, // target location | |
| 411 types.Build(), // machine_sig | |
| 412 locations.Build(), // location_sig | |
| 413 0, // stack_parameter_count | |
| 414 Operator::kNoProperties, // properties | |
| 415 kNoCalleeSaved, // callee-saved registers | |
| 416 kNoCalleeSaved, // callee-saved fp regs | |
| 417 CallDescriptor::kSupportsTailCalls | // flags | |
| 418 CallDescriptor::kCanUseRoots, // flags | |
| 419 "interpreter-dispatch"); | |
| 420 } | |
| 421 | |
| 422 | |
| 423 // TODO(all): Add support for return representations/locations to | 369 // TODO(all): Add support for return representations/locations to |
| 424 // CallInterfaceDescriptor. | 370 // CallInterfaceDescriptor. |
| 425 // TODO(turbofan): cache call descriptors for code stub calls. | 371 // TODO(turbofan): cache call descriptors for code stub calls. |
| 426 CallDescriptor* Linkage::GetStubCallDescriptor( | 372 CallDescriptor* Linkage::GetStubCallDescriptor( |
| 427 Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor, | 373 Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor, |
| 428 int stack_parameter_count, CallDescriptor::Flags flags, | 374 int stack_parameter_count, CallDescriptor::Flags flags, |
| 429 Operator::Properties properties, MachineType return_type, | 375 Operator::Properties properties, MachineType return_type, |
| 430 size_t return_count) { | 376 size_t return_count) { |
| 431 const int register_parameter_count = descriptor.GetRegisterParameterCount(); | 377 const int register_parameter_count = descriptor.GetRegisterParameterCount(); |
| 432 const int js_parameter_count = | 378 const int js_parameter_count = |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 } else { | 476 } else { |
| 531 DCHECK(loc == regloc(kContextRegister)); | 477 DCHECK(loc == regloc(kContextRegister)); |
| 532 return LinkageLocation::ForCalleeFrameSlot(Frame::kContextSlot); | 478 return LinkageLocation::ForCalleeFrameSlot(Frame::kContextSlot); |
| 533 } | 479 } |
| 534 } | 480 } |
| 535 | 481 |
| 536 | 482 |
| 537 } // namespace compiler | 483 } // namespace compiler |
| 538 } // namespace internal | 484 } // namespace internal |
| 539 } // namespace v8 | 485 } // namespace v8 |
| OLD | NEW |