| Index: src/interpreter/bytecodes.cc
|
| diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc
|
| index 136e2802be988c01590453ba4305a455e6d2cb8d..f9323121b96625f29fdb9078b7b4f2f04b67ab87 100644
|
| --- a/src/interpreter/bytecodes.cc
|
| +++ b/src/interpreter/bytecodes.cc
|
| @@ -42,6 +42,22 @@ std::string Bytecodes::ToString(Bytecode bytecode, OperandScale operand_scale) {
|
| }
|
|
|
| // static
|
| +const char* Bytecodes::AccumulatorUseToString(AccumulatorUse accumulator_use) {
|
| + switch (accumulator_use) {
|
| + case AccumulatorUse::kNone:
|
| + return "None";
|
| + case AccumulatorUse::kRead:
|
| + return "Read";
|
| + case AccumulatorUse::kWrite:
|
| + return "Write";
|
| + case AccumulatorUse::kReadWrite:
|
| + return "ReadWrite";
|
| + }
|
| + UNREACHABLE();
|
| + return "";
|
| +}
|
| +
|
| +// static
|
| const char* Bytecodes::OperandTypeToString(OperandType operand_type) {
|
| switch (operand_type) {
|
| #define CASE(Name, _) \
|
| @@ -140,7 +156,7 @@ int Bytecodes::NumberOfOperands(Bytecode bytecode) {
|
| switch (bytecode) {
|
| #define CASE(Name, ...) \
|
| case Bytecode::k##Name: \
|
| - return BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::kOperandCount;
|
| + return BytecodeTraits<__VA_ARGS__>::kOperandCount;
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| }
|
| @@ -153,9 +169,9 @@ int Bytecodes::NumberOfOperands(Bytecode bytecode) {
|
| int Bytecodes::NumberOfRegisterOperands(Bytecode bytecode) {
|
| DCHECK(bytecode <= Bytecode::kLast);
|
| switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - typedef BytecodeTraits<__VA_ARGS__, OPERAND_TERM> Name##Trait; \
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \
|
| return Name##Trait::kRegisterOperandCount;
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| @@ -198,12 +214,38 @@ OperandScale Bytecodes::PrefixBytecodeToOperandScale(Bytecode bytecode) {
|
| }
|
|
|
| // static
|
| +AccumulatorUse Bytecodes::GetAccumulatorUse(Bytecode bytecode) {
|
| + DCHECK(bytecode <= Bytecode::kLast);
|
| + switch (bytecode) {
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + return BytecodeTraits<__VA_ARGS__>::kAccumulatorUse;
|
| + BYTECODE_LIST(CASE)
|
| +#undef CASE
|
| + }
|
| + UNREACHABLE();
|
| + return AccumulatorUse::kNone;
|
| +}
|
| +
|
| +// static
|
| +bool Bytecodes::ReadsAccumulator(Bytecode bytecode) {
|
| + return (GetAccumulatorUse(bytecode) & AccumulatorUse::kRead) ==
|
| + AccumulatorUse::kRead;
|
| +}
|
| +
|
| +// static
|
| +bool Bytecodes::WritesAccumulator(Bytecode bytecode) {
|
| + return (GetAccumulatorUse(bytecode) & AccumulatorUse::kWrite) ==
|
| + AccumulatorUse::kWrite;
|
| +}
|
| +
|
| +// static
|
| OperandType Bytecodes::GetOperandType(Bytecode bytecode, int i) {
|
| DCHECK(bytecode <= Bytecode::kLast);
|
| switch (bytecode) {
|
| #define CASE(Name, ...) \
|
| case Bytecode::k##Name: \
|
| - return BytecodeTraits<__VA_ARGS__, OPERAND_TERM>::GetOperandType(i);
|
| + return BytecodeTraits<__VA_ARGS__>::GetOperandType(i);
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| }
|
| @@ -222,9 +264,9 @@ OperandSize Bytecodes::GetOperandSize(Bytecode bytecode, int i,
|
| int Bytecodes::GetRegisterOperandBitmap(Bytecode bytecode) {
|
| DCHECK(bytecode <= Bytecode::kLast);
|
| switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - typedef BytecodeTraits<__VA_ARGS__, OPERAND_TERM> Name##Trait; \
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \
|
| return Name##Trait::kRegisterOperandBitmap;
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| @@ -330,9 +372,9 @@ bool Bytecodes::IsDebugBreak(Bytecode bytecode) {
|
| // static
|
| bool Bytecodes::IsBytecodeWithScalableOperands(Bytecode bytecode) {
|
| switch (bytecode) {
|
| -#define CASE(Name, ...) \
|
| - case Bytecode::k##Name: \
|
| - typedef BytecodeTraits<__VA_ARGS__, OPERAND_TERM> Name##Trait; \
|
| +#define CASE(Name, ...) \
|
| + case Bytecode::k##Name: \
|
| + typedef BytecodeTraits<__VA_ARGS__> Name##Trait; \
|
| return Name##Trait::IsScalable();
|
| BYTECODE_LIST(CASE)
|
| #undef CASE
|
| @@ -578,6 +620,10 @@ std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode) {
|
| return os << Bytecodes::ToString(bytecode);
|
| }
|
|
|
| +std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use) {
|
| + return os << Bytecodes::AccumulatorUseToString(use);
|
| +}
|
| +
|
| std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size) {
|
| return os << Bytecodes::OperandSizeToString(operand_size);
|
| }
|
|
|