diff options
-rw-r--r-- | dexlayout/dex_ir_builder.cc | 1 | ||||
-rw-r--r-- | libdexfile/dex/dex_instruction-inl.h | 77 | ||||
-rw-r--r-- | libdexfile/dex/dex_instruction.cc | 1 | ||||
-rw-r--r-- | libdexfile/dex/dex_instruction.h | 8 | ||||
-rw-r--r-- | runtime/interpreter/interpreter_switch_impl-inl.h | 642 |
5 files changed, 377 insertions, 352 deletions
diff --git a/dexlayout/dex_ir_builder.cc b/dexlayout/dex_ir_builder.cc index f4195b257d..5636e2c1f5 100644 --- a/dexlayout/dex_ir_builder.cc +++ b/dexlayout/dex_ir_builder.cc @@ -25,6 +25,7 @@ #include "dex/class_accessor-inl.h" #include "dex/code_item_accessors-inl.h" #include "dex/dex_file_exception_helpers.h" +#include "dex/dex_instruction-inl.h" #include "dexlayout.h" namespace art { diff --git a/libdexfile/dex/dex_instruction-inl.h b/libdexfile/dex/dex_instruction-inl.h index e0cffdd2f4..88e93811f1 100644 --- a/libdexfile/dex/dex_instruction-inl.h +++ b/libdexfile/dex/dex_instruction-inl.h @@ -57,33 +57,38 @@ inline bool Instruction::HasVRegA() const { } 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(); + return VRegA(FormatOf(Opcode()), Fetch16(0)); +} + +inline int32_t Instruction::VRegA(Format format, uint16_t inst_data) const { + DCHECK_EQ(format, FormatOf(Opcode())); + switch (format) { + case k10t: return VRegA_10t(inst_data); + case k10x: return VRegA_10x(inst_data); + case k11n: return VRegA_11n(inst_data); + case k11x: return VRegA_11x(inst_data); + case k12x: return VRegA_12x(inst_data); 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 k21c: return VRegA_21c(inst_data); + case k21h: return VRegA_21h(inst_data); + case k21s: return VRegA_21s(inst_data); + case k21t: return VRegA_21t(inst_data); + case k22b: return VRegA_22b(inst_data); + case k22c: return VRegA_22c(inst_data); + case k22s: return VRegA_22s(inst_data); + case k22t: return VRegA_22t(inst_data); + case k22x: return VRegA_22x(inst_data); + case k23x: return VRegA_23x(inst_data); case k30t: return VRegA_30t(); - case k31c: return VRegA_31c(); - case k31i: return VRegA_31i(); - case k31t: return VRegA_31t(); + case k31c: return VRegA_31c(inst_data); + case k31i: return VRegA_31i(inst_data); + case k31t: return VRegA_31t(inst_data); case k32x: return VRegA_32x(); - case k35c: return VRegA_35c(); - case k3rc: return VRegA_3rc(); - case k45cc: return VRegA_45cc(); - case k4rcc: return VRegA_4rcc(); - case k51l: return VRegA_51l(); + case k35c: return VRegA_35c(inst_data); + case k3rc: return VRegA_3rc(inst_data); + case k45cc: return VRegA_45cc(inst_data); + case k4rcc: return VRegA_4rcc(inst_data); + case k51l: return VRegA_51l(inst_data); default: LOG(FATAL) << "Tried to access vA of instruction " << Name() << " which has no A operand."; exit(EXIT_FAILURE); @@ -255,17 +260,22 @@ inline bool Instruction::HasWideVRegB() const { } inline int32_t Instruction::VRegB() const { - switch (FormatOf(Opcode())) { - case k11n: return VRegB_11n(); - case k12x: return VRegB_12x(); + return VRegB(FormatOf(Opcode()), Fetch16(0)); +} + +inline int32_t Instruction::VRegB(Format format, uint16_t inst_data) const { + DCHECK_EQ(format, FormatOf(Opcode())); + switch (format) { + case k11n: return VRegB_11n(inst_data); + case k12x: return VRegB_12x(inst_data); 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 k22c: return VRegB_22c(inst_data); + case k22s: return VRegB_22s(inst_data); + case k22t: return VRegB_22t(inst_data); case k22x: return VRegB_22x(); case k23x: return VRegB_23x(); case k31c: return VRegB_31c(); @@ -412,7 +422,12 @@ inline bool Instruction::HasVRegC() const { } inline int32_t Instruction::VRegC() const { - switch (FormatOf(Opcode())) { + return VRegC(FormatOf(Opcode())); +} + +inline int32_t Instruction::VRegC(Format format) const { + DCHECK_EQ(format, FormatOf(Opcode())); + switch (format) { case k22b: return VRegC_22b(); case k22c: return VRegC_22c(); case k22s: return VRegC_22s(); diff --git a/libdexfile/dex/dex_instruction.cc b/libdexfile/dex/dex_instruction.cc index f36a2aa29e..37fc455f81 100644 --- a/libdexfile/dex/dex_instruction.cc +++ b/libdexfile/dex/dex_instruction.cc @@ -510,6 +510,7 @@ std::string Instruction::DumpString(const DexFile* file) const { } break; case k51l: os << StringPrintf("%s v%d, #%+" PRId64, opcode, VRegA_51l(), VRegB_51l()); break; + case kInvalidFormat: os << "<invalid-opcode-format>"; } return os.str(); } diff --git a/libdexfile/dex/dex_instruction.h b/libdexfile/dex/dex_instruction.h index 4b389043d7..a78330181f 100644 --- a/libdexfile/dex/dex_instruction.h +++ b/libdexfile/dex/dex_instruction.h @@ -123,6 +123,7 @@ class Instruction { k4rcc, // op {VCCCC .. v(CCCC+AA-1)}, meth@BBBB, proto@HHHH (AA: count) k51l, // op vAA, #+BBBBBBBBBBBBBBBB + kInvalidFormat, }; enum IndexType : uint8_t { @@ -291,6 +292,7 @@ class Instruction { // VRegA bool HasVRegA() const; ALWAYS_INLINE int32_t VRegA() const; + ALWAYS_INLINE int32_t VRegA(Format format, uint16_t inst_data) const; int8_t VRegA_10t() const { return VRegA_10t(Fetch16(0)); @@ -393,7 +395,8 @@ class Instruction { // VRegB bool HasVRegB() const; - int32_t VRegB() const; + ALWAYS_INLINE int32_t VRegB() const; + ALWAYS_INLINE int32_t VRegB(Format format, uint16_t inst_data) const; bool HasWideVRegB() const; uint64_t WideVRegB() const; @@ -441,7 +444,8 @@ class Instruction { // VRegC bool HasVRegC() const; - int32_t VRegC() const; + ALWAYS_INLINE int32_t VRegC() const; + ALWAYS_INLINE int32_t VRegC(Format format) const; int8_t VRegC_22b() const; uint16_t VRegC_22c() const; diff --git a/runtime/interpreter/interpreter_switch_impl-inl.h b/runtime/interpreter/interpreter_switch_impl-inl.h index 1a88f1b47d..7553527d17 100644 --- a/runtime/interpreter/interpreter_switch_impl-inl.h +++ b/runtime/interpreter/interpreter_switch_impl-inl.h @@ -46,7 +46,7 @@ namespace interpreter { // Helper methods may return boolean value - in which case 'false' always means // "stop executing current opcode" (which does not necessarily exit the interpreter loop). // -template<bool do_access_check, bool transaction_active> +template<bool do_access_check, bool transaction_active, Instruction::Format kFormat> class InstructionHandler { public: ALWAYS_INLINE WARN_UNUSED bool CheckForceReturn() @@ -110,7 +110,7 @@ class InstructionHandler { // address even in the handler copy. Make a copy of them just for the call as well. const Instruction* inst_copy = inst; bool exit_loop_copy = exit_interpreter_loop; - InstructionHandler<do_access_check, transaction_active> handler_copy( + InstructionHandler<do_access_check, transaction_active, kFormat> handler_copy( ctx, instrumentation, self, shadow_frame, dex_pc, inst_copy, inst_data, exit_loop_copy); bool result = handler_copy.HandlePendingExceptionWithInstrumentationImpl(instr); inst = inst_copy; @@ -357,78 +357,78 @@ class InstructionHandler { } ALWAYS_INLINE void MOVE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_12x(inst_data), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void MOVE_FROM16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22x(inst_data), - shadow_frame.GetVReg(inst->VRegB_22x())); + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B())); inst = inst->Next_2xx(); } ALWAYS_INLINE void MOVE_16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_32x(), - shadow_frame.GetVReg(inst->VRegB_32x())); + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B())); inst = inst->Next_3xx(); } ALWAYS_INLINE void MOVE_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void MOVE_WIDE_FROM16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_22x())); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVRegLong(B())); inst = inst->Next_2xx(); } ALWAYS_INLINE void MOVE_WIDE_16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_32x(), - shadow_frame.GetVRegLong(inst->VRegB_32x())); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVRegLong(B())); inst = inst->Next_3xx(); } ALWAYS_INLINE void MOVE_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data), - shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegReference(A(), + shadow_frame.GetVRegReference(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void MOVE_OBJECT_FROM16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data), - shadow_frame.GetVRegReference(inst->VRegB_22x())); + shadow_frame.SetVRegReference(A(), + shadow_frame.GetVRegReference(B())); inst = inst->Next_2xx(); } ALWAYS_INLINE void MOVE_OBJECT_16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegReference(inst->VRegA_32x(), - shadow_frame.GetVRegReference(inst->VRegB_32x())); + shadow_frame.SetVRegReference(A(), + shadow_frame.GetVRegReference(B())); inst = inst->Next_3xx(); } ALWAYS_INLINE void MOVE_RESULT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_11x(inst_data), ResultRegister()->GetI()); + shadow_frame.SetVReg(A(), ResultRegister()->GetI()); inst = inst->Next_1xx(); } ALWAYS_INLINE void MOVE_RESULT_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), ResultRegister()->GetJ()); + shadow_frame.SetVRegLong(A(), ResultRegister()->GetJ()); inst = inst->Next_1xx(); } ALWAYS_INLINE void MOVE_RESULT_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), ResultRegister()->GetL()); + shadow_frame.SetVRegReference(A(), ResultRegister()->GetL()); inst = inst->Next_1xx(); } ALWAYS_INLINE void MOVE_EXCEPTION() REQUIRES_SHARED(Locks::mutator_lock_) { ObjPtr<mirror::Throwable> exception = self->GetException(); DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction"; - shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception); + shadow_frame.SetVRegReference(A(), exception); self->ClearException(); inst = inst->Next_1xx(); } @@ -489,7 +489,7 @@ class InstructionHandler { ALWAYS_INLINE void RETURN() REQUIRES_SHARED(Locks::mutator_lock_) { JValue result; result.SetJ(0); - result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data))); + result.SetI(shadow_frame.GetVReg(A())); self->AllowThreadSuspension(); if (!HandleMonitorChecks()) { return; @@ -516,7 +516,7 @@ class InstructionHandler { ALWAYS_INLINE void RETURN_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) { JValue result; - result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data))); + result.SetJ(shadow_frame.GetVRegLong(A())); self->AllowThreadSuspension(); if (!HandleMonitorChecks()) { return; @@ -631,22 +631,22 @@ class InstructionHandler { } ALWAYS_INLINE void CONST_WIDE_16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); + shadow_frame.SetVRegLong(A(), inst->VRegB_21s()); inst = inst->Next_2xx(); } ALWAYS_INLINE void CONST_WIDE_32() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); + shadow_frame.SetVRegLong(A(), inst->VRegB_31i()); inst = inst->Next_3xx(); } ALWAYS_INLINE void CONST_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); + shadow_frame.SetVRegLong(A(), inst->VRegB_51l()); inst = inst->Next_51l(); } ALWAYS_INLINE void CONST_WIDE_HIGH16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), + shadow_frame.SetVRegLong(A(), static_cast<uint64_t>(inst->VRegB_21h()) << 48); inst = inst->Next_2xx(); } @@ -658,7 +658,7 @@ class InstructionHandler { if (UNLIKELY(s == nullptr)) { HANDLE_PENDING_EXCEPTION(); } else { - shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s); + shadow_frame.SetVRegReference(A(), s); inst = inst->Next_2xx(); } } @@ -670,7 +670,7 @@ class InstructionHandler { if (UNLIKELY(s == nullptr)) { HANDLE_PENDING_EXCEPTION(); } else { - shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s); + shadow_frame.SetVRegReference(A(), s); inst = inst->Next_3xx(); } } @@ -684,7 +684,7 @@ class InstructionHandler { if (UNLIKELY(c == nullptr)) { HANDLE_PENDING_EXCEPTION(); } else { - shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c); + shadow_frame.SetVRegReference(A(), c); inst = inst->Next_2xx(); } } @@ -697,7 +697,7 @@ class InstructionHandler { if (UNLIKELY(mh == nullptr)) { HANDLE_PENDING_EXCEPTION(); } else { - shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), mh); + shadow_frame.SetVRegReference(A(), mh); inst = inst->Next_2xx(); } } @@ -710,7 +710,7 @@ class InstructionHandler { if (UNLIKELY(mt == nullptr)) { HANDLE_PENDING_EXCEPTION(); } else { - shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), mt); + shadow_frame.SetVRegReference(A(), mt); inst = inst->Next_2xx(); } } @@ -719,7 +719,7 @@ class InstructionHandler { if (!HandleAsyncException()) { return; } - ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); + ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(A()); if (UNLIKELY(obj == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); @@ -733,7 +733,7 @@ class InstructionHandler { if (!HandleAsyncException()) { return; } - ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); + ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(A()); if (UNLIKELY(obj == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); @@ -752,7 +752,7 @@ class InstructionHandler { if (UNLIKELY(c == nullptr)) { HANDLE_PENDING_EXCEPTION(); } else { - ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); + ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(A()); if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) { ThrowClassCastException(c, obj->GetClass()); HANDLE_PENDING_EXCEPTION(); @@ -771,20 +771,20 @@ class InstructionHandler { if (UNLIKELY(c == nullptr)) { HANDLE_PENDING_EXCEPTION(); } else { - ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); - shadow_frame.SetVReg(inst->VRegA_22c(inst_data), + ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(B()); + shadow_frame.SetVReg(A(), (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0); inst = inst->Next_2xx(); } } ALWAYS_INLINE void ARRAY_LENGTH() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); + ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(B()); if (UNLIKELY(array == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } else { - shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); + shadow_frame.SetVReg(A(), array->AsArray()->GetLength()); inst = inst->Next_1xx(); } } @@ -815,13 +815,13 @@ class InstructionHandler { obj->PrettyTypeOf().c_str()); HANDLE_PENDING_EXCEPTION(); } - shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj); + shadow_frame.SetVRegReference(A(), obj); inst = inst->Next_2xx(); } } ALWAYS_INLINE void NEW_ARRAY() REQUIRES_SHARED(Locks::mutator_lock_) { - int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); + int32_t length = shadow_frame.GetVReg(B()); ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check>( dex::TypeIndex(inst->VRegC_22c()), length, @@ -831,7 +831,7 @@ class InstructionHandler { if (UNLIKELY(obj == nullptr)) { HANDLE_PENDING_EXCEPTION(); } else { - shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj); + shadow_frame.SetVRegReference(A(), obj); inst = inst->Next_2xx(); } } @@ -854,7 +854,7 @@ class InstructionHandler { const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); const Instruction::ArrayDataPayload* payload = reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); - ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); + ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(A()); bool success = FillArrayData(obj, payload); if (!success) { HANDLE_PENDING_EXCEPTION(); @@ -870,7 +870,7 @@ class InstructionHandler { return; } ObjPtr<mirror::Object> exception = - shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); + shadow_frame.GetVRegReference(A()); if (UNLIKELY(exception == nullptr)) { ThrowNullPointerException("throw with null exception"); } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { @@ -934,8 +934,8 @@ class InstructionHandler { ALWAYS_INLINE void CMPL_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); - float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); + float val1 = shadow_frame.GetVRegFloat(B()); + float val2 = shadow_frame.GetVRegFloat(C()); int32_t result; if (val1 > val2) { result = 1; @@ -944,13 +944,13 @@ class InstructionHandler { } else { result = -1; } - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); + shadow_frame.SetVReg(A(), result); inst = inst->Next_2xx(); } ALWAYS_INLINE void CMPG_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); - float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); + float val1 = shadow_frame.GetVRegFloat(B()); + float val2 = shadow_frame.GetVRegFloat(C()); int32_t result; if (val1 < val2) { result = -1; @@ -959,13 +959,13 @@ class InstructionHandler { } else { result = 1; } - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); + shadow_frame.SetVReg(A(), result); inst = inst->Next_2xx(); } ALWAYS_INLINE void CMPL_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); - double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); + double val1 = shadow_frame.GetVRegDouble(B()); + double val2 = shadow_frame.GetVRegDouble(C()); int32_t result; if (val1 > val2) { result = 1; @@ -974,14 +974,14 @@ class InstructionHandler { } else { result = -1; } - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); + shadow_frame.SetVReg(A(), result); inst = inst->Next_2xx(); } ALWAYS_INLINE void CMPG_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); - double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); + double val1 = shadow_frame.GetVRegDouble(B()); + double val2 = shadow_frame.GetVRegDouble(C()); int32_t result; if (val1 < val2) { result = -1; @@ -990,7 +990,7 @@ class InstructionHandler { } else { result = 1; } - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); + shadow_frame.SetVReg(A(), result); inst = inst->Next_2xx(); } @@ -998,8 +998,8 @@ class InstructionHandler { ALWAYS_INLINE void CMP_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); - int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); + int64_t val1 = shadow_frame.GetVRegLong(B()); + int64_t val2 = shadow_frame.GetVRegLong(C()); int32_t result; if (val1 > val2) { result = 1; @@ -1008,13 +1008,13 @@ class InstructionHandler { } else { result = -1; } - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); + shadow_frame.SetVReg(A(), result); inst = inst->Next_2xx(); } ALWAYS_INLINE void IF_EQ() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == - shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { + if (shadow_frame.GetVReg(A()) == + shadow_frame.GetVReg(B())) { int16_t offset = inst->VRegC_22t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1026,8 +1026,8 @@ class InstructionHandler { } ALWAYS_INLINE void IF_NE() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != - shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { + if (shadow_frame.GetVReg(A()) != + shadow_frame.GetVReg(B())) { int16_t offset = inst->VRegC_22t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1039,8 +1039,8 @@ class InstructionHandler { } ALWAYS_INLINE void IF_LT() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < - shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { + if (shadow_frame.GetVReg(A()) < + shadow_frame.GetVReg(B())) { int16_t offset = inst->VRegC_22t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1052,8 +1052,8 @@ class InstructionHandler { } ALWAYS_INLINE void IF_GE() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= - shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { + if (shadow_frame.GetVReg(A()) >= + shadow_frame.GetVReg(B())) { int16_t offset = inst->VRegC_22t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1065,8 +1065,8 @@ class InstructionHandler { } ALWAYS_INLINE void IF_GT() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > - shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { + if (shadow_frame.GetVReg(A()) > + shadow_frame.GetVReg(B())) { int16_t offset = inst->VRegC_22t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1078,8 +1078,8 @@ class InstructionHandler { } ALWAYS_INLINE void IF_LE() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= - shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { + if (shadow_frame.GetVReg(A()) <= + shadow_frame.GetVReg(B())) { int16_t offset = inst->VRegC_22t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1091,7 +1091,7 @@ class InstructionHandler { } ALWAYS_INLINE void IF_EQZ() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { + if (shadow_frame.GetVReg(A()) == 0) { int16_t offset = inst->VRegB_21t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1103,7 +1103,7 @@ class InstructionHandler { } ALWAYS_INLINE void IF_NEZ() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { + if (shadow_frame.GetVReg(A()) != 0) { int16_t offset = inst->VRegB_21t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1115,7 +1115,7 @@ class InstructionHandler { } ALWAYS_INLINE void IF_LTZ() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { + if (shadow_frame.GetVReg(A()) < 0) { int16_t offset = inst->VRegB_21t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1127,7 +1127,7 @@ class InstructionHandler { } ALWAYS_INLINE void IF_GEZ() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { + if (shadow_frame.GetVReg(A()) >= 0) { int16_t offset = inst->VRegB_21t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1139,7 +1139,7 @@ class InstructionHandler { } ALWAYS_INLINE void IF_GTZ() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { + if (shadow_frame.GetVReg(A()) > 0) { int16_t offset = inst->VRegB_21t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1151,7 +1151,7 @@ class InstructionHandler { } ALWAYS_INLINE void IF_LEZ() REQUIRES_SHARED(Locks::mutator_lock_) { - if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { + if (shadow_frame.GetVReg(A()) <= 0) { int16_t offset = inst->VRegB_21t(); BRANCH_INSTRUMENTATION(offset); inst = inst->RelativeAt(offset); @@ -1163,15 +1163,15 @@ class InstructionHandler { } ALWAYS_INLINE void AGET_BOOLEAN() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); if (array->CheckIsValidIndex(index)) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); + shadow_frame.SetVReg(A(), array->GetWithoutChecks(index)); inst = inst->Next_2xx(); } else { HANDLE_PENDING_EXCEPTION(); @@ -1179,15 +1179,15 @@ class InstructionHandler { } ALWAYS_INLINE void AGET_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::ByteArray> array = a->AsByteArray(); if (array->CheckIsValidIndex(index)) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); + shadow_frame.SetVReg(A(), array->GetWithoutChecks(index)); inst = inst->Next_2xx(); } else { HANDLE_PENDING_EXCEPTION(); @@ -1195,15 +1195,15 @@ class InstructionHandler { } ALWAYS_INLINE void AGET_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::CharArray> array = a->AsCharArray(); if (array->CheckIsValidIndex(index)) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); + shadow_frame.SetVReg(A(), array->GetWithoutChecks(index)); inst = inst->Next_2xx(); } else { HANDLE_PENDING_EXCEPTION(); @@ -1211,15 +1211,15 @@ class InstructionHandler { } ALWAYS_INLINE void AGET_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::ShortArray> array = a->AsShortArray(); if (array->CheckIsValidIndex(index)) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); + shadow_frame.SetVReg(A(), array->GetWithoutChecks(index)); inst = inst->Next_2xx(); } else { HANDLE_PENDING_EXCEPTION(); @@ -1227,16 +1227,16 @@ class InstructionHandler { } ALWAYS_INLINE void AGET() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int32_t index = shadow_frame.GetVReg(C()); DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); if (array->CheckIsValidIndex(index)) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); + shadow_frame.SetVReg(A(), array->GetWithoutChecks(index)); inst = inst->Next_2xx(); } else { HANDLE_PENDING_EXCEPTION(); @@ -1244,16 +1244,16 @@ class InstructionHandler { } ALWAYS_INLINE void AGET_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int32_t index = shadow_frame.GetVReg(C()); DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); if (array->CheckIsValidIndex(index)) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); + shadow_frame.SetVRegLong(A(), array->GetWithoutChecks(index)); inst = inst->Next_2xx(); } else { HANDLE_PENDING_EXCEPTION(); @@ -1261,15 +1261,15 @@ class InstructionHandler { } ALWAYS_INLINE void AGET_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); if (array->CheckIsValidIndex(index)) { - shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); + shadow_frame.SetVRegReference(A(), array->GetWithoutChecks(index)); inst = inst->Next_2xx(); } else { HANDLE_PENDING_EXCEPTION(); @@ -1277,13 +1277,13 @@ class InstructionHandler { } ALWAYS_INLINE void APUT_BOOLEAN() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + uint8_t val = shadow_frame.GetVReg(A()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); if (array->CheckIsValidIndex(index)) { array->SetWithoutChecks<transaction_active>(index, val); @@ -1294,13 +1294,13 @@ class InstructionHandler { } ALWAYS_INLINE void APUT_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int8_t val = shadow_frame.GetVReg(A()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::ByteArray> array = a->AsByteArray(); if (array->CheckIsValidIndex(index)) { array->SetWithoutChecks<transaction_active>(index, val); @@ -1311,13 +1311,13 @@ class InstructionHandler { } ALWAYS_INLINE void APUT_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + uint16_t val = shadow_frame.GetVReg(A()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::CharArray> array = a->AsCharArray(); if (array->CheckIsValidIndex(index)) { array->SetWithoutChecks<transaction_active>(index, val); @@ -1328,13 +1328,13 @@ class InstructionHandler { } ALWAYS_INLINE void APUT_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int16_t val = shadow_frame.GetVReg(A()); + int32_t index = shadow_frame.GetVReg(C()); ObjPtr<mirror::ShortArray> array = a->AsShortArray(); if (array->CheckIsValidIndex(index)) { array->SetWithoutChecks<transaction_active>(index, val); @@ -1345,13 +1345,13 @@ class InstructionHandler { } ALWAYS_INLINE void APUT() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int32_t val = shadow_frame.GetVReg(A()); + int32_t index = shadow_frame.GetVReg(C()); DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); if (array->CheckIsValidIndex(index)) { @@ -1363,13 +1363,13 @@ class InstructionHandler { } ALWAYS_INLINE void APUT_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); + int64_t val = shadow_frame.GetVRegLong(A()); + int32_t index = shadow_frame.GetVReg(C()); DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); if (array->CheckIsValidIndex(index)) { @@ -1381,13 +1381,13 @@ class InstructionHandler { } ALWAYS_INLINE void APUT_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) { - ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); + ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(B()); if (UNLIKELY(a == nullptr)) { ThrowNullPointerExceptionFromInterpreter(); HANDLE_PENDING_EXCEPTION(); } - int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); - ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); + int32_t index = shadow_frame.GetVReg(C()); + ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(A()); ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { array->SetWithoutChecks<transaction_active>(index, val); @@ -1744,362 +1744,362 @@ class InstructionHandler { ALWAYS_INLINE void NEG_INT() REQUIRES_SHARED(Locks::mutator_lock_) { shadow_frame.SetVReg( - inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void NOT_INT() REQUIRES_SHARED(Locks::mutator_lock_) { shadow_frame.SetVReg( - inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void NEG_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { shadow_frame.SetVRegLong( - inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void NOT_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { shadow_frame.SetVRegLong( - inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void NEG_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { shadow_frame.SetVRegFloat( - inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); + inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void NEG_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { shadow_frame.SetVRegDouble( - inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); + inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void INT_TO_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void INT_TO_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegFloat(A(), + shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void INT_TO_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegDouble(A(), + shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void LONG_TO_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_12x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.SetVReg(A(), + shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void LONG_TO_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegFloat(A(), + shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void LONG_TO_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegDouble(A(), + shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void FLOAT_TO_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); + float val = shadow_frame.GetVRegFloat(B()); int32_t result = art_float_to_integral<int32_t, float>(val); - shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); + shadow_frame.SetVReg(A(), result); inst = inst->Next_1xx(); } ALWAYS_INLINE void FLOAT_TO_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); + float val = shadow_frame.GetVRegFloat(B()); int64_t result = art_float_to_integral<int64_t, float>(val); - shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); + shadow_frame.SetVRegLong(A(), result); inst = inst->Next_1xx(); } ALWAYS_INLINE void FLOAT_TO_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), - shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegDouble(A(), + shadow_frame.GetVRegFloat(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void DOUBLE_TO_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); + double val = shadow_frame.GetVRegDouble(B()); int32_t result = art_float_to_integral<int32_t, double>(val); - shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); + shadow_frame.SetVReg(A(), result); inst = inst->Next_1xx(); } ALWAYS_INLINE void DOUBLE_TO_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); + double val = shadow_frame.GetVRegDouble(B()); int64_t result = art_float_to_integral<int64_t, double>(val); - shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); + shadow_frame.SetVRegLong(A(), result); inst = inst->Next_1xx(); } ALWAYS_INLINE void DOUBLE_TO_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), - shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); + shadow_frame.SetVRegFloat(A(), + shadow_frame.GetVRegDouble(B())); inst = inst->Next_1xx(); } ALWAYS_INLINE void INT_TO_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>( - shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); + shadow_frame.SetVReg(A(), static_cast<int8_t>( + shadow_frame.GetVReg(B()))); inst = inst->Next_1xx(); } ALWAYS_INLINE void INT_TO_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>( - shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); + shadow_frame.SetVReg(A(), static_cast<uint16_t>( + shadow_frame.GetVReg(B()))); inst = inst->Next_1xx(); } ALWAYS_INLINE void INT_TO_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>( - shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); + shadow_frame.SetVReg(A(), static_cast<int16_t>( + shadow_frame.GetVReg(B()))); inst = inst->Next_1xx(); } ALWAYS_INLINE void ADD_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()), - shadow_frame.GetVReg(inst->VRegC_23x()))); + shadow_frame.SetVReg(A(), + SafeAdd(shadow_frame.GetVReg(B()), + shadow_frame.GetVReg(C()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void SUB_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()), - shadow_frame.GetVReg(inst->VRegC_23x()))); + shadow_frame.SetVReg(A(), + SafeSub(shadow_frame.GetVReg(B()), + shadow_frame.GetVReg(C()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void MUL_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()), - shadow_frame.GetVReg(inst->VRegC_23x()))); + shadow_frame.SetVReg(A(), + SafeMul(shadow_frame.GetVReg(B()), + shadow_frame.GetVReg(C()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void DIV_INT() REQUIRES_SHARED(Locks::mutator_lock_) { bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), - shadow_frame.GetVReg(inst->VRegB_23x()), - shadow_frame.GetVReg(inst->VRegC_23x())); + shadow_frame.GetVReg(B()), + shadow_frame.GetVReg(C())); POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); } ALWAYS_INLINE void REM_INT() REQUIRES_SHARED(Locks::mutator_lock_) { bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), - shadow_frame.GetVReg(inst->VRegB_23x()), - shadow_frame.GetVReg(inst->VRegC_23x())); + shadow_frame.GetVReg(B()), + shadow_frame.GetVReg(C())); POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); } ALWAYS_INLINE void SHL_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - shadow_frame.GetVReg(inst->VRegB_23x()) << - (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) << + (shadow_frame.GetVReg(C()) & 0x1f)); inst = inst->Next_2xx(); } ALWAYS_INLINE void SHR_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - shadow_frame.GetVReg(inst->VRegB_23x()) >> - (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) >> + (shadow_frame.GetVReg(C()) & 0x1f)); inst = inst->Next_2xx(); } ALWAYS_INLINE void USHR_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> - (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); + shadow_frame.SetVReg(A(), + static_cast<uint32_t>(shadow_frame.GetVReg(B())) >> + (shadow_frame.GetVReg(C()) & 0x1f)); inst = inst->Next_2xx(); } ALWAYS_INLINE void AND_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - shadow_frame.GetVReg(inst->VRegB_23x()) & - shadow_frame.GetVReg(inst->VRegC_23x())); + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) & + shadow_frame.GetVReg(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void OR_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - shadow_frame.GetVReg(inst->VRegB_23x()) | - shadow_frame.GetVReg(inst->VRegC_23x())); + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) | + shadow_frame.GetVReg(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void XOR_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_23x(inst_data), - shadow_frame.GetVReg(inst->VRegB_23x()) ^ - shadow_frame.GetVReg(inst->VRegC_23x())); + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) ^ + shadow_frame.GetVReg(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void ADD_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()), - shadow_frame.GetVRegLong(inst->VRegC_23x()))); + shadow_frame.SetVRegLong(A(), + SafeAdd(shadow_frame.GetVRegLong(B()), + shadow_frame.GetVRegLong(C()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void SUB_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()), - shadow_frame.GetVRegLong(inst->VRegC_23x()))); + shadow_frame.SetVRegLong(A(), + SafeSub(shadow_frame.GetVRegLong(B()), + shadow_frame.GetVRegLong(C()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void MUL_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()), - shadow_frame.GetVRegLong(inst->VRegC_23x()))); + shadow_frame.SetVRegLong(A(), + SafeMul(shadow_frame.GetVRegLong(B()), + shadow_frame.GetVRegLong(C()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void DIV_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_23x()), - shadow_frame.GetVRegLong(inst->VRegC_23x())); + shadow_frame.GetVRegLong(B()), + shadow_frame.GetVRegLong(C())); POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); } ALWAYS_INLINE void REM_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_23x()), - shadow_frame.GetVRegLong(inst->VRegC_23x())); + shadow_frame.GetVRegLong(B()), + shadow_frame.GetVRegLong(C())); POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); } ALWAYS_INLINE void AND_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_23x()) & - shadow_frame.GetVRegLong(inst->VRegC_23x())); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVRegLong(B()) & + shadow_frame.GetVRegLong(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void OR_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_23x()) | - shadow_frame.GetVRegLong(inst->VRegC_23x())); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVRegLong(B()) | + shadow_frame.GetVRegLong(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void XOR_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ - shadow_frame.GetVRegLong(inst->VRegC_23x())); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVRegLong(B()) ^ + shadow_frame.GetVRegLong(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void SHL_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_23x()) << - (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVRegLong(B()) << + (shadow_frame.GetVReg(C()) & 0x3f)); inst = inst->Next_2xx(); } ALWAYS_INLINE void SHR_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegLong(inst->VRegB_23x()) >> - (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); + shadow_frame.SetVRegLong(A(), + shadow_frame.GetVRegLong(B()) >> + (shadow_frame.GetVReg(C()) & 0x3f)); inst = inst->Next_2xx(); } ALWAYS_INLINE void USHR_LONG() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), - static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> - (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); + shadow_frame.SetVRegLong(A(), + static_cast<uint64_t>(shadow_frame.GetVRegLong(B())) >> + (shadow_frame.GetVReg(C()) & 0x3f)); inst = inst->Next_2xx(); } ALWAYS_INLINE void ADD_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegFloat(inst->VRegB_23x()) + - shadow_frame.GetVRegFloat(inst->VRegC_23x())); + shadow_frame.SetVRegFloat(A(), + shadow_frame.GetVRegFloat(B()) + + shadow_frame.GetVRegFloat(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void SUB_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegFloat(inst->VRegB_23x()) - - shadow_frame.GetVRegFloat(inst->VRegC_23x())); + shadow_frame.SetVRegFloat(A(), + shadow_frame.GetVRegFloat(B()) - + shadow_frame.GetVRegFloat(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void MUL_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegFloat(inst->VRegB_23x()) * - shadow_frame.GetVRegFloat(inst->VRegC_23x())); + shadow_frame.SetVRegFloat(A(), + shadow_frame.GetVRegFloat(B()) * + shadow_frame.GetVRegFloat(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void DIV_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegFloat(inst->VRegB_23x()) / - shadow_frame.GetVRegFloat(inst->VRegC_23x())); + shadow_frame.SetVRegFloat(A(), + shadow_frame.GetVRegFloat(B()) / + shadow_frame.GetVRegFloat(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void REM_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), - fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), - shadow_frame.GetVRegFloat(inst->VRegC_23x()))); + shadow_frame.SetVRegFloat(A(), + fmodf(shadow_frame.GetVRegFloat(B()), + shadow_frame.GetVRegFloat(C()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void ADD_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegDouble(inst->VRegB_23x()) + - shadow_frame.GetVRegDouble(inst->VRegC_23x())); + shadow_frame.SetVRegDouble(A(), + shadow_frame.GetVRegDouble(B()) + + shadow_frame.GetVRegDouble(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void SUB_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegDouble(inst->VRegB_23x()) - - shadow_frame.GetVRegDouble(inst->VRegC_23x())); + shadow_frame.SetVRegDouble(A(), + shadow_frame.GetVRegDouble(B()) - + shadow_frame.GetVRegDouble(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void MUL_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegDouble(inst->VRegB_23x()) * - shadow_frame.GetVRegDouble(inst->VRegC_23x())); + shadow_frame.SetVRegDouble(A(), + shadow_frame.GetVRegDouble(B()) * + shadow_frame.GetVRegDouble(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void DIV_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), - shadow_frame.GetVRegDouble(inst->VRegB_23x()) / - shadow_frame.GetVRegDouble(inst->VRegC_23x())); + shadow_frame.SetVRegDouble(A(), + shadow_frame.GetVRegDouble(B()) / + shadow_frame.GetVRegDouble(C())); inst = inst->Next_2xx(); } ALWAYS_INLINE void REM_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), - fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), - shadow_frame.GetVRegDouble(inst->VRegC_23x()))); + shadow_frame.SetVRegDouble(A(), + fmod(shadow_frame.GetVRegDouble(B()), + shadow_frame.GetVRegDouble(C()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void ADD_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); + shadow_frame.GetVReg(B()))); inst = inst->Next_1xx(); } @@ -2107,7 +2107,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, SafeSub(shadow_frame.GetVReg(vregA), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); + shadow_frame.GetVReg(B()))); inst = inst->Next_1xx(); } @@ -2115,21 +2115,21 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, SafeMul(shadow_frame.GetVReg(vregA), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); + shadow_frame.GetVReg(B()))); inst = inst->Next_1xx(); } ALWAYS_INLINE void DIV_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) { uint4_t vregA = inst->VRegA_12x(inst_data); bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.GetVReg(B())); POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); } ALWAYS_INLINE void REM_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) { uint4_t vregA = inst->VRegA_12x(inst_data); bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.GetVReg(B())); POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); } @@ -2137,7 +2137,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, shadow_frame.GetVReg(vregA) << - (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); + (shadow_frame.GetVReg(B()) & 0x1f)); inst = inst->Next_1xx(); } @@ -2145,7 +2145,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, shadow_frame.GetVReg(vregA) >> - (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); + (shadow_frame.GetVReg(B()) & 0x1f)); inst = inst->Next_1xx(); } @@ -2153,7 +2153,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> - (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); + (shadow_frame.GetVReg(B()) & 0x1f)); inst = inst->Next_1xx(); } @@ -2161,7 +2161,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, shadow_frame.GetVReg(vregA) & - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } @@ -2169,7 +2169,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, shadow_frame.GetVReg(vregA) | - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } @@ -2177,7 +2177,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVReg(vregA, shadow_frame.GetVReg(vregA) ^ - shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); + shadow_frame.GetVReg(B())); inst = inst->Next_1xx(); } @@ -2185,7 +2185,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, SafeAdd(shadow_frame.GetVRegLong(vregA), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); + shadow_frame.GetVRegLong(B()))); inst = inst->Next_1xx(); } @@ -2193,7 +2193,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, SafeSub(shadow_frame.GetVRegLong(vregA), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); + shadow_frame.GetVRegLong(B()))); inst = inst->Next_1xx(); } @@ -2201,21 +2201,21 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, SafeMul(shadow_frame.GetVRegLong(vregA), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); + shadow_frame.GetVRegLong(B()))); inst = inst->Next_1xx(); } ALWAYS_INLINE void DIV_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) { uint4_t vregA = inst->VRegA_12x(inst_data); DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegLong(B())); POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); } ALWAYS_INLINE void REM_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) { uint4_t vregA = inst->VRegA_12x(inst_data); DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegLong(B())); POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); } @@ -2223,7 +2223,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, shadow_frame.GetVRegLong(vregA) & - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } @@ -2231,7 +2231,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, shadow_frame.GetVRegLong(vregA) | - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } @@ -2239,7 +2239,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, shadow_frame.GetVRegLong(vregA) ^ - shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegLong(B())); inst = inst->Next_1xx(); } @@ -2247,7 +2247,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, shadow_frame.GetVRegLong(vregA) << - (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); + (shadow_frame.GetVReg(B()) & 0x3f)); inst = inst->Next_1xx(); } @@ -2255,7 +2255,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, shadow_frame.GetVRegLong(vregA) >> - (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); + (shadow_frame.GetVReg(B()) & 0x3f)); inst = inst->Next_1xx(); } @@ -2263,7 +2263,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegLong(vregA, static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> - (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); + (shadow_frame.GetVReg(B()) & 0x3f)); inst = inst->Next_1xx(); } @@ -2271,7 +2271,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegFloat(vregA, shadow_frame.GetVRegFloat(vregA) + - shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegFloat(B())); inst = inst->Next_1xx(); } @@ -2279,7 +2279,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegFloat(vregA, shadow_frame.GetVRegFloat(vregA) - - shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegFloat(B())); inst = inst->Next_1xx(); } @@ -2287,7 +2287,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegFloat(vregA, shadow_frame.GetVRegFloat(vregA) * - shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegFloat(B())); inst = inst->Next_1xx(); } @@ -2295,7 +2295,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegFloat(vregA, shadow_frame.GetVRegFloat(vregA) / - shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegFloat(B())); inst = inst->Next_1xx(); } @@ -2303,7 +2303,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegFloat(vregA, fmodf(shadow_frame.GetVRegFloat(vregA), - shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); + shadow_frame.GetVRegFloat(B()))); inst = inst->Next_1xx(); } @@ -2311,7 +2311,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegDouble(vregA, shadow_frame.GetVRegDouble(vregA) + - shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegDouble(B())); inst = inst->Next_1xx(); } @@ -2319,7 +2319,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegDouble(vregA, shadow_frame.GetVRegDouble(vregA) - - shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegDouble(B())); inst = inst->Next_1xx(); } @@ -2327,7 +2327,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegDouble(vregA, shadow_frame.GetVRegDouble(vregA) * - shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegDouble(B())); inst = inst->Next_1xx(); } @@ -2335,7 +2335,7 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegDouble(vregA, shadow_frame.GetVRegDouble(vregA) / - shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); + shadow_frame.GetVRegDouble(B())); inst = inst->Next_1xx(); } @@ -2343,134 +2343,134 @@ class InstructionHandler { uint4_t vregA = inst->VRegA_12x(inst_data); shadow_frame.SetVRegDouble(vregA, fmod(shadow_frame.GetVRegDouble(vregA), - shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); + shadow_frame.GetVRegDouble(B()))); inst = inst->Next_1xx(); } ALWAYS_INLINE void ADD_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22s(inst_data), - SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), + shadow_frame.SetVReg(A(), + SafeAdd(shadow_frame.GetVReg(B()), inst->VRegC_22s())); inst = inst->Next_2xx(); } ALWAYS_INLINE void RSUB_INT() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22s(inst_data), + shadow_frame.SetVReg(A(), SafeSub(inst->VRegC_22s(), - shadow_frame.GetVReg(inst->VRegB_22s(inst_data)))); + shadow_frame.GetVReg(B()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void MUL_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22s(inst_data), - SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), + shadow_frame.SetVReg(A(), + SafeMul(shadow_frame.GetVReg(B()), inst->VRegC_22s())); inst = inst->Next_2xx(); } ALWAYS_INLINE void DIV_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) { bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), - shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), + shadow_frame.GetVReg(B()), inst->VRegC_22s()); POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); } ALWAYS_INLINE void REM_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) { bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), - shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), + shadow_frame.GetVReg(B()), inst->VRegC_22s()); POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); } ALWAYS_INLINE void AND_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22s(inst_data), - shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) & inst->VRegC_22s()); inst = inst->Next_2xx(); } ALWAYS_INLINE void OR_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22s(inst_data), - shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) | inst->VRegC_22s()); inst = inst->Next_2xx(); } ALWAYS_INLINE void XOR_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22s(inst_data), - shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) ^ inst->VRegC_22s()); inst = inst->Next_2xx(); } ALWAYS_INLINE void ADD_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); + shadow_frame.SetVReg(A(), + SafeAdd(shadow_frame.GetVReg(B()), inst->VRegC_22b())); inst = inst->Next_2xx(); } ALWAYS_INLINE void RSUB_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b()))); + shadow_frame.SetVReg(A(), + SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(B()))); inst = inst->Next_2xx(); } ALWAYS_INLINE void MUL_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); + shadow_frame.SetVReg(A(), + SafeMul(shadow_frame.GetVReg(B()), inst->VRegC_22b())); inst = inst->Next_2xx(); } ALWAYS_INLINE void DIV_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), - shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); + shadow_frame.GetVReg(B()), inst->VRegC_22b()); POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); } ALWAYS_INLINE void REM_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), - shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); + shadow_frame.GetVReg(B()), inst->VRegC_22b()); POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); } ALWAYS_INLINE void AND_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - shadow_frame.GetVReg(inst->VRegB_22b()) & + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) & inst->VRegC_22b()); inst = inst->Next_2xx(); } ALWAYS_INLINE void OR_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - shadow_frame.GetVReg(inst->VRegB_22b()) | + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) | inst->VRegC_22b()); inst = inst->Next_2xx(); } ALWAYS_INLINE void XOR_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - shadow_frame.GetVReg(inst->VRegB_22b()) ^ + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) ^ inst->VRegC_22b()); inst = inst->Next_2xx(); } ALWAYS_INLINE void SHL_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - shadow_frame.GetVReg(inst->VRegB_22b()) << + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) << (inst->VRegC_22b() & 0x1f)); inst = inst->Next_2xx(); } ALWAYS_INLINE void SHR_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - shadow_frame.GetVReg(inst->VRegB_22b()) >> + shadow_frame.SetVReg(A(), + shadow_frame.GetVReg(B()) >> (inst->VRegC_22b() & 0x1f)); inst = inst->Next_2xx(); } ALWAYS_INLINE void USHR_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) { - shadow_frame.SetVReg(inst->VRegA_22b(inst_data), - static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> + shadow_frame.SetVReg(A(), + static_cast<uint32_t>(shadow_frame.GetVReg(B())) >> (inst->VRegC_22b() & 0x1f)); inst = inst->Next_2xx(); } @@ -2560,6 +2560,10 @@ class InstructionHandler { const uint16_t* Insns() { return ctx->accessor.Insns(); } JValue* ResultRegister() { return &ctx->result_register; } + ALWAYS_INLINE int32_t A() { return inst->VRegA(kFormat, inst_data); } + ALWAYS_INLINE int32_t B() { return inst->VRegB(kFormat, inst_data); } + ALWAYS_INLINE int32_t C() { return inst->VRegC(kFormat); } + SwitchImplContext* const ctx; const instrumentation::Instrumentation* const instrumentation; Thread* const self; @@ -2608,7 +2612,7 @@ ATTRIBUTE_NO_SANITIZE_ADDRESS void ExecuteSwitchImplCpp(SwitchImplContext* ctx) inst_data = inst->Fetch16(0); { bool exit_loop = false; - InstructionHandler<do_access_check, transaction_active> handler( + InstructionHandler<do_access_check, transaction_active, Instruction::kInvalidFormat> handler( ctx, instrumentation, self, shadow_frame, dex_pc, inst, inst_data, exit_loop); if (!handler.Preamble()) { if (UNLIKELY(exit_loop)) { @@ -2621,10 +2625,10 @@ ATTRIBUTE_NO_SANITIZE_ADDRESS void ExecuteSwitchImplCpp(SwitchImplContext* ctx) } } switch (inst->Opcode(inst_data)) { -#define OPCODE_CASE(OPCODE, OPCODE_NAME, pname, f, i, a, e, v) \ +#define OPCODE_CASE(OPCODE, OPCODE_NAME, pname, FORMAT, i, a, e, v) \ case OPCODE: { \ bool exit_loop = false; \ - InstructionHandler<do_access_check, transaction_active> handler( \ + InstructionHandler<do_access_check, transaction_active, Instruction::FORMAT> handler( \ ctx, instrumentation, self, shadow_frame, dex_pc, inst, inst_data, exit_loop); \ handler.OPCODE_NAME(); \ /* TODO: Advance 'inst' here, instead of explicitly in each handler */ \ |