[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:
Alexander Markov
2018-09-28 21:23:22 +00:00
committed by commit-bot@chromium.org
parent ccf2366398
commit deb0645654
5 changed files with 375 additions and 4396 deletions
+14 -648
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff