| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/compiler/interpreter-assembler.h" | 5 #include "src/compiler/interpreter-assembler.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
| 10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, | 28 InterpreterAssembler::InterpreterAssembler(Isolate* isolate, Zone* zone, |
| 29 interpreter::Bytecode bytecode) | 29 interpreter::Bytecode bytecode) |
| 30 : bytecode_(bytecode), | 30 : bytecode_(bytecode), |
| 31 raw_assembler_(new RawMachineAssembler( | 31 raw_assembler_(new RawMachineAssembler( |
| 32 isolate, new (zone) Graph(zone), | 32 isolate, new (zone) Graph(zone), |
| 33 Linkage::GetInterpreterDispatchDescriptor(zone), kMachPtr, | 33 Linkage::GetInterpreterDispatchDescriptor(zone), kMachPtr, |
| 34 InstructionSelector::SupportedMachineOperatorFlags())), | 34 InstructionSelector::SupportedMachineOperatorFlags())), |
| 35 end_nodes_(zone), | 35 end_nodes_(zone), |
| 36 accumulator_( | 36 accumulator_( |
| 37 raw_assembler_->Parameter(Linkage::kInterpreterAccumulatorParameter)), | 37 raw_assembler_->Parameter(Linkage::kInterpreterAccumulatorParameter)), |
| 38 context_( |
| 39 raw_assembler_->Parameter(Linkage::kInterpreterContextParameter)), |
| 38 code_generated_(false) {} | 40 code_generated_(false) {} |
| 39 | 41 |
| 40 | 42 |
| 41 InterpreterAssembler::~InterpreterAssembler() {} | 43 InterpreterAssembler::~InterpreterAssembler() {} |
| 42 | 44 |
| 43 | 45 |
| 44 Handle<Code> InterpreterAssembler::GenerateCode() { | 46 Handle<Code> InterpreterAssembler::GenerateCode() { |
| 45 DCHECK(!code_generated_); | 47 DCHECK(!code_generated_); |
| 46 | 48 |
| 47 End(); | 49 End(); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 59 code->Disassemble(bytecode_name, os); | 61 code->Disassemble(bytecode_name, os); |
| 60 os << std::flush; | 62 os << std::flush; |
| 61 } | 63 } |
| 62 #endif | 64 #endif |
| 63 | 65 |
| 64 code_generated_ = true; | 66 code_generated_ = true; |
| 65 return code; | 67 return code; |
| 66 } | 68 } |
| 67 | 69 |
| 68 | 70 |
| 69 Node* InterpreterAssembler::GetAccumulator() { | 71 Node* InterpreterAssembler::GetAccumulator() { return accumulator_; } |
| 70 return accumulator_; | |
| 71 } | |
| 72 | 72 |
| 73 | 73 |
| 74 void InterpreterAssembler::SetAccumulator(Node* value) { | 74 void InterpreterAssembler::SetAccumulator(Node* value) { accumulator_ = value; } |
| 75 accumulator_ = value; | |
| 76 } | |
| 77 | 75 |
| 78 | 76 |
| 79 Node* InterpreterAssembler::ContextTaggedPointer() { | 77 Node* InterpreterAssembler::GetContext() { return context_; } |
| 80 return raw_assembler_->Parameter(Linkage::kInterpreterContextParameter); | 78 |
| 81 } | 79 |
| 80 void InterpreterAssembler::SetContext(Node* value) { context_ = value; } |
| 82 | 81 |
| 83 | 82 |
| 84 Node* InterpreterAssembler::RegisterFileRawPointer() { | 83 Node* InterpreterAssembler::RegisterFileRawPointer() { |
| 85 return raw_assembler_->Parameter(Linkage::kInterpreterRegisterFileParameter); | 84 return raw_assembler_->Parameter(Linkage::kInterpreterRegisterFileParameter); |
| 86 } | 85 } |
| 87 | 86 |
| 88 | 87 |
| 89 Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { | 88 Node* InterpreterAssembler::BytecodeArrayTaggedPointer() { |
| 90 return raw_assembler_->Parameter(Linkage::kInterpreterBytecodeArrayParameter); | 89 return raw_assembler_->Parameter(Linkage::kInterpreterBytecodeArrayParameter); |
| 91 } | 90 } |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 Callable callable = CodeFactory::InterpreterPushArgsAndCall(isolate()); | 331 Callable callable = CodeFactory::InterpreterPushArgsAndCall(isolate()); |
| 333 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( | 332 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( |
| 334 isolate(), zone(), callable.descriptor(), 0, CallDescriptor::kNoFlags); | 333 isolate(), zone(), callable.descriptor(), 0, CallDescriptor::kNoFlags); |
| 335 | 334 |
| 336 Node* code_target = HeapConstant(callable.code()); | 335 Node* code_target = HeapConstant(callable.code()); |
| 337 | 336 |
| 338 Node** args = zone()->NewArray<Node*>(4); | 337 Node** args = zone()->NewArray<Node*>(4); |
| 339 args[0] = arg_count; | 338 args[0] = arg_count; |
| 340 args[1] = first_arg; | 339 args[1] = first_arg; |
| 341 args[2] = function; | 340 args[2] = function; |
| 342 args[3] = ContextTaggedPointer(); | 341 args[3] = GetContext(); |
| 343 | 342 |
| 344 return CallN(descriptor, code_target, args); | 343 return CallN(descriptor, code_target, args); |
| 345 } | 344 } |
| 346 | 345 |
| 347 | 346 |
| 348 Node* InterpreterAssembler::CallIC(CallInterfaceDescriptor descriptor, | 347 Node* InterpreterAssembler::CallIC(CallInterfaceDescriptor descriptor, |
| 349 Node* target, Node** args) { | 348 Node* target, Node** args) { |
| 350 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( | 349 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |
| 351 isolate(), zone(), descriptor, 0, CallDescriptor::kNoFlags); | 350 isolate(), zone(), descriptor, 0, CallDescriptor::kNoFlags); |
| 352 return CallN(call_descriptor, target, args); | 351 return CallN(call_descriptor, target, args); |
| 353 } | 352 } |
| 354 | 353 |
| 355 | 354 |
| 356 Node* InterpreterAssembler::CallIC(CallInterfaceDescriptor descriptor, | 355 Node* InterpreterAssembler::CallIC(CallInterfaceDescriptor descriptor, |
| 357 Node* target, Node* arg1, Node* arg2, | 356 Node* target, Node* arg1, Node* arg2, |
| 358 Node* arg3, Node* arg4) { | 357 Node* arg3, Node* arg4) { |
| 359 Node** args = zone()->NewArray<Node*>(5); | 358 Node** args = zone()->NewArray<Node*>(5); |
| 360 args[0] = arg1; | 359 args[0] = arg1; |
| 361 args[1] = arg2; | 360 args[1] = arg2; |
| 362 args[2] = arg3; | 361 args[2] = arg3; |
| 363 args[3] = arg4; | 362 args[3] = arg4; |
| 364 args[4] = ContextTaggedPointer(); | 363 args[4] = GetContext(); |
| 365 return CallIC(descriptor, target, args); | 364 return CallIC(descriptor, target, args); |
| 366 } | 365 } |
| 367 | 366 |
| 368 | 367 |
| 369 Node* InterpreterAssembler::CallIC(CallInterfaceDescriptor descriptor, | 368 Node* InterpreterAssembler::CallIC(CallInterfaceDescriptor descriptor, |
| 370 Node* target, Node* arg1, Node* arg2, | 369 Node* target, Node* arg1, Node* arg2, |
| 371 Node* arg3, Node* arg4, Node* arg5) { | 370 Node* arg3, Node* arg4, Node* arg5) { |
| 372 Node** args = zone()->NewArray<Node*>(6); | 371 Node** args = zone()->NewArray<Node*>(6); |
| 373 args[0] = arg1; | 372 args[0] = arg1; |
| 374 args[1] = arg2; | 373 args[1] = arg2; |
| 375 args[2] = arg3; | 374 args[2] = arg3; |
| 376 args[3] = arg4; | 375 args[3] = arg4; |
| 377 args[4] = arg5; | 376 args[4] = arg5; |
| 378 args[5] = ContextTaggedPointer(); | 377 args[5] = GetContext(); |
| 379 return CallIC(descriptor, target, args); | 378 return CallIC(descriptor, target, args); |
| 380 } | 379 } |
| 381 | 380 |
| 382 | 381 |
| 383 Node* InterpreterAssembler::CallRuntime(Node* function_id, Node* first_arg, | 382 Node* InterpreterAssembler::CallRuntime(Node* function_id, Node* first_arg, |
| 384 Node* arg_count) { | 383 Node* arg_count) { |
| 385 Callable callable = CodeFactory::InterpreterCEntry(isolate()); | 384 Callable callable = CodeFactory::InterpreterCEntry(isolate()); |
| 386 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( | 385 CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( |
| 387 isolate(), zone(), callable.descriptor(), 0, CallDescriptor::kNoFlags); | 386 isolate(), zone(), callable.descriptor(), 0, CallDescriptor::kNoFlags); |
| 388 | 387 |
| 389 Node* code_target = HeapConstant(callable.code()); | 388 Node* code_target = HeapConstant(callable.code()); |
| 390 | 389 |
| 391 // Get the function entry from the function id. | 390 // Get the function entry from the function id. |
| 392 Node* function_table = raw_assembler_->ExternalConstant( | 391 Node* function_table = raw_assembler_->ExternalConstant( |
| 393 ExternalReference::runtime_function_table_address(isolate())); | 392 ExternalReference::runtime_function_table_address(isolate())); |
| 394 Node* function_offset = raw_assembler_->Int32Mul( | 393 Node* function_offset = raw_assembler_->Int32Mul( |
| 395 function_id, Int32Constant(sizeof(Runtime::Function))); | 394 function_id, Int32Constant(sizeof(Runtime::Function))); |
| 396 Node* function = IntPtrAdd(function_table, function_offset); | 395 Node* function = IntPtrAdd(function_table, function_offset); |
| 397 Node* function_entry = raw_assembler_->Load( | 396 Node* function_entry = raw_assembler_->Load( |
| 398 kMachPtr, function, Int32Constant(offsetof(Runtime::Function, entry))); | 397 kMachPtr, function, Int32Constant(offsetof(Runtime::Function, entry))); |
| 399 | 398 |
| 400 Node** args = zone()->NewArray<Node*>(4); | 399 Node** args = zone()->NewArray<Node*>(4); |
| 401 args[0] = arg_count; | 400 args[0] = arg_count; |
| 402 args[1] = first_arg; | 401 args[1] = first_arg; |
| 403 args[2] = function_entry; | 402 args[2] = function_entry; |
| 404 args[3] = ContextTaggedPointer(); | 403 args[3] = GetContext(); |
| 405 | 404 |
| 406 return CallN(descriptor, code_target, args); | 405 return CallN(descriptor, code_target, args); |
| 407 } | 406 } |
| 408 | 407 |
| 409 | 408 |
| 410 Node* InterpreterAssembler::CallRuntime(Runtime::FunctionId function_id, | 409 Node* InterpreterAssembler::CallRuntime(Runtime::FunctionId function_id, |
| 411 Node* arg1) { | 410 Node* arg1) { |
| 412 return raw_assembler_->CallRuntime1(function_id, arg1, | 411 return raw_assembler_->CallRuntime1(function_id, arg1, GetContext()); |
| 413 ContextTaggedPointer()); | |
| 414 } | 412 } |
| 415 | 413 |
| 416 | 414 |
| 417 Node* InterpreterAssembler::CallRuntime(Runtime::FunctionId function_id, | 415 Node* InterpreterAssembler::CallRuntime(Runtime::FunctionId function_id, |
| 418 Node* arg1, Node* arg2) { | 416 Node* arg1, Node* arg2) { |
| 419 return raw_assembler_->CallRuntime2(function_id, arg1, arg2, | 417 return raw_assembler_->CallRuntime2(function_id, arg1, arg2, GetContext()); |
| 420 ContextTaggedPointer()); | |
| 421 } | 418 } |
| 422 | 419 |
| 423 | 420 |
| 424 void InterpreterAssembler::Return() { | 421 void InterpreterAssembler::Return() { |
| 425 Node* exit_trampoline_code_object = | 422 Node* exit_trampoline_code_object = |
| 426 HeapConstant(isolate()->builtins()->InterpreterExitTrampoline()); | 423 HeapConstant(isolate()->builtins()->InterpreterExitTrampoline()); |
| 427 // If the order of the parameters you need to change the call signature below. | 424 // If the order of the parameters you need to change the call signature below. |
| 428 STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter); | 425 STATIC_ASSERT(0 == Linkage::kInterpreterAccumulatorParameter); |
| 429 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); | 426 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); |
| 430 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); | 427 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); |
| 431 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); | 428 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); |
| 432 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); | 429 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); |
| 433 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); | 430 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); |
| 434 Node* args[] = { GetAccumulator(), | 431 Node* args[] = { GetAccumulator(), |
| 435 RegisterFileRawPointer(), | 432 RegisterFileRawPointer(), |
| 436 BytecodeOffset(), | 433 BytecodeOffset(), |
| 437 BytecodeArrayTaggedPointer(), | 434 BytecodeArrayTaggedPointer(), |
| 438 DispatchTableRawPointer(), | 435 DispatchTableRawPointer(), |
| 439 ContextTaggedPointer() }; | 436 GetContext() }; |
| 440 Node* tail_call = raw_assembler_->TailCallN( | 437 Node* tail_call = raw_assembler_->TailCallN( |
| 441 call_descriptor(), exit_trampoline_code_object, args); | 438 call_descriptor(), exit_trampoline_code_object, args); |
| 442 // This should always be the end node. | 439 // This should always be the end node. |
| 443 AddEndInput(tail_call); | 440 AddEndInput(tail_call); |
| 444 } | 441 } |
| 445 | 442 |
| 446 | 443 |
| 447 Node* InterpreterAssembler::Advance(int delta) { | 444 Node* InterpreterAssembler::Advance(int delta) { |
| 448 return IntPtrAdd(BytecodeOffset(), Int32Constant(delta)); | 445 return IntPtrAdd(BytecodeOffset(), Int32Constant(delta)); |
| 449 } | 446 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); | 486 STATIC_ASSERT(1 == Linkage::kInterpreterRegisterFileParameter); |
| 490 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); | 487 STATIC_ASSERT(2 == Linkage::kInterpreterBytecodeOffsetParameter); |
| 491 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); | 488 STATIC_ASSERT(3 == Linkage::kInterpreterBytecodeArrayParameter); |
| 492 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); | 489 STATIC_ASSERT(4 == Linkage::kInterpreterDispatchTableParameter); |
| 493 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); | 490 STATIC_ASSERT(5 == Linkage::kInterpreterContextParameter); |
| 494 Node* args[] = { GetAccumulator(), | 491 Node* args[] = { GetAccumulator(), |
| 495 RegisterFileRawPointer(), | 492 RegisterFileRawPointer(), |
| 496 new_bytecode_offset, | 493 new_bytecode_offset, |
| 497 BytecodeArrayTaggedPointer(), | 494 BytecodeArrayTaggedPointer(), |
| 498 DispatchTableRawPointer(), | 495 DispatchTableRawPointer(), |
| 499 ContextTaggedPointer() }; | 496 GetContext() }; |
| 500 Node* tail_call = | 497 Node* tail_call = |
| 501 raw_assembler_->TailCallN(call_descriptor(), target_code_object, args); | 498 raw_assembler_->TailCallN(call_descriptor(), target_code_object, args); |
| 502 // This should always be the end node. | 499 // This should always be the end node. |
| 503 AddEndInput(tail_call); | 500 AddEndInput(tail_call); |
| 504 } | 501 } |
| 505 | 502 |
| 506 | 503 |
| 507 void InterpreterAssembler::AbortIfWordNotEqual(Node* lhs, Node* rhs, | 504 void InterpreterAssembler::AbortIfWordNotEqual(Node* lhs, Node* rhs, |
| 508 BailoutReason bailout_reason) { | 505 BailoutReason bailout_reason) { |
| 509 RawMachineAssembler::Label match, no_match; | 506 RawMachineAssembler::Label match, no_match; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 return raw_assembler_->schedule(); | 559 return raw_assembler_->schedule(); |
| 563 } | 560 } |
| 564 | 561 |
| 565 | 562 |
| 566 Zone* InterpreterAssembler::zone() { return raw_assembler_->zone(); } | 563 Zone* InterpreterAssembler::zone() { return raw_assembler_->zone(); } |
| 567 | 564 |
| 568 | 565 |
| 569 } // namespace compiler | 566 } // namespace compiler |
| 570 } // namespace internal | 567 } // namespace internal |
| 571 } // namespace v8 | 568 } // namespace v8 |
| OLD | NEW |