Index: src/interpreter/bytecodes.h |
diff --git a/src/interpreter/bytecodes.h b/src/interpreter/bytecodes.h |
index dc125162fa4f6763b5203d2d2e0bc12595361a4f..b4c0d9c4446b7eda2ac1a99a683d29e018c519b2 100644 |
--- a/src/interpreter/bytecodes.h |
+++ b/src/interpreter/bytecodes.h |
@@ -15,38 +15,70 @@ namespace v8 { |
namespace internal { |
namespace interpreter { |
+// The list of operand types used by bytecodes. |
+#define OPERAND_TYPE_LIST(V) \ |
+ V(None) \ |
+ V(Imm8) \ |
+ V(Reg) |
+ |
// The list of bytecodes which are interpreted by the interpreter. |
-#define BYTECODE_LIST(V) \ |
- V(LoadLiteral0, 1) \ |
- V(Return, 0) |
+#define BYTECODE_LIST(V) \ |
+ V(LoadLiteral0, OperandType::kReg) \ |
+ V(LoadSmi8, OperandType::kReg, OperandType::kImm8) \ |
+ V(Return, OperandType::kNone) |
+ |
+ |
+// Enumeration of operand types used by bytecodes. |
+enum class OperandType : uint8_t { |
+#define DECLARE_OPERAND_TYPE(Name) k##Name, |
+ OPERAND_TYPE_LIST(DECLARE_OPERAND_TYPE) |
+#undef DECLARE_OPERAND_TYPE |
+#define COUNT_OPERAND_TYPES(x) +1 |
+ // The COUNT_OPERAND macro will turn this into kLast = -1 +1 +1... which will |
+ // evaluate to the same value as the last operand. |
+ kLast = -1 OPERAND_TYPE_LIST(COUNT_OPERAND_TYPES) |
+#undef COUNT_OPERAND_TYPES |
+}; |
+ |
+// Enumeration of interpreter bytecodes. |
enum class Bytecode : uint8_t { |
-#define DECLARE_BYTECODE(Name, _) k##Name, |
+#define DECLARE_BYTECODE(Name, ...) k##Name, |
BYTECODE_LIST(DECLARE_BYTECODE) |
#undef DECLARE_BYTECODE |
-#define COUNT_BYTECODE(x, _) +1 |
+#define COUNT_BYTECODE(x, ...) +1 |
// The COUNT_BYTECODE macro will turn this into kLast = -1 +1 +1... which will |
// evaluate to the same value as the last real bytecode. |
kLast = -1 BYTECODE_LIST(COUNT_BYTECODE) |
#undef COUNT_BYTECODE |
}; |
+ |
class Bytecodes { |
public: |
// Returns string representation of |bytecode|. |
static const char* ToString(Bytecode bytecode); |
- // Returns the number of arguments expected by |bytecode|. |
- static const int NumberOfArguments(Bytecode bytecode); |
+ // Returns byte value of bytecode. |
+ static uint8_t ToByte(Bytecode bytecode); |
+ |
+ // Returns bytecode for |value|. |
+ static Bytecode FromByte(uint8_t value); |
+ |
+ // Returns the number of operands expected by |bytecode|. |
+ static const int NumberOfOperands(Bytecode bytecode); |
+ |
+ // Return the i-th operand of |bytecode|. |
+ static const OperandType GetOperandType(Bytecode bytecode, int i); |
// Returns the size of the bytecode including its arguments. |
static const int Size(Bytecode bytecode); |
- // The maximum number of arguments across all bytecodes. |
- static const int kMaximumNumberOfArguments = 1; |
+ // The maximum number of operands across all bytecodes. |
+ static const int MaximumNumberOfOperands(); |
// Maximum size of a bytecode and its arguments. |
- static const int kMaximumSize = 1 + kMaximumNumberOfArguments; |
+ static const int MaximumSize(); |
private: |
DISALLOW_IMPLICIT_CONSTRUCTORS(Bytecodes); |