Index: src/interpreter/bytecodes.h |
diff --git a/src/interpreter/bytecodes.h b/src/interpreter/bytecodes.h |
index 36041cb97e5bc59b27a5be846787275ef2844395..43aeb30d3bb500ce3ed5dff2ad033aeb568fb0bb 100644 |
--- a/src/interpreter/bytecodes.h |
+++ b/src/interpreter/bytecodes.h |
@@ -5,12 +5,13 @@ |
#ifndef V8_INTERPRETER_BYTECODES_H_ |
#define V8_INTERPRETER_BYTECODES_H_ |
+#include <cstdint> |
#include <iosfwd> |
+#include <string> |
-// Clients of this interface shouldn't depend on lots of interpreter internals. |
-// Do not include anything from src/interpreter here! |
-#include "src/frames.h" |
-#include "src/utils.h" |
+// This interface and it's implementation are independent of the |
+// libv8_base library as they are used by the interpreter and the |
+// standalone mkpeephole table generator program. |
namespace v8 { |
namespace internal { |
@@ -286,12 +287,12 @@ enum class AccumulatorUse : uint8_t { |
kReadWrite = kRead | kWrite |
}; |
-V8_INLINE AccumulatorUse operator&(AccumulatorUse lhs, AccumulatorUse rhs) { |
+inline AccumulatorUse operator&(AccumulatorUse lhs, AccumulatorUse rhs) { |
int result = static_cast<int>(lhs) & static_cast<int>(rhs); |
return static_cast<AccumulatorUse>(result); |
} |
-V8_INLINE AccumulatorUse operator|(AccumulatorUse lhs, AccumulatorUse rhs) { |
+inline AccumulatorUse operator|(AccumulatorUse lhs, AccumulatorUse rhs) { |
int result = static_cast<int>(lhs) | static_cast<int>(rhs); |
return static_cast<AccumulatorUse>(result); |
} |
@@ -348,7 +349,6 @@ enum class OperandType : uint8_t { |
#undef COUNT_OPERAND_TYPES |
}; |
- |
// Enumeration of interpreter bytecodes. |
enum class Bytecode : uint8_t { |
#define DECLARE_BYTECODE(Name, ...) k##Name, |
@@ -361,94 +361,7 @@ enum class Bytecode : uint8_t { |
#undef COUNT_BYTECODE |
}; |
- |
-// 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); |
- void operator delete(void* p); |
- |
- int index_; |
-}; |
- |
- |
-class Bytecodes { |
+class Bytecodes final { |
public: |
// The maximum number of operands a bytecode may have. |
static const int kMaxOperands = 4; |
@@ -472,10 +385,7 @@ class Bytecodes { |
static const char* OperandSizeToString(OperandSize operand_size); |
// Returns byte value of bytecode. |
- static uint8_t ToByte(Bytecode bytecode) { |
- DCHECK_LE(bytecode, Bytecode::kLast); |
- return static_cast<uint8_t>(bytecode); |
- } |
+ static uint8_t ToByte(Bytecode bytecode); |
// Returns bytecode for |value|. |
static Bytecode FromByte(uint8_t value); |
@@ -636,25 +546,6 @@ class Bytecodes { |
// Returns true if |operand_type| is unsigned, false if signed. |
static bool IsUnsignedOperandType(OperandType operand_type); |
- // Decodes a register operand in a byte array. |
- static Register DecodeRegisterOperand(const uint8_t* operand_start, |
- OperandType operand_type, |
- OperandScale operand_scale); |
- |
- // Decodes a signed operand in a byte array. |
- static int32_t DecodeSignedOperand(const uint8_t* operand_start, |
- OperandType operand_type, |
- OperandScale operand_scale); |
- |
- // Decodes an unsigned operand in a byte array. |
- static uint32_t DecodeUnsignedOperand(const uint8_t* operand_start, |
- OperandType operand_type, |
- OperandScale operand_scale); |
- |
- // Decode a single bytecode and operands to |os|. |
- static std::ostream& Decode(std::ostream& os, const uint8_t* bytecode_start, |
- int number_of_parameters); |
- |
// Returns true if a handler is generated for a bytecode at a given |
// operand scale. All bytecodes have handlers at OperandScale::kSingle, |
// but only bytecodes with scalable operands have handlers with larger |
@@ -666,33 +557,6 @@ class Bytecodes { |
// Return the operand size required to hold an unsigned operand. |
static OperandSize SizeForUnsignedOperand(uint32_t value); |
- |
- private: |
- DISALLOW_IMPLICIT_CONSTRUCTORS(Bytecodes); |
-}; |
- |
-class CreateObjectLiteralFlags { |
- public: |
- class FlagsBits : public BitField8<int, 0, 3> {}; |
- class FastClonePropertiesCountBits |
- : public BitField8<int, FlagsBits::kNext, 3> {}; |
- |
- static uint8_t Encode(bool fast_clone_supported, int properties_count, |
- int runtime_flags); |
- |
- private: |
- DISALLOW_IMPLICIT_CONSTRUCTORS(CreateObjectLiteralFlags); |
-}; |
- |
-class CreateClosureFlags { |
- public: |
- class PretenuredBit : public BitField8<bool, 0, 1> {}; |
- class FastNewClosureBit : public BitField8<bool, PretenuredBit::kNext, 1> {}; |
- |
- static uint8_t Encode(bool pretenure, bool is_function_scope); |
- |
- private: |
- DISALLOW_IMPLICIT_CONSTRUCTORS(CreateClosureFlags); |
}; |
std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode); |