Index: src/interpreter/bytecodes.cc |
diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc |
index 1a82f6c117e800e606080a4427668427116f8cd7..983bf9b3430dd82f2bd88a2b57e1b78db3a01243 100644 |
--- a/src/interpreter/bytecodes.cc |
+++ b/src/interpreter/bytecodes.cc |
@@ -232,6 +232,23 @@ bool Bytecodes::IsJumpOrReturn(Bytecode bytecode) { |
} |
+namespace { |
+static Register DecodeRegister(const uint8_t* operand_start, |
+ OperandType operand_type) { |
+ switch (Bytecodes::SizeOfOperand(operand_type)) { |
+ case OperandSize::kByte: |
+ return Register::FromOperand(*operand_start); |
+ case OperandSize::kShort: |
+ return Register::FromWideOperand(ReadUnalignedUInt16(operand_start)); |
+ case OperandSize::kNone: { |
+ UNREACHABLE(); |
+ } |
+ } |
+ return Register(); |
+} |
+} // namespace |
+ |
+ |
// static |
std::ostream& Bytecodes::Decode(std::ostream& os, const uint8_t* bytecode_start, |
int parameter_count) { |
@@ -257,10 +274,10 @@ std::ostream& Bytecodes::Decode(std::ostream& os, const uint8_t* bytecode_start, |
const uint8_t* operand_start = |
&bytecode_start[GetOperandOffset(bytecode, i)]; |
switch (op_type) { |
- case interpreter::OperandType::kCount8: |
+ case interpreter::OperandType::kRegCount8: |
os << "#" << static_cast<unsigned int>(*operand_start); |
break; |
- case interpreter::OperandType::kCount16: |
+ case interpreter::OperandType::kRegCount16: |
os << '#' << ReadUnalignedUInt16(operand_start); |
break; |
case interpreter::OperandType::kIdx8: |
@@ -272,9 +289,11 @@ std::ostream& Bytecodes::Decode(std::ostream& os, const uint8_t* bytecode_start, |
case interpreter::OperandType::kImm8: |
os << "#" << static_cast<int>(static_cast<int8_t>(*operand_start)); |
break; |
+ case interpreter::OperandType::kMaybeReg8: |
+ case interpreter::OperandType::kMaybeReg16: |
case interpreter::OperandType::kReg8: |
- case interpreter::OperandType::kMaybeReg8: { |
- Register reg = Register::FromOperand(*operand_start); |
+ case interpreter::OperandType::kReg16: { |
+ Register reg = DecodeRegister(operand_start, op_type); |
if (reg.is_function_context()) { |
os << "<context>"; |
} else if (reg.is_function_closure()) { |
@@ -294,30 +313,20 @@ std::ostream& Bytecodes::Decode(std::ostream& os, const uint8_t* bytecode_start, |
break; |
} |
case interpreter::OperandType::kRegPair8: |
- case interpreter::OperandType::kRegTriple8: { |
- Register reg = Register::FromOperand(*operand_start); |
+ case interpreter::OperandType::kRegTriple8: |
+ case interpreter::OperandType::kRegPair16: |
+ case interpreter::OperandType::kRegTriple16: { |
+ Register reg = DecodeRegister(operand_start, op_type); |
int range = op_type == interpreter::OperandType::kRegPair8 ? 1 : 2; |
if (reg.is_parameter()) { |
int parameter_index = reg.ToParameterIndex(parameter_count); |
- DCHECK_NE(parameter_index, 0); |
+ DCHECK_GT(parameter_index, 0); |
os << "a" << parameter_index - range << "-" << parameter_index; |
} else { |
os << "r" << reg.index() << "-" << reg.index() + range; |
} |
break; |
} |
- case interpreter::OperandType::kReg16: { |
- Register reg = |
- Register::FromWideOperand(ReadUnalignedUInt16(operand_start)); |
- if (reg.is_parameter()) { |
- int parameter_index = reg.ToParameterIndex(parameter_count); |
- DCHECK_NE(parameter_index, 0); |
- os << "a" << parameter_index - 1; |
- } else { |
- os << "r" << reg.index(); |
- } |
- break; |
- } |
case interpreter::OperandType::kNone: |
UNREACHABLE(); |
break; |
@@ -433,6 +442,16 @@ Register Register::FromWideOperand(uint16_t operand) { |
} |
+uint32_t Register::ToRawOperand() const { |
+ return static_cast<uint32_t>(-index_); |
+} |
+ |
+ |
+Register Register::FromRawOperand(uint32_t operand) { |
+ return Register(-static_cast<int32_t>(operand)); |
+} |
+ |
+ |
bool Register::AreContiguous(Register reg1, Register reg2, Register reg3, |
Register reg4, Register reg5) { |
if (reg1.index() + 1 != reg2.index()) { |