• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #if !defined(__clang__)
18 // Clang 3.4 fails to build the goto interpreter implementation.
19 
20 
21 #include "base/stl_util.h"  // MakeUnique
22 #include "experimental_flags.h"
23 #include "interpreter_common.h"
24 #include "jit/jit.h"
25 #include "safe_math.h"
26 
27 #include <memory>  // std::unique_ptr
28 
29 namespace art {
30 namespace interpreter {
31 
32 // In the following macros, we expect the following local variables exist:
33 // - "self": the current Thread*.
34 // - "inst" : the current Instruction*.
35 // - "inst_data" : the current instruction's first 16 bits.
36 // - "dex_pc": the current pc.
37 // - "shadow_frame": the current shadow frame.
38 // - "currentHandlersTable": the current table of pointer to each instruction handler.
39 
40 // Advance to the next instruction and updates interpreter state.
41 #define ADVANCE(_offset)                                                    \
42   do {                                                                      \
43     int32_t disp = static_cast<int32_t>(_offset);                           \
44     inst = inst->RelativeAt(disp);                                          \
45     dex_pc = static_cast<uint32_t>(static_cast<int32_t>(dex_pc) + disp);    \
46     shadow_frame.SetDexPC(dex_pc);                                          \
47     TraceExecution(shadow_frame, inst, dex_pc);                             \
48     inst_data = inst->Fetch16(0);                                           \
49     goto *currentHandlersTable[inst->Opcode(inst_data)];                    \
50   } while (false)
51 
52 #define HANDLE_PENDING_EXCEPTION() goto exception_pending_label
53 
54 #define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _offset)   \
55   do {                                                                      \
56     if (UNLIKELY(_is_exception_pending)) {                                  \
57       HANDLE_PENDING_EXCEPTION();                                           \
58     } else {                                                                \
59       ADVANCE(_offset);                                                     \
60     }                                                                       \
61   } while (false)
62 
63 #define UPDATE_HANDLER_TABLE() \
64   currentHandlersTable = handlersTable[ \
65       Runtime::Current()->GetInstrumentation()->GetInterpreterHandlerTable()]
66 
67 #define BRANCH_INSTRUMENTATION(offset)                                                          \
68   do {                                                                                          \
69     if (UNLIKELY(instrumentation->HasBranchListeners())) {                                      \
70       instrumentation->Branch(self, method, dex_pc, offset);                                    \
71     }                                                                                           \
72     JValue result;                                                                              \
73     if (jit::Jit::MaybeDoOnStackReplacement(self, method, dex_pc, offset, &result)) {           \
74       return result;                                                                            \
75     }                                                                                           \
76   } while (false)
77 
78 #define HOTNESS_UPDATE()                                                                       \
79   do {                                                                                         \
80     if (jit != nullptr) {                                                                      \
81       jit->AddSamples(self, method, 1, /*with_backedges*/ true);                               \
82     }                                                                                          \
83   } while (false)
84 
85 #define UNREACHABLE_CODE_CHECK()                \
86   do {                                          \
87     if (kIsDebugBuild) {                        \
88       LOG(FATAL) << "We should not be here !";  \
89       UNREACHABLE();                            \
90     }                                           \
91   } while (false)
92 
93 #define HANDLE_INSTRUCTION_START(opcode) op_##opcode:  // NOLINT(whitespace/labels)
94 #define HANDLE_INSTRUCTION_END() UNREACHABLE_CODE_CHECK()
95 
96 // Use with instructions labeled with kExperimental flag:
97 #define HANDLE_EXPERIMENTAL_INSTRUCTION_START(opcode)                                             \
98   HANDLE_INSTRUCTION_START(opcode);                                                               \
99   DCHECK(inst->IsExperimental());                                                                 \
100   if (Runtime::Current()->AreExperimentalFlagsEnabled(ExperimentalFlags::kLambdas)) {
101 #define HANDLE_EXPERIMENTAL_INSTRUCTION_END()                                                     \
102   } else {                                                                                        \
103       UnexpectedOpcode(inst, shadow_frame);                                                       \
104   } HANDLE_INSTRUCTION_END();
105 
106 #define HANDLE_MONITOR_CHECKS()                                                                   \
107   if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) {                       \
108     HANDLE_PENDING_EXCEPTION();                                                                   \
109   }
110 
111 /**
112  * Interpreter based on computed goto tables.
113  *
114  * Each instruction is associated to a handler. This handler is responsible for executing the
115  * instruction and jump to the next instruction's handler.
116  * In order to limit the cost of instrumentation, we have two handler tables:
117  * - the "main" handler table: it contains handlers for normal execution of each instruction without
118  * handling of instrumentation.
119  * - the "alternative" handler table: it contains alternative handlers which first handle
120  * instrumentation before jumping to the corresponding "normal" instruction's handler.
121  *
122  * When instrumentation is active, the interpreter uses the "alternative" handler table. Otherwise
123  * it uses the "main" handler table.
124  *
125  * The current handler table is the handler table being used by the interpreter. It is updated:
126  * - on backward branch (goto, if and switch instructions)
127  * - after invoke
128  * - when an exception is thrown.
129  * This allows to support an attaching debugger to an already running application for instance.
130  *
131  * For a fast handler table update, handler tables are stored in an array of handler tables. Each
132  * handler table is represented by the InterpreterHandlerTable enum which allows to associate it
133  * to an index in this array of handler tables ((see Instrumentation::GetInterpreterHandlerTable).
134  *
135  * Here's the current layout of this array of handler tables:
136  *
137  * ---------------------+---------------+
138  *                      |     NOP       | (handler for NOP instruction)
139  *                      +---------------+
140  *       "main"         |     MOVE      | (handler for MOVE instruction)
141  *    handler table     +---------------+
142  *                      |      ...      |
143  *                      +---------------+
144  *                      |   UNUSED_FF   | (handler for UNUSED_FF instruction)
145  * ---------------------+---------------+
146  *                      |     NOP       | (alternative handler for NOP instruction)
147  *                      +---------------+
148  *    "alternative"     |     MOVE      | (alternative handler for MOVE instruction)
149  *    handler table     +---------------+
150  *                      |      ...      |
151  *                      +---------------+
152  *                      |   UNUSED_FF   | (alternative handler for UNUSED_FF instruction)
153  * ---------------------+---------------+
154  *
155  */
156 template<bool do_access_check, bool transaction_active>
ExecuteGotoImpl(Thread * self,const DexFile::CodeItem * code_item,ShadowFrame & shadow_frame,JValue result_register)157 JValue ExecuteGotoImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowFrame& shadow_frame,
158                        JValue result_register) {
159   // Define handler tables:
160   // - The main handler table contains execution handlers for each instruction.
161   // - The alternative handler table contains prelude handlers which check for thread suspend and
162   //   manage instrumentation before jumping to the execution handler.
163   static const void* const handlersTable[instrumentation::kNumHandlerTables][kNumPackedOpcodes] = {
164     {
165     // Main handler table.
166 #define INSTRUCTION_HANDLER(o, code, n, f, r, i, a, v) &&op_##code,
167 #include "dex_instruction_list.h"
168       DEX_INSTRUCTION_LIST(INSTRUCTION_HANDLER)
169 #undef DEX_INSTRUCTION_LIST
170 #undef INSTRUCTION_HANDLER
171     }, {
172     // Alternative handler table.
173 #define INSTRUCTION_HANDLER(o, code, n, f, r, i, a, v) &&alt_op_##code,
174 #include "dex_instruction_list.h"
175       DEX_INSTRUCTION_LIST(INSTRUCTION_HANDLER)
176 #undef DEX_INSTRUCTION_LIST
177 #undef INSTRUCTION_HANDLER
178     }
179   };
180 
181   constexpr bool do_assignability_check = do_access_check;
182   if (UNLIKELY(!shadow_frame.HasReferenceArray())) {
183     LOG(FATAL) << "Invalid shadow frame for interpreter use";
184     return JValue();
185   }
186   self->VerifyStack();
187 
188   uint32_t dex_pc = shadow_frame.GetDexPC();
189   const Instruction* inst = Instruction::At(code_item->insns_ + dex_pc);
190   uint16_t inst_data;
191   const void* const* currentHandlersTable;
192   UPDATE_HANDLER_TABLE();
193   std::unique_ptr<lambda::ClosureBuilder> lambda_closure_builder;
194   size_t lambda_captured_variable_index = 0;
195   const auto* const instrumentation = Runtime::Current()->GetInstrumentation();
196   ArtMethod* method = shadow_frame.GetMethod();
197   jit::Jit* jit = Runtime::Current()->GetJit();
198 
199   // Jump to first instruction.
200   ADVANCE(0);
201   UNREACHABLE_CODE_CHECK();
202 
203   HANDLE_INSTRUCTION_START(NOP)
204     ADVANCE(1);
205   HANDLE_INSTRUCTION_END();
206 
207   HANDLE_INSTRUCTION_START(MOVE)
208     shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
209                          shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
210     ADVANCE(1);
211   HANDLE_INSTRUCTION_END();
212 
213   HANDLE_INSTRUCTION_START(MOVE_FROM16)
214     shadow_frame.SetVReg(inst->VRegA_22x(inst_data),
215                          shadow_frame.GetVReg(inst->VRegB_22x()));
216     ADVANCE(2);
217   HANDLE_INSTRUCTION_END();
218 
219   HANDLE_INSTRUCTION_START(MOVE_16)
220     shadow_frame.SetVReg(inst->VRegA_32x(),
221                          shadow_frame.GetVReg(inst->VRegB_32x()));
222     ADVANCE(3);
223   HANDLE_INSTRUCTION_END();
224 
225   HANDLE_INSTRUCTION_START(MOVE_WIDE)
226     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
227                              shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
228     ADVANCE(1);
229   HANDLE_INSTRUCTION_END();
230 
231   HANDLE_INSTRUCTION_START(MOVE_WIDE_FROM16)
232     shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data),
233                              shadow_frame.GetVRegLong(inst->VRegB_22x()));
234     ADVANCE(2);
235   HANDLE_INSTRUCTION_END();
236 
237   HANDLE_INSTRUCTION_START(MOVE_WIDE_16)
238     shadow_frame.SetVRegLong(inst->VRegA_32x(),
239                              shadow_frame.GetVRegLong(inst->VRegB_32x()));
240     ADVANCE(3);
241   HANDLE_INSTRUCTION_END();
242 
243   HANDLE_INSTRUCTION_START(MOVE_OBJECT)
244     shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data),
245                                   shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)));
246     ADVANCE(1);
247   HANDLE_INSTRUCTION_END();
248 
249   HANDLE_INSTRUCTION_START(MOVE_OBJECT_FROM16)
250     shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data),
251                                   shadow_frame.GetVRegReference(inst->VRegB_22x()));
252     ADVANCE(2);
253   HANDLE_INSTRUCTION_END();
254 
255   HANDLE_INSTRUCTION_START(MOVE_OBJECT_16)
256     shadow_frame.SetVRegReference(inst->VRegA_32x(),
257                                   shadow_frame.GetVRegReference(inst->VRegB_32x()));
258     ADVANCE(3);
259   HANDLE_INSTRUCTION_END();
260 
261   HANDLE_INSTRUCTION_START(MOVE_RESULT)
262     shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI());
263     ADVANCE(1);
264   HANDLE_INSTRUCTION_END();
265 
266   HANDLE_INSTRUCTION_START(MOVE_RESULT_WIDE)
267     shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ());
268     ADVANCE(1);
269   HANDLE_INSTRUCTION_END();
270 
271   HANDLE_INSTRUCTION_START(MOVE_RESULT_OBJECT)
272     shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL());
273     ADVANCE(1);
274   HANDLE_INSTRUCTION_END();
275 
276   HANDLE_INSTRUCTION_START(MOVE_EXCEPTION) {
277     Throwable* exception = self->GetException();
278     DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction";
279     shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception);
280     self->ClearException();
281     ADVANCE(1);
282   }
283   HANDLE_INSTRUCTION_END();
284 
285   HANDLE_INSTRUCTION_START(RETURN_VOID_NO_BARRIER) {
286     JValue result;
287     self->AllowThreadSuspension();
288     HANDLE_MONITOR_CHECKS();
289     if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
290       instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
291                                        shadow_frame.GetMethod(), dex_pc,
292                                        result);
293     }
294     return result;
295   }
296   HANDLE_INSTRUCTION_END();
297 
298   HANDLE_INSTRUCTION_START(RETURN_VOID) {
299     QuasiAtomic::ThreadFenceForConstructor();
300     JValue result;
301     self->AllowThreadSuspension();
302     HANDLE_MONITOR_CHECKS();
303     if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
304       instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
305                                        shadow_frame.GetMethod(), dex_pc,
306                                        result);
307     }
308     return result;
309   }
310   HANDLE_INSTRUCTION_END();
311 
312   HANDLE_INSTRUCTION_START(RETURN) {
313     JValue result;
314     result.SetJ(0);
315     result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data)));
316     self->AllowThreadSuspension();
317     HANDLE_MONITOR_CHECKS();
318     if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
319       instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
320                                        shadow_frame.GetMethod(), dex_pc,
321                                        result);
322     }
323     return result;
324   }
325   HANDLE_INSTRUCTION_END();
326 
327   HANDLE_INSTRUCTION_START(RETURN_WIDE) {
328     JValue result;
329     result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data)));
330     self->AllowThreadSuspension();
331     HANDLE_MONITOR_CHECKS();
332     if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
333       instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
334                                        shadow_frame.GetMethod(), dex_pc,
335                                        result);
336     }
337     return result;
338   }
339   HANDLE_INSTRUCTION_END();
340 
341   HANDLE_INSTRUCTION_START(RETURN_OBJECT) {
342     JValue result;
343     self->AllowThreadSuspension();
344     HANDLE_MONITOR_CHECKS();
345     const uint8_t vreg_index = inst->VRegA_11x(inst_data);
346     Object* obj_result = shadow_frame.GetVRegReference(vreg_index);
347     if (do_assignability_check && obj_result != nullptr) {
348       size_t pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
349       Class* return_type = shadow_frame.GetMethod()->GetReturnType(true /* resolve */,
350                                                                    pointer_size);
351       obj_result = shadow_frame.GetVRegReference(vreg_index);
352       if (return_type == nullptr) {
353         // Return the pending exception.
354         HANDLE_PENDING_EXCEPTION();
355       }
356       if (!obj_result->VerifierInstanceOf(return_type)) {
357         // This should never happen.
358         std::string temp1, temp2;
359         self->ThrowNewExceptionF("Ljava/lang/VirtualMachineError;",
360                                  "Returning '%s' that is not instance of return type '%s'",
361                                  obj_result->GetClass()->GetDescriptor(&temp1),
362                                  return_type->GetDescriptor(&temp2));
363         HANDLE_PENDING_EXCEPTION();
364       }
365     }
366     result.SetL(obj_result);
367     if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
368       instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
369                                        shadow_frame.GetMethod(), dex_pc,
370                                        result);
371     }
372     return result;
373   }
374   HANDLE_INSTRUCTION_END();
375 
376   HANDLE_INSTRUCTION_START(CONST_4) {
377     uint32_t dst = inst->VRegA_11n(inst_data);
378     int32_t val = inst->VRegB_11n(inst_data);
379     shadow_frame.SetVReg(dst, val);
380     if (val == 0) {
381       shadow_frame.SetVRegReference(dst, nullptr);
382     }
383     ADVANCE(1);
384   }
385   HANDLE_INSTRUCTION_END();
386 
387   HANDLE_INSTRUCTION_START(CONST_16) {
388     uint32_t dst = inst->VRegA_21s(inst_data);
389     int32_t val = inst->VRegB_21s();
390     shadow_frame.SetVReg(dst, val);
391     if (val == 0) {
392       shadow_frame.SetVRegReference(dst, nullptr);
393     }
394     ADVANCE(2);
395   }
396   HANDLE_INSTRUCTION_END();
397 
398   HANDLE_INSTRUCTION_START(CONST) {
399     uint32_t dst = inst->VRegA_31i(inst_data);
400     int32_t val = inst->VRegB_31i();
401     shadow_frame.SetVReg(dst, val);
402     if (val == 0) {
403       shadow_frame.SetVRegReference(dst, nullptr);
404     }
405     ADVANCE(3);
406   }
407   HANDLE_INSTRUCTION_END();
408 
409   HANDLE_INSTRUCTION_START(CONST_HIGH16) {
410     uint32_t dst = inst->VRegA_21h(inst_data);
411     int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16);
412     shadow_frame.SetVReg(dst, val);
413     if (val == 0) {
414       shadow_frame.SetVRegReference(dst, nullptr);
415     }
416     ADVANCE(2);
417   }
418   HANDLE_INSTRUCTION_END();
419 
420   HANDLE_INSTRUCTION_START(CONST_WIDE_16)
421     shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s());
422     ADVANCE(2);
423   HANDLE_INSTRUCTION_END();
424 
425   HANDLE_INSTRUCTION_START(CONST_WIDE_32)
426     shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i());
427     ADVANCE(3);
428   HANDLE_INSTRUCTION_END();
429 
430   HANDLE_INSTRUCTION_START(CONST_WIDE)
431     shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l());
432     ADVANCE(5);
433   HANDLE_INSTRUCTION_END();
434 
435   HANDLE_INSTRUCTION_START(CONST_WIDE_HIGH16)
436     shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data),
437                              static_cast<uint64_t>(inst->VRegB_21h()) << 48);
438     ADVANCE(2);
439   HANDLE_INSTRUCTION_END();
440 
441   HANDLE_INSTRUCTION_START(CONST_STRING) {
442     String* s = ResolveString(self, shadow_frame, inst->VRegB_21c());
443     if (UNLIKELY(s == nullptr)) {
444       HANDLE_PENDING_EXCEPTION();
445     } else {
446       shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s);
447       ADVANCE(2);
448     }
449   }
450   HANDLE_INSTRUCTION_END();
451 
452   HANDLE_INSTRUCTION_START(CONST_STRING_JUMBO) {
453     String* s = ResolveString(self, shadow_frame, inst->VRegB_31c());
454     if (UNLIKELY(s == nullptr)) {
455       HANDLE_PENDING_EXCEPTION();
456     } else {
457       shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s);
458       ADVANCE(3);
459     }
460   }
461   HANDLE_INSTRUCTION_END();
462 
463   HANDLE_INSTRUCTION_START(CONST_CLASS) {
464     Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(),
465                                       self, false, do_access_check);
466     if (UNLIKELY(c == nullptr)) {
467       HANDLE_PENDING_EXCEPTION();
468     } else {
469       shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c);
470       ADVANCE(2);
471     }
472   }
473   HANDLE_INSTRUCTION_END();
474 
475   HANDLE_INSTRUCTION_START(MONITOR_ENTER) {
476     Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
477     if (UNLIKELY(obj == nullptr)) {
478       ThrowNullPointerExceptionFromInterpreter();
479       HANDLE_PENDING_EXCEPTION();
480     } else {
481       DoMonitorEnter<do_access_check>(self, &shadow_frame, obj);
482       POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), 1);
483     }
484   }
485   HANDLE_INSTRUCTION_END();
486 
487   HANDLE_INSTRUCTION_START(MONITOR_EXIT) {
488     Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
489     if (UNLIKELY(obj == nullptr)) {
490       ThrowNullPointerExceptionFromInterpreter();
491       HANDLE_PENDING_EXCEPTION();
492     } else {
493       DoMonitorExit<do_access_check>(self, &shadow_frame, obj);
494       POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), 1);
495     }
496   }
497   HANDLE_INSTRUCTION_END();
498 
499   HANDLE_INSTRUCTION_START(CHECK_CAST) {
500     Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(),
501                                       self, false, do_access_check);
502     if (UNLIKELY(c == nullptr)) {
503       HANDLE_PENDING_EXCEPTION();
504     } else {
505       Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data));
506       if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) {
507         ThrowClassCastException(c, obj->GetClass());
508         HANDLE_PENDING_EXCEPTION();
509       } else {
510         ADVANCE(2);
511       }
512     }
513   }
514   HANDLE_INSTRUCTION_END();
515 
516   HANDLE_INSTRUCTION_START(INSTANCE_OF) {
517     Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(),
518                                       self, false, do_access_check);
519     if (UNLIKELY(c == nullptr)) {
520       HANDLE_PENDING_EXCEPTION();
521     } else {
522       Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data));
523       shadow_frame.SetVReg(inst->VRegA_22c(inst_data), (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0);
524       ADVANCE(2);
525     }
526   }
527   HANDLE_INSTRUCTION_END();
528 
529   HANDLE_INSTRUCTION_START(ARRAY_LENGTH) {
530     Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data));
531     if (UNLIKELY(array == nullptr)) {
532       ThrowNullPointerExceptionFromInterpreter();
533       HANDLE_PENDING_EXCEPTION();
534     } else {
535       shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength());
536       ADVANCE(1);
537     }
538   }
539   HANDLE_INSTRUCTION_END();
540 
541   HANDLE_INSTRUCTION_START(NEW_INSTANCE) {
542     Object* obj = nullptr;
543     Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(),
544                                       self, false, do_access_check);
545     if (LIKELY(c != nullptr)) {
546       if (UNLIKELY(c->IsStringClass())) {
547         gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator();
548         mirror::SetStringCountVisitor visitor(0);
549         obj = String::Alloc<true>(self, 0, allocator_type, visitor);
550       } else {
551         obj = AllocObjectFromCode<do_access_check, true>(
552             inst->VRegB_21c(), shadow_frame.GetMethod(), self,
553             Runtime::Current()->GetHeap()->GetCurrentAllocator());
554       }
555     }
556     if (UNLIKELY(obj == nullptr)) {
557       HANDLE_PENDING_EXCEPTION();
558     } else {
559       obj->GetClass()->AssertInitializedOrInitializingInThread(self);
560       // Don't allow finalizable objects to be allocated during a transaction since these can't be
561       // finalized without a started runtime.
562       if (transaction_active && obj->GetClass()->IsFinalizable()) {
563         AbortTransactionF(self, "Allocating finalizable object in transaction: %s",
564                           PrettyTypeOf(obj).c_str());
565         HANDLE_PENDING_EXCEPTION();
566       }
567       shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj);
568       ADVANCE(2);
569     }
570   }
571   HANDLE_INSTRUCTION_END();
572 
573   HANDLE_INSTRUCTION_START(NEW_ARRAY) {
574     int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data));
575     Object* obj = AllocArrayFromCode<do_access_check, true>(
576         inst->VRegC_22c(), length, shadow_frame.GetMethod(), self,
577         Runtime::Current()->GetHeap()->GetCurrentAllocator());
578     if (UNLIKELY(obj == nullptr)) {
579       HANDLE_PENDING_EXCEPTION();
580     } else {
581       shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj);
582       ADVANCE(2);
583     }
584   }
585   HANDLE_INSTRUCTION_END();
586 
587   HANDLE_INSTRUCTION_START(FILLED_NEW_ARRAY) {
588     bool success =
589         DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame,
590                                                                      self, &result_register);
591     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
592   }
593   HANDLE_INSTRUCTION_END();
594 
595   HANDLE_INSTRUCTION_START(FILLED_NEW_ARRAY_RANGE) {
596     bool success =
597         DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame,
598                                                                     self, &result_register);
599     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
600   }
601   HANDLE_INSTRUCTION_END();
602 
603   HANDLE_INSTRUCTION_START(FILL_ARRAY_DATA) {
604     Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data));
605     const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t();
606     const Instruction::ArrayDataPayload* payload =
607         reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr);
608     bool success = FillArrayData(obj, payload);
609     if (transaction_active && success) {
610       RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count);
611     }
612     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
613   }
614   HANDLE_INSTRUCTION_END();
615 
616   HANDLE_INSTRUCTION_START(THROW) {
617     Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
618     if (UNLIKELY(exception == nullptr)) {
619       ThrowNullPointerException("throw with null exception");
620     } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) {
621       // This should never happen.
622       std::string temp;
623       self->ThrowNewExceptionF("Ljava/lang/VirtualMachineError;",
624                                "Throwing '%s' that is not instance of Throwable",
625                                exception->GetClass()->GetDescriptor(&temp));
626     } else {
627       self->SetException(exception->AsThrowable());
628     }
629     HANDLE_PENDING_EXCEPTION();
630   }
631   HANDLE_INSTRUCTION_END();
632 
633   HANDLE_INSTRUCTION_START(GOTO) {
634     int8_t offset = inst->VRegA_10t(inst_data);
635     BRANCH_INSTRUMENTATION(offset);
636     if (IsBackwardBranch(offset)) {
637       HOTNESS_UPDATE();
638       if (UNLIKELY(self->TestAllFlags())) {
639         self->CheckSuspend();
640         UPDATE_HANDLER_TABLE();
641       }
642     }
643     ADVANCE(offset);
644   }
645   HANDLE_INSTRUCTION_END();
646 
647   HANDLE_INSTRUCTION_START(GOTO_16) {
648     int16_t offset = inst->VRegA_20t();
649     BRANCH_INSTRUMENTATION(offset);
650     if (IsBackwardBranch(offset)) {
651       HOTNESS_UPDATE();
652       if (UNLIKELY(self->TestAllFlags())) {
653         self->CheckSuspend();
654         UPDATE_HANDLER_TABLE();
655       }
656     }
657     ADVANCE(offset);
658   }
659   HANDLE_INSTRUCTION_END();
660 
661   HANDLE_INSTRUCTION_START(GOTO_32) {
662     int32_t offset = inst->VRegA_30t();
663     BRANCH_INSTRUMENTATION(offset);
664     if (IsBackwardBranch(offset)) {
665       HOTNESS_UPDATE();
666       if (UNLIKELY(self->TestAllFlags())) {
667         self->CheckSuspend();
668         UPDATE_HANDLER_TABLE();
669       }
670     }
671     ADVANCE(offset);
672   }
673   HANDLE_INSTRUCTION_END();
674 
675   HANDLE_INSTRUCTION_START(PACKED_SWITCH) {
676     int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data);
677     BRANCH_INSTRUMENTATION(offset);
678     if (IsBackwardBranch(offset)) {
679       HOTNESS_UPDATE();
680       if (UNLIKELY(self->TestAllFlags())) {
681         self->CheckSuspend();
682         UPDATE_HANDLER_TABLE();
683       }
684     }
685     ADVANCE(offset);
686   }
687   HANDLE_INSTRUCTION_END();
688 
689   HANDLE_INSTRUCTION_START(SPARSE_SWITCH) {
690     int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data);
691     BRANCH_INSTRUMENTATION(offset);
692     if (IsBackwardBranch(offset)) {
693       HOTNESS_UPDATE();
694       if (UNLIKELY(self->TestAllFlags())) {
695         self->CheckSuspend();
696         UPDATE_HANDLER_TABLE();
697       }
698     }
699     ADVANCE(offset);
700   }
701   HANDLE_INSTRUCTION_END();
702 
703 #if defined(__clang__)
704 #pragma clang diagnostic push
705 #pragma clang diagnostic ignored "-Wfloat-equal"
706 #endif
707 
708   HANDLE_INSTRUCTION_START(CMPL_FLOAT) {
709     float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
710     float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
711     int32_t result;
712     if (val1 > val2) {
713       result = 1;
714     } else if (val1 == val2) {
715       result = 0;
716     } else {
717       result = -1;
718     }
719     shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
720     ADVANCE(2);
721   }
722   HANDLE_INSTRUCTION_END();
723 
724   HANDLE_INSTRUCTION_START(CMPG_FLOAT) {
725     float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
726     float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
727     int32_t result;
728     if (val1 < val2) {
729       result = -1;
730     } else if (val1 == val2) {
731       result = 0;
732     } else {
733       result = 1;
734     }
735     shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
736     ADVANCE(2);
737   }
738   HANDLE_INSTRUCTION_END();
739 
740   HANDLE_INSTRUCTION_START(CMPL_DOUBLE) {
741     double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
742     double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
743     int32_t result;
744     if (val1 > val2) {
745       result = 1;
746     } else if (val1 == val2) {
747       result = 0;
748     } else {
749       result = -1;
750     }
751     shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
752     ADVANCE(2);
753   }
754   HANDLE_INSTRUCTION_END();
755 
756   HANDLE_INSTRUCTION_START(CMPG_DOUBLE) {
757     double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
758     double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
759     int32_t result;
760     if (val1 < val2) {
761       result = -1;
762     } else if (val1 == val2) {
763       result = 0;
764     } else {
765       result = 1;
766     }
767     shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
768     ADVANCE(2);
769   }
770   HANDLE_INSTRUCTION_END();
771 
772 #if defined(__clang__)
773 #pragma clang diagnostic pop
774 #endif
775 
776   HANDLE_INSTRUCTION_START(CMP_LONG) {
777     int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x());
778     int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x());
779     int32_t result;
780     if (val1 > val2) {
781       result = 1;
782     } else if (val1 == val2) {
783       result = 0;
784     } else {
785       result = -1;
786     }
787     shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
788     ADVANCE(2);
789   }
790   HANDLE_INSTRUCTION_END();
791 
792   HANDLE_INSTRUCTION_START(IF_EQ) {
793     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
794       int16_t offset = inst->VRegC_22t();
795       BRANCH_INSTRUMENTATION(offset);
796       if (IsBackwardBranch(offset)) {
797         HOTNESS_UPDATE();
798         if (UNLIKELY(self->TestAllFlags())) {
799           self->CheckSuspend();
800           UPDATE_HANDLER_TABLE();
801         }
802       }
803       ADVANCE(offset);
804     } else {
805       BRANCH_INSTRUMENTATION(2);
806       ADVANCE(2);
807     }
808   }
809   HANDLE_INSTRUCTION_END();
810 
811   HANDLE_INSTRUCTION_START(IF_NE) {
812     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) !=
813         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
814       int16_t offset = inst->VRegC_22t();
815       BRANCH_INSTRUMENTATION(offset);
816       if (IsBackwardBranch(offset)) {
817         HOTNESS_UPDATE();
818         if (UNLIKELY(self->TestAllFlags())) {
819           self->CheckSuspend();
820           UPDATE_HANDLER_TABLE();
821         }
822       }
823       ADVANCE(offset);
824     } else {
825       BRANCH_INSTRUMENTATION(2);
826       ADVANCE(2);
827     }
828   }
829   HANDLE_INSTRUCTION_END();
830 
831   HANDLE_INSTRUCTION_START(IF_LT) {
832     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <
833         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
834       int16_t offset = inst->VRegC_22t();
835       BRANCH_INSTRUMENTATION(offset);
836       if (IsBackwardBranch(offset)) {
837         HOTNESS_UPDATE();
838         if (UNLIKELY(self->TestAllFlags())) {
839           self->CheckSuspend();
840           UPDATE_HANDLER_TABLE();
841         }
842       }
843       ADVANCE(offset);
844     } else {
845       BRANCH_INSTRUMENTATION(2);
846       ADVANCE(2);
847     }
848   }
849   HANDLE_INSTRUCTION_END();
850 
851   HANDLE_INSTRUCTION_START(IF_GE) {
852     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >=
853         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
854       int16_t offset = inst->VRegC_22t();
855       BRANCH_INSTRUMENTATION(offset);
856       if (IsBackwardBranch(offset)) {
857         HOTNESS_UPDATE();
858         if (UNLIKELY(self->TestAllFlags())) {
859           self->CheckSuspend();
860           UPDATE_HANDLER_TABLE();
861         }
862       }
863       ADVANCE(offset);
864     } else {
865       BRANCH_INSTRUMENTATION(2);
866       ADVANCE(2);
867     }
868   }
869   HANDLE_INSTRUCTION_END();
870 
871   HANDLE_INSTRUCTION_START(IF_GT) {
872     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >
873     shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
874       int16_t offset = inst->VRegC_22t();
875       BRANCH_INSTRUMENTATION(offset);
876       if (IsBackwardBranch(offset)) {
877         HOTNESS_UPDATE();
878         if (UNLIKELY(self->TestAllFlags())) {
879           self->CheckSuspend();
880           UPDATE_HANDLER_TABLE();
881         }
882       }
883       ADVANCE(offset);
884     } else {
885       BRANCH_INSTRUMENTATION(2);
886       ADVANCE(2);
887     }
888   }
889   HANDLE_INSTRUCTION_END();
890 
891   HANDLE_INSTRUCTION_START(IF_LE) {
892     if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <=
893         shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
894       int16_t offset = inst->VRegC_22t();
895       BRANCH_INSTRUMENTATION(offset);
896       if (IsBackwardBranch(offset)) {
897         HOTNESS_UPDATE();
898         if (UNLIKELY(self->TestAllFlags())) {
899           self->CheckSuspend();
900           UPDATE_HANDLER_TABLE();
901         }
902       }
903       ADVANCE(offset);
904     } else {
905       BRANCH_INSTRUMENTATION(2);
906       ADVANCE(2);
907     }
908   }
909   HANDLE_INSTRUCTION_END();
910 
911   HANDLE_INSTRUCTION_START(IF_EQZ) {
912     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) {
913       int16_t offset = inst->VRegB_21t();
914       BRANCH_INSTRUMENTATION(offset);
915       if (IsBackwardBranch(offset)) {
916         HOTNESS_UPDATE();
917         if (UNLIKELY(self->TestAllFlags())) {
918           self->CheckSuspend();
919           UPDATE_HANDLER_TABLE();
920         }
921       }
922       ADVANCE(offset);
923     } else {
924       BRANCH_INSTRUMENTATION(2);
925       ADVANCE(2);
926     }
927   }
928   HANDLE_INSTRUCTION_END();
929 
930   HANDLE_INSTRUCTION_START(IF_NEZ) {
931     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) {
932       int16_t offset = inst->VRegB_21t();
933       BRANCH_INSTRUMENTATION(offset);
934       if (IsBackwardBranch(offset)) {
935         HOTNESS_UPDATE();
936         if (UNLIKELY(self->TestAllFlags())) {
937           self->CheckSuspend();
938           UPDATE_HANDLER_TABLE();
939         }
940       }
941       ADVANCE(offset);
942     } else {
943       BRANCH_INSTRUMENTATION(2);
944       ADVANCE(2);
945     }
946   }
947   HANDLE_INSTRUCTION_END();
948 
949   HANDLE_INSTRUCTION_START(IF_LTZ) {
950     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) {
951       int16_t offset = inst->VRegB_21t();
952       BRANCH_INSTRUMENTATION(offset);
953       if (IsBackwardBranch(offset)) {
954         HOTNESS_UPDATE();
955         if (UNLIKELY(self->TestAllFlags())) {
956           self->CheckSuspend();
957           UPDATE_HANDLER_TABLE();
958         }
959       }
960       ADVANCE(offset);
961     } else {
962       BRANCH_INSTRUMENTATION(2);
963       ADVANCE(2);
964     }
965   }
966   HANDLE_INSTRUCTION_END();
967 
968   HANDLE_INSTRUCTION_START(IF_GEZ) {
969     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) {
970       int16_t offset = inst->VRegB_21t();
971       BRANCH_INSTRUMENTATION(offset);
972       if (IsBackwardBranch(offset)) {
973         HOTNESS_UPDATE();
974         if (UNLIKELY(self->TestAllFlags())) {
975           self->CheckSuspend();
976           UPDATE_HANDLER_TABLE();
977         }
978       }
979       ADVANCE(offset);
980     } else {
981       BRANCH_INSTRUMENTATION(2);
982       ADVANCE(2);
983     }
984   }
985   HANDLE_INSTRUCTION_END();
986 
987   HANDLE_INSTRUCTION_START(IF_GTZ) {
988     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) {
989       int16_t offset = inst->VRegB_21t();
990       BRANCH_INSTRUMENTATION(offset);
991       if (IsBackwardBranch(offset)) {
992         HOTNESS_UPDATE();
993         if (UNLIKELY(self->TestAllFlags())) {
994           self->CheckSuspend();
995           UPDATE_HANDLER_TABLE();
996         }
997       }
998       ADVANCE(offset);
999     } else {
1000       BRANCH_INSTRUMENTATION(2);
1001       ADVANCE(2);
1002     }
1003   }
1004   HANDLE_INSTRUCTION_END();
1005 
1006   HANDLE_INSTRUCTION_START(IF_LEZ)  {
1007     if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) {
1008       int16_t offset = inst->VRegB_21t();
1009       BRANCH_INSTRUMENTATION(offset);
1010       if (IsBackwardBranch(offset)) {
1011         HOTNESS_UPDATE();
1012         if (UNLIKELY(self->TestAllFlags())) {
1013           self->CheckSuspend();
1014           UPDATE_HANDLER_TABLE();
1015         }
1016       }
1017       ADVANCE(offset);
1018     } else {
1019       BRANCH_INSTRUMENTATION(2);
1020       ADVANCE(2);
1021     }
1022   }
1023   HANDLE_INSTRUCTION_END();
1024 
1025   HANDLE_INSTRUCTION_START(AGET_BOOLEAN) {
1026     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1027     if (UNLIKELY(a == nullptr)) {
1028       ThrowNullPointerExceptionFromInterpreter();
1029       HANDLE_PENDING_EXCEPTION();
1030     } else {
1031       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1032       BooleanArray* array = a->AsBooleanArray();
1033       if (LIKELY(array->CheckIsValidIndex(index))) {
1034         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
1035         ADVANCE(2);
1036       } else {
1037         HANDLE_PENDING_EXCEPTION();
1038       }
1039     }
1040   }
1041   HANDLE_INSTRUCTION_END();
1042 
1043   HANDLE_INSTRUCTION_START(AGET_BYTE) {
1044     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1045     if (UNLIKELY(a == nullptr)) {
1046       ThrowNullPointerExceptionFromInterpreter();
1047       HANDLE_PENDING_EXCEPTION();
1048     } else {
1049       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1050       ByteArray* array = a->AsByteArray();
1051       if (LIKELY(array->CheckIsValidIndex(index))) {
1052         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
1053         ADVANCE(2);
1054       } else {
1055         HANDLE_PENDING_EXCEPTION();
1056       }
1057     }
1058   }
1059   HANDLE_INSTRUCTION_END();
1060 
1061   HANDLE_INSTRUCTION_START(AGET_CHAR) {
1062     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1063     if (UNLIKELY(a == nullptr)) {
1064       ThrowNullPointerExceptionFromInterpreter();
1065       HANDLE_PENDING_EXCEPTION();
1066     } else {
1067       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1068       CharArray* array = a->AsCharArray();
1069       if (LIKELY(array->CheckIsValidIndex(index))) {
1070         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
1071         ADVANCE(2);
1072       } else {
1073         HANDLE_PENDING_EXCEPTION();
1074       }
1075     }
1076   }
1077   HANDLE_INSTRUCTION_END();
1078 
1079   HANDLE_INSTRUCTION_START(AGET_SHORT) {
1080     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1081     if (UNLIKELY(a == nullptr)) {
1082       ThrowNullPointerExceptionFromInterpreter();
1083       HANDLE_PENDING_EXCEPTION();
1084     } else {
1085       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1086       ShortArray* array = a->AsShortArray();
1087       if (LIKELY(array->CheckIsValidIndex(index))) {
1088         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
1089         ADVANCE(2);
1090       } else {
1091         HANDLE_PENDING_EXCEPTION();
1092       }
1093     }
1094   }
1095   HANDLE_INSTRUCTION_END();
1096 
1097   HANDLE_INSTRUCTION_START(AGET) {
1098     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1099     if (UNLIKELY(a == nullptr)) {
1100       ThrowNullPointerExceptionFromInterpreter();
1101       HANDLE_PENDING_EXCEPTION();
1102     } else {
1103       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1104       DCHECK(a->IsIntArray() || a->IsFloatArray()) << PrettyTypeOf(a);
1105       auto* array = down_cast<IntArray*>(a);
1106       if (LIKELY(array->CheckIsValidIndex(index))) {
1107         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
1108         ADVANCE(2);
1109       } else {
1110         HANDLE_PENDING_EXCEPTION();
1111       }
1112     }
1113   }
1114   HANDLE_INSTRUCTION_END();
1115 
1116   HANDLE_INSTRUCTION_START(AGET_WIDE)  {
1117     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1118     if (UNLIKELY(a == nullptr)) {
1119       ThrowNullPointerExceptionFromInterpreter();
1120       HANDLE_PENDING_EXCEPTION();
1121     } else {
1122       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1123       DCHECK(a->IsLongArray() || a->IsDoubleArray()) << PrettyTypeOf(a);
1124       auto* array = down_cast<LongArray*>(a);
1125       if (LIKELY(array->CheckIsValidIndex(index))) {
1126         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
1127         ADVANCE(2);
1128       } else {
1129         HANDLE_PENDING_EXCEPTION();
1130       }
1131     }
1132   }
1133   HANDLE_INSTRUCTION_END();
1134 
1135   HANDLE_INSTRUCTION_START(AGET_OBJECT) {
1136     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1137     if (UNLIKELY(a == nullptr)) {
1138       ThrowNullPointerExceptionFromInterpreter();
1139       HANDLE_PENDING_EXCEPTION();
1140     } else {
1141       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1142       ObjectArray<Object>* array = a->AsObjectArray<Object>();
1143       if (LIKELY(array->CheckIsValidIndex(index))) {
1144         shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
1145         ADVANCE(2);
1146       } else {
1147         HANDLE_PENDING_EXCEPTION();
1148       }
1149     }
1150   }
1151   HANDLE_INSTRUCTION_END();
1152 
1153   HANDLE_INSTRUCTION_START(APUT_BOOLEAN) {
1154     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1155     if (UNLIKELY(a == nullptr)) {
1156       ThrowNullPointerExceptionFromInterpreter();
1157       HANDLE_PENDING_EXCEPTION();
1158     } else {
1159       uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1160       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1161       BooleanArray* array = a->AsBooleanArray();
1162       if (LIKELY(array->CheckIsValidIndex(index))) {
1163         array->SetWithoutChecks<transaction_active>(index, val);
1164         ADVANCE(2);
1165       } else {
1166         HANDLE_PENDING_EXCEPTION();
1167       }
1168     }
1169   }
1170   HANDLE_INSTRUCTION_END();
1171 
1172   HANDLE_INSTRUCTION_START(APUT_BYTE) {
1173     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1174     if (UNLIKELY(a == nullptr)) {
1175       ThrowNullPointerExceptionFromInterpreter();
1176       HANDLE_PENDING_EXCEPTION();
1177     } else {
1178       int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1179       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1180       ByteArray* array = a->AsByteArray();
1181       if (LIKELY(array->CheckIsValidIndex(index))) {
1182         array->SetWithoutChecks<transaction_active>(index, val);
1183         ADVANCE(2);
1184       } else {
1185         HANDLE_PENDING_EXCEPTION();
1186       }
1187     }
1188   }
1189   HANDLE_INSTRUCTION_END();
1190 
1191   HANDLE_INSTRUCTION_START(APUT_CHAR) {
1192     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1193     if (UNLIKELY(a == nullptr)) {
1194       ThrowNullPointerExceptionFromInterpreter();
1195       HANDLE_PENDING_EXCEPTION();
1196     } else {
1197       uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1198       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1199       CharArray* array = a->AsCharArray();
1200       if (LIKELY(array->CheckIsValidIndex(index))) {
1201         array->SetWithoutChecks<transaction_active>(index, val);
1202         ADVANCE(2);
1203       } else {
1204         HANDLE_PENDING_EXCEPTION();
1205       }
1206     }
1207   }
1208   HANDLE_INSTRUCTION_END();
1209 
1210   HANDLE_INSTRUCTION_START(APUT_SHORT) {
1211     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1212     if (UNLIKELY(a == nullptr)) {
1213       ThrowNullPointerExceptionFromInterpreter();
1214       HANDLE_PENDING_EXCEPTION();
1215     } else {
1216       int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1217       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1218       ShortArray* array = a->AsShortArray();
1219       if (LIKELY(array->CheckIsValidIndex(index))) {
1220         array->SetWithoutChecks<transaction_active>(index, val);
1221         ADVANCE(2);
1222       } else {
1223         HANDLE_PENDING_EXCEPTION();
1224       }
1225     }
1226   }
1227   HANDLE_INSTRUCTION_END();
1228 
1229   HANDLE_INSTRUCTION_START(APUT) {
1230     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1231     if (UNLIKELY(a == nullptr)) {
1232       ThrowNullPointerExceptionFromInterpreter();
1233       HANDLE_PENDING_EXCEPTION();
1234     } else {
1235       int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1236       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1237       DCHECK(a->IsIntArray() || a->IsFloatArray()) << PrettyTypeOf(a);
1238       auto* array = down_cast<IntArray*>(a);
1239       if (LIKELY(array->CheckIsValidIndex(index))) {
1240         array->SetWithoutChecks<transaction_active>(index, val);
1241         ADVANCE(2);
1242       } else {
1243         HANDLE_PENDING_EXCEPTION();
1244       }
1245     }
1246   }
1247   HANDLE_INSTRUCTION_END();
1248 
1249   HANDLE_INSTRUCTION_START(APUT_WIDE) {
1250     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1251     if (UNLIKELY(a == nullptr)) {
1252       ThrowNullPointerExceptionFromInterpreter();
1253       HANDLE_PENDING_EXCEPTION();
1254     } else {
1255       int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data));
1256       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1257       DCHECK(a->IsLongArray() || a->IsDoubleArray()) << PrettyTypeOf(a);
1258       auto* array = down_cast<LongArray*>(a);
1259       if (LIKELY(array->CheckIsValidIndex(index))) {
1260         array->SetWithoutChecks<transaction_active>(index, val);
1261         ADVANCE(2);
1262       } else {
1263         HANDLE_PENDING_EXCEPTION();
1264       }
1265     }
1266   }
1267   HANDLE_INSTRUCTION_END();
1268 
1269   HANDLE_INSTRUCTION_START(APUT_OBJECT) {
1270     Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1271     if (UNLIKELY(a == nullptr)) {
1272       ThrowNullPointerExceptionFromInterpreter();
1273       HANDLE_PENDING_EXCEPTION();
1274     } else {
1275       int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1276       Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data));
1277       ObjectArray<Object>* array = a->AsObjectArray<Object>();
1278       if (LIKELY(array->CheckIsValidIndex(index) && array->CheckAssignable(val))) {
1279         array->SetWithoutChecks<transaction_active>(index, val);
1280         ADVANCE(2);
1281       } else {
1282         HANDLE_PENDING_EXCEPTION();
1283       }
1284     }
1285   }
1286   HANDLE_INSTRUCTION_END();
1287 
1288   HANDLE_INSTRUCTION_START(IGET_BOOLEAN) {
1289     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(
1290         self, shadow_frame, inst, inst_data);
1291     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1292   }
1293   HANDLE_INSTRUCTION_END();
1294 
1295   HANDLE_INSTRUCTION_START(IGET_BYTE) {
1296     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(
1297         self, shadow_frame, inst, inst_data);
1298     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1299   }
1300   HANDLE_INSTRUCTION_END();
1301 
1302   HANDLE_INSTRUCTION_START(IGET_CHAR) {
1303     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(
1304         self, shadow_frame, inst, inst_data);
1305     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1306   }
1307   HANDLE_INSTRUCTION_END();
1308 
1309   HANDLE_INSTRUCTION_START(IGET_SHORT) {
1310     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(
1311         self, shadow_frame, inst, inst_data);
1312     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1313   }
1314   HANDLE_INSTRUCTION_END();
1315 
1316   HANDLE_INSTRUCTION_START(IGET) {
1317     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(
1318         self, shadow_frame, inst, inst_data);
1319     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1320   }
1321   HANDLE_INSTRUCTION_END();
1322 
1323   HANDLE_INSTRUCTION_START(IGET_WIDE) {
1324     bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(
1325         self, shadow_frame, inst, inst_data);
1326     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1327   }
1328   HANDLE_INSTRUCTION_END();
1329 
1330   HANDLE_INSTRUCTION_START(IGET_OBJECT) {
1331     bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(
1332         self, shadow_frame, inst, inst_data);
1333     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1334   }
1335   HANDLE_INSTRUCTION_END();
1336 
1337   HANDLE_INSTRUCTION_START(IGET_QUICK) {
1338     bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data);
1339     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1340   }
1341   HANDLE_INSTRUCTION_END();
1342 
1343   HANDLE_INSTRUCTION_START(IGET_BOOLEAN_QUICK) {
1344     bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data);
1345     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1346   }
1347   HANDLE_INSTRUCTION_END();
1348 
1349   HANDLE_INSTRUCTION_START(IGET_BYTE_QUICK) {
1350     bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data);
1351     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1352   }
1353   HANDLE_INSTRUCTION_END();
1354 
1355   HANDLE_INSTRUCTION_START(IGET_CHAR_QUICK) {
1356     bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data);
1357     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1358   }
1359   HANDLE_INSTRUCTION_END();
1360 
1361   HANDLE_INSTRUCTION_START(IGET_SHORT_QUICK) {
1362     bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data);
1363     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1364   }
1365   HANDLE_INSTRUCTION_END();
1366 
1367   HANDLE_INSTRUCTION_START(IGET_WIDE_QUICK) {
1368     bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data);
1369     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1370   }
1371   HANDLE_INSTRUCTION_END();
1372 
1373   HANDLE_INSTRUCTION_START(IGET_OBJECT_QUICK) {
1374     bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data);
1375     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1376   }
1377   HANDLE_INSTRUCTION_END();
1378 
1379   HANDLE_INSTRUCTION_START(SGET_BOOLEAN) {
1380     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(
1381         self, shadow_frame, inst, inst_data);
1382     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1383   }
1384   HANDLE_INSTRUCTION_END();
1385 
1386   HANDLE_INSTRUCTION_START(SGET_BYTE) {
1387     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(
1388         self, shadow_frame, inst, inst_data);
1389     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1390   }
1391   HANDLE_INSTRUCTION_END();
1392 
1393   HANDLE_INSTRUCTION_START(SGET_CHAR) {
1394     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(
1395         self, shadow_frame, inst, inst_data);
1396     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1397   }
1398   HANDLE_INSTRUCTION_END();
1399 
1400   HANDLE_INSTRUCTION_START(SGET_SHORT) {
1401     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(
1402         self, shadow_frame, inst, inst_data);
1403     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1404   }
1405   HANDLE_INSTRUCTION_END();
1406 
1407   HANDLE_INSTRUCTION_START(SGET) {
1408     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(
1409         self, shadow_frame, inst, inst_data);
1410     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1411   }
1412   HANDLE_INSTRUCTION_END();
1413 
1414   HANDLE_INSTRUCTION_START(SGET_WIDE) {
1415     bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(
1416         self, shadow_frame, inst, inst_data);
1417     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1418   }
1419   HANDLE_INSTRUCTION_END();
1420 
1421   HANDLE_INSTRUCTION_START(SGET_OBJECT) {
1422     bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(
1423         self, shadow_frame, inst, inst_data);
1424     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1425   }
1426   HANDLE_INSTRUCTION_END();
1427 
1428   HANDLE_INSTRUCTION_START(IPUT_BOOLEAN) {
1429     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check,
1430         transaction_active>(self, shadow_frame, inst, inst_data);
1431     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1432   }
1433   HANDLE_INSTRUCTION_END();
1434 
1435   HANDLE_INSTRUCTION_START(IPUT_BYTE) {
1436     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check,
1437         transaction_active>(self, shadow_frame, inst, inst_data);
1438     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1439   }
1440   HANDLE_INSTRUCTION_END();
1441 
1442   HANDLE_INSTRUCTION_START(IPUT_CHAR) {
1443     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check,
1444         transaction_active>(self, shadow_frame, inst, inst_data);
1445     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1446   }
1447   HANDLE_INSTRUCTION_END();
1448 
1449   HANDLE_INSTRUCTION_START(IPUT_SHORT) {
1450     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check,
1451         transaction_active>(self, shadow_frame, inst, inst_data);
1452     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1453   }
1454   HANDLE_INSTRUCTION_END();
1455 
1456   HANDLE_INSTRUCTION_START(IPUT) {
1457     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check,
1458         transaction_active>(self, shadow_frame, inst, inst_data);
1459     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1460   }
1461   HANDLE_INSTRUCTION_END();
1462 
1463   HANDLE_INSTRUCTION_START(IPUT_WIDE) {
1464     bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check,
1465         transaction_active>(self, shadow_frame, inst, inst_data);
1466     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1467   }
1468   HANDLE_INSTRUCTION_END();
1469 
1470   HANDLE_INSTRUCTION_START(IPUT_OBJECT) {
1471     bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check,
1472         transaction_active>(self, shadow_frame, inst, inst_data);
1473     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1474   }
1475   HANDLE_INSTRUCTION_END();
1476 
1477   HANDLE_INSTRUCTION_START(IPUT_QUICK) {
1478     bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>(
1479         shadow_frame, inst, inst_data);
1480     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1481   }
1482   HANDLE_INSTRUCTION_END();
1483 
1484   HANDLE_INSTRUCTION_START(IPUT_BOOLEAN_QUICK) {
1485     bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>(
1486         shadow_frame, inst, inst_data);
1487     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1488   }
1489   HANDLE_INSTRUCTION_END();
1490 
1491   HANDLE_INSTRUCTION_START(IPUT_BYTE_QUICK) {
1492     bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>(
1493         shadow_frame, inst, inst_data);
1494     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1495   }
1496   HANDLE_INSTRUCTION_END();
1497 
1498   HANDLE_INSTRUCTION_START(IPUT_CHAR_QUICK) {
1499     bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>(
1500         shadow_frame, inst, inst_data);
1501     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1502   }
1503   HANDLE_INSTRUCTION_END();
1504 
1505   HANDLE_INSTRUCTION_START(IPUT_SHORT_QUICK) {
1506     bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>(
1507         shadow_frame, inst, inst_data);
1508     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1509   }
1510   HANDLE_INSTRUCTION_END();
1511 
1512   HANDLE_INSTRUCTION_START(IPUT_WIDE_QUICK) {
1513     bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>(
1514         shadow_frame, inst, inst_data);
1515     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1516   }
1517   HANDLE_INSTRUCTION_END();
1518 
1519   HANDLE_INSTRUCTION_START(IPUT_OBJECT_QUICK) {
1520     bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>(
1521         shadow_frame, inst, inst_data);
1522     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1523   }
1524   HANDLE_INSTRUCTION_END();
1525 
1526   HANDLE_INSTRUCTION_START(SPUT_BOOLEAN) {
1527     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check,
1528         transaction_active>(self, shadow_frame, inst, inst_data);
1529     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1530   }
1531   HANDLE_INSTRUCTION_END();
1532 
1533   HANDLE_INSTRUCTION_START(SPUT_BYTE) {
1534     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check,
1535         transaction_active>(self, shadow_frame, inst, inst_data);
1536     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1537   }
1538   HANDLE_INSTRUCTION_END();
1539 
1540   HANDLE_INSTRUCTION_START(SPUT_CHAR) {
1541     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check,
1542         transaction_active>(self, shadow_frame, inst, inst_data);
1543     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1544   }
1545   HANDLE_INSTRUCTION_END();
1546 
1547   HANDLE_INSTRUCTION_START(SPUT_SHORT) {
1548     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check,
1549         transaction_active>(self, shadow_frame, inst, inst_data);
1550     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1551   }
1552   HANDLE_INSTRUCTION_END();
1553 
1554   HANDLE_INSTRUCTION_START(SPUT) {
1555     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check,
1556         transaction_active>(self, shadow_frame, inst, inst_data);
1557     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1558   }
1559   HANDLE_INSTRUCTION_END();
1560 
1561   HANDLE_INSTRUCTION_START(SPUT_WIDE) {
1562     bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check,
1563         transaction_active>(self, shadow_frame, inst, inst_data);
1564     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1565   }
1566   HANDLE_INSTRUCTION_END();
1567 
1568   HANDLE_INSTRUCTION_START(SPUT_OBJECT) {
1569     bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check,
1570         transaction_active>(self, shadow_frame, inst, inst_data);
1571     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1572   }
1573   HANDLE_INSTRUCTION_END();
1574 
1575   HANDLE_INSTRUCTION_START(INVOKE_VIRTUAL) {
1576     bool success = DoInvoke<kVirtual, false, do_access_check>(
1577         self, shadow_frame, inst, inst_data, &result_register);
1578     UPDATE_HANDLER_TABLE();
1579     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1580   }
1581   HANDLE_INSTRUCTION_END();
1582 
1583   HANDLE_INSTRUCTION_START(INVOKE_VIRTUAL_RANGE) {
1584     bool success = DoInvoke<kVirtual, true, do_access_check>(
1585         self, shadow_frame, inst, inst_data, &result_register);
1586     UPDATE_HANDLER_TABLE();
1587     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1588   }
1589   HANDLE_INSTRUCTION_END();
1590 
1591   HANDLE_INSTRUCTION_START(INVOKE_SUPER) {
1592     bool success = DoInvoke<kSuper, false, do_access_check>(
1593         self, shadow_frame, inst, inst_data, &result_register);
1594     UPDATE_HANDLER_TABLE();
1595     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1596   }
1597   HANDLE_INSTRUCTION_END();
1598 
1599   HANDLE_INSTRUCTION_START(INVOKE_SUPER_RANGE) {
1600     bool success = DoInvoke<kSuper, true, do_access_check>(
1601         self, shadow_frame, inst, inst_data, &result_register);
1602     UPDATE_HANDLER_TABLE();
1603     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1604   }
1605   HANDLE_INSTRUCTION_END();
1606 
1607   HANDLE_INSTRUCTION_START(INVOKE_DIRECT) {
1608     bool success = DoInvoke<kDirect, false, do_access_check>(
1609         self, shadow_frame, inst, inst_data, &result_register);
1610     UPDATE_HANDLER_TABLE();
1611     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1612   }
1613   HANDLE_INSTRUCTION_END();
1614 
1615   HANDLE_INSTRUCTION_START(INVOKE_DIRECT_RANGE) {
1616     bool success = DoInvoke<kDirect, true, do_access_check>(
1617         self, shadow_frame, inst, inst_data, &result_register);
1618     UPDATE_HANDLER_TABLE();
1619     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1620   }
1621   HANDLE_INSTRUCTION_END();
1622 
1623   HANDLE_INSTRUCTION_START(INVOKE_INTERFACE) {
1624     bool success = DoInvoke<kInterface, false, do_access_check>(
1625         self, shadow_frame, inst, inst_data, &result_register);
1626     UPDATE_HANDLER_TABLE();
1627     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1628   }
1629   HANDLE_INSTRUCTION_END();
1630 
1631   HANDLE_INSTRUCTION_START(INVOKE_INTERFACE_RANGE) {
1632     bool success = DoInvoke<kInterface, true, do_access_check>(
1633         self, shadow_frame, inst, inst_data, &result_register);
1634     UPDATE_HANDLER_TABLE();
1635     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1636   }
1637   HANDLE_INSTRUCTION_END();
1638 
1639   HANDLE_INSTRUCTION_START(INVOKE_STATIC) {
1640     bool success = DoInvoke<kStatic, false, do_access_check>(
1641         self, shadow_frame, inst, inst_data, &result_register);
1642     UPDATE_HANDLER_TABLE();
1643     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1644   }
1645   HANDLE_INSTRUCTION_END();
1646 
1647   HANDLE_INSTRUCTION_START(INVOKE_STATIC_RANGE) {
1648     bool success = DoInvoke<kStatic, true, do_access_check>(
1649         self, shadow_frame, inst, inst_data, &result_register);
1650     UPDATE_HANDLER_TABLE();
1651     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1652   }
1653   HANDLE_INSTRUCTION_END();
1654 
1655   HANDLE_INSTRUCTION_START(INVOKE_VIRTUAL_QUICK) {
1656     bool success = DoInvokeVirtualQuick<false>(
1657         self, shadow_frame, inst, inst_data, &result_register);
1658     UPDATE_HANDLER_TABLE();
1659     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1660   }
1661   HANDLE_INSTRUCTION_END();
1662 
1663   HANDLE_INSTRUCTION_START(INVOKE_VIRTUAL_RANGE_QUICK) {
1664     bool success = DoInvokeVirtualQuick<true>(
1665         self, shadow_frame, inst, inst_data, &result_register);
1666     UPDATE_HANDLER_TABLE();
1667     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 3);
1668   }
1669   HANDLE_INSTRUCTION_END();
1670 
1671   HANDLE_EXPERIMENTAL_INSTRUCTION_START(INVOKE_LAMBDA) {
1672     bool success = DoInvokeLambda<do_access_check>(self, shadow_frame, inst, inst_data,
1673                                                    &result_register);
1674     UPDATE_HANDLER_TABLE();
1675     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1676   }
1677   HANDLE_EXPERIMENTAL_INSTRUCTION_END();
1678 
1679   HANDLE_INSTRUCTION_START(NEG_INT)
1680     shadow_frame.SetVReg(
1681         inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1682     ADVANCE(1);
1683   HANDLE_INSTRUCTION_END();
1684 
1685   HANDLE_INSTRUCTION_START(NOT_INT)
1686     shadow_frame.SetVReg(
1687         inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1688     ADVANCE(1);
1689   HANDLE_INSTRUCTION_END();
1690 
1691   HANDLE_INSTRUCTION_START(NEG_LONG)
1692     shadow_frame.SetVRegLong(
1693         inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1694     ADVANCE(1);
1695   HANDLE_INSTRUCTION_END();
1696 
1697   HANDLE_INSTRUCTION_START(NOT_LONG)
1698     shadow_frame.SetVRegLong(
1699         inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1700     ADVANCE(1);
1701   HANDLE_INSTRUCTION_END();
1702 
1703   HANDLE_INSTRUCTION_START(NEG_FLOAT)
1704     shadow_frame.SetVRegFloat(
1705         inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
1706     ADVANCE(1);
1707   HANDLE_INSTRUCTION_END();
1708 
1709   HANDLE_INSTRUCTION_START(NEG_DOUBLE)
1710     shadow_frame.SetVRegDouble(
1711         inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
1712     ADVANCE(1);
1713   HANDLE_INSTRUCTION_END();
1714 
1715   HANDLE_INSTRUCTION_START(INT_TO_LONG)
1716     shadow_frame.SetVRegLong(
1717         inst->VRegA_12x(inst_data), shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1718     ADVANCE(1);
1719   HANDLE_INSTRUCTION_END();
1720 
1721   HANDLE_INSTRUCTION_START(INT_TO_FLOAT)
1722     shadow_frame.SetVRegFloat(
1723         inst->VRegA_12x(inst_data), shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1724     ADVANCE(1);
1725   HANDLE_INSTRUCTION_END();
1726 
1727   HANDLE_INSTRUCTION_START(INT_TO_DOUBLE)
1728     shadow_frame.SetVRegDouble(
1729         inst->VRegA_12x(inst_data), shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1730     ADVANCE(1);
1731   HANDLE_INSTRUCTION_END();
1732 
1733   HANDLE_INSTRUCTION_START(LONG_TO_INT)
1734     shadow_frame.SetVReg(
1735         inst->VRegA_12x(inst_data), shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1736     ADVANCE(1);
1737   HANDLE_INSTRUCTION_END();
1738 
1739   HANDLE_INSTRUCTION_START(LONG_TO_FLOAT)
1740     shadow_frame.SetVRegFloat(
1741         inst->VRegA_12x(inst_data), shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1742     ADVANCE(1);
1743   HANDLE_INSTRUCTION_END();
1744 
1745   HANDLE_INSTRUCTION_START(LONG_TO_DOUBLE)
1746     shadow_frame.SetVRegDouble(
1747         inst->VRegA_12x(inst_data), shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1748     ADVANCE(1);
1749   HANDLE_INSTRUCTION_END();
1750 
1751   HANDLE_INSTRUCTION_START(FLOAT_TO_INT) {
1752     float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
1753     int32_t result = art_float_to_integral<int32_t, float>(val);
1754     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
1755     ADVANCE(1);
1756   }
1757   HANDLE_INSTRUCTION_END();
1758 
1759   HANDLE_INSTRUCTION_START(FLOAT_TO_LONG) {
1760     float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
1761     int64_t result = art_float_to_integral<int64_t, float>(val);
1762     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
1763     ADVANCE(1);
1764   }
1765   HANDLE_INSTRUCTION_END();
1766 
1767   HANDLE_INSTRUCTION_START(FLOAT_TO_DOUBLE)
1768     shadow_frame.SetVRegDouble(
1769         inst->VRegA_12x(inst_data), shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
1770     ADVANCE(1);
1771   HANDLE_INSTRUCTION_END();
1772 
1773   HANDLE_INSTRUCTION_START(DOUBLE_TO_INT) {
1774     double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
1775     int32_t result = art_float_to_integral<int32_t, double>(val);
1776     shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
1777     ADVANCE(1);
1778   }
1779   HANDLE_INSTRUCTION_END();
1780 
1781   HANDLE_INSTRUCTION_START(DOUBLE_TO_LONG) {
1782     double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
1783     int64_t result = art_float_to_integral<int64_t, double>(val);
1784     shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
1785     ADVANCE(1);
1786   }
1787   HANDLE_INSTRUCTION_END();
1788 
1789   HANDLE_INSTRUCTION_START(DOUBLE_TO_FLOAT)
1790     shadow_frame.SetVRegFloat(
1791         inst->VRegA_12x(inst_data), shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
1792     ADVANCE(1);
1793   HANDLE_INSTRUCTION_END();
1794 
1795   HANDLE_INSTRUCTION_START(INT_TO_BYTE)
1796     shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1797                          static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
1798     ADVANCE(1);
1799   HANDLE_INSTRUCTION_END();
1800 
1801   HANDLE_INSTRUCTION_START(INT_TO_CHAR)
1802     shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1803                          static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
1804     ADVANCE(1);
1805   HANDLE_INSTRUCTION_END();
1806 
1807   HANDLE_INSTRUCTION_START(INT_TO_SHORT)
1808     shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1809                          static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
1810     ADVANCE(1);
1811   HANDLE_INSTRUCTION_END();
1812 
1813   HANDLE_INSTRUCTION_START(ADD_INT)
1814     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1815                          SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()),
1816                                  shadow_frame.GetVReg(inst->VRegC_23x())));
1817     ADVANCE(2);
1818   HANDLE_INSTRUCTION_END();
1819 
1820   HANDLE_INSTRUCTION_START(SUB_INT)
1821     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1822                          SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()),
1823                                  shadow_frame.GetVReg(inst->VRegC_23x())));
1824     ADVANCE(2);
1825   HANDLE_INSTRUCTION_END();
1826 
1827   HANDLE_INSTRUCTION_START(MUL_INT)
1828     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1829                          SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()),
1830                                  shadow_frame.GetVReg(inst->VRegC_23x())));
1831     ADVANCE(2);
1832   HANDLE_INSTRUCTION_END();
1833 
1834   HANDLE_INSTRUCTION_START(DIV_INT) {
1835     bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data),
1836                                shadow_frame.GetVReg(inst->VRegB_23x()),
1837                                shadow_frame.GetVReg(inst->VRegC_23x()));
1838     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1839   }
1840   HANDLE_INSTRUCTION_END();
1841 
1842   HANDLE_INSTRUCTION_START(REM_INT) {
1843     bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data),
1844                                   shadow_frame.GetVReg(inst->VRegB_23x()),
1845                                   shadow_frame.GetVReg(inst->VRegC_23x()));
1846     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1847   }
1848   HANDLE_INSTRUCTION_END();
1849 
1850   HANDLE_INSTRUCTION_START(SHL_INT)
1851     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1852                          shadow_frame.GetVReg(inst->VRegB_23x()) <<
1853                          (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1854     ADVANCE(2);
1855   HANDLE_INSTRUCTION_END();
1856 
1857   HANDLE_INSTRUCTION_START(SHR_INT)
1858     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1859                          shadow_frame.GetVReg(inst->VRegB_23x()) >>
1860                          (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1861     ADVANCE(2);
1862   HANDLE_INSTRUCTION_END();
1863 
1864   HANDLE_INSTRUCTION_START(USHR_INT)
1865     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1866                          static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >>
1867                          (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1868     ADVANCE(2);
1869   HANDLE_INSTRUCTION_END();
1870 
1871   HANDLE_INSTRUCTION_START(AND_INT)
1872     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1873                          shadow_frame.GetVReg(inst->VRegB_23x()) &
1874                          shadow_frame.GetVReg(inst->VRegC_23x()));
1875     ADVANCE(2);
1876   HANDLE_INSTRUCTION_END();
1877 
1878   HANDLE_INSTRUCTION_START(OR_INT)
1879     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1880                          shadow_frame.GetVReg(inst->VRegB_23x()) |
1881                          shadow_frame.GetVReg(inst->VRegC_23x()));
1882     ADVANCE(2);
1883   HANDLE_INSTRUCTION_END();
1884 
1885   HANDLE_INSTRUCTION_START(XOR_INT)
1886     shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1887                          shadow_frame.GetVReg(inst->VRegB_23x()) ^
1888                          shadow_frame.GetVReg(inst->VRegC_23x()));
1889     ADVANCE(2);
1890   HANDLE_INSTRUCTION_END();
1891 
1892   HANDLE_INSTRUCTION_START(ADD_LONG)
1893     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1894                              SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1895                                      shadow_frame.GetVRegLong(inst->VRegC_23x())));
1896     ADVANCE(2);
1897   HANDLE_INSTRUCTION_END();
1898 
1899   HANDLE_INSTRUCTION_START(SUB_LONG)
1900     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1901                              SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1902                                      shadow_frame.GetVRegLong(inst->VRegC_23x())));
1903     ADVANCE(2);
1904   HANDLE_INSTRUCTION_END();
1905 
1906   HANDLE_INSTRUCTION_START(MUL_LONG)
1907     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1908                              SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1909                                      shadow_frame.GetVRegLong(inst->VRegC_23x())));
1910     ADVANCE(2);
1911   HANDLE_INSTRUCTION_END();
1912 
1913   HANDLE_INSTRUCTION_START(DIV_LONG) {
1914     bool success = DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data),
1915                                 shadow_frame.GetVRegLong(inst->VRegB_23x()),
1916                                 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1917     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1918   }
1919   HANDLE_INSTRUCTION_END();
1920 
1921   HANDLE_INSTRUCTION_START(REM_LONG) {
1922     bool success = DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data),
1923                                    shadow_frame.GetVRegLong(inst->VRegB_23x()),
1924                                    shadow_frame.GetVRegLong(inst->VRegC_23x()));
1925     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
1926   }
1927   HANDLE_INSTRUCTION_END();
1928 
1929   HANDLE_INSTRUCTION_START(AND_LONG)
1930     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1931                              shadow_frame.GetVRegLong(inst->VRegB_23x()) &
1932                              shadow_frame.GetVRegLong(inst->VRegC_23x()));
1933     ADVANCE(2);
1934   HANDLE_INSTRUCTION_END();
1935 
1936   HANDLE_INSTRUCTION_START(OR_LONG)
1937     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1938                              shadow_frame.GetVRegLong(inst->VRegB_23x()) |
1939                              shadow_frame.GetVRegLong(inst->VRegC_23x()));
1940     ADVANCE(2);
1941   HANDLE_INSTRUCTION_END();
1942 
1943   HANDLE_INSTRUCTION_START(XOR_LONG)
1944     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1945                              shadow_frame.GetVRegLong(inst->VRegB_23x()) ^
1946                              shadow_frame.GetVRegLong(inst->VRegC_23x()));
1947     ADVANCE(2);
1948   HANDLE_INSTRUCTION_END();
1949 
1950   HANDLE_INSTRUCTION_START(SHL_LONG)
1951     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1952                              shadow_frame.GetVRegLong(inst->VRegB_23x()) <<
1953                              (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1954     ADVANCE(2);
1955   HANDLE_INSTRUCTION_END();
1956 
1957   HANDLE_INSTRUCTION_START(SHR_LONG)
1958     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1959                              shadow_frame.GetVRegLong(inst->VRegB_23x()) >>
1960                              (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1961     ADVANCE(2);
1962   HANDLE_INSTRUCTION_END();
1963 
1964   HANDLE_INSTRUCTION_START(USHR_LONG)
1965     shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1966                              static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >>
1967                              (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1968     ADVANCE(2);
1969   HANDLE_INSTRUCTION_END();
1970 
1971   HANDLE_INSTRUCTION_START(ADD_FLOAT)
1972     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1973                               shadow_frame.GetVRegFloat(inst->VRegB_23x()) +
1974                               shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1975     ADVANCE(2);
1976   HANDLE_INSTRUCTION_END();
1977 
1978   HANDLE_INSTRUCTION_START(SUB_FLOAT)
1979     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1980                               shadow_frame.GetVRegFloat(inst->VRegB_23x()) -
1981                               shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1982     ADVANCE(2);
1983   HANDLE_INSTRUCTION_END();
1984 
1985   HANDLE_INSTRUCTION_START(MUL_FLOAT)
1986     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1987                               shadow_frame.GetVRegFloat(inst->VRegB_23x()) *
1988                               shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1989     ADVANCE(2);
1990   HANDLE_INSTRUCTION_END();
1991 
1992   HANDLE_INSTRUCTION_START(DIV_FLOAT)
1993     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1994                               shadow_frame.GetVRegFloat(inst->VRegB_23x()) /
1995                               shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1996     ADVANCE(2);
1997   HANDLE_INSTRUCTION_END();
1998 
1999   HANDLE_INSTRUCTION_START(REM_FLOAT)
2000     shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
2001                               fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()),
2002                                     shadow_frame.GetVRegFloat(inst->VRegC_23x())));
2003     ADVANCE(2);
2004   HANDLE_INSTRUCTION_END();
2005 
2006   HANDLE_INSTRUCTION_START(ADD_DOUBLE)
2007     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
2008                                shadow_frame.GetVRegDouble(inst->VRegB_23x()) +
2009                                shadow_frame.GetVRegDouble(inst->VRegC_23x()));
2010     ADVANCE(2);
2011   HANDLE_INSTRUCTION_END();
2012 
2013   HANDLE_INSTRUCTION_START(SUB_DOUBLE)
2014     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
2015                                shadow_frame.GetVRegDouble(inst->VRegB_23x()) -
2016                                shadow_frame.GetVRegDouble(inst->VRegC_23x()));
2017     ADVANCE(2);
2018   HANDLE_INSTRUCTION_END();
2019 
2020   HANDLE_INSTRUCTION_START(MUL_DOUBLE)
2021     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
2022                                shadow_frame.GetVRegDouble(inst->VRegB_23x()) *
2023                                shadow_frame.GetVRegDouble(inst->VRegC_23x()));
2024     ADVANCE(2);
2025   HANDLE_INSTRUCTION_END();
2026 
2027   HANDLE_INSTRUCTION_START(DIV_DOUBLE)
2028     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
2029                                shadow_frame.GetVRegDouble(inst->VRegB_23x()) /
2030                                shadow_frame.GetVRegDouble(inst->VRegC_23x()));
2031     ADVANCE(2);
2032   HANDLE_INSTRUCTION_END();
2033 
2034   HANDLE_INSTRUCTION_START(REM_DOUBLE)
2035     shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
2036                                fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()),
2037                                     shadow_frame.GetVRegDouble(inst->VRegC_23x())));
2038     ADVANCE(2);
2039   HANDLE_INSTRUCTION_END();
2040 
2041   HANDLE_INSTRUCTION_START(ADD_INT_2ADDR) {
2042     uint32_t vregA = inst->VRegA_12x(inst_data);
2043     shadow_frame.SetVReg(vregA,
2044                          SafeAdd(shadow_frame.GetVReg(vregA),
2045                                  shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
2046     ADVANCE(1);
2047   }
2048   HANDLE_INSTRUCTION_END();
2049 
2050   HANDLE_INSTRUCTION_START(SUB_INT_2ADDR) {
2051     uint32_t vregA = inst->VRegA_12x(inst_data);
2052     shadow_frame.SetVReg(vregA,
2053                          SafeSub(shadow_frame.GetVReg(vregA),
2054                                  shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
2055     ADVANCE(1);
2056   }
2057   HANDLE_INSTRUCTION_END();
2058 
2059   HANDLE_INSTRUCTION_START(MUL_INT_2ADDR) {
2060     uint32_t vregA = inst->VRegA_12x(inst_data);
2061     shadow_frame.SetVReg(vregA,
2062                          SafeMul(shadow_frame.GetVReg(vregA),
2063                                  shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
2064     ADVANCE(1);
2065   }
2066   HANDLE_INSTRUCTION_END();
2067 
2068   HANDLE_INSTRUCTION_START(DIV_INT_2ADDR) {
2069     uint32_t vregA = inst->VRegA_12x(inst_data);
2070     bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA),
2071                                shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
2072     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 1);
2073   }
2074   HANDLE_INSTRUCTION_END();
2075 
2076   HANDLE_INSTRUCTION_START(REM_INT_2ADDR) {
2077     uint32_t vregA = inst->VRegA_12x(inst_data);
2078     bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA),
2079                                   shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
2080     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 1);
2081   }
2082   HANDLE_INSTRUCTION_END();
2083 
2084   HANDLE_INSTRUCTION_START(SHL_INT_2ADDR) {
2085     uint32_t vregA = inst->VRegA_12x(inst_data);
2086     shadow_frame.SetVReg(vregA,
2087                          shadow_frame.GetVReg(vregA) <<
2088                          (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
2089     ADVANCE(1);
2090   }
2091   HANDLE_INSTRUCTION_END();
2092 
2093   HANDLE_INSTRUCTION_START(SHR_INT_2ADDR) {
2094     uint32_t vregA = inst->VRegA_12x(inst_data);
2095     shadow_frame.SetVReg(vregA,
2096                          shadow_frame.GetVReg(vregA) >>
2097                          (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
2098     ADVANCE(1);
2099   }
2100   HANDLE_INSTRUCTION_END();
2101 
2102   HANDLE_INSTRUCTION_START(USHR_INT_2ADDR) {
2103     uint32_t vregA = inst->VRegA_12x(inst_data);
2104     shadow_frame.SetVReg(vregA,
2105                          static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >>
2106                          (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
2107     ADVANCE(1);
2108   }
2109   HANDLE_INSTRUCTION_END();
2110 
2111   HANDLE_INSTRUCTION_START(AND_INT_2ADDR) {
2112     uint32_t vregA = inst->VRegA_12x(inst_data);
2113     shadow_frame.SetVReg(vregA,
2114                          shadow_frame.GetVReg(vregA) &
2115                          shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
2116     ADVANCE(1);
2117   }
2118   HANDLE_INSTRUCTION_END();
2119 
2120   HANDLE_INSTRUCTION_START(OR_INT_2ADDR) {
2121     uint32_t vregA = inst->VRegA_12x(inst_data);
2122     shadow_frame.SetVReg(vregA,
2123                          shadow_frame.GetVReg(vregA) |
2124                          shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
2125     ADVANCE(1);
2126   }
2127   HANDLE_INSTRUCTION_END();
2128 
2129   HANDLE_INSTRUCTION_START(XOR_INT_2ADDR) {
2130     uint32_t vregA = inst->VRegA_12x(inst_data);
2131     shadow_frame.SetVReg(vregA,
2132                          shadow_frame.GetVReg(vregA) ^
2133                          shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
2134     ADVANCE(1);
2135   }
2136   HANDLE_INSTRUCTION_END();
2137 
2138   HANDLE_INSTRUCTION_START(ADD_LONG_2ADDR) {
2139     uint32_t vregA = inst->VRegA_12x(inst_data);
2140     shadow_frame.SetVRegLong(vregA,
2141                              SafeAdd(shadow_frame.GetVRegLong(vregA),
2142                                      shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
2143     ADVANCE(1);
2144   }
2145   HANDLE_INSTRUCTION_END();
2146 
2147   HANDLE_INSTRUCTION_START(SUB_LONG_2ADDR) {
2148     uint32_t vregA = inst->VRegA_12x(inst_data);
2149     shadow_frame.SetVRegLong(vregA,
2150                              SafeSub(shadow_frame.GetVRegLong(vregA),
2151                                      shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
2152     ADVANCE(1);
2153   }
2154   HANDLE_INSTRUCTION_END();
2155 
2156   HANDLE_INSTRUCTION_START(MUL_LONG_2ADDR) {
2157     uint32_t vregA = inst->VRegA_12x(inst_data);
2158     shadow_frame.SetVRegLong(vregA,
2159                              SafeMul(shadow_frame.GetVRegLong(vregA),
2160                                      shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
2161     ADVANCE(1);
2162   }
2163   HANDLE_INSTRUCTION_END();
2164 
2165   HANDLE_INSTRUCTION_START(DIV_LONG_2ADDR) {
2166     uint32_t vregA = inst->VRegA_12x(inst_data);
2167     bool success = DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
2168                                 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
2169     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 1);
2170   }
2171   HANDLE_INSTRUCTION_END();
2172 
2173   HANDLE_INSTRUCTION_START(REM_LONG_2ADDR) {
2174     uint32_t vregA = inst->VRegA_12x(inst_data);
2175     bool success = DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
2176                                    shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
2177     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 1);
2178   }
2179   HANDLE_INSTRUCTION_END();
2180 
2181   HANDLE_INSTRUCTION_START(AND_LONG_2ADDR) {
2182     uint32_t vregA = inst->VRegA_12x(inst_data);
2183     shadow_frame.SetVRegLong(vregA,
2184                              shadow_frame.GetVRegLong(vregA) &
2185                              shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
2186     ADVANCE(1);
2187   }
2188   HANDLE_INSTRUCTION_END();
2189 
2190   HANDLE_INSTRUCTION_START(OR_LONG_2ADDR) {
2191     uint32_t vregA = inst->VRegA_12x(inst_data);
2192     shadow_frame.SetVRegLong(vregA,
2193                              shadow_frame.GetVRegLong(vregA) |
2194                              shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
2195     ADVANCE(1);
2196   }
2197   HANDLE_INSTRUCTION_END();
2198 
2199   HANDLE_INSTRUCTION_START(XOR_LONG_2ADDR) {
2200     uint32_t vregA = inst->VRegA_12x(inst_data);
2201     shadow_frame.SetVRegLong(vregA,
2202                              shadow_frame.GetVRegLong(vregA) ^
2203                              shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
2204     ADVANCE(1);
2205   }
2206   HANDLE_INSTRUCTION_END();
2207 
2208   HANDLE_INSTRUCTION_START(SHL_LONG_2ADDR) {
2209     uint32_t vregA = inst->VRegA_12x(inst_data);
2210     shadow_frame.SetVRegLong(vregA,
2211                              shadow_frame.GetVRegLong(vregA) <<
2212                              (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
2213     ADVANCE(1);
2214   }
2215   HANDLE_INSTRUCTION_END();
2216 
2217   HANDLE_INSTRUCTION_START(SHR_LONG_2ADDR) {
2218     uint32_t vregA = inst->VRegA_12x(inst_data);
2219     shadow_frame.SetVRegLong(vregA,
2220                              shadow_frame.GetVRegLong(vregA) >>
2221                              (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
2222     ADVANCE(1);
2223   }
2224   HANDLE_INSTRUCTION_END();
2225 
2226   HANDLE_INSTRUCTION_START(USHR_LONG_2ADDR) {
2227     uint32_t vregA = inst->VRegA_12x(inst_data);
2228     shadow_frame.SetVRegLong(vregA,
2229                              static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >>
2230                              (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
2231     ADVANCE(1);
2232   }
2233   HANDLE_INSTRUCTION_END();
2234 
2235   HANDLE_INSTRUCTION_START(ADD_FLOAT_2ADDR) {
2236     uint32_t vregA = inst->VRegA_12x(inst_data);
2237     shadow_frame.SetVRegFloat(vregA,
2238                               shadow_frame.GetVRegFloat(vregA) +
2239                               shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
2240     ADVANCE(1);
2241   }
2242   HANDLE_INSTRUCTION_END();
2243 
2244   HANDLE_INSTRUCTION_START(SUB_FLOAT_2ADDR) {
2245     uint32_t vregA = inst->VRegA_12x(inst_data);
2246     shadow_frame.SetVRegFloat(vregA,
2247                               shadow_frame.GetVRegFloat(vregA) -
2248                               shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
2249     ADVANCE(1);
2250   }
2251   HANDLE_INSTRUCTION_END();
2252 
2253   HANDLE_INSTRUCTION_START(MUL_FLOAT_2ADDR) {
2254     uint32_t vregA = inst->VRegA_12x(inst_data);
2255     shadow_frame.SetVRegFloat(vregA,
2256                               shadow_frame.GetVRegFloat(vregA) *
2257                               shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
2258     ADVANCE(1);
2259   }
2260   HANDLE_INSTRUCTION_END();
2261 
2262   HANDLE_INSTRUCTION_START(DIV_FLOAT_2ADDR) {
2263     uint32_t vregA = inst->VRegA_12x(inst_data);
2264     shadow_frame.SetVRegFloat(vregA,
2265                               shadow_frame.GetVRegFloat(vregA) /
2266                               shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
2267     ADVANCE(1);
2268   }
2269   HANDLE_INSTRUCTION_END();
2270 
2271   HANDLE_INSTRUCTION_START(REM_FLOAT_2ADDR) {
2272     uint32_t vregA = inst->VRegA_12x(inst_data);
2273     shadow_frame.SetVRegFloat(vregA,
2274                               fmodf(shadow_frame.GetVRegFloat(vregA),
2275                                     shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))));
2276     ADVANCE(1);
2277   }
2278   HANDLE_INSTRUCTION_END();
2279 
2280   HANDLE_INSTRUCTION_START(ADD_DOUBLE_2ADDR) {
2281     uint32_t vregA = inst->VRegA_12x(inst_data);
2282     shadow_frame.SetVRegDouble(vregA,
2283                                shadow_frame.GetVRegDouble(vregA) +
2284                                shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
2285     ADVANCE(1);
2286   }
2287   HANDLE_INSTRUCTION_END();
2288 
2289   HANDLE_INSTRUCTION_START(SUB_DOUBLE_2ADDR) {
2290     uint32_t vregA = inst->VRegA_12x(inst_data);
2291     shadow_frame.SetVRegDouble(vregA,
2292                                shadow_frame.GetVRegDouble(vregA) -
2293                                shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
2294     ADVANCE(1);
2295   }
2296   HANDLE_INSTRUCTION_END();
2297 
2298   HANDLE_INSTRUCTION_START(MUL_DOUBLE_2ADDR) {
2299     uint32_t vregA = inst->VRegA_12x(inst_data);
2300     shadow_frame.SetVRegDouble(vregA,
2301                                shadow_frame.GetVRegDouble(vregA) *
2302                                shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
2303     ADVANCE(1);
2304   }
2305   HANDLE_INSTRUCTION_END();
2306 
2307   HANDLE_INSTRUCTION_START(DIV_DOUBLE_2ADDR) {
2308     uint32_t vregA = inst->VRegA_12x(inst_data);
2309     shadow_frame.SetVRegDouble(vregA,
2310                                shadow_frame.GetVRegDouble(vregA) /
2311                                shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
2312     ADVANCE(1);
2313   }
2314   HANDLE_INSTRUCTION_END();
2315 
2316   HANDLE_INSTRUCTION_START(REM_DOUBLE_2ADDR) {
2317     uint32_t vregA = inst->VRegA_12x(inst_data);
2318     shadow_frame.SetVRegDouble(vregA,
2319                                fmod(shadow_frame.GetVRegDouble(vregA),
2320                                     shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))));
2321     ADVANCE(1);
2322   }
2323   HANDLE_INSTRUCTION_END();
2324 
2325   HANDLE_INSTRUCTION_START(ADD_INT_LIT16)
2326     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2327                          SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2328                                  inst->VRegC_22s()));
2329     ADVANCE(2);
2330   HANDLE_INSTRUCTION_END();
2331 
2332   HANDLE_INSTRUCTION_START(RSUB_INT)
2333     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2334                          SafeSub(inst->VRegC_22s(),
2335                                  shadow_frame.GetVReg(inst->VRegB_22s(inst_data))));
2336     ADVANCE(2);
2337   HANDLE_INSTRUCTION_END();
2338 
2339   HANDLE_INSTRUCTION_START(MUL_INT_LIT16)
2340     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2341                          SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2342                                  inst->VRegC_22s()));
2343     ADVANCE(2);
2344   HANDLE_INSTRUCTION_END();
2345 
2346   HANDLE_INSTRUCTION_START(DIV_INT_LIT16) {
2347     bool success = DoIntDivide(
2348         shadow_frame, inst->VRegA_22s(inst_data), shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2349         inst->VRegC_22s());
2350     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2351   }
2352   HANDLE_INSTRUCTION_END();
2353 
2354   HANDLE_INSTRUCTION_START(REM_INT_LIT16) {
2355     bool success = DoIntRemainder(
2356         shadow_frame, inst->VRegA_22s(inst_data), shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2357         inst->VRegC_22s());
2358     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2359   }
2360   HANDLE_INSTRUCTION_END();
2361 
2362   HANDLE_INSTRUCTION_START(AND_INT_LIT16)
2363     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2364                          shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) &
2365                          inst->VRegC_22s());
2366     ADVANCE(2);
2367   HANDLE_INSTRUCTION_END();
2368 
2369   HANDLE_INSTRUCTION_START(OR_INT_LIT16)
2370     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2371                          shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) |
2372                          inst->VRegC_22s());
2373     ADVANCE(2);
2374   HANDLE_INSTRUCTION_END();
2375 
2376   HANDLE_INSTRUCTION_START(XOR_INT_LIT16)
2377     shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2378                          shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^
2379                          inst->VRegC_22s());
2380     ADVANCE(2);
2381   HANDLE_INSTRUCTION_END();
2382 
2383   HANDLE_INSTRUCTION_START(ADD_INT_LIT8)
2384     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2385                          SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()),
2386                                  inst->VRegC_22b()));
2387     ADVANCE(2);
2388   HANDLE_INSTRUCTION_END();
2389 
2390   HANDLE_INSTRUCTION_START(RSUB_INT_LIT8)
2391     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2392                          SafeSub(inst->VRegC_22b(),
2393                                  shadow_frame.GetVReg(inst->VRegB_22b())));
2394     ADVANCE(2);
2395   HANDLE_INSTRUCTION_END();
2396 
2397   HANDLE_INSTRUCTION_START(MUL_INT_LIT8)
2398     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2399                          SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()),
2400                                  inst->VRegC_22b()));
2401     ADVANCE(2);
2402   HANDLE_INSTRUCTION_END();
2403 
2404   HANDLE_INSTRUCTION_START(DIV_INT_LIT8) {
2405     bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data),
2406                                shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
2407     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2408   }
2409   HANDLE_INSTRUCTION_END();
2410 
2411   HANDLE_INSTRUCTION_START(REM_INT_LIT8) {
2412     bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data),
2413                                   shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
2414     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2415   }
2416   HANDLE_INSTRUCTION_END();
2417 
2418   HANDLE_INSTRUCTION_START(AND_INT_LIT8)
2419     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2420                          shadow_frame.GetVReg(inst->VRegB_22b()) &
2421                          inst->VRegC_22b());
2422     ADVANCE(2);
2423   HANDLE_INSTRUCTION_END();
2424 
2425   HANDLE_INSTRUCTION_START(OR_INT_LIT8)
2426     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2427                          shadow_frame.GetVReg(inst->VRegB_22b()) |
2428                          inst->VRegC_22b());
2429     ADVANCE(2);
2430   HANDLE_INSTRUCTION_END();
2431 
2432   HANDLE_INSTRUCTION_START(XOR_INT_LIT8)
2433     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2434                          shadow_frame.GetVReg(inst->VRegB_22b()) ^
2435                          inst->VRegC_22b());
2436     ADVANCE(2);
2437   HANDLE_INSTRUCTION_END();
2438 
2439   HANDLE_INSTRUCTION_START(SHL_INT_LIT8)
2440     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2441                          shadow_frame.GetVReg(inst->VRegB_22b()) <<
2442                          (inst->VRegC_22b() & 0x1f));
2443     ADVANCE(2);
2444   HANDLE_INSTRUCTION_END();
2445 
2446   HANDLE_INSTRUCTION_START(SHR_INT_LIT8)
2447     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2448                          shadow_frame.GetVReg(inst->VRegB_22b()) >>
2449                          (inst->VRegC_22b() & 0x1f));
2450     ADVANCE(2);
2451   HANDLE_INSTRUCTION_END();
2452 
2453   HANDLE_INSTRUCTION_START(USHR_INT_LIT8)
2454     shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2455                          static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >>
2456                          (inst->VRegC_22b() & 0x1f));
2457     ADVANCE(2);
2458   HANDLE_INSTRUCTION_END();
2459 
2460   HANDLE_EXPERIMENTAL_INSTRUCTION_START(CREATE_LAMBDA) {
2461     if (lambda_closure_builder == nullptr) {
2462       // DoCreateLambda always needs a ClosureBuilder, even if it has 0 captured variables.
2463       lambda_closure_builder = MakeUnique<lambda::ClosureBuilder>();
2464     }
2465 
2466     // TODO: these allocations should not leak, and the lambda method should not be local.
2467     lambda::Closure* lambda_closure =
2468         reinterpret_cast<lambda::Closure*>(alloca(lambda_closure_builder->GetSize()));
2469     bool success = DoCreateLambda<do_access_check>(self,
2470                                                    inst,
2471                                                    /*inout*/shadow_frame,
2472                                                    /*inout*/lambda_closure_builder.get(),
2473                                                    /*inout*/lambda_closure);
2474     lambda_closure_builder.reset(nullptr);  // reset state of variables captured
2475     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2476   }
2477   HANDLE_EXPERIMENTAL_INSTRUCTION_END();
2478 
2479   HANDLE_EXPERIMENTAL_INSTRUCTION_START(BOX_LAMBDA) {
2480     bool success = DoBoxLambda<do_access_check>(self, shadow_frame, inst, inst_data);
2481     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2482   }
2483   HANDLE_EXPERIMENTAL_INSTRUCTION_END();
2484 
2485   HANDLE_EXPERIMENTAL_INSTRUCTION_START(UNBOX_LAMBDA) {
2486     bool success = DoUnboxLambda<do_access_check>(self, shadow_frame, inst, inst_data);
2487     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2488   }
2489   HANDLE_EXPERIMENTAL_INSTRUCTION_END();
2490 
2491   HANDLE_EXPERIMENTAL_INSTRUCTION_START(CAPTURE_VARIABLE) {
2492     if (lambda_closure_builder == nullptr) {
2493       lambda_closure_builder = MakeUnique<lambda::ClosureBuilder>();
2494     }
2495 
2496     bool success = DoCaptureVariable<do_access_check>(self,
2497                                                       inst,
2498                                                       /*inout*/shadow_frame,
2499                                                       /*inout*/lambda_closure_builder.get());
2500 
2501     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2502   }
2503   HANDLE_EXPERIMENTAL_INSTRUCTION_END();
2504 
2505   HANDLE_EXPERIMENTAL_INSTRUCTION_START(LIBERATE_VARIABLE) {
2506     bool success = DoLiberateVariable<do_access_check>(self,
2507                                                            inst,
2508                                                            lambda_captured_variable_index,
2509                                                            /*inout*/shadow_frame);
2510     // Temporarily only allow sequences of 'liberate-variable, liberate-variable, ...'
2511     lambda_captured_variable_index++;
2512     POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, 2);
2513   }
2514   HANDLE_EXPERIMENTAL_INSTRUCTION_END();
2515 
2516   HANDLE_INSTRUCTION_START(UNUSED_3E)
2517     UnexpectedOpcode(inst, shadow_frame);
2518   HANDLE_INSTRUCTION_END();
2519 
2520   HANDLE_INSTRUCTION_START(UNUSED_3F)
2521     UnexpectedOpcode(inst, shadow_frame);
2522   HANDLE_INSTRUCTION_END();
2523 
2524   HANDLE_INSTRUCTION_START(UNUSED_40)
2525     UnexpectedOpcode(inst, shadow_frame);
2526   HANDLE_INSTRUCTION_END();
2527 
2528   HANDLE_INSTRUCTION_START(UNUSED_41)
2529     UnexpectedOpcode(inst, shadow_frame);
2530   HANDLE_INSTRUCTION_END();
2531 
2532   HANDLE_INSTRUCTION_START(UNUSED_42)
2533     UnexpectedOpcode(inst, shadow_frame);
2534   HANDLE_INSTRUCTION_END();
2535 
2536   HANDLE_INSTRUCTION_START(UNUSED_43)
2537     UnexpectedOpcode(inst, shadow_frame);
2538   HANDLE_INSTRUCTION_END();
2539 
2540   HANDLE_INSTRUCTION_START(UNUSED_79)
2541     UnexpectedOpcode(inst, shadow_frame);
2542   HANDLE_INSTRUCTION_END();
2543 
2544   HANDLE_INSTRUCTION_START(UNUSED_7A)
2545     UnexpectedOpcode(inst, shadow_frame);
2546   HANDLE_INSTRUCTION_END();
2547 
2548   HANDLE_INSTRUCTION_START(UNUSED_F4)
2549     UnexpectedOpcode(inst, shadow_frame);
2550   HANDLE_INSTRUCTION_END();
2551 
2552   HANDLE_INSTRUCTION_START(UNUSED_FA)
2553     UnexpectedOpcode(inst, shadow_frame);
2554   HANDLE_INSTRUCTION_END();
2555 
2556   HANDLE_INSTRUCTION_START(UNUSED_FB)
2557     UnexpectedOpcode(inst, shadow_frame);
2558   HANDLE_INSTRUCTION_END();
2559 
2560   HANDLE_INSTRUCTION_START(UNUSED_FC)
2561     UnexpectedOpcode(inst, shadow_frame);
2562   HANDLE_INSTRUCTION_END();
2563 
2564   HANDLE_INSTRUCTION_START(UNUSED_FD)
2565     UnexpectedOpcode(inst, shadow_frame);
2566   HANDLE_INSTRUCTION_END();
2567 
2568   HANDLE_INSTRUCTION_START(UNUSED_FE)
2569     UnexpectedOpcode(inst, shadow_frame);
2570   HANDLE_INSTRUCTION_END();
2571 
2572   HANDLE_INSTRUCTION_START(UNUSED_FF)
2573     UnexpectedOpcode(inst, shadow_frame);
2574   HANDLE_INSTRUCTION_END();
2575 
2576   exception_pending_label: {
2577     CHECK(self->IsExceptionPending());
2578     if (UNLIKELY(self->TestAllFlags())) {
2579       self->CheckSuspend();
2580       UPDATE_HANDLER_TABLE();
2581     }
2582     uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, dex_pc,
2583                                                                   instrumentation);
2584     if (found_dex_pc == DexFile::kDexNoIndex) {
2585       // Structured locking is to be enforced for abnormal termination, too.
2586       DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame);
2587       return JValue(); /* Handled in caller. */
2588     } else {
2589       int32_t displacement = static_cast<int32_t>(found_dex_pc) - static_cast<int32_t>(dex_pc);
2590       ADVANCE(displacement);
2591     }
2592   }
2593 
2594 // Create alternative instruction handlers dedicated to instrumentation.
2595 // Return instructions must not call Instrumentation::DexPcMovedEvent since they already call
2596 // Instrumentation::MethodExited. This is to avoid posting debugger events twice for this location.
2597 // Note: we do not use the kReturn instruction flag here (to test the instruction is a return). The
2598 // compiler seems to not evaluate "(Instruction::FlagsOf(Instruction::code) & kReturn) != 0" to
2599 // a constant condition that would remove the "if" statement so the test is free.
2600 #define INSTRUMENTATION_INSTRUCTION_HANDLER(o, code, n, f, r, i, a, v)                        \
2601   alt_op_##code: {                                                                            \
2602     if (UNLIKELY(instrumentation->HasDexPcListeners())) {                                     \
2603       Object* this_object = shadow_frame.GetThisObject(code_item->ins_size_);                 \
2604       instrumentation->DexPcMovedEvent(self, this_object, shadow_frame.GetMethod(), dex_pc);  \
2605     }                                                                                         \
2606     UPDATE_HANDLER_TABLE();                                                                   \
2607     goto *handlersTable[instrumentation::kMainHandlerTable][Instruction::code];               \
2608   }
2609 #include "dex_instruction_list.h"
2610       DEX_INSTRUCTION_LIST(INSTRUMENTATION_INSTRUCTION_HANDLER)
2611 #undef DEX_INSTRUCTION_LIST
2612 #undef INSTRUMENTATION_INSTRUCTION_HANDLER
2613 }  // NOLINT(readability/fn_size)
2614 
2615 // Explicit definitions of ExecuteGotoImpl.
2616 template SHARED_REQUIRES(Locks::mutator_lock_) HOT_ATTR
2617 JValue ExecuteGotoImpl<true, false>(Thread* self, const DexFile::CodeItem* code_item,
2618                                     ShadowFrame& shadow_frame, JValue result_register);
2619 template SHARED_REQUIRES(Locks::mutator_lock_) HOT_ATTR
2620 JValue ExecuteGotoImpl<false, false>(Thread* self, const DexFile::CodeItem* code_item,
2621                                      ShadowFrame& shadow_frame, JValue result_register);
2622 template SHARED_REQUIRES(Locks::mutator_lock_)
2623 JValue ExecuteGotoImpl<true, true>(Thread* self, const DexFile::CodeItem* code_item,
2624                                    ShadowFrame& shadow_frame, JValue result_register);
2625 template SHARED_REQUIRES(Locks::mutator_lock_)
2626 JValue ExecuteGotoImpl<false, true>(Thread* self, const DexFile::CodeItem* code_item,
2627                                     ShadowFrame& shadow_frame, JValue result_register);
2628 
2629 }  // namespace interpreter
2630 }  // namespace art
2631 
2632 #endif
2633