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/interpreter/interpreter-assembler.h" | 5 #include "src/interpreter/interpreter-assembler.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <ostream> | 8 #include <ostream> |
9 | 9 |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 } | 495 } |
496 | 496 |
497 Node* InterpreterAssembler::Advance(int delta) { | 497 Node* InterpreterAssembler::Advance(int delta) { |
498 return IntPtrAdd(BytecodeOffset(), IntPtrConstant(delta)); | 498 return IntPtrAdd(BytecodeOffset(), IntPtrConstant(delta)); |
499 } | 499 } |
500 | 500 |
501 Node* InterpreterAssembler::Advance(Node* delta) { | 501 Node* InterpreterAssembler::Advance(Node* delta) { |
502 return IntPtrAdd(BytecodeOffset(), delta); | 502 return IntPtrAdd(BytecodeOffset(), delta); |
503 } | 503 } |
504 | 504 |
505 void InterpreterAssembler::Jump(Node* delta) { | 505 Node* InterpreterAssembler::Jump(Node* delta) { |
506 UpdateInterruptBudget(delta); | 506 UpdateInterruptBudget(delta); |
507 DispatchTo(Advance(delta)); | 507 return DispatchTo(Advance(delta)); |
508 } | 508 } |
509 | 509 |
510 void InterpreterAssembler::JumpConditional(Node* condition, Node* delta) { | 510 void InterpreterAssembler::JumpConditional(Node* condition, Node* delta) { |
511 CodeStubAssembler::Label match(this); | 511 CodeStubAssembler::Label match(this); |
512 CodeStubAssembler::Label no_match(this); | 512 CodeStubAssembler::Label no_match(this); |
513 | 513 |
514 Branch(condition, &match, &no_match); | 514 Branch(condition, &match, &no_match); |
515 Bind(&match); | 515 Bind(&match); |
516 Jump(delta); | 516 Jump(delta); |
517 Bind(&no_match); | 517 Bind(&no_match); |
518 Dispatch(); | 518 Dispatch(); |
519 } | 519 } |
520 | 520 |
521 void InterpreterAssembler::JumpIfWordEqual(Node* lhs, Node* rhs, Node* delta) { | 521 void InterpreterAssembler::JumpIfWordEqual(Node* lhs, Node* rhs, Node* delta) { |
522 JumpConditional(WordEqual(lhs, rhs), delta); | 522 JumpConditional(WordEqual(lhs, rhs), delta); |
523 } | 523 } |
524 | 524 |
525 void InterpreterAssembler::JumpIfWordNotEqual(Node* lhs, Node* rhs, | 525 void InterpreterAssembler::JumpIfWordNotEqual(Node* lhs, Node* rhs, |
526 Node* delta) { | 526 Node* delta) { |
527 JumpConditional(WordNotEqual(lhs, rhs), delta); | 527 JumpConditional(WordNotEqual(lhs, rhs), delta); |
528 } | 528 } |
529 | 529 |
530 void InterpreterAssembler::Dispatch() { | 530 Node* InterpreterAssembler::Dispatch() { |
531 DispatchTo(Advance(Bytecodes::Size(bytecode_, operand_scale_))); | 531 return DispatchTo(Advance(Bytecodes::Size(bytecode_, operand_scale_))); |
532 } | 532 } |
533 | 533 |
534 void InterpreterAssembler::DispatchTo(Node* new_bytecode_offset) { | 534 Node* InterpreterAssembler::DispatchTo(Node* new_bytecode_offset) { |
535 Node* target_bytecode = Load( | 535 Node* target_bytecode = Load( |
536 MachineType::Uint8(), BytecodeArrayTaggedPointer(), new_bytecode_offset); | 536 MachineType::Uint8(), BytecodeArrayTaggedPointer(), new_bytecode_offset); |
537 if (kPointerSize == 8) { | 537 if (kPointerSize == 8) { |
538 target_bytecode = ChangeUint32ToUint64(target_bytecode); | 538 target_bytecode = ChangeUint32ToUint64(target_bytecode); |
539 } | 539 } |
540 | 540 |
541 if (FLAG_trace_ignition_dispatches) { | 541 if (FLAG_trace_ignition_dispatches) { |
542 TraceBytecodeDispatch(target_bytecode); | 542 TraceBytecodeDispatch(target_bytecode); |
543 } | 543 } |
544 | 544 |
545 Node* target_code_entry = | 545 Node* target_code_entry = |
546 Load(MachineType::Pointer(), DispatchTableRawPointer(), | 546 Load(MachineType::Pointer(), DispatchTableRawPointer(), |
547 WordShl(target_bytecode, IntPtrConstant(kPointerSizeLog2))); | 547 WordShl(target_bytecode, IntPtrConstant(kPointerSizeLog2))); |
548 | 548 |
549 DispatchToBytecodeHandlerEntry(target_code_entry, new_bytecode_offset); | 549 return DispatchToBytecodeHandlerEntry(target_code_entry, new_bytecode_offset); |
550 } | 550 } |
551 | 551 |
552 void InterpreterAssembler::DispatchToBytecodeHandler(Node* handler, | 552 Node* InterpreterAssembler::DispatchToBytecodeHandler(Node* handler, |
553 Node* bytecode_offset) { | 553 Node* bytecode_offset) { |
554 Node* handler_entry = | 554 Node* handler_entry = |
555 IntPtrAdd(handler, IntPtrConstant(Code::kHeaderSize - kHeapObjectTag)); | 555 IntPtrAdd(handler, IntPtrConstant(Code::kHeaderSize - kHeapObjectTag)); |
556 DispatchToBytecodeHandlerEntry(handler_entry, bytecode_offset); | 556 return DispatchToBytecodeHandlerEntry(handler_entry, bytecode_offset); |
557 } | 557 } |
558 | 558 |
559 void InterpreterAssembler::DispatchToBytecodeHandlerEntry( | 559 Node* InterpreterAssembler::DispatchToBytecodeHandlerEntry( |
560 Node* handler_entry, Node* bytecode_offset) { | 560 Node* handler_entry, Node* bytecode_offset) { |
561 if (FLAG_trace_ignition) { | 561 if (FLAG_trace_ignition) { |
562 TraceBytecode(Runtime::kInterpreterTraceBytecodeExit); | 562 TraceBytecode(Runtime::kInterpreterTraceBytecodeExit); |
563 } | 563 } |
564 | 564 |
565 InterpreterDispatchDescriptor descriptor(isolate()); | 565 InterpreterDispatchDescriptor descriptor(isolate()); |
566 Node* args[] = {GetAccumulatorUnchecked(), bytecode_offset, | 566 Node* args[] = {GetAccumulatorUnchecked(), bytecode_offset, |
567 BytecodeArrayTaggedPointer(), DispatchTableRawPointer()}; | 567 BytecodeArrayTaggedPointer(), DispatchTableRawPointer()}; |
568 TailCallBytecodeDispatch(descriptor, handler_entry, args); | 568 return TailCallBytecodeDispatch(descriptor, handler_entry, args); |
569 } | 569 } |
570 | 570 |
571 void InterpreterAssembler::DispatchWide(OperandScale operand_scale) { | 571 void InterpreterAssembler::DispatchWide(OperandScale operand_scale) { |
572 // Dispatching a wide bytecode requires treating the prefix | 572 // Dispatching a wide bytecode requires treating the prefix |
573 // bytecode a base pointer into the dispatch table and dispatching | 573 // bytecode a base pointer into the dispatch table and dispatching |
574 // the bytecode that follows relative to this base. | 574 // the bytecode that follows relative to this base. |
575 // | 575 // |
576 // Indices 0-255 correspond to bytecodes with operand_scale == 0 | 576 // Indices 0-255 correspond to bytecodes with operand_scale == 0 |
577 // Indices 256-511 correspond to bytecodes with operand_scale == 1 | 577 // Indices 256-511 correspond to bytecodes with operand_scale == 1 |
578 // Indices 512-767 correspond to bytecodes with operand_scale == 2 | 578 // Indices 512-767 correspond to bytecodes with operand_scale == 2 |
(...skipping 21 matching lines...) Expand all Loading... |
600 base_index = nullptr; | 600 base_index = nullptr; |
601 } | 601 } |
602 Node* target_index = IntPtrAdd(base_index, next_bytecode); | 602 Node* target_index = IntPtrAdd(base_index, next_bytecode); |
603 Node* target_code_entry = | 603 Node* target_code_entry = |
604 Load(MachineType::Pointer(), DispatchTableRawPointer(), | 604 Load(MachineType::Pointer(), DispatchTableRawPointer(), |
605 WordShl(target_index, kPointerSizeLog2)); | 605 WordShl(target_index, kPointerSizeLog2)); |
606 | 606 |
607 DispatchToBytecodeHandlerEntry(target_code_entry, next_bytecode_offset); | 607 DispatchToBytecodeHandlerEntry(target_code_entry, next_bytecode_offset); |
608 } | 608 } |
609 | 609 |
610 void InterpreterAssembler::InterpreterReturn() { | 610 compiler::Node* InterpreterAssembler::InterpreterReturn() { |
611 // TODO(rmcilroy): Investigate whether it is worth supporting self | 611 // TODO(rmcilroy): Investigate whether it is worth supporting self |
612 // optimization of primitive functions like FullCodegen. | 612 // optimization of primitive functions like FullCodegen. |
613 | 613 |
614 // Update profiling count by -BytecodeOffset to simulate backedge to start of | 614 // Update profiling count by -BytecodeOffset to simulate backedge to start of |
615 // function. | 615 // function. |
616 Node* profiling_weight = | 616 Node* profiling_weight = |
617 Int32Sub(Int32Constant(kHeapObjectTag + BytecodeArray::kHeaderSize), | 617 Int32Sub(Int32Constant(kHeapObjectTag + BytecodeArray::kHeaderSize), |
618 BytecodeOffset()); | 618 BytecodeOffset()); |
619 UpdateInterruptBudget(profiling_weight); | 619 UpdateInterruptBudget(profiling_weight); |
620 | 620 |
621 Node* exit_trampoline_code_object = | 621 Node* exit_trampoline_code_object = |
622 HeapConstant(isolate()->builtins()->InterpreterExitTrampoline()); | 622 HeapConstant(isolate()->builtins()->InterpreterExitTrampoline()); |
623 DispatchToBytecodeHandler(exit_trampoline_code_object); | 623 return DispatchToBytecodeHandler(exit_trampoline_code_object); |
624 } | 624 } |
625 | 625 |
626 void InterpreterAssembler::StackCheck() { | 626 void InterpreterAssembler::StackCheck() { |
627 CodeStubAssembler::Label end(this); | 627 CodeStubAssembler::Label end(this); |
628 CodeStubAssembler::Label ok(this); | 628 CodeStubAssembler::Label ok(this); |
629 CodeStubAssembler::Label stack_guard(this); | 629 CodeStubAssembler::Label stack_guard(this); |
630 | 630 |
631 Node* sp = LoadStackPointer(); | 631 Node* sp = LoadStackPointer(); |
632 Node* stack_limit = Load( | 632 Node* stack_limit = Load( |
633 MachineType::Pointer(), | 633 MachineType::Pointer(), |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 V8_TARGET_ARCH_S390 | 709 V8_TARGET_ARCH_S390 |
710 return true; | 710 return true; |
711 #else | 711 #else |
712 #error "Unknown Architecture" | 712 #error "Unknown Architecture" |
713 #endif | 713 #endif |
714 } | 714 } |
715 | 715 |
716 } // namespace interpreter | 716 } // namespace interpreter |
717 } // namespace internal | 717 } // namespace internal |
718 } // namespace v8 | 718 } // namespace v8 |
OLD | NEW |