| 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/bytecodes.h" | 5 #include "src/interpreter/bytecodes.h" |
| 6 | 6 |
| 7 #include <iomanip> | 7 #include <iomanip> |
| 8 | 8 |
| 9 #include "src/frames.h" | 9 #include "src/frames.h" |
| 10 #include "src/interpreter/bytecode-traits.h" | 10 #include "src/interpreter/bytecode-traits.h" |
| (...skipping 627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 | 638 |
| 639 std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale) { | 639 std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale) { |
| 640 return os << Bytecodes::OperandScaleToString(operand_scale); | 640 return os << Bytecodes::OperandScaleToString(operand_scale); |
| 641 } | 641 } |
| 642 | 642 |
| 643 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) { | 643 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type) { |
| 644 return os << Bytecodes::OperandTypeToString(operand_type); | 644 return os << Bytecodes::OperandTypeToString(operand_type); |
| 645 } | 645 } |
| 646 | 646 |
| 647 static const int kLastParamRegisterIndex = | 647 static const int kLastParamRegisterIndex = |
| 648 -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; | 648 (InterpreterFrameConstants::kRegisterFileFromFp - |
| 649 InterpreterFrameConstants::kLastParamFromFp) / |
| 650 kPointerSize; |
| 649 static const int kFunctionClosureRegisterIndex = | 651 static const int kFunctionClosureRegisterIndex = |
| 650 -InterpreterFrameConstants::kFunctionFromRegisterPointer / kPointerSize; | 652 (InterpreterFrameConstants::kRegisterFileFromFp - |
| 653 StandardFrameConstants::kFunctionOffset) / |
| 654 kPointerSize; |
| 651 static const int kCurrentContextRegisterIndex = | 655 static const int kCurrentContextRegisterIndex = |
| 652 -InterpreterFrameConstants::kContextFromRegisterPointer / kPointerSize; | 656 (InterpreterFrameConstants::kRegisterFileFromFp - |
| 657 StandardFrameConstants::kContextOffset) / |
| 658 kPointerSize; |
| 653 static const int kNewTargetRegisterIndex = | 659 static const int kNewTargetRegisterIndex = |
| 654 -InterpreterFrameConstants::kNewTargetFromRegisterPointer / kPointerSize; | 660 (InterpreterFrameConstants::kRegisterFileFromFp - |
| 655 | 661 InterpreterFrameConstants::kNewTargetFromFp) / |
| 656 bool Register::is_byte_operand() const { | 662 kPointerSize; |
| 657 return index_ >= -kMaxInt8 && index_ <= -kMinInt8; | 663 static const int kBytecodeArrayRegisterIndex = |
| 658 } | 664 (InterpreterFrameConstants::kRegisterFileFromFp - |
| 659 | 665 InterpreterFrameConstants::kBytecodeArrayFromFp) / |
| 660 bool Register::is_short_operand() const { | 666 kPointerSize; |
| 661 return index_ >= -kMaxInt16 && index_ <= -kMinInt16; | 667 static const int kBytecodeOffsetRegisterIndex = |
| 662 } | 668 (InterpreterFrameConstants::kRegisterFileFromFp - |
| 669 InterpreterFrameConstants::kBytecodeOffsetFromFp) / |
| 670 kPointerSize; |
| 663 | 671 |
| 664 Register Register::FromParameterIndex(int index, int parameter_count) { | 672 Register Register::FromParameterIndex(int index, int parameter_count) { |
| 665 DCHECK_GE(index, 0); | 673 DCHECK_GE(index, 0); |
| 666 DCHECK_LT(index, parameter_count); | 674 DCHECK_LT(index, parameter_count); |
| 667 int register_index = kLastParamRegisterIndex - parameter_count + index + 1; | 675 int register_index = kLastParamRegisterIndex - parameter_count + index + 1; |
| 668 DCHECK_LT(register_index, 0); | 676 DCHECK_LT(register_index, 0); |
| 669 return Register(register_index); | 677 return Register(register_index); |
| 670 } | 678 } |
| 671 | 679 |
| 672 | |
| 673 int Register::ToParameterIndex(int parameter_count) const { | 680 int Register::ToParameterIndex(int parameter_count) const { |
| 674 DCHECK(is_parameter()); | 681 DCHECK(is_parameter()); |
| 675 return index() - kLastParamRegisterIndex + parameter_count - 1; | 682 return index() - kLastParamRegisterIndex + parameter_count - 1; |
| 676 } | 683 } |
| 677 | 684 |
| 678 | |
| 679 Register Register::function_closure() { | 685 Register Register::function_closure() { |
| 680 return Register(kFunctionClosureRegisterIndex); | 686 return Register(kFunctionClosureRegisterIndex); |
| 681 } | 687 } |
| 682 | 688 |
| 683 | |
| 684 bool Register::is_function_closure() const { | 689 bool Register::is_function_closure() const { |
| 685 return index() == kFunctionClosureRegisterIndex; | 690 return index() == kFunctionClosureRegisterIndex; |
| 686 } | 691 } |
| 687 | 692 |
| 688 | |
| 689 Register Register::current_context() { | 693 Register Register::current_context() { |
| 690 return Register(kCurrentContextRegisterIndex); | 694 return Register(kCurrentContextRegisterIndex); |
| 691 } | 695 } |
| 692 | 696 |
| 693 | |
| 694 bool Register::is_current_context() const { | 697 bool Register::is_current_context() const { |
| 695 return index() == kCurrentContextRegisterIndex; | 698 return index() == kCurrentContextRegisterIndex; |
| 696 } | 699 } |
| 697 | 700 |
| 698 | |
| 699 Register Register::new_target() { return Register(kNewTargetRegisterIndex); } | 701 Register Register::new_target() { return Register(kNewTargetRegisterIndex); } |
| 700 | 702 |
| 701 | |
| 702 bool Register::is_new_target() const { | 703 bool Register::is_new_target() const { |
| 703 return index() == kNewTargetRegisterIndex; | 704 return index() == kNewTargetRegisterIndex; |
| 704 } | 705 } |
| 705 | 706 |
| 707 Register Register::bytecode_array() { |
| 708 return Register(kBytecodeArrayRegisterIndex); |
| 709 } |
| 710 |
| 711 bool Register::is_bytecode_array() const { |
| 712 return index() == kBytecodeArrayRegisterIndex; |
| 713 } |
| 714 |
| 715 Register Register::bytecode_offset() { |
| 716 return Register(kBytecodeOffsetRegisterIndex); |
| 717 } |
| 718 |
| 719 bool Register::is_bytecode_offset() const { |
| 720 return index() == kBytecodeOffsetRegisterIndex; |
| 721 } |
| 722 |
| 723 OperandSize Register::SizeOfOperand() const { |
| 724 int32_t operand = ToOperand(); |
| 725 if (operand >= kMinInt8 && operand <= kMaxInt8) { |
| 726 return OperandSize::kByte; |
| 727 } else if (index_ >= kMinInt16 && index_ <= kMaxInt16) { |
| 728 return OperandSize::kShort; |
| 729 } else { |
| 730 return OperandSize::kQuad; |
| 731 } |
| 732 } |
| 733 |
| 706 bool Register::AreContiguous(Register reg1, Register reg2, Register reg3, | 734 bool Register::AreContiguous(Register reg1, Register reg2, Register reg3, |
| 707 Register reg4, Register reg5) { | 735 Register reg4, Register reg5) { |
| 708 if (reg1.index() + 1 != reg2.index()) { | 736 if (reg1.index() + 1 != reg2.index()) { |
| 709 return false; | 737 return false; |
| 710 } | 738 } |
| 711 if (reg3.is_valid() && reg2.index() + 1 != reg3.index()) { | 739 if (reg3.is_valid() && reg2.index() + 1 != reg3.index()) { |
| 712 return false; | 740 return false; |
| 713 } | 741 } |
| 714 if (reg4.is_valid() && reg3.index() + 1 != reg4.index()) { | 742 if (reg4.is_valid() && reg3.index() + 1 != reg4.index()) { |
| 715 return false; | 743 return false; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 739 } else { | 767 } else { |
| 740 std::ostringstream s; | 768 std::ostringstream s; |
| 741 s << "r" << index(); | 769 s << "r" << index(); |
| 742 return s.str(); | 770 return s.str(); |
| 743 } | 771 } |
| 744 } | 772 } |
| 745 | 773 |
| 746 } // namespace interpreter | 774 } // namespace interpreter |
| 747 } // namespace internal | 775 } // namespace internal |
| 748 } // namespace v8 | 776 } // namespace v8 |
| OLD | NEW |