Index: src/interpreter/bytecodes.cc |
diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc |
index 9fa1209d51b6075817e097918324483e41fb1a4d..fd27f391aa93636829fd1d689e98ca79aa15b7c0 100644 |
--- a/src/interpreter/bytecodes.cc |
+++ b/src/interpreter/bytecodes.cc |
@@ -43,6 +43,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, _) \ |
@@ -141,7 +157,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 |
} |
@@ -154,9 +170,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 |
@@ -199,12 +215,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 |
} |
@@ -223,9 +265,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 |
@@ -331,9 +373,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 |
@@ -586,6 +628,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); |
} |