// 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 operands; const Format(this.encoding, this.operands); } const Map 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;