Index: src/interpreter/bytecode-traits.h |
diff --git a/src/interpreter/bytecode-traits.h b/src/interpreter/bytecode-traits.h |
index fd778d7c927880428797ad62fa0a7ee6f728e6e2..b8136051bbb20eec6c127b9a21c2891742781eed 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,28 @@ 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 kRegisterOperandBitmap = |
+ RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
+ (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1) + |
+ (RegisterOperandTraits<operand_2>::kIsRegisterOperand << 2) + |
+ (RegisterOperandTraits<operand_3>::kIsRegisterOperand << 3); |
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 +123,20 @@ 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 kRegisterOperandBitmap = |
+ RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
+ (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1) + |
+ (RegisterOperandTraits<operand_2>::kIsRegisterOperand << 2); |
static const int kSize = |
1 + OperandTraits<operand_0>::kSize + OperandTraits<operand_1>::kSize + |
OperandTraits<operand_2>::kSize; |
@@ -126,7 +166,18 @@ 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 kRegisterOperandBitmap = |
+ RegisterOperandTraits<operand_0>::kIsRegisterOperand + |
+ (RegisterOperandTraits<operand_1>::kIsRegisterOperand << 1); |
static const int kSize = |
1 + OperandTraits<operand_0>::kSize + OperandTraits<operand_1>::kSize; |
}; |
@@ -148,7 +199,16 @@ 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 kRegisterOperandBitmap = |
+ RegisterOperandTraits<operand_0>::kIsRegisterOperand; |
static const int kSize = 1 + OperandTraits<operand_0>::kSize; |
}; |
@@ -169,7 +229,14 @@ 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 kRegisterOperandBitmap = 0; |
static const int kSize = 1 + OperandTraits<OperandType::kNone>::kSize; |
}; |