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 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 Node* target_bytecode = Load( | 552 Node* target_bytecode = Load( |
553 MachineType::Uint8(), BytecodeArrayTaggedPointer(), new_bytecode_offset); | 553 MachineType::Uint8(), BytecodeArrayTaggedPointer(), new_bytecode_offset); |
554 if (kPointerSize == 8) { | 554 if (kPointerSize == 8) { |
555 target_bytecode = ChangeUint32ToUint64(target_bytecode); | 555 target_bytecode = ChangeUint32ToUint64(target_bytecode); |
556 } | 556 } |
557 | 557 |
558 if (FLAG_trace_ignition_dispatches) { | 558 if (FLAG_trace_ignition_dispatches) { |
559 TraceBytecodeDispatch(target_bytecode); | 559 TraceBytecodeDispatch(target_bytecode); |
560 } | 560 } |
561 | 561 |
562 // TODO(rmcilroy): Create a code target dispatch table to avoid conversion | 562 Node* target_code_entry = |
563 // from code object on every dispatch. | |
564 Node* target_code_object = | |
565 Load(MachineType::Pointer(), DispatchTableRawPointer(), | 563 Load(MachineType::Pointer(), DispatchTableRawPointer(), |
566 WordShl(target_bytecode, IntPtrConstant(kPointerSizeLog2))); | 564 WordShl(target_bytecode, IntPtrConstant(kPointerSizeLog2))); |
567 | 565 |
568 DispatchToBytecodeHandler(target_code_object, new_bytecode_offset); | 566 DispatchToBytecodeHandlerEntry(target_code_entry, new_bytecode_offset); |
569 } | 567 } |
570 | 568 |
571 void InterpreterAssembler::DispatchToBytecodeHandler(Node* handler, | 569 void InterpreterAssembler::DispatchToBytecodeHandler(Node* handler, |
572 Node* bytecode_offset) { | 570 Node* bytecode_offset) { |
| 571 Node* handler_entry = |
| 572 IntPtrAdd(handler, IntPtrConstant(Code::kHeaderSize - kHeapObjectTag)); |
| 573 DispatchToBytecodeHandlerEntry(handler_entry, bytecode_offset); |
| 574 } |
| 575 |
| 576 void InterpreterAssembler::DispatchToBytecodeHandlerEntry( |
| 577 Node* handler_entry, Node* bytecode_offset) { |
573 if (FLAG_trace_ignition) { | 578 if (FLAG_trace_ignition) { |
574 TraceBytecode(Runtime::kInterpreterTraceBytecodeExit); | 579 TraceBytecode(Runtime::kInterpreterTraceBytecodeExit); |
575 } | 580 } |
576 | 581 |
577 InterpreterDispatchDescriptor descriptor(isolate()); | 582 InterpreterDispatchDescriptor descriptor(isolate()); |
578 Node* args[] = {GetAccumulatorUnchecked(), RegisterFileRawPointer(), | 583 Node* args[] = {GetAccumulatorUnchecked(), RegisterFileRawPointer(), |
579 bytecode_offset, BytecodeArrayTaggedPointer(), | 584 bytecode_offset, BytecodeArrayTaggedPointer(), |
580 DispatchTableRawPointer(), GetContext()}; | 585 DispatchTableRawPointer(), GetContext()}; |
581 TailCall(descriptor, handler, args, 0); | 586 TailCallBytecodeDispatch(descriptor, handler_entry, args); |
582 } | 587 } |
583 | 588 |
584 void InterpreterAssembler::DispatchWide(OperandScale operand_scale) { | 589 void InterpreterAssembler::DispatchWide(OperandScale operand_scale) { |
585 // Dispatching a wide bytecode requires treating the prefix | 590 // Dispatching a wide bytecode requires treating the prefix |
586 // bytecode a base pointer into the dispatch table and dispatching | 591 // bytecode a base pointer into the dispatch table and dispatching |
587 // the bytecode that follows relative to this base. | 592 // the bytecode that follows relative to this base. |
588 // | 593 // |
589 // Indices 0-255 correspond to bytecodes with operand_scale == 0 | 594 // Indices 0-255 correspond to bytecodes with operand_scale == 0 |
590 // Indices 256-511 correspond to bytecodes with operand_scale == 1 | 595 // Indices 256-511 correspond to bytecodes with operand_scale == 1 |
591 // Indices 512-767 correspond to bytecodes with operand_scale == 2 | 596 // Indices 512-767 correspond to bytecodes with operand_scale == 2 |
(...skipping 14 matching lines...) Expand all Loading... |
606 base_index = IntPtrConstant(1 << kBitsPerByte); | 611 base_index = IntPtrConstant(1 << kBitsPerByte); |
607 break; | 612 break; |
608 case OperandScale::kQuadruple: | 613 case OperandScale::kQuadruple: |
609 base_index = IntPtrConstant(2 << kBitsPerByte); | 614 base_index = IntPtrConstant(2 << kBitsPerByte); |
610 break; | 615 break; |
611 default: | 616 default: |
612 UNREACHABLE(); | 617 UNREACHABLE(); |
613 base_index = nullptr; | 618 base_index = nullptr; |
614 } | 619 } |
615 Node* target_index = IntPtrAdd(base_index, next_bytecode); | 620 Node* target_index = IntPtrAdd(base_index, next_bytecode); |
616 Node* target_code_object = | 621 Node* target_code_entry = |
617 Load(MachineType::Pointer(), DispatchTableRawPointer(), | 622 Load(MachineType::Pointer(), DispatchTableRawPointer(), |
618 WordShl(target_index, kPointerSizeLog2)); | 623 WordShl(target_index, kPointerSizeLog2)); |
619 | 624 |
620 DispatchToBytecodeHandler(target_code_object, next_bytecode_offset); | 625 DispatchToBytecodeHandlerEntry(target_code_entry, next_bytecode_offset); |
621 } | 626 } |
622 | 627 |
623 void InterpreterAssembler::InterpreterReturn() { | 628 void InterpreterAssembler::InterpreterReturn() { |
624 // TODO(rmcilroy): Investigate whether it is worth supporting self | 629 // TODO(rmcilroy): Investigate whether it is worth supporting self |
625 // optimization of primitive functions like FullCodegen. | 630 // optimization of primitive functions like FullCodegen. |
626 | 631 |
627 // Update profiling count by -BytecodeOffset to simulate backedge to start of | 632 // Update profiling count by -BytecodeOffset to simulate backedge to start of |
628 // function. | 633 // function. |
629 Node* profiling_weight = | 634 Node* profiling_weight = |
630 Int32Sub(Int32Constant(kHeapObjectTag + BytecodeArray::kHeaderSize), | 635 Int32Sub(Int32Constant(kHeapObjectTag + BytecodeArray::kHeaderSize), |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 V8_TARGET_ARCH_S390 | 727 V8_TARGET_ARCH_S390 |
723 return true; | 728 return true; |
724 #else | 729 #else |
725 #error "Unknown Architecture" | 730 #error "Unknown Architecture" |
726 #endif | 731 #endif |
727 } | 732 } |
728 | 733 |
729 } // namespace interpreter | 734 } // namespace interpreter |
730 } // namespace internal | 735 } // namespace internal |
731 } // namespace v8 | 736 } // namespace v8 |
OLD | NEW |