Replace switch interpreter macros with C++ functions.

C++ code is more maintainable than huge macros.

The "return" statement was used within the macros to skip the rest
of the interpreted opcode.  This is slightly more tricky in functions.
All such use cases have been replaced with "return false", and the
calling functions always check the return value and propagate it up.

Performance difference is within noise (golem using the switch).

This halves per-file compile time to 1min.

Test: "test.py -b -r --interpreter --host" with switch interpreter.
Change-Id: I01d861dec1c4a7e95e412fd4b662e5a4d7bd55a8
diff --git a/runtime/interpreter/interpreter_switch_impl-inl.h b/runtime/interpreter/interpreter_switch_impl-inl.h
index 71b2336..4125a0a 100644
--- a/runtime/interpreter/interpreter_switch_impl-inl.h
+++ b/runtime/interpreter/interpreter_switch_impl-inl.h
@@ -37,339 +37,373 @@
 namespace art {
 namespace interpreter {
 
-// TODO: Replace macros with member functions.
-#define CHECK_FORCE_RETURN()                                                        \
-  {                                                                                 \
-    if (UNLIKELY(shadow_frame.GetForcePopFrame())) {                                \
-      DCHECK(PrevFrameWillRetry(self, shadow_frame))                                \
-          << "Pop frame forced without previous frame ready to retry instruction!"; \
-      DCHECK(Runtime::Current()->AreNonStandardExitsEnabled());                     \
-      if (UNLIKELY(NeedsMethodExitEvent(instrumentation))) {                        \
-        SendMethodExitEvents(self,                                                  \
-                             instrumentation,                                       \
-                             shadow_frame,                                          \
-                             shadow_frame.GetThisObject(Accessor().InsSize()),      \
-                             shadow_frame.GetMethod(),                              \
-                             inst->GetDexPc(Insns()),                               \
-                             JValue());                                             \
-      }                                                                             \
-      ctx->result = JValue(); /* Handled in caller. */                              \
-      exit_interpreter_loop = true;                                                 \
-      return;                                                                       \
-    }                                                                               \
-  }                                                                                 \
-  do {} while (false)
-
-#define HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instr)                                    \
-  {                                                                                             \
-    DCHECK(self->IsExceptionPending());                                                         \
-    self->AllowThreadSuspension();                                                              \
-    CHECK_FORCE_RETURN();                                                                       \
-    if (!MoveToExceptionHandler(self, shadow_frame, instr)) {                                   \
-      /* Structured locking is to be enforced for abnormal termination, too. */                 \
-      DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame);                        \
-      if (ctx->interpret_one_instruction) {                                                     \
-        /* Signal mterp to return to caller */                                                  \
-        shadow_frame.SetDexPC(dex::kDexNoIndex);                                                \
-      }                                                                                         \
-      ctx->result = JValue(); /* Handled in caller. */                                          \
-      exit_interpreter_loop = true;                                                             \
-      return;                                                                                   \
-    } else {                                                                                    \
-      CHECK_FORCE_RETURN();                                                                     \
-      int32_t displacement =                                                                    \
-          static_cast<int32_t>(shadow_frame.GetDexPC()) - static_cast<int32_t>(dex_pc);         \
-      inst = inst->RelativeAt(displacement);                                                    \
-      return;  /* Stop executing this opcode and continue in the exception handler. */          \
-    }                                                                                           \
-  }                                                                                             \
-  do {} while (false)
-
-#define HANDLE_PENDING_EXCEPTION() HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instrumentation)
-
-#define POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE_IMPL(_is_exception_pending, _next_function) \
-  {                                                                                             \
-    if (UNLIKELY(shadow_frame.GetForceRetryInstruction())) {                                    \
-      /* Don't need to do anything except clear the flag and exception. We leave the */         \
-      /* instruction the same so it will be re-executed on the next go-around.       */         \
-      DCHECK(inst->IsInvoke());                                                                 \
-      shadow_frame.SetForceRetryInstruction(false);                                             \
-      if (UNLIKELY(_is_exception_pending)) {                                                    \
-        DCHECK(self->IsExceptionPending());                                                     \
-        if (kIsDebugBuild) {                                                                    \
-          LOG(WARNING) << "Suppressing exception for instruction-retry: "                       \
-                       << self->GetException()->Dump();                                         \
-        }                                                                                       \
-        self->ClearException();                                                                 \
-      }                                                                                         \
-    } else if (UNLIKELY(_is_exception_pending)) {                                               \
-      /* Should have succeeded. */                                                              \
-      DCHECK(!shadow_frame.GetForceRetryInstruction());                                         \
-      HANDLE_PENDING_EXCEPTION();                                                               \
-    } else {                                                                                    \
-      inst = inst->_next_function();                                                            \
-    }                                                                                           \
-  }                                                                                             \
-  do {} while (false)
-
-#define POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE_POLYMORPHIC(_is_exception_pending) \
-  POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE_IMPL(_is_exception_pending, Next_4xx)
-#define POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(_is_exception_pending) \
-  POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE_IMPL(_is_exception_pending, Next_3xx)
-
-#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function)  \
-  {                                                                               \
-    /* Should only be on invoke instructions. */                                  \
-    DCHECK(!shadow_frame.GetForceRetryInstruction());                             \
-    if (UNLIKELY(_is_exception_pending)) {                                        \
-      HANDLE_PENDING_EXCEPTION();                                                 \
-    } else {                                                                      \
-      inst = inst->_next_function();                                              \
-    }                                                                             \
-  }                                                                               \
-  do {} while (false)
-
-#define HANDLE_MONITOR_CHECKS()                                                                   \
-  if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) {                       \
-    HANDLE_PENDING_EXCEPTION();                                                                   \
-  }
-
-// Code to run before each dex instruction.
-#define PREAMBLE_SAVE(save_ref)                                                                 \
-  {                                                                                             \
-    /* We need to put this before & after the instrumentation to avoid having to put in a */    \
-    /* post-script macro.                                                                 */    \
-    CHECK_FORCE_RETURN();                                                                       \
-    if (UNLIKELY(instrumentation->HasDexPcListeners())) {                                       \
-      if (UNLIKELY(!DoDexPcMoveEvent(self,                                                      \
-                                     Accessor(),                                                \
-                                     shadow_frame,                                              \
-                                     dex_pc,                                                    \
-                                     instrumentation,                                           \
-                                     save_ref))) {                                              \
-        HANDLE_PENDING_EXCEPTION();                                                             \
-      }                                                                                         \
-      CHECK_FORCE_RETURN();                                                                     \
-    }                                                                                           \
-  }                                                                                             \
-  do {} while (false)
-
-#define PREAMBLE() PREAMBLE_SAVE(nullptr)
-
-#define BRANCH_INSTRUMENTATION(offset)                                                         \
-  {                                                                                            \
-    if (UNLIKELY(instrumentation->HasBranchListeners())) {                                     \
-      instrumentation->Branch(self, shadow_frame.GetMethod(), dex_pc, offset);                 \
-    }                                                                                          \
-    JValue result;                                                                             \
-    if (jit::Jit::MaybeDoOnStackReplacement(self,                                              \
-                                            shadow_frame.GetMethod(),                          \
-                                            dex_pc,                                            \
-                                            offset,                                            \
-                                            &result)) {                                        \
-      if (ctx->interpret_one_instruction) {                                                    \
-        /* OSR has completed execution of the method.  Signal mterp to return to caller */     \
-        shadow_frame.SetDexPC(dex::kDexNoIndex);                                               \
-      }                                                                                        \
-      ctx->result = result;                                                                    \
-      exit_interpreter_loop = true;                                                            \
-      return;                                                                                  \
-    }                                                                                          \
-  }                                                                                            \
-  do {} while (false)
-
-#define HOTNESS_UPDATE()                                                                       \
-  {                                                                                            \
-    jit::Jit* jit = Runtime::Current()->GetJit();                                              \
-    if (jit != nullptr) {                                                                      \
-      jit->AddSamples(self, shadow_frame.GetMethod(), 1, /*with_backedges=*/ true);            \
-    }                                                                                          \
-  }                                                                                            \
-  do {} while (false)
-
-#define HANDLE_ASYNC_EXCEPTION()                                                               \
-  if (UNLIKELY(self->ObserveAsyncException())) {                                               \
-    HANDLE_PENDING_EXCEPTION();                                                                \
-  }                                                                                            \
-  do {} while (false)
-
-#define HANDLE_BACKWARD_BRANCH(offset)                                                         \
-  {                                                                                            \
-    if (IsBackwardBranch(offset)) {                                                            \
-      HOTNESS_UPDATE();                                                                        \
-      /* Record new dex pc early to have consistent suspend point at loop header. */           \
-      shadow_frame.SetDexPC(inst->GetDexPc(Insns()));                                          \
-      self->AllowThreadSuspension();                                                           \
-    }                                                                                          \
-  }                                                                                            \
-  do {} while (false)
-
-// Unlike most other events the DexPcMovedEvent can be sent when there is a pending exception (if
-// the next instruction is MOVE_EXCEPTION). This means it needs to be handled carefully to be able
-// to detect exceptions thrown by the DexPcMovedEvent itself. These exceptions could be thrown by
-// jvmti-agents while handling breakpoint or single step events. We had to move this into its own
-// function because it was making ExecuteSwitchImpl have too large a stack.
-NO_INLINE static bool DoDexPcMoveEvent(Thread* self,
-                                       const CodeItemDataAccessor& accessor,
-                                       const ShadowFrame& shadow_frame,
-                                       uint32_t dex_pc,
-                                       const instrumentation::Instrumentation* instrumentation,
-                                       JValue* save_ref)
-    REQUIRES_SHARED(Locks::mutator_lock_) {
-  DCHECK(instrumentation->HasDexPcListeners());
-  StackHandleScope<2> hs(self);
-  Handle<mirror::Throwable> thr(hs.NewHandle(self->GetException()));
-  mirror::Object* null_obj = nullptr;
-  HandleWrapper<mirror::Object> h(
-      hs.NewHandleWrapper(LIKELY(save_ref == nullptr) ? &null_obj : save_ref->GetGCRoot()));
-  self->ClearException();
-  instrumentation->DexPcMovedEvent(self,
-                                   shadow_frame.GetThisObject(accessor.InsSize()),
-                                   shadow_frame.GetMethod(),
-                                   dex_pc);
-  if (UNLIKELY(self->IsExceptionPending())) {
-    // We got a new exception in the dex-pc-moved event. We just let this exception replace the old
-    // one.
-    // TODO It would be good to add the old exception to the suppressed exceptions of the new one if
-    // possible.
-    return false;
-  } else {
-    if (UNLIKELY(!thr.IsNull())) {
-      self->SetException(thr.Get());
-    }
-    return true;
-  }
-}
-
-static bool NeedsMethodExitEvent(const instrumentation::Instrumentation* ins)
-    REQUIRES_SHARED(Locks::mutator_lock_) {
-  return ins->HasMethodExitListeners() || ins->HasWatchedFramePopListeners();
-}
-
-// Sends the normal method exit event. Returns true if the events succeeded and false if there is a
-// pending exception.
-NO_INLINE static bool SendMethodExitEvents(Thread* self,
-                                           const instrumentation::Instrumentation* instrumentation,
-                                           const ShadowFrame& frame,
-                                           ObjPtr<mirror::Object> thiz,
-                                           ArtMethod* method,
-                                           uint32_t dex_pc,
-                                           const JValue& result)
-    REQUIRES_SHARED(Locks::mutator_lock_) {
-  bool had_event = false;
-  // We don't send method-exit if it's a pop-frame. We still send frame_popped though.
-  if (UNLIKELY(instrumentation->HasMethodExitListeners() && !frame.GetForcePopFrame())) {
-    had_event = true;
-    instrumentation->MethodExitEvent(self, thiz.Ptr(), method, dex_pc, result);
-  }
-  if (UNLIKELY(frame.NeedsNotifyPop() && instrumentation->HasWatchedFramePopListeners())) {
-    had_event = true;
-    instrumentation->WatchedFramePopped(self, frame);
-  }
-  if (UNLIKELY(had_event)) {
-    return !self->IsExceptionPending();
-  } else {
-    return true;
-  }
-}
-
 // Short-lived helper class which executes single DEX bytecode.  It is inlined by compiler.
 //
 // The function names must match the names from dex_instruction_list.h and have no arguments.
 //
 // Any relevant execution information is stored in the fields - it should be kept to minimum.
 //
+// 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>
 class InstructionHandler {
  public:
+  ALWAYS_INLINE WARN_UNUSED bool CheckForceReturn()
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    if (UNLIKELY(shadow_frame.GetForcePopFrame())) {
+      DCHECK(PrevFrameWillRetry(self, shadow_frame))
+          << "Pop frame forced without previous frame ready to retry instruction!";
+      DCHECK(Runtime::Current()->AreNonStandardExitsEnabled());
+      if (UNLIKELY(NeedsMethodExitEvent(instrumentation))) {
+        SendMethodExitEvents(self,
+                             instrumentation,
+                             shadow_frame,
+                             shadow_frame.GetThisObject(Accessor().InsSize()),
+                             shadow_frame.GetMethod(),
+                             inst->GetDexPc(Insns()),
+                             JValue());
+      }
+      ctx->result = JValue(); /* Handled in caller. */
+      exit_interpreter_loop = true;
+      return false;
+    }
+    return true;
+  }
+
+  ALWAYS_INLINE WARN_UNUSED bool HandlePendingExceptionWithInstrumentation(
+      const instrumentation::Instrumentation* instr)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    DCHECK(self->IsExceptionPending());
+    self->AllowThreadSuspension();
+    if (!CheckForceReturn()) {
+      return false;
+    }
+    if (!MoveToExceptionHandler(self, shadow_frame, instr)) {
+      /* Structured locking is to be enforced for abnormal termination, too. */
+      DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame);
+      if (ctx->interpret_one_instruction) {
+        /* Signal mterp to return to caller */
+        shadow_frame.SetDexPC(dex::kDexNoIndex);
+      }
+      ctx->result = JValue(); /* Handled in caller. */
+      exit_interpreter_loop = true;
+      return false;  // Return to caller.
+    }
+    if (!CheckForceReturn()) {
+      return false;
+    }
+    int32_t displacement =
+        static_cast<int32_t>(shadow_frame.GetDexPC()) - static_cast<int32_t>(dex_pc);
+    inst = inst->RelativeAt(displacement);
+    return false;  // Stop executing this opcode and continue in the exception handler.
+  }
+
+  ALWAYS_INLINE WARN_UNUSED bool HandlePendingException()
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    return HandlePendingExceptionWithInstrumentation(instrumentation);
+  }
+
+  ALWAYS_INLINE WARN_UNUSED bool PossiblyHandlePendingExceptionOnInvokeImpl(
+      bool is_exception_pending,
+      const Instruction* next_inst)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    if (UNLIKELY(shadow_frame.GetForceRetryInstruction())) {
+      /* Don't need to do anything except clear the flag and exception. We leave the */
+      /* instruction the same so it will be re-executed on the next go-around.       */
+      DCHECK(inst->IsInvoke());
+      shadow_frame.SetForceRetryInstruction(false);
+      if (UNLIKELY(is_exception_pending)) {
+        DCHECK(self->IsExceptionPending());
+        if (kIsDebugBuild) {
+          LOG(WARNING) << "Suppressing exception for instruction-retry: "
+                       << self->GetException()->Dump();
+        }
+        self->ClearException();
+      }
+    } else if (UNLIKELY(is_exception_pending)) {
+      /* Should have succeeded. */
+      DCHECK(!shadow_frame.GetForceRetryInstruction());
+      if (!HandlePendingException()) {
+        return false;
+      }
+    } else {
+      inst = next_inst;
+    }
+    return true;
+  }
+
+  ALWAYS_INLINE WARN_UNUSED bool PossiblyHandlePendingException(
+      bool is_exception_pending,
+      const Instruction* next_inst)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    /* Should only be on invoke instructions. */
+    DCHECK(!shadow_frame.GetForceRetryInstruction());
+    if (UNLIKELY(is_exception_pending)) {
+      if (!HandlePendingException()) {
+        return false;
+      }
+    } else {
+      inst = next_inst;
+    }
+    return true;
+  }
+
+  ALWAYS_INLINE WARN_UNUSED bool HandleMonitorChecks()
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) {
+      if (!HandlePendingException()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  // Code to run before each dex instruction.
+  ALWAYS_INLINE WARN_UNUSED bool PreambleSave(JValue* save_ref)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    /* We need to put this before & after the instrumentation to avoid having to put in a */
+    /* post-script macro.                                                                 */
+    if (!CheckForceReturn()) {
+      return false;
+    }
+    if (UNLIKELY(instrumentation->HasDexPcListeners())) {
+      if (UNLIKELY(!DoDexPcMoveEvent(self,
+                                     Accessor(),
+                                     shadow_frame,
+                                     dex_pc,
+                                     instrumentation,
+                                     save_ref))) {
+        if (!HandlePendingException()) {
+          return false;
+        }
+      }
+      if (!CheckForceReturn()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  ALWAYS_INLINE WARN_UNUSED bool BranchInstrumentation(int32_t offset)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    if (UNLIKELY(instrumentation->HasBranchListeners())) {
+      instrumentation->Branch(self, shadow_frame.GetMethod(), dex_pc, offset);
+    }
+    JValue result;
+    if (jit::Jit::MaybeDoOnStackReplacement(self,
+                                            shadow_frame.GetMethod(),
+                                            dex_pc,
+                                            offset,
+                                            &result)) {
+      if (ctx->interpret_one_instruction) {
+        /* OSR has completed execution of the method.  Signal mterp to return to caller */
+        shadow_frame.SetDexPC(dex::kDexNoIndex);
+      }
+      ctx->result = result;
+      exit_interpreter_loop = true;
+      return false;
+    }
+    return true;
+  }
+
+  ALWAYS_INLINE void HotnessUpdate()
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    jit::Jit* jit = Runtime::Current()->GetJit();
+    if (jit != nullptr) {
+      jit->AddSamples(self, shadow_frame.GetMethod(), 1, /*with_backedges=*/ true);
+    }
+  }
+
+  ALWAYS_INLINE WARN_UNUSED bool HandleAsyncException()
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    if (UNLIKELY(self->ObserveAsyncException())) {
+      if (!HandlePendingException()) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  ALWAYS_INLINE void HandleBackwardBranch(int32_t offset)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    if (IsBackwardBranch(offset)) {
+      HotnessUpdate();
+      /* Record new dex pc early to have consistent suspend point at loop header. */
+      shadow_frame.SetDexPC(inst->GetDexPc(Insns()));
+      self->AllowThreadSuspension();
+    }
+  }
+
+  // Unlike most other events the DexPcMovedEvent can be sent when there is a pending exception (if
+  // the next instruction is MOVE_EXCEPTION). This means it needs to be handled carefully to be able
+  // to detect exceptions thrown by the DexPcMovedEvent itself. These exceptions could be thrown by
+  // jvmti-agents while handling breakpoint or single step events. We had to move this into its own
+  // function because it was making ExecuteSwitchImpl have too large a stack.
+  NO_INLINE static bool DoDexPcMoveEvent(Thread* self,
+                                         const CodeItemDataAccessor& accessor,
+                                         const ShadowFrame& shadow_frame,
+                                         uint32_t dex_pc,
+                                         const instrumentation::Instrumentation* instrumentation,
+                                         JValue* save_ref)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    DCHECK(instrumentation->HasDexPcListeners());
+    StackHandleScope<2> hs(self);
+    Handle<mirror::Throwable> thr(hs.NewHandle(self->GetException()));
+    mirror::Object* null_obj = nullptr;
+    HandleWrapper<mirror::Object> h(
+        hs.NewHandleWrapper(LIKELY(save_ref == nullptr) ? &null_obj : save_ref->GetGCRoot()));
+    self->ClearException();
+    instrumentation->DexPcMovedEvent(self,
+                                     shadow_frame.GetThisObject(accessor.InsSize()),
+                                     shadow_frame.GetMethod(),
+                                     dex_pc);
+    if (UNLIKELY(self->IsExceptionPending())) {
+      // We got a new exception in the dex-pc-moved event.
+      // We just let this exception replace the old one.
+      // TODO It would be good to add the old exception to the
+      // suppressed exceptions of the new one if possible.
+      return false;
+    } else {
+      if (UNLIKELY(!thr.IsNull())) {
+        self->SetException(thr.Get());
+      }
+      return true;
+    }
+  }
+
+  static bool NeedsMethodExitEvent(const instrumentation::Instrumentation* ins)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    return ins->HasMethodExitListeners() || ins->HasWatchedFramePopListeners();
+  }
+
+  // Sends the normal method exit event.
+  // Returns true if the events succeeded and false if there is a pending exception.
+  NO_INLINE static bool SendMethodExitEvents(
+      Thread* self,
+      const instrumentation::Instrumentation* instrumentation,
+      const ShadowFrame& frame,
+      ObjPtr<mirror::Object> thiz,
+      ArtMethod* method,
+      uint32_t dex_pc,
+      const JValue& result)
+      REQUIRES_SHARED(Locks::mutator_lock_) {
+    bool had_event = false;
+    // We don't send method-exit if it's a pop-frame. We still send frame_popped though.
+    if (UNLIKELY(instrumentation->HasMethodExitListeners() && !frame.GetForcePopFrame())) {
+      had_event = true;
+      instrumentation->MethodExitEvent(self, thiz.Ptr(), method, dex_pc, result);
+    }
+    if (UNLIKELY(frame.NeedsNotifyPop() && instrumentation->HasWatchedFramePopListeners())) {
+      had_event = true;
+      instrumentation->WatchedFramePopped(self, frame);
+    }
+    if (UNLIKELY(had_event)) {
+      return !self->IsExceptionPending();
+    } else {
+      return true;
+    }
+  }
+
+#define BRANCH_INSTRUMENTATION(offset)                                                            \
+  if (!BranchInstrumentation(offset)) {                                                           \
+    return;                                                                                       \
+  }
+
+#define HANDLE_PENDING_EXCEPTION()                                                                \
+  if (!HandlePendingException()) {                                                                \
+    return;                                                                                       \
+  }
+
+#define POSSIBLY_HANDLE_PENDING_EXCEPTION(is_exception_pending, next_function)                    \
+  if (!PossiblyHandlePendingException(is_exception_pending, inst->next_function())) {             \
+    return;                                                                                       \
+  }
+
+#define POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE_POLYMORPHIC(is_exception_pending)             \
+  if (!PossiblyHandlePendingExceptionOnInvokeImpl(is_exception_pending, inst->Next_4xx())) {      \
+    return;                                                                                       \
+  }
+
+#define POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(is_exception_pending)                         \
+  if (!PossiblyHandlePendingExceptionOnInvokeImpl(is_exception_pending, inst->Next_3xx())) {      \
+    return;                                                                                       \
+  }
+
   ALWAYS_INLINE void NOP() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void MOVE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void MOVE_FROM16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22x(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22x()));
     inst = inst->Next_2xx();
   }
 
   ALWAYS_INLINE void MOVE_16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_32x(),
                          shadow_frame.GetVReg(inst->VRegB_32x()));
     inst = inst->Next_3xx();
   }
 
   ALWAYS_INLINE void MOVE_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
                              shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void MOVE_WIDE_FROM16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data),
                              shadow_frame.GetVRegLong(inst->VRegB_22x()));
     inst = inst->Next_2xx();
   }
 
   ALWAYS_INLINE void MOVE_WIDE_16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_32x(),
                              shadow_frame.GetVRegLong(inst->VRegB_32x()));
     inst = inst->Next_3xx();
   }
 
   ALWAYS_INLINE void MOVE_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data),
                                   shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void MOVE_OBJECT_FROM16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data),
                                   shadow_frame.GetVRegReference(inst->VRegB_22x()));
     inst = inst->Next_2xx();
   }
 
   ALWAYS_INLINE void MOVE_OBJECT_16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegReference(inst->VRegA_32x(),
                                   shadow_frame.GetVRegReference(inst->VRegB_32x()));
     inst = inst->Next_3xx();
   }
 
   ALWAYS_INLINE void MOVE_RESULT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_11x(inst_data), ResultRegister()->GetI());
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void MOVE_RESULT_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), ResultRegister()->GetJ());
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void MOVE_RESULT_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE_SAVE(ResultRegister());
     shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), ResultRegister()->GetL());
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void MOVE_EXCEPTION() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     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);
@@ -378,10 +412,11 @@
   }
 
   ALWAYS_INLINE void RETURN_VOID_NO_BARRIER() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     JValue result;
     self->AllowThreadSuspension();
-    HANDLE_MONITOR_CHECKS();
+    if (!HandleMonitorChecks()) {
+      return;
+    }
     if (UNLIKELY(NeedsMethodExitEvent(instrumentation) &&
                  !SendMethodExitEvents(self,
                                        instrumentation,
@@ -390,7 +425,9 @@
                                        shadow_frame.GetMethod(),
                                        inst->GetDexPc(Insns()),
                                        result))) {
-      HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr);
+      if (!HandlePendingExceptionWithInstrumentation(nullptr)) {
+        return;
+      }
     }
     if (ctx->interpret_one_instruction) {
       /* Signal mterp to return to caller */
@@ -401,11 +438,12 @@
   }
 
   ALWAYS_INLINE void RETURN_VOID() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     QuasiAtomic::ThreadFenceForConstructor();
     JValue result;
     self->AllowThreadSuspension();
-    HANDLE_MONITOR_CHECKS();
+    if (!HandleMonitorChecks()) {
+      return;
+    }
     if (UNLIKELY(NeedsMethodExitEvent(instrumentation) &&
                  !SendMethodExitEvents(self,
                                        instrumentation,
@@ -414,7 +452,9 @@
                                        shadow_frame.GetMethod(),
                                        inst->GetDexPc(Insns()),
                                        result))) {
-      HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr);
+      if (!HandlePendingExceptionWithInstrumentation(nullptr)) {
+        return;
+      }
     }
     if (ctx->interpret_one_instruction) {
       /* Signal mterp to return to caller */
@@ -425,12 +465,13 @@
   }
 
   ALWAYS_INLINE void RETURN() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     JValue result;
     result.SetJ(0);
     result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data)));
     self->AllowThreadSuspension();
-    HANDLE_MONITOR_CHECKS();
+    if (!HandleMonitorChecks()) {
+      return;
+    }
     if (UNLIKELY(NeedsMethodExitEvent(instrumentation) &&
                  !SendMethodExitEvents(self,
                                        instrumentation,
@@ -439,7 +480,9 @@
                                        shadow_frame.GetMethod(),
                                        inst->GetDexPc(Insns()),
                                        result))) {
-      HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr);
+      if (!HandlePendingExceptionWithInstrumentation(nullptr)) {
+        return;
+      }
     }
     if (ctx->interpret_one_instruction) {
       /* Signal mterp to return to caller */
@@ -450,11 +493,12 @@
   }
 
   ALWAYS_INLINE void RETURN_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     JValue result;
     result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data)));
     self->AllowThreadSuspension();
-    HANDLE_MONITOR_CHECKS();
+    if (!HandleMonitorChecks()) {
+      return;
+    }
     if (UNLIKELY(NeedsMethodExitEvent(instrumentation) &&
                  !SendMethodExitEvents(self,
                                        instrumentation,
@@ -463,7 +507,9 @@
                                        shadow_frame.GetMethod(),
                                        inst->GetDexPc(Insns()),
                                        result))) {
-      HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr);
+      if (!HandlePendingExceptionWithInstrumentation(nullptr)) {
+        return;
+      }
     }
     if (ctx->interpret_one_instruction) {
       /* Signal mterp to return to caller */
@@ -474,10 +520,11 @@
   }
 
   ALWAYS_INLINE void RETURN_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     JValue result;
     self->AllowThreadSuspension();
-    HANDLE_MONITOR_CHECKS();
+    if (!HandleMonitorChecks()) {
+      return;
+    }
     const size_t ref_idx = inst->VRegA_11x(inst_data);
     ObjPtr<mirror::Object> obj_result = shadow_frame.GetVRegReference(ref_idx);
     if (do_assignability_check && obj_result != nullptr) {
@@ -507,7 +554,9 @@
                                        shadow_frame.GetMethod(),
                                        inst->GetDexPc(Insns()),
                                        result))) {
-      HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr);
+      if (!HandlePendingExceptionWithInstrumentation(nullptr)) {
+        return;
+      }
     }
     // Re-load since it might have moved during the MethodExitEvent.
     result.SetL(shadow_frame.GetVRegReference(ref_idx));
@@ -520,7 +569,6 @@
   }
 
   ALWAYS_INLINE void CONST_4() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t dst = inst->VRegA_11n(inst_data);
     int4_t val = inst->VRegB_11n(inst_data);
     shadow_frame.SetVReg(dst, val);
@@ -531,7 +579,6 @@
   }
 
   ALWAYS_INLINE void CONST_16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint8_t dst = inst->VRegA_21s(inst_data);
     int16_t val = inst->VRegB_21s();
     shadow_frame.SetVReg(dst, val);
@@ -542,7 +589,6 @@
   }
 
   ALWAYS_INLINE void CONST() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint8_t dst = inst->VRegA_31i(inst_data);
     int32_t val = inst->VRegB_31i();
     shadow_frame.SetVReg(dst, val);
@@ -553,7 +599,6 @@
   }
 
   ALWAYS_INLINE void CONST_HIGH16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint8_t dst = inst->VRegA_21h(inst_data);
     int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16);
     shadow_frame.SetVReg(dst, val);
@@ -564,32 +609,27 @@
   }
 
   ALWAYS_INLINE void CONST_WIDE_16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s());
     inst = inst->Next_2xx();
   }
 
   ALWAYS_INLINE void CONST_WIDE_32() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i());
     inst = inst->Next_3xx();
   }
 
   ALWAYS_INLINE void CONST_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l());
     inst = inst->Next_51l();
   }
 
   ALWAYS_INLINE void CONST_WIDE_HIGH16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data),
                              static_cast<uint64_t>(inst->VRegB_21h()) << 48);
     inst = inst->Next_2xx();
   }
 
   ALWAYS_INLINE void CONST_STRING() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::String> s = ResolveString(self,
                                              shadow_frame,
                                              dex::StringIndex(inst->VRegB_21c()));
@@ -602,7 +642,6 @@
   }
 
   ALWAYS_INLINE void CONST_STRING_JUMBO() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::String> s = ResolveString(self,
                                              shadow_frame,
                                              dex::StringIndex(inst->VRegB_31c()));
@@ -615,7 +654,6 @@
   }
 
   ALWAYS_INLINE void CONST_CLASS() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()),
                                                      shadow_frame.GetMethod(),
                                                      self,
@@ -630,7 +668,6 @@
   }
 
   ALWAYS_INLINE void CONST_METHOD_HANDLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ClassLinker* cl = Runtime::Current()->GetClassLinker();
     ObjPtr<mirror::MethodHandle> mh = cl->ResolveMethodHandle(self,
                                                               inst->VRegB_21c(),
@@ -644,7 +681,6 @@
   }
 
   ALWAYS_INLINE void CONST_METHOD_TYPE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ClassLinker* cl = Runtime::Current()->GetClassLinker();
     ObjPtr<mirror::MethodType> mt = cl->ResolveMethodType(self,
                                                           dex::ProtoIndex(inst->VRegB_21c()),
@@ -658,8 +694,9 @@
   }
 
   ALWAYS_INLINE void MONITOR_ENTER() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
-    HANDLE_ASYNC_EXCEPTION();
+    if (!HandleAsyncException()) {
+      return;
+    }
     ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
     if (UNLIKELY(obj == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -671,8 +708,9 @@
   }
 
   ALWAYS_INLINE void MONITOR_EXIT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
-    HANDLE_ASYNC_EXCEPTION();
+    if (!HandleAsyncException()) {
+      return;
+    }
     ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
     if (UNLIKELY(obj == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -684,7 +722,6 @@
   }
 
   ALWAYS_INLINE void CHECK_CAST() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()),
                                                      shadow_frame.GetMethod(),
                                                      self,
@@ -704,7 +741,6 @@
   }
 
   ALWAYS_INLINE void INSTANCE_OF() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegC_22c()),
                                                      shadow_frame.GetMethod(),
                                                      self,
@@ -721,7 +757,6 @@
   }
 
   ALWAYS_INLINE void ARRAY_LENGTH() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data));
     if (UNLIKELY(array == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -733,7 +768,6 @@
   }
 
   ALWAYS_INLINE void NEW_INSTANCE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> obj = nullptr;
     ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()),
                                                      shadow_frame.GetMethod(),
@@ -768,7 +802,6 @@
   }
 
   ALWAYS_INLINE void NEW_ARRAY() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data));
     ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check, true>(
         dex::TypeIndex(inst->VRegC_22c()),
@@ -785,7 +818,6 @@
   }
 
   ALWAYS_INLINE void FILLED_NEW_ARRAY() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success =
         DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self,
                                                                      ResultRegister());
@@ -793,7 +825,6 @@
   }
 
   ALWAYS_INLINE void FILLED_NEW_ARRAY_RANGE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success =
         DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame,
                                                                     self, ResultRegister());
@@ -801,7 +832,6 @@
   }
 
   ALWAYS_INLINE void FILL_ARRAY_DATA() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     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);
@@ -817,8 +847,9 @@
   }
 
   ALWAYS_INLINE void THROW() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
-    HANDLE_ASYNC_EXCEPTION();
+    if (!HandleAsyncException()) {
+      return;
+    }
     ObjPtr<mirror::Object> exception =
         shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
     if (UNLIKELY(exception == nullptr)) {
@@ -836,46 +867,47 @@
   }
 
   ALWAYS_INLINE void GOTO() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
-    HANDLE_ASYNC_EXCEPTION();
+    if (!HandleAsyncException()) {
+      return;
+    }
     int8_t offset = inst->VRegA_10t(inst_data);
     BRANCH_INSTRUMENTATION(offset);
     inst = inst->RelativeAt(offset);
-    HANDLE_BACKWARD_BRANCH(offset);
+    HandleBackwardBranch(offset);
   }
 
   ALWAYS_INLINE void GOTO_16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
-    HANDLE_ASYNC_EXCEPTION();
+    if (!HandleAsyncException()) {
+      return;
+    }
     int16_t offset = inst->VRegA_20t();
     BRANCH_INSTRUMENTATION(offset);
     inst = inst->RelativeAt(offset);
-    HANDLE_BACKWARD_BRANCH(offset);
+    HandleBackwardBranch(offset);
   }
 
   ALWAYS_INLINE void GOTO_32() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
-    HANDLE_ASYNC_EXCEPTION();
+    if (!HandleAsyncException()) {
+      return;
+    }
     int32_t offset = inst->VRegA_30t();
     BRANCH_INSTRUMENTATION(offset);
     inst = inst->RelativeAt(offset);
-    HANDLE_BACKWARD_BRANCH(offset);
+    HandleBackwardBranch(offset);
   }
 
   ALWAYS_INLINE void PACKED_SWITCH() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data);
     BRANCH_INSTRUMENTATION(offset);
     inst = inst->RelativeAt(offset);
-    HANDLE_BACKWARD_BRANCH(offset);
+    HandleBackwardBranch(offset);
   }
 
   ALWAYS_INLINE void SPARSE_SWITCH() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data);
     BRANCH_INSTRUMENTATION(offset);
     inst = inst->RelativeAt(offset);
-    HANDLE_BACKWARD_BRANCH(offset);
+    HandleBackwardBranch(offset);
   }
 
 #pragma clang diagnostic push
@@ -883,7 +915,6 @@
 
 
   ALWAYS_INLINE void CMPL_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
     float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
     int32_t result;
@@ -899,7 +930,6 @@
   }
 
   ALWAYS_INLINE void CMPG_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
     float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
     int32_t result;
@@ -915,7 +945,6 @@
   }
 
   ALWAYS_INLINE void CMPL_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
     double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
     int32_t result;
@@ -932,7 +961,6 @@
 
 
   ALWAYS_INLINE void CMPG_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
     double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
     int32_t result;
@@ -951,7 +979,6 @@
 
 
   ALWAYS_INLINE void CMP_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x());
     int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x());
     int32_t result;
@@ -967,13 +994,12 @@
   }
 
   ALWAYS_INLINE void IF_EQ() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) ==
         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
       int16_t offset = inst->VRegC_22t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -981,13 +1007,12 @@
   }
 
   ALWAYS_INLINE void IF_NE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) !=
         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
       int16_t offset = inst->VRegC_22t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -995,13 +1020,12 @@
   }
 
   ALWAYS_INLINE void IF_LT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <
         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
       int16_t offset = inst->VRegC_22t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1009,13 +1033,12 @@
   }
 
   ALWAYS_INLINE void IF_GE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >=
         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
       int16_t offset = inst->VRegC_22t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1023,13 +1046,12 @@
   }
 
   ALWAYS_INLINE void IF_GT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >
     shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
       int16_t offset = inst->VRegC_22t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1037,13 +1059,12 @@
   }
 
   ALWAYS_INLINE void IF_LE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <=
         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
       int16_t offset = inst->VRegC_22t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1051,12 +1072,11 @@
   }
 
   ALWAYS_INLINE void IF_EQZ() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) {
       int16_t offset = inst->VRegB_21t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1064,12 +1084,11 @@
   }
 
   ALWAYS_INLINE void IF_NEZ() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) {
       int16_t offset = inst->VRegB_21t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1077,12 +1096,11 @@
   }
 
   ALWAYS_INLINE void IF_LTZ() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) {
       int16_t offset = inst->VRegB_21t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1090,12 +1108,11 @@
   }
 
   ALWAYS_INLINE void IF_GEZ() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) {
       int16_t offset = inst->VRegB_21t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1103,12 +1120,11 @@
   }
 
   ALWAYS_INLINE void IF_GTZ() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) {
       int16_t offset = inst->VRegB_21t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1116,12 +1132,11 @@
   }
 
   ALWAYS_INLINE void IF_LEZ() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) {
       int16_t offset = inst->VRegB_21t();
       BRANCH_INSTRUMENTATION(offset);
       inst = inst->RelativeAt(offset);
-      HANDLE_BACKWARD_BRANCH(offset);
+      HandleBackwardBranch(offset);
     } else {
       BRANCH_INSTRUMENTATION(2);
       inst = inst->Next_2xx();
@@ -1129,7 +1144,6 @@
   }
 
   ALWAYS_INLINE void AGET_BOOLEAN() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1146,7 +1160,6 @@
   }
 
   ALWAYS_INLINE void AGET_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1163,7 +1176,6 @@
   }
 
   ALWAYS_INLINE void AGET_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1180,7 +1192,6 @@
   }
 
   ALWAYS_INLINE void AGET_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1197,7 +1208,6 @@
   }
 
   ALWAYS_INLINE void AGET() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1215,7 +1225,6 @@
   }
 
   ALWAYS_INLINE void AGET_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1233,7 +1242,6 @@
   }
 
   ALWAYS_INLINE void AGET_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1250,7 +1258,6 @@
   }
 
   ALWAYS_INLINE void APUT_BOOLEAN() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1268,7 +1275,6 @@
   }
 
   ALWAYS_INLINE void APUT_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1286,7 +1292,6 @@
   }
 
   ALWAYS_INLINE void APUT_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1304,7 +1309,6 @@
   }
 
   ALWAYS_INLINE void APUT_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1322,7 +1326,6 @@
   }
 
   ALWAYS_INLINE void APUT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1341,7 +1344,6 @@
   }
 
   ALWAYS_INLINE void APUT_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1360,7 +1362,6 @@
   }
 
   ALWAYS_INLINE void APUT_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
     if (UNLIKELY(a == nullptr)) {
       ThrowNullPointerExceptionFromInterpreter();
@@ -1378,378 +1379,323 @@
   }
 
   ALWAYS_INLINE void IGET_BOOLEAN() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(
         self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(
         self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(
         self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(
         self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(
         self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(
         self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(
         self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_WIDE_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_OBJECT_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_BOOLEAN_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_BYTE_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_CHAR_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IGET_SHORT_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SGET_BOOLEAN() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SGET_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SGET_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SGET_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SGET() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SGET_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SGET_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_BOOLEAN() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>(
         shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_BOOLEAN_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>(
         shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_BYTE_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>(
         shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_CHAR_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>(
         shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_SHORT_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>(
         shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_WIDE_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>(
         shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void IPUT_OBJECT_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>(
         shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SPUT_BOOLEAN() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SPUT_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SPUT_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SPUT_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SPUT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SPUT_WIDE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void SPUT_OBJECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check,
         transaction_active>(self, shadow_frame, inst, inst_data);
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void INVOKE_VIRTUAL() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kVirtual, false, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_VIRTUAL_RANGE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kVirtual, true, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_SUPER() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kSuper, false, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_SUPER_RANGE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kSuper, true, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_DIRECT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kDirect, false, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_DIRECT_RANGE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kDirect, true, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_INTERFACE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kInterface, false, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_INTERFACE_RANGE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kInterface, true, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_STATIC() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kStatic, false, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_STATIC_RANGE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kStatic, true, do_access_check, /*is_mterp=*/ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_VIRTUAL_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kVirtual, false, do_access_check, /*is_mterp=*/ false,
         /*is_quick=*/ true>(self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_VIRTUAL_RANGE_QUICK() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoInvoke<kVirtual, true, do_access_check, /*is_mterp=*/ false,
         /*is_quick=*/ true>(self, shadow_frame, inst, inst_data, ResultRegister());
     POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE(!success);
   }
 
   ALWAYS_INLINE void INVOKE_POLYMORPHIC() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     DCHECK(Runtime::Current()->IsMethodHandlesEnabled());
     bool success = DoInvokePolymorphic</* is_range= */ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
@@ -1757,7 +1703,6 @@
   }
 
   ALWAYS_INLINE void INVOKE_POLYMORPHIC_RANGE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     DCHECK(Runtime::Current()->IsMethodHandlesEnabled());
     bool success = DoInvokePolymorphic</* is_range= */ true>(
         self, shadow_frame, inst, inst_data, ResultRegister());
@@ -1765,7 +1710,6 @@
   }
 
   ALWAYS_INLINE void INVOKE_CUSTOM() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     DCHECK(Runtime::Current()->IsMethodHandlesEnabled());
     bool success = DoInvokeCustom</* is_range= */ false>(
         self, shadow_frame, inst, inst_data, ResultRegister());
@@ -1773,7 +1717,6 @@
   }
 
   ALWAYS_INLINE void INVOKE_CUSTOM_RANGE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     DCHECK(Runtime::Current()->IsMethodHandlesEnabled());
     bool success = DoInvokeCustom</* is_range= */ true>(
         self, shadow_frame, inst, inst_data, ResultRegister());
@@ -1781,91 +1724,78 @@
   }
 
   ALWAYS_INLINE void NEG_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(
         inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void NOT_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(
         inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void NEG_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(
         inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void NOT_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(
         inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void NEG_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(
         inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void NEG_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(
         inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void INT_TO_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
                              shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void INT_TO_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
                               shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void INT_TO_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
                                shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void LONG_TO_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
                          shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void LONG_TO_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
                               shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void LONG_TO_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
                                shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void FLOAT_TO_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
     int32_t result = art_float_to_integral<int32_t, float>(val);
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
@@ -1873,7 +1803,6 @@
   }
 
   ALWAYS_INLINE void FLOAT_TO_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
     int64_t result = art_float_to_integral<int64_t, float>(val);
     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
@@ -1881,14 +1810,12 @@
   }
 
   ALWAYS_INLINE void FLOAT_TO_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
                                shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void DOUBLE_TO_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
     int32_t result = art_float_to_integral<int32_t, double>(val);
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
@@ -1896,7 +1823,6 @@
   }
 
   ALWAYS_INLINE void DOUBLE_TO_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
     int64_t result = art_float_to_integral<int64_t, double>(val);
     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
@@ -1904,35 +1830,30 @@
   }
 
   ALWAYS_INLINE void DOUBLE_TO_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
                               shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void INT_TO_BYTE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>(
         shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void INT_TO_CHAR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>(
         shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void INT_TO_SHORT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>(
         shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
     inst = inst->Next_1xx();
   }
 
   ALWAYS_INLINE void ADD_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
                          SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()),
                                  shadow_frame.GetVReg(inst->VRegC_23x())));
@@ -1940,7 +1861,6 @@
   }
 
   ALWAYS_INLINE void SUB_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
                          SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()),
                                  shadow_frame.GetVReg(inst->VRegC_23x())));
@@ -1948,7 +1868,6 @@
   }
 
   ALWAYS_INLINE void MUL_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
                          SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()),
                                  shadow_frame.GetVReg(inst->VRegC_23x())));
@@ -1956,7 +1875,6 @@
   }
 
   ALWAYS_INLINE void DIV_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data),
                                shadow_frame.GetVReg(inst->VRegB_23x()),
                                shadow_frame.GetVReg(inst->VRegC_23x()));
@@ -1964,7 +1882,6 @@
   }
 
   ALWAYS_INLINE void REM_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data),
                                   shadow_frame.GetVReg(inst->VRegB_23x()),
                                   shadow_frame.GetVReg(inst->VRegC_23x()));
@@ -1972,7 +1889,6 @@
   }
 
   ALWAYS_INLINE void SHL_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_23x()) <<
                          (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
@@ -1980,7 +1896,6 @@
   }
 
   ALWAYS_INLINE void SHR_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_23x()) >>
                          (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
@@ -1988,7 +1903,6 @@
   }
 
   ALWAYS_INLINE void USHR_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     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));
@@ -1996,7 +1910,6 @@
   }
 
   ALWAYS_INLINE void AND_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_23x()) &
                          shadow_frame.GetVReg(inst->VRegC_23x()));
@@ -2004,7 +1917,6 @@
   }
 
   ALWAYS_INLINE void OR_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_23x()) |
                          shadow_frame.GetVReg(inst->VRegC_23x()));
@@ -2012,7 +1924,6 @@
   }
 
   ALWAYS_INLINE void XOR_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_23x()) ^
                          shadow_frame.GetVReg(inst->VRegC_23x()));
@@ -2020,7 +1931,6 @@
   }
 
   ALWAYS_INLINE void ADD_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
                              SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()),
                                      shadow_frame.GetVRegLong(inst->VRegC_23x())));
@@ -2028,7 +1938,6 @@
   }
 
   ALWAYS_INLINE void SUB_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
                              SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()),
                                      shadow_frame.GetVRegLong(inst->VRegC_23x())));
@@ -2036,7 +1945,6 @@
   }
 
   ALWAYS_INLINE void MUL_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
                              SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()),
                                      shadow_frame.GetVRegLong(inst->VRegC_23x())));
@@ -2044,7 +1952,6 @@
   }
 
   ALWAYS_INLINE void DIV_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data),
                  shadow_frame.GetVRegLong(inst->VRegB_23x()),
                  shadow_frame.GetVRegLong(inst->VRegC_23x()));
@@ -2052,7 +1959,6 @@
   }
 
   ALWAYS_INLINE void REM_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data),
                     shadow_frame.GetVRegLong(inst->VRegB_23x()),
                     shadow_frame.GetVRegLong(inst->VRegC_23x()));
@@ -2060,7 +1966,6 @@
   }
 
   ALWAYS_INLINE void AND_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
                              shadow_frame.GetVRegLong(inst->VRegB_23x()) &
                              shadow_frame.GetVRegLong(inst->VRegC_23x()));
@@ -2068,7 +1973,6 @@
   }
 
   ALWAYS_INLINE void OR_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
                              shadow_frame.GetVRegLong(inst->VRegB_23x()) |
                              shadow_frame.GetVRegLong(inst->VRegC_23x()));
@@ -2076,7 +1980,6 @@
   }
 
   ALWAYS_INLINE void XOR_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
                              shadow_frame.GetVRegLong(inst->VRegB_23x()) ^
                              shadow_frame.GetVRegLong(inst->VRegC_23x()));
@@ -2084,7 +1987,6 @@
   }
 
   ALWAYS_INLINE void SHL_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
                              shadow_frame.GetVRegLong(inst->VRegB_23x()) <<
                              (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
@@ -2092,7 +1994,6 @@
   }
 
   ALWAYS_INLINE void SHR_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
                              shadow_frame.GetVRegLong(inst->VRegB_23x()) >>
                              (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
@@ -2100,7 +2001,6 @@
   }
 
   ALWAYS_INLINE void USHR_LONG() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     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));
@@ -2108,7 +2008,6 @@
   }
 
   ALWAYS_INLINE void ADD_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
                               shadow_frame.GetVRegFloat(inst->VRegB_23x()) +
                               shadow_frame.GetVRegFloat(inst->VRegC_23x()));
@@ -2116,7 +2015,6 @@
   }
 
   ALWAYS_INLINE void SUB_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
                               shadow_frame.GetVRegFloat(inst->VRegB_23x()) -
                               shadow_frame.GetVRegFloat(inst->VRegC_23x()));
@@ -2124,7 +2022,6 @@
   }
 
   ALWAYS_INLINE void MUL_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
                               shadow_frame.GetVRegFloat(inst->VRegB_23x()) *
                               shadow_frame.GetVRegFloat(inst->VRegC_23x()));
@@ -2132,7 +2029,6 @@
   }
 
   ALWAYS_INLINE void DIV_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
                               shadow_frame.GetVRegFloat(inst->VRegB_23x()) /
                               shadow_frame.GetVRegFloat(inst->VRegC_23x()));
@@ -2140,7 +2036,6 @@
   }
 
   ALWAYS_INLINE void REM_FLOAT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
                               fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()),
                                     shadow_frame.GetVRegFloat(inst->VRegC_23x())));
@@ -2148,7 +2043,6 @@
   }
 
   ALWAYS_INLINE void ADD_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
                                shadow_frame.GetVRegDouble(inst->VRegB_23x()) +
                                shadow_frame.GetVRegDouble(inst->VRegC_23x()));
@@ -2156,7 +2050,6 @@
   }
 
   ALWAYS_INLINE void SUB_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
                                shadow_frame.GetVRegDouble(inst->VRegB_23x()) -
                                shadow_frame.GetVRegDouble(inst->VRegC_23x()));
@@ -2164,7 +2057,6 @@
   }
 
   ALWAYS_INLINE void MUL_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
                                shadow_frame.GetVRegDouble(inst->VRegB_23x()) *
                                shadow_frame.GetVRegDouble(inst->VRegC_23x()));
@@ -2172,7 +2064,6 @@
   }
 
   ALWAYS_INLINE void DIV_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
                                shadow_frame.GetVRegDouble(inst->VRegB_23x()) /
                                shadow_frame.GetVRegDouble(inst->VRegC_23x()));
@@ -2180,7 +2071,6 @@
   }
 
   ALWAYS_INLINE void REM_DOUBLE() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
                                fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()),
                                     shadow_frame.GetVRegDouble(inst->VRegC_23x())));
@@ -2188,7 +2078,6 @@
   }
 
   ALWAYS_INLINE void ADD_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     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))));
@@ -2196,7 +2085,6 @@
   }
 
   ALWAYS_INLINE void SUB_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVReg(vregA,
                          SafeSub(shadow_frame.GetVReg(vregA),
@@ -2205,7 +2093,6 @@
   }
 
   ALWAYS_INLINE void MUL_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVReg(vregA,
                          SafeMul(shadow_frame.GetVReg(vregA),
@@ -2214,7 +2101,6 @@
   }
 
   ALWAYS_INLINE void DIV_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     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)));
@@ -2222,7 +2108,6 @@
   }
 
   ALWAYS_INLINE void REM_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     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)));
@@ -2230,7 +2115,6 @@
   }
 
   ALWAYS_INLINE void SHL_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVReg(vregA,
                          shadow_frame.GetVReg(vregA) <<
@@ -2239,7 +2123,6 @@
   }
 
   ALWAYS_INLINE void SHR_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVReg(vregA,
                          shadow_frame.GetVReg(vregA) >>
@@ -2248,7 +2131,6 @@
   }
 
   ALWAYS_INLINE void USHR_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVReg(vregA,
                          static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >>
@@ -2257,7 +2139,6 @@
   }
 
   ALWAYS_INLINE void AND_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVReg(vregA,
                          shadow_frame.GetVReg(vregA) &
@@ -2266,7 +2147,6 @@
   }
 
   ALWAYS_INLINE void OR_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVReg(vregA,
                          shadow_frame.GetVReg(vregA) |
@@ -2275,7 +2155,6 @@
   }
 
   ALWAYS_INLINE void XOR_INT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVReg(vregA,
                          shadow_frame.GetVReg(vregA) ^
@@ -2284,7 +2163,6 @@
   }
 
   ALWAYS_INLINE void ADD_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              SafeAdd(shadow_frame.GetVRegLong(vregA),
@@ -2293,7 +2171,6 @@
   }
 
   ALWAYS_INLINE void SUB_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              SafeSub(shadow_frame.GetVRegLong(vregA),
@@ -2302,7 +2179,6 @@
   }
 
   ALWAYS_INLINE void MUL_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              SafeMul(shadow_frame.GetVRegLong(vregA),
@@ -2311,7 +2187,6 @@
   }
 
   ALWAYS_INLINE void DIV_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
                 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
@@ -2319,7 +2194,6 @@
   }
 
   ALWAYS_INLINE void REM_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
                     shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
@@ -2327,7 +2201,6 @@
   }
 
   ALWAYS_INLINE void AND_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              shadow_frame.GetVRegLong(vregA) &
@@ -2336,7 +2209,6 @@
   }
 
   ALWAYS_INLINE void OR_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              shadow_frame.GetVRegLong(vregA) |
@@ -2345,7 +2217,6 @@
   }
 
   ALWAYS_INLINE void XOR_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              shadow_frame.GetVRegLong(vregA) ^
@@ -2354,7 +2225,6 @@
   }
 
   ALWAYS_INLINE void SHL_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              shadow_frame.GetVRegLong(vregA) <<
@@ -2363,7 +2233,6 @@
   }
 
   ALWAYS_INLINE void SHR_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              shadow_frame.GetVRegLong(vregA) >>
@@ -2372,7 +2241,6 @@
   }
 
   ALWAYS_INLINE void USHR_LONG_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegLong(vregA,
                              static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >>
@@ -2381,7 +2249,6 @@
   }
 
   ALWAYS_INLINE void ADD_FLOAT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegFloat(vregA,
                               shadow_frame.GetVRegFloat(vregA) +
@@ -2390,7 +2257,6 @@
   }
 
   ALWAYS_INLINE void SUB_FLOAT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegFloat(vregA,
                               shadow_frame.GetVRegFloat(vregA) -
@@ -2399,7 +2265,6 @@
   }
 
   ALWAYS_INLINE void MUL_FLOAT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegFloat(vregA,
                               shadow_frame.GetVRegFloat(vregA) *
@@ -2408,7 +2273,6 @@
   }
 
   ALWAYS_INLINE void DIV_FLOAT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegFloat(vregA,
                               shadow_frame.GetVRegFloat(vregA) /
@@ -2417,7 +2281,6 @@
   }
 
   ALWAYS_INLINE void REM_FLOAT_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegFloat(vregA,
                               fmodf(shadow_frame.GetVRegFloat(vregA),
@@ -2426,7 +2289,6 @@
   }
 
   ALWAYS_INLINE void ADD_DOUBLE_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegDouble(vregA,
                                shadow_frame.GetVRegDouble(vregA) +
@@ -2435,7 +2297,6 @@
   }
 
   ALWAYS_INLINE void SUB_DOUBLE_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegDouble(vregA,
                                shadow_frame.GetVRegDouble(vregA) -
@@ -2444,7 +2305,6 @@
   }
 
   ALWAYS_INLINE void MUL_DOUBLE_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegDouble(vregA,
                                shadow_frame.GetVRegDouble(vregA) *
@@ -2453,7 +2313,6 @@
   }
 
   ALWAYS_INLINE void DIV_DOUBLE_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegDouble(vregA,
                                shadow_frame.GetVRegDouble(vregA) /
@@ -2462,7 +2321,6 @@
   }
 
   ALWAYS_INLINE void REM_DOUBLE_2ADDR() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     uint4_t vregA = inst->VRegA_12x(inst_data);
     shadow_frame.SetVRegDouble(vregA,
                                fmod(shadow_frame.GetVRegDouble(vregA),
@@ -2471,7 +2329,6 @@
   }
 
   ALWAYS_INLINE void ADD_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
                          SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
                                  inst->VRegC_22s()));
@@ -2479,7 +2336,6 @@
   }
 
   ALWAYS_INLINE void RSUB_INT() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
                          SafeSub(inst->VRegC_22s(),
                                  shadow_frame.GetVReg(inst->VRegB_22s(inst_data))));
@@ -2487,7 +2343,6 @@
   }
 
   ALWAYS_INLINE void MUL_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
                          SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
                                  inst->VRegC_22s()));
@@ -2495,7 +2350,6 @@
   }
 
   ALWAYS_INLINE void DIV_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data),
                                shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
                                inst->VRegC_22s());
@@ -2503,7 +2357,6 @@
   }
 
   ALWAYS_INLINE void REM_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data),
                                   shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
                                   inst->VRegC_22s());
@@ -2511,7 +2364,6 @@
   }
 
   ALWAYS_INLINE void AND_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) &
                          inst->VRegC_22s());
@@ -2519,7 +2371,6 @@
   }
 
   ALWAYS_INLINE void OR_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) |
                          inst->VRegC_22s());
@@ -2527,7 +2378,6 @@
   }
 
   ALWAYS_INLINE void XOR_INT_LIT16() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^
                          inst->VRegC_22s());
@@ -2535,42 +2385,36 @@
   }
 
   ALWAYS_INLINE void ADD_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()));
     inst = inst->Next_2xx();
   }
 
   ALWAYS_INLINE void RSUB_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b())));
     inst = inst->Next_2xx();
   }
 
   ALWAYS_INLINE void MUL_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()));
     inst = inst->Next_2xx();
   }
 
   ALWAYS_INLINE void DIV_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data),
                                shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void REM_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data),
                                   shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
   }
 
   ALWAYS_INLINE void AND_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22b()) &
                          inst->VRegC_22b());
@@ -2578,7 +2422,6 @@
   }
 
   ALWAYS_INLINE void OR_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22b()) |
                          inst->VRegC_22b());
@@ -2586,7 +2429,6 @@
   }
 
   ALWAYS_INLINE void XOR_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22b()) ^
                          inst->VRegC_22b());
@@ -2594,7 +2436,6 @@
   }
 
   ALWAYS_INLINE void SHL_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22b()) <<
                          (inst->VRegC_22b() & 0x1f));
@@ -2602,7 +2443,6 @@
   }
 
   ALWAYS_INLINE void SHR_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          shadow_frame.GetVReg(inst->VRegB_22b()) >>
                          (inst->VRegC_22b() & 0x1f));
@@ -2610,7 +2450,6 @@
   }
 
   ALWAYS_INLINE void USHR_INT_LIT8() REQUIRES_SHARED(Locks::mutator_lock_) {
-    PREAMBLE();
     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
                          static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >>
                          (inst->VRegC_22b() & 0x1f));
@@ -2712,20 +2551,11 @@
   bool& exit_interpreter_loop;
 };
 
-#undef HANDLE_BACKWARD_BRANCH
-#undef HANDLE_ASYNC_EXCEPTION
-#undef HOTNESS_UPDATE
 #undef BRANCH_INSTRUMENTATION
-#undef PREAMBLE
-#undef PREAMBLE_SAVE
-#undef HANDLE_MONITOR_CHECKS
 #undef POSSIBLY_HANDLE_PENDING_EXCEPTION
 #undef POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE
 #undef POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE_POLYMORPHIC
-#undef POSSIBLY_HANDLE_PENDING_EXCEPTION_ON_INVOKE_IMPL
 #undef HANDLE_PENDING_EXCEPTION
-#undef HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION
-#undef CHECK_FORCE_RETURN
 
 // TODO On ASAN builds this function gets a huge stack frame. Since normally we run in the mterp
 // this shouldn't cause any problems for stack overflow detection. Remove this once b/117341496 is
@@ -2763,8 +2593,10 @@
         bool exit_loop = false;                                                                   \
         InstructionHandler<do_access_check, transaction_active> handler(                          \
             ctx, instrumentation, self, shadow_frame, dex_pc, inst, inst_data, exit_loop);        \
-        /* TODO: Call PREAMBLE here, instead of explicitly in each handler */                     \
-        handler.OPCODE_NAME();                                                                    \
+        constexpr bool is_move_result_object = (OPCODE == Instruction::MOVE_RESULT_OBJECT);       \
+        if (handler.PreambleSave(is_move_result_object ? &ctx->result_register : nullptr)) {      \
+          handler.OPCODE_NAME();                                                                  \
+        }                                                                                         \
         /* TODO: Advance 'inst' here, instead of explicitly in each handler */                    \
         if (UNLIKELY(exit_loop)) {                                                                \
           return;                                                                                 \