diff options
Diffstat (limited to 'runtime/dex_instruction.h')
| -rw-r--r-- | runtime/dex_instruction.h | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/runtime/dex_instruction.h b/runtime/dex_instruction.h index 89c3db6223..f437fdef1c 100644 --- a/runtime/dex_instruction.h +++ b/runtime/dex_instruction.h @@ -80,7 +80,7 @@ class Instruction { }; enum Code { // private marker to avoid generate-operator-out.py from processing. -#define INSTRUCTION_ENUM(opcode, cname, p, f, r, i, a, v) cname = (opcode), +#define INSTRUCTION_ENUM(opcode, cname, p, f, i, a, v) cname = (opcode), #include "dex_instruction_list.h" DEX_INSTRUCTION_LIST(INSTRUCTION_ENUM) #undef DEX_INSTRUCTION_LIST @@ -105,7 +105,6 @@ class Instruction { k22t, // op vA, vB, +CCCC k22s, // op vA, vB, #+CCCC k22c, // op vA, vB, thing@CCCC - k25x, // op vC, {vD, vE, vF, vG} (B: count) k32x, // op vAAAA, vBBBB k30t, // op +AAAAAAAA k31t, // op vAA, +BBBBBBBB @@ -113,6 +112,15 @@ class Instruction { k31c, // op vAA, thing@BBBBBBBB k35c, // op {vC, vD, vE, vF, vG}, thing@BBBB (B: count, A: vG) k3rc, // op {vCCCC .. v(CCCC+AA-1)}, meth@BBBB + + // op {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH (A: count) + // format: AG op BBBB FEDC HHHH + k45cc, + + // op {VCCCC .. v(CCCC+AA-1)}, meth@BBBB, proto@HHHH (AA: count) + // format: AA op BBBB CCCC HHHH + k4rcc, // op {VCCCC .. v(CCCC+AA-1)}, meth@BBBB, proto@HHHH (AA: count) + k51l, // op vAA, #+BBBBBBBBBBBBBBBB }; @@ -180,12 +188,9 @@ class Instruction { kVerifyVarArgRangeNonZero = 0x100000, kVerifyRuntimeOnly = 0x200000, kVerifyError = 0x400000, - kVerifyRegCString = 0x800000, }; static constexpr uint32_t kMaxVarArgRegs = 5; - static constexpr uint32_t kMaxVarArgRegs25x = 6; // lambdas are 2 registers. - static constexpr uint32_t kLambdaVirtualRegisterWidth = 2; // Returns the size (in 2 byte code units) of this instruction. size_t SizeInCodeUnits() const { @@ -221,7 +226,7 @@ class Instruction { // Returns a pointer to the instruction after this 2xx instruction in the stream. const Instruction* Next_2xx() const { - DCHECK(FormatOf(Opcode()) >= k20t && FormatOf(Opcode()) <= k25x); + DCHECK(FormatOf(Opcode()) >= k20t && FormatOf(Opcode()) <= k22c); return RelativeAt(2); } @@ -231,6 +236,12 @@ class Instruction { return RelativeAt(3); } + // Returns a pointer to the instruction after this 4xx instruction in the stream. + const Instruction* Next_4xx() const { + DCHECK(FormatOf(Opcode()) >= k45cc && FormatOf(Opcode()) <= k4rcc); + return RelativeAt(4); + } + // Returns a pointer to the instruction after this 51l instruction in the stream. const Instruction* Next_51l() const { DCHECK(FormatOf(Opcode()) == k51l); @@ -317,6 +328,12 @@ class Instruction { uint8_t VRegA_51l() const { return VRegA_51l(Fetch16(0)); } + uint4_t VRegA_45cc() const { + return VRegA_45cc(Fetch16(0)); + } + uint8_t VRegA_4rcc() const { + return VRegA_4rcc(Fetch16(0)); + } // The following methods return the vA operand for various instruction formats. The "inst_data" // parameter holds the first 16 bits of instruction which the returned value is decoded from. @@ -341,6 +358,8 @@ class Instruction { uint4_t VRegA_35c(uint16_t inst_data) const; uint8_t VRegA_3rc(uint16_t inst_data) const; uint8_t VRegA_51l(uint16_t inst_data) const; + uint4_t VRegA_45cc(uint16_t inst_data) const; + uint8_t VRegA_4rcc(uint16_t inst_data) const; // VRegB bool HasVRegB() const; @@ -371,7 +390,6 @@ class Instruction { } uint16_t VRegB_22x() const; uint8_t VRegB_23x() const; - uint4_t VRegB_25x() const; uint32_t VRegB_31c() const; int32_t VRegB_31i() const; int32_t VRegB_31t() const; @@ -379,6 +397,8 @@ class Instruction { uint16_t VRegB_35c() const; uint16_t VRegB_3rc() const; uint64_t VRegB_51l() const; // vB_wide + uint16_t VRegB_45cc() const; + uint16_t VRegB_4rcc() const; // The following methods return the vB operand for all instruction formats where it is encoded in // the first 16 bits of instruction. The "inst_data" parameter holds these 16 bits. The returned @@ -398,20 +418,24 @@ class Instruction { int16_t VRegC_22s() const; int16_t VRegC_22t() const; uint8_t VRegC_23x() const; - uint4_t VRegC_25x() const; uint4_t VRegC_35c() const; uint16_t VRegC_3rc() const; + uint4_t VRegC_45cc() const; + uint16_t VRegC_4rcc() const; - // Fills the given array with the 'arg' array of the instruction. - bool HasVarArgs35c() const; - bool HasVarArgs25x() const; - // TODO(iam): Make this name more consistent with GetAllArgs25x by including the opcode format. + // VRegH + bool HasVRegH() const; + int32_t VRegH() const; + uint16_t VRegH_45cc() const; + uint16_t VRegH_4rcc() const; + + // Fills the given array with the 'arg' array of the instruction. + bool HasVarArgs() const; void GetVarArgs(uint32_t args[kMaxVarArgRegs], uint16_t inst_data) const; void GetVarArgs(uint32_t args[kMaxVarArgRegs]) const { return GetVarArgs(args, Fetch16(0)); } - void GetAllArgs25x(uint32_t (&args)[kMaxVarArgRegs25x]) const; // Returns the opcode field of the instruction. The given "inst_data" parameter must be the first // 16 bits of instruction. @@ -539,7 +563,7 @@ class Instruction { int GetVerifyTypeArgumentC() const { return (kInstructionVerifyFlags[Opcode()] & (kVerifyRegC | kVerifyRegCField | - kVerifyRegCNewArray | kVerifyRegCType | kVerifyRegCWide | kVerifyRegCString)); + kVerifyRegCNewArray | kVerifyRegCType | kVerifyRegCWide)); } int GetVerifyExtraFlags() const { |