6202749429
Change-Id: I2882546741b1dd8f6e03a21d85b5487fb754b742 Reviewed-on: https://dart-review.googlesource.com/55324 Reviewed-by: Régis Crelier <regis@google.com> Reviewed-by: Zach Anderson <zra@google.com> Reviewed-by: Vyacheslav Egorov <vegorov@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
659 lines
25 KiB
Dart
659 lines
25 KiB
Dart
// 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 FieldOffset,
|
|
// TypeArgumentsFieldOffset or ConstantContextOffset tags
|
|
// (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
|
|
//
|
|
|
|
enum Opcode {
|
|
kTrap,
|
|
kNop,
|
|
kCompile,
|
|
kHotCheck,
|
|
kIntrinsic,
|
|
kDrop1,
|
|
kDropR,
|
|
kDrop,
|
|
kJump,
|
|
kReturn,
|
|
kReturnTOS,
|
|
kMove,
|
|
kSwap,
|
|
kPush,
|
|
kLoadConstant,
|
|
kLoadClassId,
|
|
kLoadClassIdTOS,
|
|
kPushConstant,
|
|
kStoreLocal,
|
|
kPopLocal,
|
|
kIndirectStaticCall,
|
|
kStaticCall,
|
|
kInstanceCall1,
|
|
kInstanceCall2,
|
|
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,
|
|
kLoadField,
|
|
kLoadFieldExt,
|
|
kLoadUntagged,
|
|
kLoadFieldTOS,
|
|
kBooleanNegateTOS,
|
|
kBooleanNegate,
|
|
kThrow,
|
|
kEntry,
|
|
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.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.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.kInstanceCall1: const Format(
|
|
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
|
|
Opcode.kInstanceCall2: 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.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
|
|
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.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.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.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]),
|
|
Opcode.kEntryOptional: const Format(
|
|
Encoding.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
|
|
};
|
|
|
|
// Should match constant in runtime/vm/stack_frame_dbc.h.
|
|
const int kParamEndSlotFromFp = 4;
|
|
|
|
// Prefix used to distinguish getters in ICData target names.
|
|
// Should match constant in runtime/vm/object.cc.
|
|
const String kGetterPrefix = 'get:';
|
|
|
|
// Prefix used to distinguish setters in ICData target names.
|
|
// Should match constant in runtime/vm/object.cc.
|
|
const String kSetterPrefix = 'set:';
|
|
|
|
enum SpecialIndex {
|
|
exception,
|
|
stackTrace,
|
|
}
|