blob: 8fd6b05141ad1bee01bea3b220d446a19b880ded [file] [log] [blame]
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library vm.bytecode.dbc;
// List of changes from original DBC (described in runtime/vm/constants_dbc.h):
//
// 1. StoreFieldTOS, LoadFieldTOS instructions:
// D = index of constant pool entry with InstanceField tag.
// (instead of field offset in words).
//
// 2. EntryOptional instruction is revived in order to re-shuffle optional
// parameters. This DBC instruction was removed at
// https://github.com/dart-lang/sdk/commit/cf1de7d46cd88e204380e8f96a993439be56b24c
//
// 3. NativeCall instruction is modified to have 'D' format and take 1 argument:
// D = index of NativeEntry constant pool entry
//
// 4. JumpIfNoAsserts instruction is added. This instruction jumps to the given
// target if assertions are not enabled. It has the same format as Jump
// instruction.
//
// 5. StoreContextParent stores context SP[0] into `parent` field of context SP[-1].
//
// 6. LoadContextParent loads parent from context SP[0].
//
// 7. StoreContextVar stores value SP[0] into context SP[-1] at index D.
//
// 8. LoadContextVar loads value from context SP[0] at index D.
//
// 9. LoadTypeArgumentsField loads instantiator type arguments from an
// instance SP[0].
// D = index of TypeArgumentsField constant pool entry corresponding
// to an instance's class.
//
// 10. InstanceCall1 and InstanceCall2 instructions are superseded by
// InstanceCall which works for any number of checked arguments.
//
// 11. EntryFixed instruction works like Entry. In addition, it checks number
// of fixed arguments.
//
// 12. JumpIfNotZeroTypeArgs instruction jumps if number of passed
// function type arguments is not zero.
//
// 13. PushNull, PushTrue, PushFalse, PushInt instructions added.
//
enum Opcode {
kTrap,
kNop,
kCompile,
kHotCheck,
kIntrinsic,
kDrop1,
kDropR,
kDrop,
kJump,
kJumpIfNoAsserts,
kJumpIfNotZeroTypeArgs,
kReturn,
kReturnTOS,
kMove,
kSwap,
kPush,
kLoadConstant,
kLoadClassId,
kLoadClassIdTOS,
kPushConstant,
kPushNull,
kPushTrue,
kPushFalse,
kPushInt,
kStoreLocal,
kPopLocal,
kIndirectStaticCall,
kStaticCall,
kInstanceCall,
kInstanceCall1Opt,
kInstanceCall2Opt,
kPushPolymorphicInstanceCall,
kPushPolymorphicInstanceCallByRange,
kNativeCall,
kOneByteStringFromCharCode,
kStringToCharCode,
kAddTOS,
kSubTOS,
kMulTOS,
kBitOrTOS,
kBitAndTOS,
kEqualTOS,
kLessThanTOS,
kGreaterThanTOS,
kSmiAddTOS,
kSmiSubTOS,
kSmiMulTOS,
kSmiBitAndTOS,
kAdd,
kSub,
kMul,
kDiv,
kMod,
kShl,
kShr,
kShlImm,
kNeg,
kBitOr,
kBitAnd,
kBitXor,
kBitNot,
kMin,
kMax,
kWriteIntoDouble,
kUnboxDouble,
kCheckedUnboxDouble,
kUnboxInt32,
kBoxInt32,
kBoxUint32,
kSmiToDouble,
kDoubleToSmi,
kDAdd,
kDSub,
kDMul,
kDDiv,
kDNeg,
kDSqrt,
kDMin,
kDMax,
kDCos,
kDSin,
kDPow,
kDMod,
kDTruncate,
kDFloor,
kDCeil,
kDoubleToFloat,
kFloatToDouble,
kDoubleIsNaN,
kDoubleIsInfinite,
kStoreStaticTOS,
kPushStatic,
kInitStaticTOS,
kIfNeStrictTOS,
kIfEqStrictTOS,
kIfNeStrictNumTOS,
kIfEqStrictNumTOS,
kIfSmiLtTOS,
kIfSmiLeTOS,
kIfSmiGeTOS,
kIfSmiGtTOS,
kIfNeStrict,
kIfEqStrict,
kIfLe,
kIfLt,
kIfGe,
kIfGt,
kIfULe,
kIfULt,
kIfUGe,
kIfUGt,
kIfDNe,
kIfDEq,
kIfDLe,
kIfDLt,
kIfDGe,
kIfDGt,
kIfNeStrictNum,
kIfEqStrictNum,
kIfEqNull,
kIfNeNull,
kCreateArrayTOS,
kCreateArrayOpt,
kAllocate,
kAllocateT,
kAllocateOpt,
kAllocateTOpt,
kStoreIndexedTOS,
kStoreIndexed,
kStoreIndexedUint8,
kStoreIndexedExternalUint8,
kStoreIndexedOneByteString,
kStoreIndexedUint32,
kStoreIndexedFloat32,
kStoreIndexed4Float32,
kStoreIndexedFloat64,
kStoreIndexed8Float64,
kNoSuchMethod,
kTailCall,
kTailCallOpt,
kLoadArgDescriptor,
kLoadArgDescriptorOpt,
kLoadFpRelativeSlot,
kLoadFpRelativeSlotOpt,
kStoreFpRelativeSlot,
kStoreFpRelativeSlotOpt,
kLoadIndexedTOS,
kLoadIndexed,
kLoadIndexedUint8,
kLoadIndexedInt8,
kLoadIndexedInt32,
kLoadIndexedUint32,
kLoadIndexedExternalUint8,
kLoadIndexedExternalInt8,
kLoadIndexedFloat32,
kLoadIndexed4Float32,
kLoadIndexedFloat64,
kLoadIndexed8Float64,
kLoadIndexedOneByteString,
kLoadIndexedTwoByteString,
kStoreField,
kStoreFieldExt,
kStoreFieldTOS,
kStoreContextParent,
kStoreContextVar,
kLoadField,
kLoadFieldExt,
kLoadUntagged,
kLoadFieldTOS,
kLoadTypeArgumentsField,
kLoadContextParent,
kLoadContextVar,
kBooleanNegateTOS,
kBooleanNegate,
kThrow,
kEntry,
kEntryFixed,
kEntryOptional,
kEntryOptimized,
kFrame,
kSetFrame,
kAllocateContext,
kAllocateUninitializedContext,
kCloneContext,
kMoveSpecial,
kInstantiateType,
kInstantiateTypeArgumentsTOS,
kInstanceOf,
kBadTypeError,
kAssertAssignable,
kAssertSubtype,
kAssertBoolean,
kTestSmi,
kTestCids,
kCheckSmi,
kCheckEitherNonSmi,
kCheckClassId,
kCheckClassIdRange,
kCheckBitTest,
kCheckCids,
kCheckCidsByRange,
kCheckStack,
kCheckStackAlwaysExit,
kCheckFunctionTypeArgs,
kDebugStep,
kDebugBreak,
kDeopt,
kDeoptRewind,
}
enum Encoding {
k0,
kA,
kAD,
kAX,
kD,
kX,
kABC,
kABY,
kT,
}
enum Operand {
none, // ignored / non-existent operand
imm, // immediate operand
lit, // constant literal from object pool
reg, // register (unsigned FP relative local)
xeg, // x-register (signed FP relative local)
tgt, // jump target relative to the PC of the current instruction
spe, // SpecialIndex
}
class Format {
final Encoding encoding;
final List<Operand> operands;
const Format(this.encoding, this.operands);
}
const Map<Opcode, Format> BytecodeFormats = const {
Opcode.kTrap: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kNop: const Format(
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
Opcode.kCompile: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kHotCheck: const Format(
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
Opcode.kIntrinsic: const Format(
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kDrop1: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kDropR: const Format(
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kDrop: const Format(
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kJump: const Format(
Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
Opcode.kJumpIfNoAsserts: const Format(
Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
Opcode.kJumpIfNotZeroTypeArgs: const Format(
Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
Opcode.kReturn: const Format(
Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kReturnTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kMove: const Format(
Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
Opcode.kSwap: const Format(
Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
Opcode.kPush: const Format(
Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
Opcode.kLoadConstant: const Format(
Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
Opcode.kLoadClassId: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kLoadClassIdTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kPushConstant: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kPushNull: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kPushTrue: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kPushFalse: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kPushInt: const Format(
Encoding.kX, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kStoreLocal: const Format(
Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
Opcode.kPopLocal: const Format(
Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
Opcode.kIndirectStaticCall: const Format(
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
Opcode.kStaticCall: const Format(
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
Opcode.kInstanceCall: const Format(
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
Opcode.kInstanceCall1Opt: const Format(
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
Opcode.kInstanceCall2Opt: const Format(
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
Opcode.kPushPolymorphicInstanceCall: const Format(
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
Opcode.kPushPolymorphicInstanceCallByRange: const Format(
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
Opcode.kNativeCall: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kOneByteStringFromCharCode: const Format(
Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
Opcode.kStringToCharCode: const Format(
Encoding.kAX, const [Operand.reg, Operand.xeg, Operand.none]),
Opcode.kAddTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kSubTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kMulTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kBitOrTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kBitAndTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kEqualTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kLessThanTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kGreaterThanTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kSmiAddTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kSmiSubTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kSmiMulTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kSmiBitAndTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kAdd: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kSub: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kMul: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDiv: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kMod: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kShl: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kShr: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kShlImm: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
Opcode.kNeg: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kBitOr: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kBitAnd: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kBitXor: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kBitNot: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kMin: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kMax: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kWriteIntoDouble: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kUnboxDouble: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kCheckedUnboxDouble: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kUnboxInt32: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
Opcode.kBoxInt32: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kBoxUint32: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kSmiToDouble: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDoubleToSmi: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDAdd: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDSub: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDMul: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDDiv: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDNeg: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDSqrt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDMin: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDMax: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDCos: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDSin: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDPow: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDMod: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kDTruncate: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDFloor: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDCeil: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDoubleToFloat: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kFloatToDouble: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kDoubleIsNaN: const Format(
Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kDoubleIsInfinite: const Format(
Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kStoreStaticTOS: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kPushStatic: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kInitStaticTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfNeStrictTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfEqStrictTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfNeStrictNumTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfEqStrictNumTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfSmiLtTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfSmiLeTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfSmiGeTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfSmiGtTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kIfNeStrict: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfEqStrict: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfLe: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfLt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfGe: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfGt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfULe: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfULt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfUGe: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfUGt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfDNe: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfDEq: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfDLe: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfDLt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfDGe: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfDGt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfNeStrictNum: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfEqStrictNum: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kIfEqNull: const Format(
Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kIfNeNull: const Format(
Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kCreateArrayTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kCreateArrayOpt: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kAllocate: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kAllocateT: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kAllocateOpt: const Format(
Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
Opcode.kAllocateTOpt: const Format(
Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
Opcode.kStoreIndexedTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kStoreIndexed: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreIndexedUint8: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreIndexedExternalUint8: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreIndexedOneByteString: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreIndexedUint32: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreIndexedFloat32: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreIndexed4Float32: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreIndexedFloat64: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreIndexed8Float64: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kNoSuchMethod: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kTailCall: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kTailCallOpt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kLoadArgDescriptor: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kLoadArgDescriptorOpt: const Format(
Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kLoadFpRelativeSlot: const Format(
Encoding.kX, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kLoadFpRelativeSlotOpt: const Format(
Encoding.kABY, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreFpRelativeSlot: const Format(
Encoding.kX, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kStoreFpRelativeSlotOpt: const Format(
Encoding.kABY, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kLoadIndexed: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedUint8: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedInt8: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedInt32: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedUint32: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedExternalUint8: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedExternalInt8: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedFloat32: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexed4Float32: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedFloat64: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexed8Float64: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedOneByteString: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kLoadIndexedTwoByteString: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.reg]),
Opcode.kStoreField: const Format(
Encoding.kABC, const [Operand.reg, Operand.imm, Operand.reg]),
Opcode.kStoreFieldExt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kStoreFieldTOS: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kStoreContextParent: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kStoreContextVar: const Format(
Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kLoadField: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
Opcode.kLoadFieldExt: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kLoadUntagged: const Format(
Encoding.kABC, const [Operand.reg, Operand.reg, Operand.imm]),
Opcode.kLoadFieldTOS: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kLoadTypeArgumentsField: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kLoadContextParent: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kLoadContextVar: const Format(
Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kBooleanNegateTOS: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kBooleanNegate: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kThrow: const Format(
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kEntry: const Format(
Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kEntryFixed: const Format(
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
Opcode.kEntryOptional: const Format(
Encoding.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
Opcode.kEntryOptimized: const Format(
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
Opcode.kFrame: const Format(
Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kSetFrame: const Format(
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kAllocateContext: const Format(
Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kAllocateUninitializedContext: const Format(
Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
Opcode.kCloneContext: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kMoveSpecial: const Format(
Encoding.kAD, const [Operand.reg, Operand.spe, Operand.none]),
Opcode.kInstantiateType: const Format(
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
Opcode.kInstantiateTypeArgumentsTOS: const Format(
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
Opcode.kInstanceOf: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kBadTypeError: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kAssertAssignable: const Format(
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
Opcode.kAssertSubtype: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kAssertBoolean: const Format(
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kTestSmi: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kTestCids: const Format(
Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
Opcode.kCheckSmi: const Format(
Encoding.kA, const [Operand.reg, Operand.none, Operand.none]),
Opcode.kCheckEitherNonSmi: const Format(
Encoding.kAD, const [Operand.reg, Operand.reg, Operand.none]),
Opcode.kCheckClassId: const Format(
Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
Opcode.kCheckClassIdRange: const Format(
Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
Opcode.kCheckBitTest: const Format(
Encoding.kAD, const [Operand.reg, Operand.imm, Operand.none]),
Opcode.kCheckCids: const Format(
Encoding.kABC, const [Operand.reg, Operand.imm, Operand.imm]),
Opcode.kCheckCidsByRange: const Format(
Encoding.kABC, const [Operand.reg, Operand.imm, Operand.imm]),
Opcode.kCheckStack: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kCheckStackAlwaysExit: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kCheckFunctionTypeArgs: const Format(
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
Opcode.kDebugStep: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
Opcode.kDebugBreak: const Format(
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
Opcode.kDeopt: const Format(
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
Opcode.kDeoptRewind: const Format(
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
};
// Should match constant in runtime/vm/stack_frame_dbc.h.
const int kParamEndSlotFromFp = 4;
enum SpecialIndex {
exception,
stackTrace,
}
bool isJump(Opcode opcode) => BytecodeFormats[opcode].encoding == Encoding.kT;