Index: src/interpreter/bytecode-decoder.cc |
diff --git a/src/interpreter/bytecode-decoder.cc b/src/interpreter/bytecode-decoder.cc |
index b47c0e281a4989ba04a8cfd9f01df307f88a2235..49751897ee8a46608829be148fdb2ae153b4835a 100644 |
--- a/src/interpreter/bytecode-decoder.cc |
+++ b/src/interpreter/bytecode-decoder.cc |
@@ -23,6 +23,15 @@ Register BytecodeDecoder::DecodeRegisterOperand(const uint8_t* operand_start, |
} |
// static |
+RegisterList BytecodeDecoder::DecodeRegisterListOperand( |
+ const uint8_t* operand_start, uint32_t count, OperandType operand_type, |
+ OperandScale operand_scale) { |
+ Register first_reg = |
+ DecodeRegisterOperand(operand_start, operand_type, operand_scale); |
+ return RegisterList(first_reg.index(), static_cast<int>(count)); |
+} |
+ |
+// static |
int32_t BytecodeDecoder::DecodeSignedOperand(const uint8_t* operand_start, |
OperandType operand_type, |
OperandScale operand_scale) { |
@@ -94,7 +103,6 @@ std::ostream& BytecodeDecoder::Decode(std::ostream& os, |
if (Bytecodes::IsDebugBreak(bytecode)) return os; |
int number_of_operands = Bytecodes::NumberOfOperands(bytecode); |
- int range = 0; |
for (int i = 0; i < number_of_operands; i++) { |
OperandType op_type = Bytecodes::GetOperandType(bytecode, i); |
int operand_offset = |
@@ -102,10 +110,6 @@ std::ostream& BytecodeDecoder::Decode(std::ostream& os, |
const uint8_t* operand_start = |
&bytecode_start[prefix_offset + operand_offset]; |
switch (op_type) { |
- case interpreter::OperandType::kRegCount: |
- os << "#" |
- << DecodeUnsignedOperand(operand_start, op_type, operand_scale); |
- break; |
case interpreter::OperandType::kIdx: |
case interpreter::OperandType::kUImm: |
case interpreter::OperandType::kRuntimeId: |
@@ -122,7 +126,6 @@ std::ostream& BytecodeDecoder::Decode(std::ostream& os, |
os << "#" |
<< DecodeUnsignedOperand(operand_start, op_type, operand_scale); |
break; |
- case interpreter::OperandType::kMaybeReg: |
case interpreter::OperandType::kReg: |
case interpreter::OperandType::kRegOut: { |
Register reg = |
@@ -130,19 +133,40 @@ std::ostream& BytecodeDecoder::Decode(std::ostream& os, |
os << reg.ToString(parameter_count); |
break; |
} |
- case interpreter::OperandType::kRegOutTriple: |
- range += 1; |
+ case interpreter::OperandType::kRegOutTriple: { |
+ RegisterList reg_list = |
+ DecodeRegisterListOperand(operand_start, 3, op_type, operand_scale); |
+ os << reg_list.first_register().ToString(parameter_count) << "-" |
+ << reg_list.last_register().ToString(parameter_count); |
+ break; |
+ } |
case interpreter::OperandType::kRegOutPair: |
case interpreter::OperandType::kRegPair: { |
- range += 1; |
- Register first_reg = |
- DecodeRegisterOperand(operand_start, op_type, operand_scale); |
- Register last_reg = Register(first_reg.index() + range); |
- os << first_reg.ToString(parameter_count) << "-" |
- << last_reg.ToString(parameter_count); |
+ RegisterList reg_list = |
+ DecodeRegisterListOperand(operand_start, 2, op_type, operand_scale); |
+ os << reg_list.first_register().ToString(parameter_count) << "-" |
+ << reg_list.last_register().ToString(parameter_count); |
+ break; |
+ } |
+ case interpreter::OperandType::kRegList: { |
+ DCHECK_LT(i, number_of_operands - 1); |
+ DCHECK_EQ(Bytecodes::GetOperandType(bytecode, i + 1), |
+ OperandType::kRegCount); |
+ int reg_count_offset = |
+ Bytecodes::GetOperandOffset(bytecode, i + 1, operand_scale); |
+ const uint8_t* reg_count_operand = |
+ &bytecode_start[prefix_offset + reg_count_offset]; |
+ uint32_t count = DecodeUnsignedOperand( |
+ reg_count_operand, OperandType::kRegCount, operand_scale); |
+ RegisterList reg_list = DecodeRegisterListOperand( |
+ operand_start, count, op_type, operand_scale); |
+ os << reg_list.first_register().ToString(parameter_count) << "-" |
+ << reg_list.last_register().ToString(parameter_count); |
+ i++; // Skip kRegCount. |
break; |
} |
case interpreter::OperandType::kNone: |
+ case interpreter::OperandType::kRegCount: // Dealt with in kRegList. |
UNREACHABLE(); |
break; |
} |