Index: src/interpreter/bytecodes.h |
diff --git a/src/interpreter/bytecodes.h b/src/interpreter/bytecodes.h |
index bd8ad811987b47d8c183e56462aa6b1fecc73c00..4612f2f25eda4fed21dc3dfeda46647e0ae5d0d7 100644 |
--- a/src/interpreter/bytecodes.h |
+++ b/src/interpreter/bytecodes.h |
@@ -15,37 +15,24 @@ namespace v8 { |
namespace internal { |
namespace interpreter { |
-#define INVALID_OPERAND_TYPE_LIST(V) \ |
- V(None, OperandSize::kNone) |
- |
-#define REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ |
- /* Byte operands. */ \ |
- V(MaybeReg8, OperandSize::kByte) \ |
- V(Reg8, OperandSize::kByte) \ |
- V(RegPair8, OperandSize::kByte) \ |
- /* Short operands. */ \ |
- V(MaybeReg16, OperandSize::kShort) \ |
- V(Reg16, OperandSize::kShort) \ |
- V(RegPair16, OperandSize::kShort) |
- |
-#define REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) \ |
- /* Byte operands. */ \ |
- V(RegOut8, OperandSize::kByte) \ |
- V(RegOutPair8, OperandSize::kByte) \ |
- V(RegOutTriple8, OperandSize::kByte) \ |
- /* Short operands. */ \ |
- V(RegOut16, OperandSize::kShort) \ |
- V(RegOutPair16, OperandSize::kShort) \ |
- V(RegOutTriple16, OperandSize::kShort) |
- |
-#define SCALAR_OPERAND_TYPE_LIST(V) \ |
- /* Byte operands. */ \ |
- V(Idx8, OperandSize::kByte) \ |
- V(Imm8, OperandSize::kByte) \ |
- V(RegCount8, OperandSize::kByte) \ |
- /* Short operands. */ \ |
- V(Idx16, OperandSize::kShort) \ |
- V(RegCount16, OperandSize::kShort) |
+#define INVALID_OPERAND_TYPE_LIST(V) V(None, OperandTypeInfo::kNone) |
+ |
+#define REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ |
+ V(MaybeReg, OperandTypeInfo::kScalableSignedByte) \ |
+ V(Reg, OperandTypeInfo::kScalableSignedByte) \ |
+ V(RegPair, OperandTypeInfo::kScalableSignedByte) |
+ |
+#define REGISTER_OUTPUT_OPERAND_TYPE_LIST(V) \ |
+ V(RegOut, OperandTypeInfo::kScalableSignedByte) \ |
+ V(RegOutPair, OperandTypeInfo::kScalableSignedByte) \ |
+ V(RegOutTriple, OperandTypeInfo::kScalableSignedByte) |
+ |
+#define SCALAR_OPERAND_TYPE_LIST(V) \ |
+ V(Flag8, OperandTypeInfo::kFixedUnsignedByte) \ |
+ V(Idx, OperandTypeInfo::kScalableUnsignedByte) \ |
+ V(Imm, OperandTypeInfo::kScalableSignedByte) \ |
+ V(RegCount, OperandTypeInfo::kScalableUnsignedByte) \ |
+ V(RuntimeId, OperandTypeInfo::kFixedUnsignedShort) |
#define REGISTER_OPERAND_TYPE_LIST(V) \ |
REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ |
@@ -60,235 +47,225 @@ namespace interpreter { |
NON_REGISTER_OPERAND_TYPE_LIST(V) \ |
REGISTER_OPERAND_TYPE_LIST(V) |
-// Define one debug break bytecode for each operands size. |
-#define DEBUG_BREAK_BYTECODE_LIST(V) \ |
- V(DebugBreak0, OperandType::kNone) \ |
- V(DebugBreak1, OperandType::kReg8) \ |
- V(DebugBreak2, OperandType::kReg16) \ |
- V(DebugBreak3, OperandType::kReg16, OperandType::kReg8) \ |
- V(DebugBreak4, OperandType::kReg16, OperandType::kReg16) \ |
- V(DebugBreak5, OperandType::kReg16, OperandType::kReg16, OperandType::kReg8) \ |
- V(DebugBreak6, OperandType::kReg16, OperandType::kReg16, \ |
- OperandType::kReg16) \ |
- V(DebugBreak7, OperandType::kReg16, OperandType::kReg16, \ |
- OperandType::kReg16, OperandType::kReg8) \ |
- V(DebugBreak8, OperandType::kReg16, OperandType::kReg16, \ |
- OperandType::kReg16, OperandType::kReg16) |
+// Define one debug break bytecode for each possible size of unscaled |
+// bytecodes. |
+#define DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ |
+ V(DebugBreak0, OperandType::kNone) \ |
+ V(DebugBreak1, OperandType::kReg) \ |
+ V(DebugBreak2, OperandType::kReg, OperandType::kReg) \ |
+ V(DebugBreak3, OperandType::kReg, OperandType::kReg, OperandType::kReg) \ |
+ V(DebugBreak4, OperandType::kReg, OperandType::kReg, OperandType::kReg, \ |
+ OperandType::kReg) \ |
+ V(DebugBreak5, OperandType::kRuntimeId, OperandType::kReg, \ |
+ OperandType::kReg) \ |
+ V(DebugBreak6, OperandType::kRuntimeId, OperandType::kReg, \ |
+ OperandType::kReg, OperandType::kReg) |
+ |
+// Define one debug break for each widening prefix. |
+#define DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) \ |
+ V(DebugBreakWide, OperandType::kNone) \ |
+ V(DebugBreakExtraWide, OperandType::kNone) |
+ |
+#define DEBUG_BREAK_BYTECODE_LIST(V) \ |
+ DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ |
+ DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) |
// The list of bytecodes which are interpreted by the interpreter. |
-#define BYTECODE_LIST(V) \ |
- \ |
- /* Loading the accumulator */ \ |
- V(LdaZero, OperandType::kNone) \ |
- V(LdaSmi8, OperandType::kImm8) \ |
- V(LdaUndefined, OperandType::kNone) \ |
- V(LdaNull, OperandType::kNone) \ |
- V(LdaTheHole, OperandType::kNone) \ |
- V(LdaTrue, OperandType::kNone) \ |
- V(LdaFalse, OperandType::kNone) \ |
- V(LdaConstant, OperandType::kIdx8) \ |
- V(LdaConstantWide, OperandType::kIdx16) \ |
- \ |
- /* Globals */ \ |
- V(LdaGlobal, OperandType::kIdx8, OperandType::kIdx8) \ |
- V(LdaGlobalInsideTypeof, OperandType::kIdx8, OperandType::kIdx8) \ |
- V(LdaGlobalWide, OperandType::kIdx16, OperandType::kIdx16) \ |
- V(LdaGlobalInsideTypeofWide, OperandType::kIdx16, OperandType::kIdx16) \ |
- V(StaGlobalSloppy, OperandType::kIdx8, OperandType::kIdx8) \ |
- V(StaGlobalStrict, OperandType::kIdx8, OperandType::kIdx8) \ |
- V(StaGlobalSloppyWide, OperandType::kIdx16, OperandType::kIdx16) \ |
- V(StaGlobalStrictWide, OperandType::kIdx16, OperandType::kIdx16) \ |
- \ |
- /* Context operations */ \ |
- V(PushContext, OperandType::kReg8) \ |
- V(PopContext, OperandType::kReg8) \ |
- V(LdaContextSlot, OperandType::kReg8, OperandType::kIdx8) \ |
- V(StaContextSlot, OperandType::kReg8, OperandType::kIdx8) \ |
- V(LdaContextSlotWide, OperandType::kReg8, OperandType::kIdx16) \ |
- V(StaContextSlotWide, OperandType::kReg8, OperandType::kIdx16) \ |
- \ |
- /* Load-Store lookup slots */ \ |
- V(LdaLookupSlot, OperandType::kIdx8) \ |
- V(LdaLookupSlotInsideTypeof, OperandType::kIdx8) \ |
- V(LdaLookupSlotWide, OperandType::kIdx16) \ |
- V(LdaLookupSlotInsideTypeofWide, OperandType::kIdx16) \ |
- V(StaLookupSlotSloppy, OperandType::kIdx8) \ |
- V(StaLookupSlotStrict, OperandType::kIdx8) \ |
- V(StaLookupSlotSloppyWide, OperandType::kIdx16) \ |
- V(StaLookupSlotStrictWide, OperandType::kIdx16) \ |
- \ |
- /* Register-accumulator transfers */ \ |
- V(Ldar, OperandType::kReg8) \ |
- V(Star, OperandType::kRegOut8) \ |
- \ |
- /* Register-register transfers */ \ |
- V(Mov, OperandType::kReg8, OperandType::kRegOut8) \ |
- V(MovWide, OperandType::kReg16, OperandType::kRegOut16) \ |
- \ |
- /* LoadIC operations */ \ |
- V(LoadIC, OperandType::kReg8, OperandType::kIdx8, OperandType::kIdx8) \ |
- V(KeyedLoadIC, OperandType::kReg8, OperandType::kIdx8) \ |
- V(LoadICWide, OperandType::kReg8, OperandType::kIdx16, OperandType::kIdx16) \ |
- V(KeyedLoadICWide, OperandType::kReg8, OperandType::kIdx16) \ |
- \ |
- /* StoreIC operations */ \ |
- V(StoreICSloppy, OperandType::kReg8, OperandType::kIdx8, OperandType::kIdx8) \ |
- V(StoreICStrict, OperandType::kReg8, OperandType::kIdx8, OperandType::kIdx8) \ |
- V(KeyedStoreICSloppy, OperandType::kReg8, OperandType::kReg8, \ |
- OperandType::kIdx8) \ |
- V(KeyedStoreICStrict, OperandType::kReg8, OperandType::kReg8, \ |
- OperandType::kIdx8) \ |
- V(StoreICSloppyWide, OperandType::kReg8, OperandType::kIdx16, \ |
- OperandType::kIdx16) \ |
- V(StoreICStrictWide, OperandType::kReg8, OperandType::kIdx16, \ |
- OperandType::kIdx16) \ |
- V(KeyedStoreICSloppyWide, OperandType::kReg8, OperandType::kReg8, \ |
- OperandType::kIdx16) \ |
- V(KeyedStoreICStrictWide, OperandType::kReg8, OperandType::kReg8, \ |
- OperandType::kIdx16) \ |
- \ |
- /* Binary Operators */ \ |
- V(Add, OperandType::kReg8) \ |
- V(Sub, OperandType::kReg8) \ |
- V(Mul, OperandType::kReg8) \ |
- V(Div, OperandType::kReg8) \ |
- V(Mod, OperandType::kReg8) \ |
- V(BitwiseOr, OperandType::kReg8) \ |
- V(BitwiseXor, OperandType::kReg8) \ |
- V(BitwiseAnd, OperandType::kReg8) \ |
- V(ShiftLeft, OperandType::kReg8) \ |
- V(ShiftRight, OperandType::kReg8) \ |
- V(ShiftRightLogical, OperandType::kReg8) \ |
- \ |
- /* Unary Operators */ \ |
- V(Inc, OperandType::kNone) \ |
- V(Dec, OperandType::kNone) \ |
- V(LogicalNot, OperandType::kNone) \ |
- V(TypeOf, OperandType::kNone) \ |
- V(DeletePropertyStrict, OperandType::kReg8) \ |
- V(DeletePropertySloppy, OperandType::kReg8) \ |
- \ |
- /* Call operations */ \ |
- V(Call, OperandType::kReg8, OperandType::kReg8, OperandType::kRegCount8, \ |
- OperandType::kIdx8) \ |
- V(CallWide, OperandType::kReg16, OperandType::kReg16, \ |
- OperandType::kRegCount16, OperandType::kIdx16) \ |
- V(TailCall, OperandType::kReg8, OperandType::kReg8, OperandType::kRegCount8, \ |
- OperandType::kIdx8) \ |
- V(TailCallWide, OperandType::kReg16, OperandType::kReg16, \ |
- OperandType::kRegCount16, OperandType::kIdx16) \ |
- V(CallRuntime, OperandType::kIdx16, OperandType::kMaybeReg8, \ |
- OperandType::kRegCount8) \ |
- V(CallRuntimeWide, OperandType::kIdx16, OperandType::kMaybeReg16, \ |
- OperandType::kRegCount8) \ |
- V(CallRuntimeForPair, OperandType::kIdx16, OperandType::kMaybeReg8, \ |
- OperandType::kRegCount8, OperandType::kRegOutPair8) \ |
- V(CallRuntimeForPairWide, OperandType::kIdx16, OperandType::kMaybeReg16, \ |
- OperandType::kRegCount8, OperandType::kRegOutPair16) \ |
- V(CallJSRuntime, OperandType::kIdx16, OperandType::kReg8, \ |
- OperandType::kRegCount8) \ |
- V(CallJSRuntimeWide, OperandType::kIdx16, OperandType::kReg16, \ |
- OperandType::kRegCount16) \ |
- \ |
- /* New operator */ \ |
- V(New, OperandType::kReg8, OperandType::kMaybeReg8, OperandType::kRegCount8) \ |
- V(NewWide, OperandType::kReg16, OperandType::kMaybeReg16, \ |
- OperandType::kRegCount16) \ |
- \ |
- /* Test Operators */ \ |
- V(TestEqual, OperandType::kReg8) \ |
- V(TestNotEqual, OperandType::kReg8) \ |
- V(TestEqualStrict, OperandType::kReg8) \ |
- V(TestLessThan, OperandType::kReg8) \ |
- V(TestGreaterThan, OperandType::kReg8) \ |
- V(TestLessThanOrEqual, OperandType::kReg8) \ |
- V(TestGreaterThanOrEqual, OperandType::kReg8) \ |
- V(TestInstanceOf, OperandType::kReg8) \ |
- V(TestIn, OperandType::kReg8) \ |
- \ |
- /* Cast operators */ \ |
- V(ToName, OperandType::kNone) \ |
- V(ToNumber, OperandType::kNone) \ |
- V(ToObject, OperandType::kNone) \ |
- \ |
- /* Literals */ \ |
- V(CreateRegExpLiteral, OperandType::kIdx8, OperandType::kIdx8, \ |
- OperandType::kImm8) \ |
- V(CreateArrayLiteral, OperandType::kIdx8, OperandType::kIdx8, \ |
- OperandType::kImm8) \ |
- V(CreateObjectLiteral, OperandType::kIdx8, OperandType::kIdx8, \ |
- OperandType::kImm8) \ |
- V(CreateRegExpLiteralWide, OperandType::kIdx16, OperandType::kIdx16, \ |
- OperandType::kImm8) \ |
- V(CreateArrayLiteralWide, OperandType::kIdx16, OperandType::kIdx16, \ |
- OperandType::kImm8) \ |
- V(CreateObjectLiteralWide, OperandType::kIdx16, OperandType::kIdx16, \ |
- OperandType::kImm8) \ |
- \ |
- /* Closure allocation */ \ |
- V(CreateClosure, OperandType::kIdx8, OperandType::kImm8) \ |
- V(CreateClosureWide, OperandType::kIdx16, OperandType::kImm8) \ |
- \ |
- /* Arguments allocation */ \ |
- V(CreateMappedArguments, OperandType::kNone) \ |
- V(CreateUnmappedArguments, OperandType::kNone) \ |
- V(CreateRestParameter, OperandType::kNone) \ |
- \ |
- /* Control Flow */ \ |
- V(Jump, OperandType::kImm8) \ |
- V(JumpConstant, OperandType::kIdx8) \ |
- V(JumpConstantWide, OperandType::kIdx16) \ |
- V(JumpIfTrue, OperandType::kImm8) \ |
- V(JumpIfTrueConstant, OperandType::kIdx8) \ |
- V(JumpIfTrueConstantWide, OperandType::kIdx16) \ |
- V(JumpIfFalse, OperandType::kImm8) \ |
- V(JumpIfFalseConstant, OperandType::kIdx8) \ |
- V(JumpIfFalseConstantWide, OperandType::kIdx16) \ |
- V(JumpIfToBooleanTrue, OperandType::kImm8) \ |
- V(JumpIfToBooleanTrueConstant, OperandType::kIdx8) \ |
- V(JumpIfToBooleanTrueConstantWide, OperandType::kIdx16) \ |
- V(JumpIfToBooleanFalse, OperandType::kImm8) \ |
- V(JumpIfToBooleanFalseConstant, OperandType::kIdx8) \ |
- V(JumpIfToBooleanFalseConstantWide, OperandType::kIdx16) \ |
- V(JumpIfNull, OperandType::kImm8) \ |
- V(JumpIfNullConstant, OperandType::kIdx8) \ |
- V(JumpIfNullConstantWide, OperandType::kIdx16) \ |
- V(JumpIfUndefined, OperandType::kImm8) \ |
- V(JumpIfUndefinedConstant, OperandType::kIdx8) \ |
- V(JumpIfUndefinedConstantWide, OperandType::kIdx16) \ |
- V(JumpIfNotHole, OperandType::kImm8) \ |
- V(JumpIfNotHoleConstant, OperandType::kIdx8) \ |
- V(JumpIfNotHoleConstantWide, OperandType::kIdx16) \ |
- \ |
- /* Complex flow control For..in */ \ |
- V(ForInPrepare, OperandType::kRegOutTriple8) \ |
- V(ForInPrepareWide, OperandType::kRegOutTriple16) \ |
- V(ForInDone, OperandType::kReg8, OperandType::kReg8) \ |
- V(ForInNext, OperandType::kReg8, OperandType::kReg8, OperandType::kRegPair8, \ |
- OperandType::kIdx8) \ |
- V(ForInNextWide, OperandType::kReg16, OperandType::kReg16, \ |
- OperandType::kRegPair16, OperandType::kIdx16) \ |
- V(ForInStep, OperandType::kReg8) \ |
- \ |
- /* Perform a stack guard check */ \ |
- V(StackCheck, OperandType::kNone) \ |
- \ |
- /* Non-local flow control */ \ |
- V(Throw, OperandType::kNone) \ |
- V(ReThrow, OperandType::kNone) \ |
- V(Return, OperandType::kNone) \ |
- \ |
- /* Debugger */ \ |
- V(Debugger, OperandType::kNone) \ |
- DEBUG_BREAK_BYTECODE_LIST(V) |
- |
-// Enumeration of the size classes of operand types used by bytecodes. |
+#define BYTECODE_LIST(V) \ |
+ /* Extended width operands */ \ |
+ V(Wide, OperandType::kNone) \ |
+ V(ExtraWide, OperandType::kNone) \ |
+ \ |
+ /* Loading the accumulator */ \ |
+ V(LdaZero, OperandType::kNone) \ |
+ V(LdaSmi, OperandType::kImm) \ |
+ V(LdaUndefined, OperandType::kNone) \ |
+ V(LdaNull, OperandType::kNone) \ |
+ V(LdaTheHole, OperandType::kNone) \ |
+ V(LdaTrue, OperandType::kNone) \ |
+ V(LdaFalse, OperandType::kNone) \ |
+ V(LdaConstant, OperandType::kIdx) \ |
+ \ |
+ /* Globals */ \ |
+ V(LdaGlobal, OperandType::kIdx, OperandType::kIdx) \ |
+ V(LdaGlobalInsideTypeof, OperandType::kIdx, OperandType::kIdx) \ |
+ V(StaGlobalSloppy, OperandType::kIdx, OperandType::kIdx) \ |
+ V(StaGlobalStrict, OperandType::kIdx, OperandType::kIdx) \ |
+ \ |
+ /* Context operations */ \ |
+ V(PushContext, OperandType::kReg) \ |
+ V(PopContext, OperandType::kReg) \ |
+ V(LdaContextSlot, OperandType::kReg, OperandType::kIdx) \ |
+ V(StaContextSlot, OperandType::kReg, OperandType::kIdx) \ |
+ \ |
+ /* Load-Store lookup slots */ \ |
+ V(LdaLookupSlot, OperandType::kIdx) \ |
+ V(LdaLookupSlotInsideTypeof, OperandType::kIdx) \ |
+ V(StaLookupSlotSloppy, OperandType::kIdx) \ |
+ V(StaLookupSlotStrict, OperandType::kIdx) \ |
+ \ |
+ /* Register-accumulator transfers */ \ |
+ V(Ldar, OperandType::kReg) \ |
+ V(Star, OperandType::kRegOut) \ |
+ \ |
+ /* Register-register transfers */ \ |
+ V(Mov, OperandType::kReg, OperandType::kRegOut) \ |
+ \ |
+ /* LoadIC operations */ \ |
+ V(LoadIC, OperandType::kReg, OperandType::kIdx, OperandType::kIdx) \ |
+ V(KeyedLoadIC, OperandType::kReg, OperandType::kIdx) \ |
+ \ |
+ /* StoreIC operations */ \ |
+ V(StoreICSloppy, OperandType::kReg, OperandType::kIdx, OperandType::kIdx) \ |
+ V(StoreICStrict, OperandType::kReg, OperandType::kIdx, OperandType::kIdx) \ |
+ V(KeyedStoreICSloppy, OperandType::kReg, OperandType::kReg, \ |
+ OperandType::kIdx) \ |
+ V(KeyedStoreICStrict, OperandType::kReg, OperandType::kReg, \ |
+ OperandType::kIdx) \ |
+ \ |
+ /* Binary Operators */ \ |
+ V(Add, OperandType::kReg) \ |
+ V(Sub, OperandType::kReg) \ |
+ V(Mul, OperandType::kReg) \ |
+ V(Div, OperandType::kReg) \ |
+ V(Mod, OperandType::kReg) \ |
+ V(BitwiseOr, OperandType::kReg) \ |
+ V(BitwiseXor, OperandType::kReg) \ |
+ V(BitwiseAnd, OperandType::kReg) \ |
+ V(ShiftLeft, OperandType::kReg) \ |
+ V(ShiftRight, OperandType::kReg) \ |
+ V(ShiftRightLogical, OperandType::kReg) \ |
+ \ |
+ /* Unary Operators */ \ |
+ V(Inc, OperandType::kNone) \ |
+ V(Dec, OperandType::kNone) \ |
+ V(LogicalNot, OperandType::kNone) \ |
+ V(TypeOf, OperandType::kNone) \ |
+ V(DeletePropertyStrict, OperandType::kReg) \ |
+ V(DeletePropertySloppy, OperandType::kReg) \ |
+ \ |
+ /* Call operations */ \ |
+ V(Call, OperandType::kReg, OperandType::kReg, OperandType::kRegCount, \ |
+ OperandType::kIdx) \ |
+ V(TailCall, OperandType::kReg, OperandType::kReg, OperandType::kRegCount, \ |
+ OperandType::kIdx) \ |
+ V(CallRuntime, OperandType::kRuntimeId, OperandType::kMaybeReg, \ |
+ OperandType::kRegCount) \ |
+ V(CallRuntimeForPair, OperandType::kRuntimeId, OperandType::kMaybeReg, \ |
+ OperandType::kRegCount, OperandType::kRegOutPair) \ |
+ V(CallJSRuntime, OperandType::kIdx, OperandType::kReg, \ |
+ OperandType::kRegCount) \ |
+ \ |
+ /* New operator */ \ |
+ V(New, OperandType::kReg, OperandType::kMaybeReg, OperandType::kRegCount) \ |
+ \ |
+ /* Test Operators */ \ |
+ V(TestEqual, OperandType::kReg) \ |
+ V(TestNotEqual, OperandType::kReg) \ |
+ V(TestEqualStrict, OperandType::kReg) \ |
+ V(TestLessThan, OperandType::kReg) \ |
+ V(TestGreaterThan, OperandType::kReg) \ |
+ V(TestLessThanOrEqual, OperandType::kReg) \ |
+ V(TestGreaterThanOrEqual, OperandType::kReg) \ |
+ V(TestInstanceOf, OperandType::kReg) \ |
+ V(TestIn, OperandType::kReg) \ |
+ \ |
+ /* Cast operators */ \ |
+ V(ToName, OperandType::kNone) \ |
+ V(ToNumber, OperandType::kNone) \ |
+ V(ToObject, OperandType::kNone) \ |
+ \ |
+ /* Literals */ \ |
+ V(CreateRegExpLiteral, OperandType::kIdx, OperandType::kIdx, \ |
+ OperandType::kFlag8) \ |
+ V(CreateArrayLiteral, OperandType::kIdx, OperandType::kIdx, \ |
+ OperandType::kFlag8) \ |
+ V(CreateObjectLiteral, OperandType::kIdx, OperandType::kIdx, \ |
+ OperandType::kFlag8) \ |
+ \ |
+ /* Closure allocation */ \ |
+ V(CreateClosure, OperandType::kIdx, OperandType::kFlag8) \ |
+ \ |
+ /* Arguments allocation */ \ |
+ V(CreateMappedArguments, OperandType::kNone) \ |
+ V(CreateUnmappedArguments, OperandType::kNone) \ |
+ V(CreateRestParameter, OperandType::kNone) \ |
+ \ |
+ /* Control Flow */ \ |
+ V(Jump, OperandType::kImm) \ |
+ V(JumpConstant, OperandType::kIdx) \ |
+ V(JumpIfTrue, OperandType::kImm) \ |
+ V(JumpIfTrueConstant, OperandType::kIdx) \ |
+ V(JumpIfFalse, OperandType::kImm) \ |
+ V(JumpIfFalseConstant, OperandType::kIdx) \ |
+ V(JumpIfToBooleanTrue, OperandType::kImm) \ |
+ V(JumpIfToBooleanTrueConstant, OperandType::kIdx) \ |
+ V(JumpIfToBooleanFalse, OperandType::kImm) \ |
+ V(JumpIfToBooleanFalseConstant, OperandType::kIdx) \ |
+ V(JumpIfNull, OperandType::kImm) \ |
+ V(JumpIfNullConstant, OperandType::kIdx) \ |
+ V(JumpIfUndefined, OperandType::kImm) \ |
+ V(JumpIfUndefinedConstant, OperandType::kIdx) \ |
+ V(JumpIfNotHole, OperandType::kImm) \ |
+ V(JumpIfNotHoleConstant, OperandType::kIdx) \ |
+ \ |
+ /* Complex flow control For..in */ \ |
+ V(ForInPrepare, OperandType::kRegOutTriple) \ |
+ V(ForInDone, OperandType::kReg, OperandType::kReg) \ |
+ V(ForInNext, OperandType::kReg, OperandType::kReg, OperandType::kRegPair, \ |
+ OperandType::kIdx) \ |
+ V(ForInStep, OperandType::kReg) \ |
+ \ |
+ /* Perform a stack guard check */ \ |
+ V(StackCheck, OperandType::kNone) \ |
+ \ |
+ /* Non-local flow control */ \ |
+ V(Throw, OperandType::kNone) \ |
+ V(ReThrow, OperandType::kNone) \ |
+ V(Return, OperandType::kNone) \ |
+ \ |
+ /* Debugger */ \ |
+ V(Debugger, OperandType::kNone) \ |
+ DEBUG_BREAK_BYTECODE_LIST(V) \ |
+ \ |
+ /* Illegal bytecode (terminates execution) */ \ |
+ V(Illegal, OperandType::kNone) |
+ |
+// Enumeration of scaling factors applicable to scalable operands. Code |
+// relies on being able to cast values to integer scaling values. |
+enum class OperandScale : uint8_t { |
+ kSingle = 1, |
+ kDouble = 2, |
+ kQuadruple = 4, |
+ kMaxValid = kQuadruple, |
+ kInvalid = 8, |
+}; |
+ |
+// Enumeration of the size classes of operand types used by |
+// bytecodes. Code relies on being able to cast values to integer |
+// types to get the size in bytes. |
enum class OperandSize : uint8_t { |
kNone = 0, |
kByte = 1, |
kShort = 2, |
+ kQuad = 4, |
+ kLast = kQuad |
}; |
+// Primitive operand info used that summarize properties of operands. |
+// Columns are Name, IsScalable, IsUnsigned, UnscaledSize. |
+#define OPERAND_TYPE_INFO_LIST(V) \ |
+ V(None, false, false, OperandSize::kNone) \ |
+ V(ScalableSignedByte, true, false, OperandSize::kByte) \ |
+ V(ScalableUnsignedByte, true, true, OperandSize::kByte) \ |
+ V(FixedUnsignedByte, false, true, OperandSize::kByte) \ |
+ V(FixedUnsignedShort, false, true, OperandSize::kShort) |
+ |
+enum class OperandTypeInfo : uint8_t { |
+#define DECLARE_OPERAND_TYPE_INFO(Name, ...) k##Name, |
+ OPERAND_TYPE_INFO_LIST(DECLARE_OPERAND_TYPE_INFO) |
+#undef DECLARE_OPERAND_TYPE_INFO |
+}; |
// Enumeration of operand types used by bytecodes. |
enum class OperandType : uint8_t { |
@@ -330,9 +307,6 @@ class Register { |
static Register FromParameterIndex(int index, int parameter_count); |
int ToParameterIndex(int parameter_count) const; |
- static int MaxParameterIndex(); |
- static int MaxRegisterIndex(); |
- static int MaxRegisterIndexForByteOperand(); |
// Returns an invalid register. |
static Register invalid_value() { return Register(); } |
@@ -349,14 +323,8 @@ class Register { |
static Register new_target(); |
bool is_new_target() const; |
- static Register FromOperand(uint8_t operand); |
- uint8_t ToOperand() const; |
- |
- static Register FromWideOperand(uint16_t operand); |
- uint16_t ToWideOperand() const; |
- |
- static Register FromRawOperand(uint32_t raw_operand); |
- uint32_t ToRawOperand() const; |
+ int32_t ToOperand() const { return -index_; } |
+ static Register FromOperand(int32_t operand) { return Register(-operand); } |
static bool AreContiguous(Register reg1, Register reg2, |
Register reg3 = Register(), |
@@ -399,9 +367,15 @@ class Bytecodes { |
// Returns string representation of |bytecode|. |
static const char* ToString(Bytecode bytecode); |
+ // Returns string representation of |bytecode|. |
+ static std::string ToString(Bytecode bytecode, OperandScale operand_scale); |
+ |
// Returns string representation of |operand_type|. |
static const char* OperandTypeToString(OperandType operand_type); |
+ // Returns string representation of |operand_scale|. |
+ static const char* OperandScaleToString(OperandScale operand_scale); |
+ |
// Returns string representation of |operand_size|. |
static const char* OperandSizeToString(OperandSize operand_size); |
@@ -417,57 +391,63 @@ class Bytecodes { |
// Returns the number of register operands expected by |bytecode|. |
static int NumberOfRegisterOperands(Bytecode bytecode); |
+ // Returns the prefix bytecode representing an operand scale to be |
+ // applied to a a bytecode. |
+ static Bytecode OperandScaleToPrefixBytecode(OperandScale operand_scale); |
+ |
+ // Returns true if the operand scale requires a prefix bytecode. |
+ static bool OperandScaleRequiresPrefixBytecode(OperandScale operand_scale); |
+ |
+ // Returns the scaling applied to scalable operands if bytecode is |
+ // is a scaling prefix. |
+ static OperandScale PrefixBytecodeToOperandScale(Bytecode bytecode); |
+ |
// Returns the i-th operand of |bytecode|. |
static OperandType GetOperandType(Bytecode bytecode, int i); |
// Returns the size of the i-th operand of |bytecode|. |
- static OperandSize GetOperandSize(Bytecode bytecode, int i); |
+ static OperandSize GetOperandSize(Bytecode bytecode, int i, |
+ OperandScale operand_scale); |
// Returns the offset of the i-th operand of |bytecode| relative to the start |
// of the bytecode. |
- static int GetOperandOffset(Bytecode bytecode, int i); |
+ static int GetOperandOffset(Bytecode bytecode, int i, |
+ OperandScale operand_scale); |
// Returns a zero-based bitmap of the register operand positions of |
// |bytecode|. |
static int GetRegisterOperandBitmap(Bytecode bytecode); |
- // Returns a debug break bytecode with a matching operand size. |
+ // Returns a debug break bytecode to replace |bytecode|. |
static Bytecode GetDebugBreak(Bytecode bytecode); |
- // Returns the size of the bytecode including its operands. |
- static int Size(Bytecode bytecode); |
+ // Returns the size of the bytecode including its operands for the |
+ // given |operand_scale|. |
+ static int Size(Bytecode bytecode, OperandScale operand_scale); |
// Returns the size of |operand|. |
- static OperandSize SizeOfOperand(OperandType operand); |
+ static OperandSize SizeOfOperand(OperandType operand, OperandScale scale); |
// Returns true if the bytecode is a conditional jump taking |
- // an immediate byte operand (OperandType::kImm8). |
+ // an immediate byte operand (OperandType::kImm). |
static bool IsConditionalJumpImmediate(Bytecode bytecode); |
// Returns true if the bytecode is a conditional jump taking |
- // a constant pool entry (OperandType::kIdx8). |
+ // a constant pool entry (OperandType::kIdx). |
static bool IsConditionalJumpConstant(Bytecode bytecode); |
// Returns true if the bytecode is a conditional jump taking |
- // a constant pool entry (OperandType::kIdx16). |
- static bool IsConditionalJumpConstantWide(Bytecode bytecode); |
- |
- // Returns true if the bytecode is a conditional jump taking |
// any kind of operand. |
static bool IsConditionalJump(Bytecode bytecode); |
// Returns true if the bytecode is a jump or a conditional jump taking |
- // an immediate byte operand (OperandType::kImm8). |
+ // an immediate byte operand (OperandType::kImm). |
static bool IsJumpImmediate(Bytecode bytecode); |
// Returns true if the bytecode is a jump or conditional jump taking a |
- // constant pool entry (OperandType::kIdx8). |
+ // constant pool entry (OperandType::kIdx). |
static bool IsJumpConstant(Bytecode bytecode); |
- // Returns true if the bytecode is a jump or conditional jump taking a |
- // constant pool entry (OperandType::kIdx16). |
- static bool IsJumpConstantWide(Bytecode bytecode); |
- |
// Returns true if the bytecode is a jump or conditional jump taking |
// any kind of operand. |
static bool IsJump(Bytecode bytecode); |
@@ -484,15 +464,11 @@ class Bytecodes { |
// Returns true if the bytecode is a debug break. |
static bool IsDebugBreak(Bytecode bytecode); |
- // Returns true if |operand_type| is a register index operand (kIdx8/kIdx16). |
- static bool IsIndexOperandType(OperandType operand_type); |
- |
- // Returns true if |operand_type| represents an immediate. |
- static bool IsImmediateOperandType(OperandType operand_type); |
+ // Returns true if the bytecode has wider operand forms. |
+ static bool IsBytecodeWithScalableOperands(Bytecode bytecode); |
- // Returns true if |operand_type| is a register count operand |
- // (kRegCount8/kRegCount16). |
- static bool IsRegisterCountOperandType(OperandType operand_type); |
+ // Returns true if the bytecode is a scaling prefix bytecode. |
+ static bool IsPrefixScalingBytecode(Bytecode bytecode); |
// Returns true if |operand_type| is any type of register operand. |
static bool IsRegisterOperandType(OperandType operand_type); |
@@ -504,20 +480,45 @@ class Bytecodes { |
static bool IsRegisterOutputOperandType(OperandType operand_type); |
// Returns true if |operand_type| is a maybe register operand |
- // (kMaybeReg8/kMaybeReg16). |
+ // (kMaybeReg). |
static bool IsMaybeRegisterOperandType(OperandType operand_type); |
+ // Returns true if |operand_type| is a runtime-id operand (kRuntimeId). |
+ static bool IsRuntimeIdOperandType(OperandType operand_type); |
+ |
+ // Returns true if |operand_type| is unsigned, false if signed. |
+ static bool IsUnsignedOperandType(OperandType operand_type); |
+ |
+ // Decodes a register operand in a byte array. |
+ static Register DecodeRegisterOperand(const uint8_t* operand_start, |
+ OperandType operand_type, |
+ OperandScale operand_scale); |
+ |
+ // Decodes a signed operand in a byte array. |
+ static int32_t DecodeSignedOperand(const uint8_t* operand_start, |
+ OperandType operand_type, |
+ OperandScale operand_scale); |
+ |
+ // Decodes an unsigned operand in a byte array. |
+ static uint32_t DecodeUnsignedOperand(const uint8_t* operand_start, |
+ OperandType operand_type, |
+ OperandScale operand_scale); |
+ |
// Decode a single bytecode and operands to |os|. |
static std::ostream& Decode(std::ostream& os, const uint8_t* bytecode_start, |
int number_of_parameters); |
+ // Return the next larger operand scale. |
+ static OperandScale NextOperandScale(OperandScale operand_scale); |
+ |
private: |
DISALLOW_IMPLICIT_CONSTRUCTORS(Bytecodes); |
}; |
std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode); |
+std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale); |
+std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size); |
std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); |
-std::ostream& operator<<(std::ostream& os, const OperandSize& operand_type); |
} // namespace interpreter |
} // namespace internal |