Index: src/interpreter/bytecode-register.h |
diff --git a/src/interpreter/bytecode-register.h b/src/interpreter/bytecode-register.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b698da6a74b3b0fc0ea48109498dd2997d971af3 |
--- /dev/null |
+++ b/src/interpreter/bytecode-register.h |
@@ -0,0 +1,105 @@ |
+// Copyright 2015 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_INTERPRETER_BYTECODE_REGISTER_H_ |
+#define V8_INTERPRETER_BYTECODE_REGISTER_H_ |
+ |
+#include "src/interpreter/bytecodes.h" |
+ |
+#include "src/frames.h" |
+ |
+namespace v8 { |
+namespace internal { |
+namespace interpreter { |
+ |
+// An interpreter Register which is located in the function's Register file |
+// in its stack-frame. Register hold parameters, this, and expression values. |
+class Register final { |
+ public: |
+ explicit Register(int index = kInvalidIndex) : index_(index) {} |
+ |
+ int index() const { return index_; } |
+ bool is_parameter() const { return index() < 0; } |
+ bool is_valid() const { return index_ != kInvalidIndex; } |
+ |
+ static Register FromParameterIndex(int index, int parameter_count); |
+ int ToParameterIndex(int parameter_count) const; |
+ |
+ // Returns an invalid register. |
+ static Register invalid_value() { return Register(); } |
+ |
+ // Returns the register for the function's closure object. |
+ static Register function_closure(); |
+ bool is_function_closure() const; |
+ |
+ // Returns the register which holds the current context object. |
+ static Register current_context(); |
+ bool is_current_context() const; |
+ |
+ // Returns the register for the incoming new target value. |
+ static Register new_target(); |
+ bool is_new_target() const; |
+ |
+ // Returns the register for the bytecode array. |
+ static Register bytecode_array(); |
+ bool is_bytecode_array() const; |
+ |
+ // Returns the register for the saved bytecode offset. |
+ static Register bytecode_offset(); |
+ bool is_bytecode_offset() const; |
+ |
+ // Returns a register that can be used to represent the accumulator |
+ // within code in the interpreter, but should never be emitted in |
+ // bytecode. |
+ static Register virtual_accumulator(); |
+ |
+ OperandSize SizeOfOperand() const; |
+ |
+ int32_t ToOperand() const { return kRegisterFileStartOffset - index_; } |
+ static Register FromOperand(int32_t operand) { |
+ return Register(kRegisterFileStartOffset - operand); |
+ } |
+ |
+ static bool AreContiguous(Register reg1, Register reg2, |
+ Register reg3 = Register(), |
+ Register reg4 = Register(), |
+ Register reg5 = Register()); |
+ |
+ std::string ToString(int parameter_count); |
+ |
+ bool operator==(const Register& other) const { |
+ return index() == other.index(); |
+ } |
+ bool operator!=(const Register& other) const { |
+ return index() != other.index(); |
+ } |
+ bool operator<(const Register& other) const { |
+ return index() < other.index(); |
+ } |
+ bool operator<=(const Register& other) const { |
+ return index() <= other.index(); |
+ } |
+ bool operator>(const Register& other) const { |
+ return index() > other.index(); |
+ } |
+ bool operator>=(const Register& other) const { |
+ return index() >= other.index(); |
+ } |
+ |
+ private: |
+ static const int kInvalidIndex = kMaxInt; |
+ static const int kRegisterFileStartOffset = |
+ InterpreterFrameConstants::kRegisterFileFromFp / kPointerSize; |
+ |
+ void* operator new(size_t size) = delete; |
+ void operator delete(void* p) = delete; |
+ |
+ int index_; |
+}; |
+ |
+} // namespace interpreter |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_INTERPRETER_BYTECODE_REGISTER_H_ |