| Index: src/interpreter/bytecode-traits.h
|
| diff --git a/src/interpreter/bytecode-traits.h b/src/interpreter/bytecode-traits.h
|
| index fd778d7c927880428797ad62fa0a7ee6f728e6e2..76d07c454187436c8e100aff25dbf2fa3be41714 100644
|
| --- a/src/interpreter/bytecode-traits.h
|
| +++ b/src/interpreter/bytecode-traits.h
|
| @@ -28,6 +28,18 @@ struct OperandTraits {};
|
| OPERAND_TYPE_LIST(DECLARE_OPERAND_SIZE)
|
| #undef DECLARE_OPERAND_SIZE
|
|
|
| +template <OperandType>
|
| +struct RegisterOperandTraits {
|
| + static const int kIsRegisterOperand = 0;
|
| +};
|
| +
|
| +#define DECLARE_REGISTER_OPERAND(Name, _) \
|
| + template <> \
|
| + struct RegisterOperandTraits<OperandType::k##Name> { \
|
| + static const int kIsRegisterOperand = 1; \
|
| + };
|
| +REGISTER_OPERAND_TYPE_LIST(DECLARE_REGISTER_OPERAND)
|
| +#undef DECLARE_REGISTER_OPERAND
|
|
|
| template <OperandType... Args>
|
| struct BytecodeTraits {};
|
| @@ -63,13 +75,23 @@ struct BytecodeTraits<operand_0, operand_1, operand_2, operand_3,
|
| return kOperandOffsets[i];
|
| }
|
|
|
| + template <OperandType ot>
|
| + static inline bool HasAnyOperandsOfType() {
|
| + return operand_0 == ot || operand_1 == ot || operand_2 == ot ||
|
| + operand_3 == ot;
|
| + }
|
| +
|
| static const int kOperandCount = 4;
|
| + static const int kRegisterOperandCount =
|
| + RegisterOperandTraits<operand_0>::kIsRegisterOperand +
|
| + RegisterOperandTraits<operand_1>::kIsRegisterOperand +
|
| + RegisterOperandTraits<operand_2>::kIsRegisterOperand +
|
| + RegisterOperandTraits<operand_3>::kIsRegisterOperand;
|
| static const int kSize =
|
| 1 + OperandTraits<operand_0>::kSize + OperandTraits<operand_1>::kSize +
|
| OperandTraits<operand_2>::kSize + OperandTraits<operand_3>::kSize;
|
| };
|
|
|
| -
|
| template <OperandType operand_0, OperandType operand_1, OperandType operand_2>
|
| struct BytecodeTraits<operand_0, operand_1, operand_2, OPERAND_TERM> {
|
| static inline OperandType GetOperandType(int i) {
|
| @@ -96,7 +118,16 @@ struct BytecodeTraits<operand_0, operand_1, operand_2, OPERAND_TERM> {
|
| return kOperandOffsets[i];
|
| }
|
|
|
| + template <OperandType ot>
|
| + static inline bool HasAnyOperandsOfType() {
|
| + return operand_0 == ot || operand_1 == ot || operand_2 == ot;
|
| + }
|
| +
|
| static const int kOperandCount = 3;
|
| + static const int kRegisterOperandCount =
|
| + RegisterOperandTraits<operand_0>::kIsRegisterOperand +
|
| + RegisterOperandTraits<operand_1>::kIsRegisterOperand +
|
| + RegisterOperandTraits<operand_2>::kIsRegisterOperand;
|
| static const int kSize =
|
| 1 + OperandTraits<operand_0>::kSize + OperandTraits<operand_1>::kSize +
|
| OperandTraits<operand_2>::kSize;
|
| @@ -126,7 +157,15 @@ struct BytecodeTraits<operand_0, operand_1, OPERAND_TERM> {
|
| return kOperandOffsets[i];
|
| }
|
|
|
| + template <OperandType ot>
|
| + static inline bool HasAnyOperandsOfType() {
|
| + return operand_0 == ot || operand_1 == ot;
|
| + }
|
| +
|
| static const int kOperandCount = 2;
|
| + static const int kRegisterOperandCount =
|
| + RegisterOperandTraits<operand_0>::kIsRegisterOperand +
|
| + RegisterOperandTraits<operand_1>::kIsRegisterOperand;
|
| static const int kSize =
|
| 1 + OperandTraits<operand_0>::kSize + OperandTraits<operand_1>::kSize;
|
| };
|
| @@ -148,7 +187,14 @@ struct BytecodeTraits<operand_0, OPERAND_TERM> {
|
| return 1;
|
| }
|
|
|
| + template <OperandType ot>
|
| + static inline bool HasAnyOperandsOfType() {
|
| + return operand_0 == ot;
|
| + }
|
| +
|
| static const int kOperandCount = 1;
|
| + static const int kRegisterOperandCount =
|
| + RegisterOperandTraits<operand_0>::kIsRegisterOperand;
|
| static const int kSize = 1 + OperandTraits<operand_0>::kSize;
|
| };
|
|
|
| @@ -169,7 +215,13 @@ struct BytecodeTraits<OperandType::kNone, OPERAND_TERM> {
|
| return 1;
|
| }
|
|
|
| + template <OperandType ot>
|
| + static inline bool HasAnyOperandsOfType() {
|
| + return false;
|
| + }
|
| +
|
| static const int kOperandCount = 0;
|
| + static const int kRegisterOperandCount = 0;
|
| static const int kSize = 1 + OperandTraits<OperandType::kNone>::kSize;
|
| };
|
|
|
|
|