Index: src/interpreter/bytecodes.cc |
diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc |
index 5a67847a45c66a32443993ee62bbd67aaa5e43e2..566b8e3b5cf1c0c0131d35ec0bdfd8ccfbefb58b 100644 |
--- a/src/interpreter/bytecodes.cc |
+++ b/src/interpreter/bytecodes.cc |
@@ -309,16 +309,23 @@ const OperandType* Bytecodes::GetOperandTypes(Bytecode bytecode) { |
// static |
OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i, |
OperandScale operand_scale) { |
+ DCHECK_LT(i, NumberOfOperands(bytecode)); |
+ return GetOperandSizes(bytecode, operand_scale)[i]; |
+} |
+ |
+// static |
+const OperandSize* Bytecodes::GetOperandSizes(Bytecode bytecode, |
+ OperandScale operand_scale) { |
DCHECK(bytecode <= Bytecode::kLast); |
switch (bytecode) { |
#define CASE(Name, ...) \ |
case Bytecode::k##Name: \ |
- return BytecodeTraits<__VA_ARGS__>::GetOperandSize(i, operand_scale); |
+ return BytecodeTraits<__VA_ARGS__>::GetOperandSizes(operand_scale); |
BYTECODE_LIST(CASE) |
#undef CASE |
} |
UNREACHABLE(); |
- return OperandSize::kNone; |
+ return nullptr; |
} |
// static |
@@ -618,6 +625,33 @@ OperandSize Bytecodes::SizeForUnsignedOperand(size_t value) { |
} |
} |
+OperandScale Bytecodes::OperandSizesToScale(OperandSize size0) { |
+ OperandScale operand_scale = static_cast<OperandScale>(size0); |
+ DCHECK(operand_scale == OperandScale::kSingle || |
+ operand_scale == OperandScale::kDouble || |
+ operand_scale == OperandScale::kQuadruple); |
+ return operand_scale; |
+} |
+ |
+OperandScale Bytecodes::OperandSizesToScale(OperandSize size0, |
+ OperandSize size1) { |
+ OperandSize operand_size = std::max(size0, size1); |
+ // Operand sizes have been scaled before calling this function. |
+ // Currently all scalable operands are byte sized at |
+ // OperandScale::kSingle. |
+ STATIC_ASSERT(static_cast<int>(OperandSize::kByte) == |
+ static_cast<int>(OperandScale::kSingle) && |
+ static_cast<int>(OperandSize::kShort) == |
+ static_cast<int>(OperandScale::kDouble) && |
+ static_cast<int>(OperandSize::kQuad) == |
+ static_cast<int>(OperandScale::kQuadruple)); |
+ OperandScale operand_scale = static_cast<OperandScale>(operand_size); |
+ DCHECK(operand_scale == OperandScale::kSingle || |
+ operand_scale == OperandScale::kDouble || |
+ operand_scale == OperandScale::kQuadruple); |
+ return operand_scale; |
+} |
+ |
OperandScale Bytecodes::OperandSizesToScale(OperandSize size0, |
OperandSize size1, |
OperandSize size2, |