From 29a2648821ea4d0b5d3aecb9f835822fdfe6faa1 Mon Sep 17 00:00:00 2001 From: Ian Rogers Date: Fri, 2 May 2014 15:27:29 -0700 Subject: Move DecodedInstruction into MIR. Change-Id: I188dc7fef4f4033361c78daf2015b869242191c6 --- runtime/dex_instruction-inl.h | 156 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 155 insertions(+), 1 deletion(-) (limited to 'runtime/dex_instruction-inl.h') diff --git a/runtime/dex_instruction-inl.h b/runtime/dex_instruction-inl.h index 207b0b6795..ad9491fda6 100644 --- a/runtime/dex_instruction-inl.h +++ b/runtime/dex_instruction-inl.h @@ -24,6 +24,68 @@ namespace art { //------------------------------------------------------------------------------ // VRegA //------------------------------------------------------------------------------ +inline bool Instruction::HasVRegA() const { + switch (FormatOf(Opcode())) { + case k10t: return true; + case k10x: return true; + case k11n: return true; + case k11x: return true; + case k12x: return true; + case k20t: return true; + case k21c: return true; + case k21h: return true; + case k21s: return true; + case k21t: return true; + case k22b: return true; + case k22c: return true; + case k22s: return true; + case k22t: return true; + case k22x: return true; + case k23x: return true; + case k30t: return true; + case k31c: return true; + case k31i: return true; + case k31t: return true; + case k32x: return true; + case k35c: return true; + case k3rc: return true; + case k51l: return true; + default: return false; + } +} + +inline int32_t Instruction::VRegA() const { + switch (FormatOf(Opcode())) { + case k10t: return VRegA_10t(); + case k10x: return VRegA_10x(); + case k11n: return VRegA_11n(); + case k11x: return VRegA_11x(); + case k12x: return VRegA_12x(); + case k20t: return VRegA_20t(); + case k21c: return VRegA_21c(); + case k21h: return VRegA_21h(); + case k21s: return VRegA_21s(); + case k21t: return VRegA_21t(); + case k22b: return VRegA_22b(); + case k22c: return VRegA_22c(); + case k22s: return VRegA_22s(); + case k22t: return VRegA_22t(); + case k22x: return VRegA_22x(); + case k23x: return VRegA_23x(); + case k30t: return VRegA_30t(); + case k31c: return VRegA_31c(); + case k31i: return VRegA_31i(); + case k31t: return VRegA_31t(); + case k32x: return VRegA_32x(); + case k35c: return VRegA_35c(); + case k3rc: return VRegA_3rc(); + case k51l: return VRegA_51l(); + default: + LOG(FATAL) << "Tried to access vA of instruction " << Name() << " which has no A operand."; + exit(EXIT_FAILURE); + } +} + inline int8_t Instruction::VRegA_10t(uint16_t inst_data) const { DCHECK_EQ(FormatOf(Opcode()), k10t); return static_cast(InstAA(inst_data)); @@ -147,6 +209,66 @@ inline uint8_t Instruction::VRegA_51l(uint16_t inst_data) const { //------------------------------------------------------------------------------ // VRegB //------------------------------------------------------------------------------ +inline bool Instruction::HasVRegB() const { + switch (FormatOf(Opcode())) { + case k11n: return true; + case k12x: return true; + case k21c: return true; + case k21h: return true; + case k21s: return true; + case k21t: return true; + case k22b: return true; + case k22c: return true; + case k22s: return true; + case k22t: return true; + case k22x: return true; + case k23x: return true; + case k31c: return true; + case k31i: return true; + case k31t: return true; + case k32x: return true; + case k35c: return true; + case k3rc: return true; + case k51l: return true; + default: return false; + } +} + +inline bool Instruction::HasWideVRegB() const { + return FormatOf(Opcode()) == k51l; +} + +inline int32_t Instruction::VRegB() const { + switch (FormatOf(Opcode())) { + case k11n: return VRegB_11n(); + case k12x: return VRegB_12x(); + case k21c: return VRegB_21c(); + case k21h: return VRegB_21h(); + case k21s: return VRegB_21s(); + case k21t: return VRegB_21t(); + case k22b: return VRegB_22b(); + case k22c: return VRegB_22c(); + case k22s: return VRegB_22s(); + case k22t: return VRegB_22t(); + case k22x: return VRegB_22x(); + case k23x: return VRegB_23x(); + case k31c: return VRegB_31c(); + case k31i: return VRegB_31i(); + case k31t: return VRegB_31t(); + case k32x: return VRegB_32x(); + case k35c: return VRegB_35c(); + case k3rc: return VRegB_3rc(); + case k51l: return VRegB_51l(); + default: + LOG(FATAL) << "Tried to access vB of instruction " << Name() << " which has no B operand."; + exit(EXIT_FAILURE); + } +} + +inline uint64_t Instruction::WideVRegB() const { + return VRegB_51l(); +} + inline int4_t Instruction::VRegB_11n(uint16_t inst_data) const { DCHECK_EQ(FormatOf(Opcode()), k11n); return static_cast((InstB(inst_data) << 28) >> 28); @@ -246,6 +368,34 @@ inline uint64_t Instruction::VRegB_51l() const { //------------------------------------------------------------------------------ // VRegC //------------------------------------------------------------------------------ +inline bool Instruction::HasVRegC() const { + switch (FormatOf(Opcode())) { + case k22b: return true; + case k22c: return true; + case k22s: return true; + case k22t: return true; + case k23x: return true; + case k35c: return true; + case k3rc: return true; + default: return false; + } +} + +inline int32_t Instruction::VRegC() const { + switch (FormatOf(Opcode())) { + case k22b: return VRegC_22b(); + case k22c: return VRegC_22c(); + case k22s: return VRegC_22s(); + case k22t: return VRegC_22t(); + case k23x: return VRegC_23x(); + case k35c: return VRegC_35c(); + case k3rc: return VRegC_3rc(); + default: + LOG(FATAL) << "Tried to access vC of instruction " << Name() << " which has no C operand."; + exit(EXIT_FAILURE); + } +} + inline int8_t Instruction::VRegC_22b() const { DCHECK_EQ(FormatOf(Opcode()), k22b); return static_cast(Fetch16(1) >> 8); @@ -281,7 +431,11 @@ inline uint16_t Instruction::VRegC_3rc() const { return Fetch16(2); } -inline void Instruction::GetArgs(uint32_t arg[5], uint16_t inst_data) const { +inline bool Instruction::HasVarArgs() const { + return FormatOf(Opcode()) == k35c; +} + +inline void Instruction::GetVarArgs(uint32_t arg[5], uint16_t inst_data) const { DCHECK_EQ(FormatOf(Opcode()), k35c); /* -- cgit v1.2.3