Index: src/interpreter/bytecode-operands.h |
diff --git a/src/interpreter/bytecode-operands.h b/src/interpreter/bytecode-operands.h |
index 55485027d3a6394feeae2e15e8812c99c55e9fcf..f649d93a089e77d184e26b7f2a5836a647ddb71f 100644 |
--- a/src/interpreter/bytecode-operands.h |
+++ b/src/interpreter/bytecode-operands.h |
@@ -23,27 +23,33 @@ namespace interpreter { |
V(RegOutPair, OperandTypeInfo::kScalableSignedByte) \ |
V(RegOutTriple, OperandTypeInfo::kScalableSignedByte) |
-#define UNSIGNED_SCALAR_OPERAND_TYPE_LIST(V) \ |
- V(Flag8, OperandTypeInfo::kFixedUnsignedByte) \ |
- V(IntrinsicId, OperandTypeInfo::kFixedUnsignedByte) \ |
+#define SIGNED_SCALABLE_SCALAR_OPERAND_TYPE_LIST(V) \ |
+ V(Imm, OperandTypeInfo::kScalableSignedByte) |
+ |
+#define UNSIGNED_SCALABLE_SCALAR_OPERAND_TYPE_LIST(V) \ |
V(Idx, OperandTypeInfo::kScalableUnsignedByte) \ |
V(UImm, OperandTypeInfo::kScalableUnsignedByte) \ |
- V(RegCount, OperandTypeInfo::kScalableUnsignedByte) \ |
+ V(RegCount, OperandTypeInfo::kScalableUnsignedByte) |
+ |
+#define UNSIGNED_FIXED_SCALAR_OPERAND_TYPE_LIST(V) \ |
+ V(Flag8, OperandTypeInfo::kFixedUnsignedByte) \ |
+ V(IntrinsicId, OperandTypeInfo::kFixedUnsignedByte) \ |
V(RuntimeId, OperandTypeInfo::kFixedUnsignedShort) |
-#define SIGNED_SCALAR_OPERAND_TYPE_LIST(V) \ |
- V(Imm, OperandTypeInfo::kScalableSignedByte) |
+// Carefully ordered for operand type range checks below. |
+#define NON_REGISTER_OPERAND_TYPE_LIST(V) \ |
+ INVALID_OPERAND_TYPE_LIST(V) \ |
+ UNSIGNED_FIXED_SCALAR_OPERAND_TYPE_LIST(V) \ |
+ UNSIGNED_SCALABLE_SCALAR_OPERAND_TYPE_LIST(V) \ |
+ SIGNED_SCALABLE_SCALAR_OPERAND_TYPE_LIST(V) |
+// Carefully ordered for operand type range checks below. |
#define REGISTER_OPERAND_TYPE_LIST(V) \ |
REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ |
REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) |
-#define NON_REGISTER_OPERAND_TYPE_LIST(V) \ |
- INVALID_OPERAND_TYPE_LIST(V) \ |
- UNSIGNED_SCALAR_OPERAND_TYPE_LIST(V) \ |
- SIGNED_SCALAR_OPERAND_TYPE_LIST(V) |
- |
// The list of operand types used by bytecodes. |
+// Carefully ordered for operand type range checks below. |
#define OPERAND_TYPE_LIST(V) \ |
NON_REGISTER_OPERAND_TYPE_LIST(V) \ |
REGISTER_OPERAND_TYPE_LIST(V) |
@@ -125,6 +131,33 @@ V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, |
const OperandSize& operand_size); |
std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); |
+class BytecodeOperands { |
+ public: |
+ // Returns true if |accumulator_use| reads the accumulator. |
+ static constexpr bool ReadsAccumulator(AccumulatorUse accumulator_use) { |
+ return accumulator_use == AccumulatorUse::kRead || |
+ accumulator_use == AccumulatorUse::kReadWrite; |
+ } |
+ |
+ // Returns true if |accumulator_use| writes the accumulator. |
+ static constexpr bool WritesAccumulator(AccumulatorUse accumulator_use) { |
+ return accumulator_use == AccumulatorUse::kWrite || |
+ accumulator_use == AccumulatorUse::kReadWrite; |
+ } |
+ |
+ // Returns true if |operand_type| is a scalable signed byte. |
+ static constexpr bool IsScalableSignedByte(OperandType operand_type) { |
+ return operand_type >= OperandType::kImm && |
+ operand_type <= OperandType::kRegOutTriple; |
+ } |
+ |
+ // Returns true if |operand_type| is a scalable unsigned byte. |
+ static constexpr bool IsScalableUnsignedByte(OperandType operand_type) { |
+ return operand_type >= OperandType::kIdx && |
+ operand_type <= OperandType::kRegCount; |
+ } |
+}; |
+ |
} // namespace interpreter |
} // namespace internal |
} // namespace v8 |