[vm/bytecode] Cleanup unused bytecode instructions
Change-Id: I956525dbeb3fdcb4b65a5530dbb59a96b4a02e81 Reviewed-on: https://dart-review.googlesource.com/77224 Reviewed-by: Zach Anderson <zra@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
committed by
commit-bot@chromium.org
parent
ccf2366398
commit
deb0645654
@@ -98,7 +98,7 @@ class BytecodeAssembler {
|
||||
int _uint8(int v) => _unsigned(v, 8);
|
||||
int _uint16(int v) => _unsigned(v, 16);
|
||||
|
||||
int _int8(int v) => _signed(v, 8);
|
||||
// int _int8(int v) => _signed(v, 8);
|
||||
int _int16(int v) => _signed(v, 16);
|
||||
int _int24(int v) => _signed(v, 24);
|
||||
|
||||
@@ -110,8 +110,11 @@ class BytecodeAssembler {
|
||||
int _encodeAD(Opcode opcode, int ra, int rd) =>
|
||||
_uint8(opcode.index) | (_uint8(ra) << 8) | (_uint16(rd) << 16);
|
||||
|
||||
int _encodeAX(Opcode opcode, int ra, int rx) =>
|
||||
_uint8(opcode.index) | (_uint8(ra) << 8) | (_int16(rx) << 16);
|
||||
// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
|
||||
// remove it once bytecode instruction set is finalized.
|
||||
//
|
||||
// int _encodeAX(Opcode opcode, int ra, int rx) =>
|
||||
// _uint8(opcode.index) | (_uint8(ra) << 8) | (_int16(rx) << 16);
|
||||
|
||||
int _encodeD(Opcode opcode, int rd) =>
|
||||
_uint8(opcode.index) | (_uint16(rd) << 16);
|
||||
@@ -125,11 +128,14 @@ class BytecodeAssembler {
|
||||
(_uint8(rb) << 16) |
|
||||
(_uint8(rc) << 24);
|
||||
|
||||
int _encodeABY(Opcode opcode, int ra, int rb, int ry) =>
|
||||
_uint8(opcode.index) |
|
||||
(_uint8(ra) << 8) |
|
||||
(_uint8(rb) << 16) |
|
||||
(_int8(ry) << 24);
|
||||
// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
|
||||
// remove it once bytecode instruction set is finalized.
|
||||
//
|
||||
// int _encodeABY(Opcode opcode, int ra, int rb, int ry) =>
|
||||
// _uint8(opcode.index) |
|
||||
// (_uint8(ra) << 8) |
|
||||
// (_uint8(rb) << 16) |
|
||||
// (_int8(ry) << 24);
|
||||
|
||||
int _encodeT(Opcode opcode, int rt) =>
|
||||
_uint8(opcode.index) | (_int24(rt) << 8);
|
||||
@@ -138,34 +144,10 @@ class BytecodeAssembler {
|
||||
emitWord(_encode0(Opcode.kTrap));
|
||||
}
|
||||
|
||||
void emitNop(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kNop, ra, rd));
|
||||
}
|
||||
|
||||
void emitCompile() {
|
||||
emitWord(_encode0(Opcode.kCompile));
|
||||
}
|
||||
|
||||
void emitHotCheck(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kHotCheck, ra, rd));
|
||||
}
|
||||
|
||||
void emitIntrinsic(int ra) {
|
||||
emitWord(_encodeA(Opcode.kIntrinsic, ra));
|
||||
}
|
||||
|
||||
void emitDrop1() {
|
||||
emitWord(_encode0(Opcode.kDrop1));
|
||||
}
|
||||
|
||||
void emitDropR(int ra) {
|
||||
emitWord(_encodeA(Opcode.kDropR, ra));
|
||||
}
|
||||
|
||||
void emitDrop(int ra) {
|
||||
emitWord(_encodeA(Opcode.kDrop, ra));
|
||||
}
|
||||
|
||||
void emitJump(Label label) {
|
||||
emitWord(_encodeT(Opcode.kJump, label.jumpOperand(offset)));
|
||||
}
|
||||
@@ -209,22 +191,10 @@ class BytecodeAssembler {
|
||||
_setWord(pos, _encodeT(opcode, rt));
|
||||
}
|
||||
|
||||
void emitReturn(int ra) {
|
||||
emitWord(_encodeA(Opcode.kReturn, ra));
|
||||
}
|
||||
|
||||
void emitReturnTOS() {
|
||||
emitWord(_encode0(Opcode.kReturnTOS));
|
||||
}
|
||||
|
||||
void emitMove(int ra, int rx) {
|
||||
emitWord(_encodeAX(Opcode.kMove, ra, rx));
|
||||
}
|
||||
|
||||
void emitSwap(int ra, int rx) {
|
||||
emitWord(_encodeAX(Opcode.kSwap, ra, rx));
|
||||
}
|
||||
|
||||
void emitPush(int rx) {
|
||||
emitWord(_encodeX(Opcode.kPush, rx));
|
||||
}
|
||||
@@ -233,14 +203,6 @@ class BytecodeAssembler {
|
||||
emitWord(_encodeAD(Opcode.kLoadConstant, ra, rd));
|
||||
}
|
||||
|
||||
void emitLoadClassId(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kLoadClassId, ra, rd));
|
||||
}
|
||||
|
||||
void emitLoadClassIdTOS() {
|
||||
emitWord(_encode0(Opcode.kLoadClassIdTOS));
|
||||
}
|
||||
|
||||
void emitPushConstant(int rd) {
|
||||
emitWord(_encodeD(Opcode.kPushConstant, rd));
|
||||
}
|
||||
@@ -273,258 +235,14 @@ class BytecodeAssembler {
|
||||
emitWord(_encodeAD(Opcode.kIndirectStaticCall, ra, rd));
|
||||
}
|
||||
|
||||
void emitStaticCall(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kStaticCall, ra, rd));
|
||||
}
|
||||
|
||||
void emitInstanceCall(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kInstanceCall, ra, rd));
|
||||
}
|
||||
|
||||
void emitInstanceCall1Opt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kInstanceCall1Opt, ra, rd));
|
||||
}
|
||||
|
||||
void emitInstanceCall2Opt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kInstanceCall2Opt, ra, rd));
|
||||
}
|
||||
|
||||
void emitPushPolymorphicInstanceCall(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kPushPolymorphicInstanceCall, ra, rd));
|
||||
}
|
||||
|
||||
void emitPushPolymorphicInstanceCallByRange(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kPushPolymorphicInstanceCallByRange, ra, rd));
|
||||
}
|
||||
|
||||
void emitNativeCall(int rd) {
|
||||
emitWord(_encodeD(Opcode.kNativeCall, rd));
|
||||
}
|
||||
|
||||
void emitOneByteStringFromCharCode(int ra, int rx) {
|
||||
emitWord(_encodeAX(Opcode.kOneByteStringFromCharCode, ra, rx));
|
||||
}
|
||||
|
||||
void emitStringToCharCode(int ra, int rx) {
|
||||
emitWord(_encodeAX(Opcode.kStringToCharCode, ra, rx));
|
||||
}
|
||||
|
||||
void emitAddTOS() {
|
||||
emitWord(_encode0(Opcode.kAddTOS));
|
||||
}
|
||||
|
||||
void emitSubTOS() {
|
||||
emitWord(_encode0(Opcode.kSubTOS));
|
||||
}
|
||||
|
||||
void emitMulTOS() {
|
||||
emitWord(_encode0(Opcode.kMulTOS));
|
||||
}
|
||||
|
||||
void emitBitOrTOS() {
|
||||
emitWord(_encode0(Opcode.kBitOrTOS));
|
||||
}
|
||||
|
||||
void emitBitAndTOS() {
|
||||
emitWord(_encode0(Opcode.kBitAndTOS));
|
||||
}
|
||||
|
||||
void emitEqualTOS() {
|
||||
emitWord(_encode0(Opcode.kEqualTOS));
|
||||
}
|
||||
|
||||
void emitLessThanTOS() {
|
||||
emitWord(_encode0(Opcode.kLessThanTOS));
|
||||
}
|
||||
|
||||
void emitGreaterThanTOS() {
|
||||
emitWord(_encode0(Opcode.kGreaterThanTOS));
|
||||
}
|
||||
|
||||
void emitSmiAddTOS() {
|
||||
emitWord(_encode0(Opcode.kSmiAddTOS));
|
||||
}
|
||||
|
||||
void emitSmiSubTOS() {
|
||||
emitWord(_encode0(Opcode.kSmiSubTOS));
|
||||
}
|
||||
|
||||
void emitSmiMulTOS() {
|
||||
emitWord(_encode0(Opcode.kSmiMulTOS));
|
||||
}
|
||||
|
||||
void emitSmiBitAndTOS() {
|
||||
emitWord(_encode0(Opcode.kSmiBitAndTOS));
|
||||
}
|
||||
|
||||
void emitAdd(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kAdd, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitSub(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kSub, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitMul(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kMul, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDiv(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDiv, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitMod(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kMod, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitShl(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kShl, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitShr(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kShr, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitShlImm(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kShlImm, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitNeg(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kNeg, ra, rd));
|
||||
}
|
||||
|
||||
void emitBitOr(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kBitOr, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitBitAnd(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kBitAnd, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitBitXor(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kBitXor, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitBitNot(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kBitNot, ra, rd));
|
||||
}
|
||||
|
||||
void emitMin(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kMin, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitMax(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kMax, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitWriteIntoDouble(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kWriteIntoDouble, ra, rd));
|
||||
}
|
||||
|
||||
void emitUnboxDouble(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kUnboxDouble, ra, rd));
|
||||
}
|
||||
|
||||
void emitCheckedUnboxDouble(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kCheckedUnboxDouble, ra, rd));
|
||||
}
|
||||
|
||||
void emitUnboxInt32(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kUnboxInt32, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitBoxInt32(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kBoxInt32, ra, rd));
|
||||
}
|
||||
|
||||
void emitBoxUint32(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kBoxUint32, ra, rd));
|
||||
}
|
||||
|
||||
void emitSmiToDouble(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kSmiToDouble, ra, rd));
|
||||
}
|
||||
|
||||
void emitDoubleToSmi(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDoubleToSmi, ra, rd));
|
||||
}
|
||||
|
||||
void emitDAdd(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDAdd, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDSub(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDSub, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDMul(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDMul, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDDiv(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDDiv, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDNeg(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDNeg, ra, rd));
|
||||
}
|
||||
|
||||
void emitDSqrt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDSqrt, ra, rd));
|
||||
}
|
||||
|
||||
void emitDMin(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDMin, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDMax(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDMax, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDCos(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDCos, ra, rd));
|
||||
}
|
||||
|
||||
void emitDSin(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDSin, ra, rd));
|
||||
}
|
||||
|
||||
void emitDPow(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDPow, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDMod(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kDMod, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitDTruncate(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDTruncate, ra, rd));
|
||||
}
|
||||
|
||||
void emitDFloor(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDFloor, ra, rd));
|
||||
}
|
||||
|
||||
void emitDCeil(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDCeil, ra, rd));
|
||||
}
|
||||
|
||||
void emitDoubleToFloat(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDoubleToFloat, ra, rd));
|
||||
}
|
||||
|
||||
void emitFloatToDouble(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kFloatToDouble, ra, rd));
|
||||
}
|
||||
|
||||
void emitDoubleIsNaN(int ra) {
|
||||
emitWord(_encodeA(Opcode.kDoubleIsNaN, ra));
|
||||
}
|
||||
|
||||
void emitDoubleIsInfinite(int ra) {
|
||||
emitWord(_encodeA(Opcode.kDoubleIsInfinite, ra));
|
||||
}
|
||||
|
||||
void emitStoreStaticTOS(int rd) {
|
||||
emitWord(_encodeD(Opcode.kStoreStaticTOS, rd));
|
||||
}
|
||||
@@ -533,130 +251,10 @@ class BytecodeAssembler {
|
||||
emitWord(_encodeD(Opcode.kPushStatic, rd));
|
||||
}
|
||||
|
||||
void emitInitStaticTOS() {
|
||||
emitWord(_encode0(Opcode.kInitStaticTOS));
|
||||
}
|
||||
|
||||
void emitIfNeStrictTOS() {
|
||||
emitWord(_encode0(Opcode.kIfNeStrictTOS));
|
||||
}
|
||||
|
||||
void emitIfEqStrictTOS() {
|
||||
emitWord(_encode0(Opcode.kIfEqStrictTOS));
|
||||
}
|
||||
|
||||
void emitIfNeStrictNumTOS() {
|
||||
emitWord(_encode0(Opcode.kIfNeStrictNumTOS));
|
||||
}
|
||||
|
||||
void emitIfEqStrictNumTOS() {
|
||||
emitWord(_encode0(Opcode.kIfEqStrictNumTOS));
|
||||
}
|
||||
|
||||
void emitIfSmiLtTOS() {
|
||||
emitWord(_encode0(Opcode.kIfSmiLtTOS));
|
||||
}
|
||||
|
||||
void emitIfSmiLeTOS() {
|
||||
emitWord(_encode0(Opcode.kIfSmiLeTOS));
|
||||
}
|
||||
|
||||
void emitIfSmiGeTOS() {
|
||||
emitWord(_encode0(Opcode.kIfSmiGeTOS));
|
||||
}
|
||||
|
||||
void emitIfSmiGtTOS() {
|
||||
emitWord(_encode0(Opcode.kIfSmiGtTOS));
|
||||
}
|
||||
|
||||
void emitIfNeStrict(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfNeStrict, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfEqStrict(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfEqStrict, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfLe(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfLe, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfLt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfLt, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfGe(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfGe, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfGt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfGt, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfULe(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfULe, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfULt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfULt, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfUGe(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfUGe, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfUGt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfUGt, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfDNe(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfDNe, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfDEq(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfDEq, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfDLe(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfDLe, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfDLt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfDLt, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfDGe(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfDGe, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfDGt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfDGt, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfNeStrictNum(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfNeStrictNum, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfEqStrictNum(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kIfEqStrictNum, ra, rd));
|
||||
}
|
||||
|
||||
void emitIfEqNull(int ra) {
|
||||
emitWord(_encodeA(Opcode.kIfEqNull, ra));
|
||||
}
|
||||
|
||||
void emitIfNeNull(int ra) {
|
||||
emitWord(_encodeA(Opcode.kIfNeNull, ra));
|
||||
}
|
||||
|
||||
void emitCreateArrayTOS() {
|
||||
emitWord(_encode0(Opcode.kCreateArrayTOS));
|
||||
}
|
||||
|
||||
void emitCreateArrayOpt(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kCreateArrayOpt, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitAllocate(int rd) {
|
||||
emitWord(_encodeD(Opcode.kAllocate, rd));
|
||||
}
|
||||
@@ -665,154 +263,10 @@ class BytecodeAssembler {
|
||||
emitWord(_encode0(Opcode.kAllocateT));
|
||||
}
|
||||
|
||||
void emitAllocateOpt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kAllocateOpt, ra, rd));
|
||||
}
|
||||
|
||||
void emitAllocateTOpt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kAllocateTOpt, ra, rd));
|
||||
}
|
||||
|
||||
void emitStoreIndexedTOS() {
|
||||
emitWord(_encode0(Opcode.kStoreIndexedTOS));
|
||||
}
|
||||
|
||||
void emitStoreIndexed(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexed, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreIndexedUint8(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexedUint8, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreIndexedExternalUint8(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexedExternalUint8, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreIndexedOneByteString(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexedOneByteString, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreIndexedUint32(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexedUint32, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreIndexedFloat32(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexedFloat32, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreIndexed4Float32(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexed4Float32, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreIndexedFloat64(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexedFloat64, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreIndexed8Float64(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreIndexed8Float64, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitNoSuchMethod() {
|
||||
emitWord(_encode0(Opcode.kNoSuchMethod));
|
||||
}
|
||||
|
||||
void emitTailCall() {
|
||||
emitWord(_encode0(Opcode.kTailCall));
|
||||
}
|
||||
|
||||
void emitTailCallOpt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kTailCallOpt, ra, rd));
|
||||
}
|
||||
|
||||
void emitLoadArgDescriptor() {
|
||||
emitWord(_encode0(Opcode.kLoadArgDescriptor));
|
||||
}
|
||||
|
||||
void emitLoadArgDescriptorOpt(int ra) {
|
||||
emitWord(_encodeA(Opcode.kLoadArgDescriptorOpt, ra));
|
||||
}
|
||||
|
||||
void emitLoadFpRelativeSlot(int rx) {
|
||||
emitWord(_encodeX(Opcode.kLoadFpRelativeSlot, rx));
|
||||
}
|
||||
|
||||
void emitLoadFpRelativeSlotOpt(int ra, int rb, int ry) {
|
||||
emitWord(_encodeABY(Opcode.kLoadFpRelativeSlotOpt, ra, rb, ry));
|
||||
}
|
||||
|
||||
void emitStoreFpRelativeSlot(int rx) {
|
||||
emitWord(_encodeX(Opcode.kStoreFpRelativeSlot, rx));
|
||||
}
|
||||
|
||||
void emitStoreFpRelativeSlotOpt(int ra, int rb, int ry) {
|
||||
emitWord(_encodeABY(Opcode.kStoreFpRelativeSlotOpt, ra, rb, ry));
|
||||
}
|
||||
|
||||
void emitLoadIndexedTOS() {
|
||||
emitWord(_encode0(Opcode.kLoadIndexedTOS));
|
||||
}
|
||||
|
||||
void emitLoadIndexed(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexed, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedUint8(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedUint8, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedInt8(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedInt8, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedInt32(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedInt32, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedUint32(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedUint32, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedExternalUint8(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedExternalUint8, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedExternalInt8(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedExternalInt8, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedFloat32(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedFloat32, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexed4Float32(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexed4Float32, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedFloat64(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedFloat64, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexed8Float64(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexed8Float64, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedOneByteString(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedOneByteString, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadIndexedTwoByteString(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadIndexedTwoByteString, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreField(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kStoreField, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitStoreFieldExt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kStoreFieldExt, ra, rd));
|
||||
}
|
||||
|
||||
void emitStoreFieldTOS(int rd) {
|
||||
emitWord(_encodeD(Opcode.kStoreFieldTOS, rd));
|
||||
}
|
||||
@@ -825,18 +279,6 @@ class BytecodeAssembler {
|
||||
emitWord(_encodeD(Opcode.kStoreContextVar, rd));
|
||||
}
|
||||
|
||||
void emitLoadField(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadField, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadFieldExt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kLoadFieldExt, ra, rd));
|
||||
}
|
||||
|
||||
void emitLoadUntagged(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kLoadUntagged, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitLoadFieldTOS(int rd) {
|
||||
emitWord(_encodeD(Opcode.kLoadFieldTOS, rd));
|
||||
}
|
||||
@@ -857,10 +299,6 @@ class BytecodeAssembler {
|
||||
emitWord(_encode0(Opcode.kBooleanNegateTOS));
|
||||
}
|
||||
|
||||
void emitBooleanNegate(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kBooleanNegate, ra, rd));
|
||||
}
|
||||
|
||||
void emitThrow(int ra) {
|
||||
emitWord(_encodeA(Opcode.kThrow, ra));
|
||||
}
|
||||
@@ -869,10 +307,6 @@ class BytecodeAssembler {
|
||||
emitWord(_encodeD(Opcode.kEntry, rd));
|
||||
}
|
||||
|
||||
void emitEntryOptimized(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kEntryOptimized, ra, rd));
|
||||
}
|
||||
|
||||
void emitFrame(int rd) {
|
||||
emitWord(_encodeD(Opcode.kFrame, rd));
|
||||
}
|
||||
@@ -885,10 +319,6 @@ class BytecodeAssembler {
|
||||
emitWord(_encodeD(Opcode.kAllocateContext, rd));
|
||||
}
|
||||
|
||||
void emitAllocateUninitializedContext(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kAllocateUninitializedContext, ra, rd));
|
||||
}
|
||||
|
||||
void emitCloneContext() {
|
||||
emitWord(_encode0(Opcode.kCloneContext));
|
||||
}
|
||||
@@ -905,14 +335,6 @@ class BytecodeAssembler {
|
||||
emitWord(_encodeAD(Opcode.kInstantiateTypeArgumentsTOS, ra, rd));
|
||||
}
|
||||
|
||||
void emitInstanceOf() {
|
||||
emitWord(_encode0(Opcode.kInstanceOf));
|
||||
}
|
||||
|
||||
void emitBadTypeError() {
|
||||
emitWord(_encode0(Opcode.kBadTypeError));
|
||||
}
|
||||
|
||||
void emitAssertAssignable(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kAssertAssignable, ra, rd));
|
||||
}
|
||||
@@ -925,70 +347,14 @@ class BytecodeAssembler {
|
||||
emitWord(_encodeA(Opcode.kAssertBoolean, ra));
|
||||
}
|
||||
|
||||
void emitTestSmi(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kTestSmi, ra, rd));
|
||||
}
|
||||
|
||||
void emitTestCids(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kTestCids, ra, rd));
|
||||
}
|
||||
|
||||
void emitCheckSmi(int ra) {
|
||||
emitWord(_encodeA(Opcode.kCheckSmi, ra));
|
||||
}
|
||||
|
||||
void emitCheckEitherNonSmi(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kCheckEitherNonSmi, ra, rd));
|
||||
}
|
||||
|
||||
void emitCheckClassId(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kCheckClassId, ra, rd));
|
||||
}
|
||||
|
||||
void emitCheckClassIdRange(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kCheckClassIdRange, ra, rd));
|
||||
}
|
||||
|
||||
void emitCheckBitTest(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kCheckBitTest, ra, rd));
|
||||
}
|
||||
|
||||
void emitCheckCids(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kCheckCids, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitCheckCidsByRange(int ra, int rb, int rc) {
|
||||
emitWord(_encodeABC(Opcode.kCheckCidsByRange, ra, rb, rc));
|
||||
}
|
||||
|
||||
void emitCheckStack() {
|
||||
emitWord(_encode0(Opcode.kCheckStack));
|
||||
}
|
||||
|
||||
void emitCheckStackAlwaysExit() {
|
||||
emitWord(_encode0(Opcode.kCheckStackAlwaysExit));
|
||||
}
|
||||
|
||||
void emitCheckFunctionTypeArgs(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kCheckFunctionTypeArgs, ra, rd));
|
||||
}
|
||||
|
||||
void emitDebugStep() {
|
||||
emitWord(_encode0(Opcode.kDebugStep));
|
||||
}
|
||||
|
||||
void emitDebugBreak(int ra) {
|
||||
emitWord(_encodeA(Opcode.kDebugBreak, ra));
|
||||
}
|
||||
|
||||
void emitDeopt(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kDeopt, ra, rd));
|
||||
}
|
||||
|
||||
void emitDeoptRewind() {
|
||||
emitWord(_encode0(Opcode.kDeoptRewind));
|
||||
}
|
||||
|
||||
void emitEntryFixed(int ra, int rd) {
|
||||
emitWord(_encodeAD(Opcode.kEntryFixed, ra, rd));
|
||||
}
|
||||
|
||||
+131
-633
@@ -2,65 +2,58 @@
|
||||
// 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;
|
||||
/// Dart kernel bytecode instructions (described in runtime/vm/constants_kbc.h).
|
||||
|
||||
// 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.
|
||||
//
|
||||
// 14. AssertAssignable is modified to expect arguments in same order as runtime
|
||||
// call: instance, type, instantiator type args, function type args, name.
|
||||
//
|
||||
// 15. JumpIfEqStrict, JumpIfNeStrict, JumpIfTrue, JumpIfFalse,
|
||||
// JumpIfNull, JumpIfNotNull instructions added.
|
||||
//
|
||||
library vm.bytecode.dbc;
|
||||
|
||||
enum Opcode {
|
||||
kTrap,
|
||||
kNop,
|
||||
kCompile,
|
||||
kHotCheck,
|
||||
kIntrinsic,
|
||||
|
||||
// Prologue and stack management.
|
||||
kEntry,
|
||||
kEntryFixed,
|
||||
kEntryOptional,
|
||||
kLoadConstant,
|
||||
kFrame,
|
||||
kCheckFunctionTypeArgs,
|
||||
kCheckStack,
|
||||
|
||||
// Object allocation.
|
||||
kAllocate,
|
||||
kAllocateT,
|
||||
kCreateArrayTOS,
|
||||
|
||||
// Context allocation and access.
|
||||
kAllocateContext,
|
||||
kCloneContext,
|
||||
kLoadContextParent,
|
||||
kStoreContextParent,
|
||||
kLoadContextVar,
|
||||
kStoreContextVar,
|
||||
|
||||
// Constants.
|
||||
kPushConstant,
|
||||
kPushNull,
|
||||
kPushTrue,
|
||||
kPushFalse,
|
||||
kPushInt,
|
||||
|
||||
// Locals and expression stack.
|
||||
kDrop1,
|
||||
kDropR,
|
||||
kDrop,
|
||||
kPush,
|
||||
kPopLocal,
|
||||
kStoreLocal,
|
||||
|
||||
// Instance fields and arrays.
|
||||
kLoadFieldTOS,
|
||||
kStoreFieldTOS,
|
||||
kStoreIndexedTOS,
|
||||
|
||||
// Static fields.
|
||||
kPushStatic,
|
||||
kStoreStaticTOS,
|
||||
|
||||
// Jumps.
|
||||
kJump,
|
||||
kJumpIfNoAsserts,
|
||||
kJumpIfNotZeroTypeArgs,
|
||||
@@ -70,203 +63,28 @@ enum Opcode {
|
||||
kJumpIfFalse,
|
||||
kJumpIfNull,
|
||||
kJumpIfNotNull,
|
||||
kReturn,
|
||||
kReturnTOS,
|
||||
kMove,
|
||||
kSwap,
|
||||
kPush,
|
||||
kLoadConstant,
|
||||
kLoadClassId,
|
||||
kLoadClassIdTOS,
|
||||
kPushConstant,
|
||||
kPushNull,
|
||||
kPushTrue,
|
||||
kPushFalse,
|
||||
kPushInt,
|
||||
kStoreLocal,
|
||||
kPopLocal,
|
||||
|
||||
// Calls.
|
||||
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,
|
||||
kReturnTOS,
|
||||
|
||||
// Types and type checks.
|
||||
kAssertAssignable,
|
||||
kAssertBoolean,
|
||||
kAssertSubtype,
|
||||
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,
|
||||
|
||||
// Exception handling.
|
||||
kThrow,
|
||||
kMoveSpecial,
|
||||
kSetFrame,
|
||||
|
||||
// Bool operations.
|
||||
kBooleanNegateTOS,
|
||||
}
|
||||
|
||||
enum Encoding {
|
||||
@@ -300,20 +118,66 @@ class Format {
|
||||
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(
|
||||
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.kIntrinsic: const Format(
|
||||
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
|
||||
Opcode.kEntryOptional: const Format(
|
||||
Encoding.kABC, const [Operand.imm, Operand.imm, Operand.imm]),
|
||||
Opcode.kLoadConstant: const Format(
|
||||
Encoding.kAD, const [Operand.reg, Operand.lit, Operand.none]),
|
||||
Opcode.kFrame: const Format(
|
||||
Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
|
||||
Opcode.kCheckFunctionTypeArgs: const Format(
|
||||
Encoding.kAD, const [Operand.imm, Operand.imm, Operand.none]),
|
||||
Opcode.kCheckStack: const Format(
|
||||
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
|
||||
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.kCreateArrayTOS: const Format(
|
||||
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
|
||||
Opcode.kAllocateContext: const Format(
|
||||
Encoding.kD, const [Operand.imm, Operand.none, Operand.none]),
|
||||
Opcode.kCloneContext: const Format(
|
||||
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
|
||||
Opcode.kLoadContextParent: const Format(
|
||||
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
|
||||
Opcode.kStoreContextParent: 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.kStoreContextVar: const Format(
|
||||
Encoding.kD, const [Operand.imm, 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.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.kPush: 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.kStoreLocal: const Format(
|
||||
Encoding.kX, const [Operand.xeg, Operand.none, Operand.none]),
|
||||
Opcode.kLoadFieldTOS: const Format(
|
||||
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
|
||||
Opcode.kStoreFieldTOS: const Format(
|
||||
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
|
||||
Opcode.kStoreIndexedTOS: const Format(
|
||||
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
|
||||
Opcode.kPushStatic: const Format(
|
||||
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
|
||||
Opcode.kStoreStaticTOS: const Format(
|
||||
Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
|
||||
Opcode.kJump: const Format(
|
||||
Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
|
||||
Opcode.kJumpIfNoAsserts: const Format(
|
||||
@@ -332,399 +196,33 @@ const Map<Opcode, Format> BytecodeFormats = const {
|
||||
Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
|
||||
Opcode.kJumpIfNotNull: 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(
|
||||
Opcode.kReturnTOS: const Format(
|
||||
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
|
||||
Opcode.kSubTOS: const Format(
|
||||
Opcode.kAssertAssignable: const Format(
|
||||
Encoding.kAD, const [Operand.imm, Operand.lit, Operand.none]),
|
||||
Opcode.kAssertBoolean: const Format(
|
||||
Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
|
||||
Opcode.kAssertSubtype: 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(
|
||||
Opcode.kThrow: 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(
|
||||
Opcode.kMoveSpecial: const Format(
|
||||
Encoding.kAD, const [Operand.reg, Operand.spe, Operand.none]),
|
||||
Opcode.kSetFrame: 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(
|
||||
Opcode.kBooleanNegateTOS: const Format(
|
||||
Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
|
||||
};
|
||||
|
||||
|
||||
@@ -128,18 +128,21 @@ static void FormatA_D(char* buf,
|
||||
Apply(&buf, &size, pc, op2, bc, "");
|
||||
}
|
||||
|
||||
static void FormatA_X(char* buf,
|
||||
intptr_t size,
|
||||
uword pc,
|
||||
uint32_t op,
|
||||
Fmt op1,
|
||||
Fmt op2,
|
||||
Fmt op3) {
|
||||
const int32_t a = (op & 0xFF00) >> 8;
|
||||
const int32_t bc = static_cast<int32_t>(op) >> 16;
|
||||
Apply(&buf, &size, pc, op1, a, ", ");
|
||||
Apply(&buf, &size, pc, op2, bc, "");
|
||||
}
|
||||
// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
|
||||
// remove it once bytecode instruction set is finalized.
|
||||
//
|
||||
// static void FormatA_X(char* buf,
|
||||
// intptr_t size,
|
||||
// uword pc,
|
||||
// uint32_t op,
|
||||
// Fmt op1,
|
||||
// Fmt op2,
|
||||
// Fmt op3) {
|
||||
// const int32_t a = (op & 0xFF00) >> 8;
|
||||
// const int32_t bc = static_cast<int32_t>(op) >> 16;
|
||||
// Apply(&buf, &size, pc, op1, a, ", ");
|
||||
// Apply(&buf, &size, pc, op2, bc, "");
|
||||
// }
|
||||
|
||||
static void FormatX(char* buf,
|
||||
intptr_t size,
|
||||
@@ -178,20 +181,23 @@ static void FormatA_B_C(char* buf,
|
||||
Apply(&buf, &size, pc, op3, c, "");
|
||||
}
|
||||
|
||||
static void FormatA_B_Y(char* buf,
|
||||
intptr_t size,
|
||||
uword pc,
|
||||
uint32_t op,
|
||||
Fmt op1,
|
||||
Fmt op2,
|
||||
Fmt op3) {
|
||||
const int32_t a = (op >> 8) & 0xFF;
|
||||
const int32_t b = (op >> 16) & 0xFF;
|
||||
const int32_t y = static_cast<int8_t>((op >> 24) & 0xFF);
|
||||
Apply(&buf, &size, pc, op1, a, ", ");
|
||||
Apply(&buf, &size, pc, op2, b, ", ");
|
||||
Apply(&buf, &size, pc, op3, y, "");
|
||||
}
|
||||
// TODO(alexmarkov) This format is currently unused. Restore it if needed, or
|
||||
// remove it once bytecode instruction set is finalized.
|
||||
//
|
||||
// static void FormatA_B_Y(char* buf,
|
||||
// intptr_t size,
|
||||
// uword pc,
|
||||
// uint32_t op,
|
||||
// Fmt op1,
|
||||
// Fmt op2,
|
||||
// Fmt op3) {
|
||||
// const int32_t a = (op >> 8) & 0xFF;
|
||||
// const int32_t b = (op >> 16) & 0xFF;
|
||||
// const int32_t y = static_cast<int8_t>((op >> 24) & 0xFF);
|
||||
// Apply(&buf, &size, pc, op1, a, ", ");
|
||||
// Apply(&buf, &size, pc, op2, b, ", ");
|
||||
// Apply(&buf, &size, pc, op3, y, "");
|
||||
// }
|
||||
|
||||
#define BYTECODE_FORMATTER(name, encoding, op1, op2, op3) \
|
||||
static void Format##name(char* buf, intptr_t size, uword pc, uint32_t op) { \
|
||||
@@ -210,11 +216,8 @@ static bool HasLoadFromPool(KBCInstr instr) {
|
||||
switch (KernelBytecode::DecodeOpcode(instr)) {
|
||||
case KernelBytecode::kLoadConstant:
|
||||
case KernelBytecode::kPushConstant:
|
||||
case KernelBytecode::kStaticCall:
|
||||
case KernelBytecode::kIndirectStaticCall:
|
||||
case KernelBytecode::kInstanceCall:
|
||||
case KernelBytecode::kInstanceCall1Opt:
|
||||
case KernelBytecode::kInstanceCall2Opt:
|
||||
case KernelBytecode::kStoreStaticTOS:
|
||||
case KernelBytecode::kPushStatic:
|
||||
case KernelBytecode::kAllocate:
|
||||
|
||||
+198
-850
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user