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 #include "interpreter_common.h"
18 
19 namespace art {
20 namespace interpreter {
21 
22 #define HANDLE_PENDING_EXCEPTION()                                                              \
23   do {                                                                                          \
24     DCHECK(self->IsExceptionPending());                                                         \
25     if (UNLIKELY(self->TestAllFlags())) {                                                       \
26       CheckSuspend(self);                                                                       \
27     }                                                                                           \
28     uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame,           \
29                                                                   inst->GetDexPc(insns),        \
30                                                                   instrumentation);             \
31     if (found_dex_pc == DexFile::kDexNoIndex) {                                                 \
32       return JValue(); /* Handled in caller. */                                                 \
33     } else {                                                                                    \
34       int32_t displacement = static_cast<int32_t>(found_dex_pc) - static_cast<int32_t>(dex_pc); \
35       inst = inst->RelativeAt(displacement);                                                    \
36     }                                                                                           \
37   } while (false)
38 
39 #define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function)  \
40   do {                                                                            \
41     if (UNLIKELY(_is_exception_pending)) {                                        \
42       HANDLE_PENDING_EXCEPTION();                                                 \
43     } else {                                                                      \
44       inst = inst->_next_function();                                              \
45     }                                                                             \
46   } while (false)
47 
48 // Code to run before each dex instruction.
49 #define PREAMBLE()                                                                              \
50   do {                                                                                          \
51     DCHECK(!inst->IsReturn());                                                                  \
52     if (UNLIKELY(notified_method_entry_event)) {                                                \
53       notified_method_entry_event = false;                                                      \
54     } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {                                \
55       instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),  \
56                                        shadow_frame.GetMethod(), dex_pc);                       \
57     }                                                                                           \
58   } while (false)
59 
60 template<bool do_access_check, bool transaction_active>
ExecuteSwitchImpl(Thread * self,MethodHelper & mh,const DexFile::CodeItem * code_item,ShadowFrame & shadow_frame,JValue result_register)61 JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item,
62                          ShadowFrame& shadow_frame, JValue result_register) {
63   bool do_assignability_check = do_access_check;
64   if (UNLIKELY(!shadow_frame.HasReferenceArray())) {
65     LOG(FATAL) << "Invalid shadow frame for interpreter use";
66     return JValue();
67   }
68   self->VerifyStack();
69 
70   uint32_t dex_pc = shadow_frame.GetDexPC();
71   bool notified_method_entry_event = false;
72   const instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation();
73   if (LIKELY(dex_pc == 0)) {  // We are entering the method as opposed to deoptimizing.
74     if (kIsDebugBuild) {
75         self->AssertNoPendingException();
76     }
77     if (UNLIKELY(instrumentation->HasMethodEntryListeners())) {
78       instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
79                                         shadow_frame.GetMethod(), 0);
80       notified_method_entry_event = true;
81     }
82   }
83   const uint16_t* const insns = code_item->insns_;
84   const Instruction* inst = Instruction::At(insns + dex_pc);
85   uint16_t inst_data;
86   while (true) {
87     dex_pc = inst->GetDexPc(insns);
88     shadow_frame.SetDexPC(dex_pc);
89     TraceExecution(shadow_frame, inst, dex_pc, mh);
90     inst_data = inst->Fetch16(0);
91     switch (inst->Opcode(inst_data)) {
92       case Instruction::NOP:
93         PREAMBLE();
94         inst = inst->Next_1xx();
95         break;
96       case Instruction::MOVE:
97         PREAMBLE();
98         shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
99                              shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
100         inst = inst->Next_1xx();
101         break;
102       case Instruction::MOVE_FROM16:
103         PREAMBLE();
104         shadow_frame.SetVReg(inst->VRegA_22x(inst_data),
105                              shadow_frame.GetVReg(inst->VRegB_22x()));
106         inst = inst->Next_2xx();
107         break;
108       case Instruction::MOVE_16:
109         PREAMBLE();
110         shadow_frame.SetVReg(inst->VRegA_32x(),
111                              shadow_frame.GetVReg(inst->VRegB_32x()));
112         inst = inst->Next_3xx();
113         break;
114       case Instruction::MOVE_WIDE:
115         PREAMBLE();
116         shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
117                                  shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
118         inst = inst->Next_1xx();
119         break;
120       case Instruction::MOVE_WIDE_FROM16:
121         PREAMBLE();
122         shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data),
123                                  shadow_frame.GetVRegLong(inst->VRegB_22x()));
124         inst = inst->Next_2xx();
125         break;
126       case Instruction::MOVE_WIDE_16:
127         PREAMBLE();
128         shadow_frame.SetVRegLong(inst->VRegA_32x(),
129                                  shadow_frame.GetVRegLong(inst->VRegB_32x()));
130         inst = inst->Next_3xx();
131         break;
132       case Instruction::MOVE_OBJECT:
133         PREAMBLE();
134         shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data),
135                                       shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)));
136         inst = inst->Next_1xx();
137         break;
138       case Instruction::MOVE_OBJECT_FROM16:
139         PREAMBLE();
140         shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data),
141                                       shadow_frame.GetVRegReference(inst->VRegB_22x()));
142         inst = inst->Next_2xx();
143         break;
144       case Instruction::MOVE_OBJECT_16:
145         PREAMBLE();
146         shadow_frame.SetVRegReference(inst->VRegA_32x(),
147                                       shadow_frame.GetVRegReference(inst->VRegB_32x()));
148         inst = inst->Next_3xx();
149         break;
150       case Instruction::MOVE_RESULT:
151         PREAMBLE();
152         shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI());
153         inst = inst->Next_1xx();
154         break;
155       case Instruction::MOVE_RESULT_WIDE:
156         PREAMBLE();
157         shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ());
158         inst = inst->Next_1xx();
159         break;
160       case Instruction::MOVE_RESULT_OBJECT:
161         PREAMBLE();
162         shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL());
163         inst = inst->Next_1xx();
164         break;
165       case Instruction::MOVE_EXCEPTION: {
166         PREAMBLE();
167         Throwable* exception = self->GetException(nullptr);
168         DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction";
169         shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception);
170         self->ClearException();
171         inst = inst->Next_1xx();
172         break;
173       }
174       case Instruction::RETURN_VOID: {
175         JValue result;
176         if (do_access_check) {
177           // If access checks are required then the dex-to-dex compiler and analysis of
178           // whether the class has final fields hasn't been performed. Conservatively
179           // perform the memory barrier now.
180           QuasiAtomic::ThreadFenceForConstructor();
181         }
182         if (UNLIKELY(self->TestAllFlags())) {
183           CheckSuspend(self);
184         }
185         if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
186           instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
187                                            shadow_frame.GetMethod(), inst->GetDexPc(insns),
188                                            result);
189         } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
190           instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
191                                            shadow_frame.GetMethod(), dex_pc);
192         }
193         return result;
194       }
195       case Instruction::RETURN_VOID_BARRIER: {
196         QuasiAtomic::ThreadFenceForConstructor();
197         JValue result;
198         if (UNLIKELY(self->TestAllFlags())) {
199           CheckSuspend(self);
200         }
201         if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
202           instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
203                                            shadow_frame.GetMethod(), inst->GetDexPc(insns),
204                                            result);
205         } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
206           instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
207                                            shadow_frame.GetMethod(), dex_pc);
208         }
209         return result;
210       }
211       case Instruction::RETURN: {
212         JValue result;
213         result.SetJ(0);
214         result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data)));
215         if (UNLIKELY(self->TestAllFlags())) {
216           CheckSuspend(self);
217         }
218         if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
219           instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
220                                            shadow_frame.GetMethod(), inst->GetDexPc(insns),
221                                            result);
222         } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
223           instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
224                                            shadow_frame.GetMethod(), dex_pc);
225         }
226         return result;
227       }
228       case Instruction::RETURN_WIDE: {
229         JValue result;
230         result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data)));
231         if (UNLIKELY(self->TestAllFlags())) {
232           CheckSuspend(self);
233         }
234         if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
235           instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
236                                            shadow_frame.GetMethod(), inst->GetDexPc(insns),
237                                            result);
238         } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
239           instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
240                                            shadow_frame.GetMethod(), dex_pc);
241         }
242         return result;
243       }
244       case Instruction::RETURN_OBJECT: {
245         JValue result;
246         if (UNLIKELY(self->TestAllFlags())) {
247           CheckSuspend(self);
248         }
249         const size_t ref_idx = inst->VRegA_11x(inst_data);
250         Object* obj_result = shadow_frame.GetVRegReference(ref_idx);
251         if (do_assignability_check && obj_result != NULL) {
252           StackHandleScope<1> hs(self);
253           MethodHelper mhs(hs.NewHandle(shadow_frame.GetMethod()));
254           Class* return_type = mhs.GetReturnType();
255           // Re-load since it might have moved.
256           obj_result = shadow_frame.GetVRegReference(ref_idx);
257           if (return_type == NULL) {
258             // Return the pending exception.
259             HANDLE_PENDING_EXCEPTION();
260           }
261           if (!obj_result->VerifierInstanceOf(return_type)) {
262             // This should never happen.
263             std::string temp1, temp2;
264             self->ThrowNewExceptionF(self->GetCurrentLocationForThrow(),
265                                      "Ljava/lang/VirtualMachineError;",
266                                      "Returning '%s' that is not instance of return type '%s'",
267                                      obj_result->GetClass()->GetDescriptor(&temp1),
268                                      return_type->GetDescriptor(&temp2));
269             HANDLE_PENDING_EXCEPTION();
270           }
271         }
272         result.SetL(obj_result);
273         if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
274           instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
275                                            shadow_frame.GetMethod(), inst->GetDexPc(insns),
276                                            result);
277         } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
278           instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
279                                            shadow_frame.GetMethod(), dex_pc);
280         }
281         return result;
282       }
283       case Instruction::CONST_4: {
284         PREAMBLE();
285         uint4_t dst = inst->VRegA_11n(inst_data);
286         int4_t val = inst->VRegB_11n(inst_data);
287         shadow_frame.SetVReg(dst, val);
288         if (val == 0) {
289           shadow_frame.SetVRegReference(dst, NULL);
290         }
291         inst = inst->Next_1xx();
292         break;
293       }
294       case Instruction::CONST_16: {
295         PREAMBLE();
296         uint8_t dst = inst->VRegA_21s(inst_data);
297         int16_t val = inst->VRegB_21s();
298         shadow_frame.SetVReg(dst, val);
299         if (val == 0) {
300           shadow_frame.SetVRegReference(dst, NULL);
301         }
302         inst = inst->Next_2xx();
303         break;
304       }
305       case Instruction::CONST: {
306         PREAMBLE();
307         uint8_t dst = inst->VRegA_31i(inst_data);
308         int32_t val = inst->VRegB_31i();
309         shadow_frame.SetVReg(dst, val);
310         if (val == 0) {
311           shadow_frame.SetVRegReference(dst, NULL);
312         }
313         inst = inst->Next_3xx();
314         break;
315       }
316       case Instruction::CONST_HIGH16: {
317         PREAMBLE();
318         uint8_t dst = inst->VRegA_21h(inst_data);
319         int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16);
320         shadow_frame.SetVReg(dst, val);
321         if (val == 0) {
322           shadow_frame.SetVRegReference(dst, NULL);
323         }
324         inst = inst->Next_2xx();
325         break;
326       }
327       case Instruction::CONST_WIDE_16:
328         PREAMBLE();
329         shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s());
330         inst = inst->Next_2xx();
331         break;
332       case Instruction::CONST_WIDE_32:
333         PREAMBLE();
334         shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i());
335         inst = inst->Next_3xx();
336         break;
337       case Instruction::CONST_WIDE:
338         PREAMBLE();
339         shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l());
340         inst = inst->Next_51l();
341         break;
342       case Instruction::CONST_WIDE_HIGH16:
343         PREAMBLE();
344         shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data),
345                                  static_cast<uint64_t>(inst->VRegB_21h()) << 48);
346         inst = inst->Next_2xx();
347         break;
348       case Instruction::CONST_STRING: {
349         PREAMBLE();
350         String* s = ResolveString(self, mh,  inst->VRegB_21c());
351         if (UNLIKELY(s == NULL)) {
352           HANDLE_PENDING_EXCEPTION();
353         } else {
354           shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s);
355           inst = inst->Next_2xx();
356         }
357         break;
358       }
359       case Instruction::CONST_STRING_JUMBO: {
360         PREAMBLE();
361         String* s = ResolveString(self, mh,  inst->VRegB_31c());
362         if (UNLIKELY(s == NULL)) {
363           HANDLE_PENDING_EXCEPTION();
364         } else {
365           shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s);
366           inst = inst->Next_3xx();
367         }
368         break;
369       }
370       case Instruction::CONST_CLASS: {
371         PREAMBLE();
372         Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(),
373                                           self, false, do_access_check);
374         if (UNLIKELY(c == NULL)) {
375           HANDLE_PENDING_EXCEPTION();
376         } else {
377           shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c);
378           inst = inst->Next_2xx();
379         }
380         break;
381       }
382       case Instruction::MONITOR_ENTER: {
383         PREAMBLE();
384         Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
385         if (UNLIKELY(obj == NULL)) {
386           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
387           HANDLE_PENDING_EXCEPTION();
388         } else {
389           DoMonitorEnter(self, obj);
390           POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
391         }
392         break;
393       }
394       case Instruction::MONITOR_EXIT: {
395         PREAMBLE();
396         Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
397         if (UNLIKELY(obj == NULL)) {
398           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
399           HANDLE_PENDING_EXCEPTION();
400         } else {
401           DoMonitorExit(self, obj);
402           POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
403         }
404         break;
405       }
406       case Instruction::CHECK_CAST: {
407         PREAMBLE();
408         Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(),
409                                           self, false, do_access_check);
410         if (UNLIKELY(c == NULL)) {
411           HANDLE_PENDING_EXCEPTION();
412         } else {
413           Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data));
414           if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) {
415             ThrowClassCastException(c, obj->GetClass());
416             HANDLE_PENDING_EXCEPTION();
417           } else {
418             inst = inst->Next_2xx();
419           }
420         }
421         break;
422       }
423       case Instruction::INSTANCE_OF: {
424         PREAMBLE();
425         Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(),
426                                           self, false, do_access_check);
427         if (UNLIKELY(c == NULL)) {
428           HANDLE_PENDING_EXCEPTION();
429         } else {
430           Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data));
431           shadow_frame.SetVReg(inst->VRegA_22c(inst_data), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0);
432           inst = inst->Next_2xx();
433         }
434         break;
435       }
436       case Instruction::ARRAY_LENGTH:  {
437         PREAMBLE();
438         Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data));
439         if (UNLIKELY(array == NULL)) {
440           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
441           HANDLE_PENDING_EXCEPTION();
442         } else {
443           shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength());
444           inst = inst->Next_1xx();
445         }
446         break;
447       }
448       case Instruction::NEW_INSTANCE: {
449         PREAMBLE();
450         Runtime* runtime = Runtime::Current();
451         Object* obj = AllocObjectFromCode<do_access_check, true>(
452             inst->VRegB_21c(), shadow_frame.GetMethod(), self,
453             runtime->GetHeap()->GetCurrentAllocator());
454         if (UNLIKELY(obj == NULL)) {
455           HANDLE_PENDING_EXCEPTION();
456         } else {
457           obj->GetClass()->AssertInitializedOrInitializingInThread(self);
458           // Don't allow finalizable objects to be allocated during a transaction since these can't
459           // be finalized without a started runtime.
460           if (transaction_active && obj->GetClass()->IsFinalizable()) {
461             AbortTransaction(self, "Allocating finalizable object in transaction: %s",
462                              PrettyTypeOf(obj).c_str());
463             HANDLE_PENDING_EXCEPTION();
464             break;
465           }
466           shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj);
467           inst = inst->Next_2xx();
468         }
469         break;
470       }
471       case Instruction::NEW_ARRAY: {
472         PREAMBLE();
473         int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data));
474         Object* obj = AllocArrayFromCode<do_access_check, true>(
475             inst->VRegC_22c(), shadow_frame.GetMethod(), length, self,
476             Runtime::Current()->GetHeap()->GetCurrentAllocator());
477         if (UNLIKELY(obj == NULL)) {
478           HANDLE_PENDING_EXCEPTION();
479         } else {
480           shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj);
481           inst = inst->Next_2xx();
482         }
483         break;
484       }
485       case Instruction::FILLED_NEW_ARRAY: {
486         PREAMBLE();
487         bool success =
488             DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self,
489                                                                          &result_register);
490         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
491         break;
492       }
493       case Instruction::FILLED_NEW_ARRAY_RANGE: {
494         PREAMBLE();
495         bool success =
496             DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame,
497                                                                         self, &result_register);
498         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
499         break;
500       }
501       case Instruction::FILL_ARRAY_DATA: {
502         PREAMBLE();
503         Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data));
504         if (UNLIKELY(obj == NULL)) {
505           ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA");
506           HANDLE_PENDING_EXCEPTION();
507           break;
508         }
509         Array* array = obj->AsArray();
510         DCHECK(array->IsArrayInstance() && !array->IsObjectArray());
511         const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t();
512         const Instruction::ArrayDataPayload* payload =
513             reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr);
514         if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) {
515           self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(),
516                                    "Ljava/lang/ArrayIndexOutOfBoundsException;",
517                                    "failed FILL_ARRAY_DATA; length=%d, index=%d",
518                                    array->GetLength(), payload->element_count);
519           HANDLE_PENDING_EXCEPTION();
520           break;
521         }
522         if (transaction_active) {
523           RecordArrayElementsInTransaction(array, payload->element_count);
524         }
525         uint32_t size_in_bytes = payload->element_count * payload->element_width;
526         memcpy(array->GetRawData(payload->element_width, 0), payload->data, size_in_bytes);
527         inst = inst->Next_3xx();
528         break;
529       }
530       case Instruction::THROW: {
531         PREAMBLE();
532         Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
533         if (UNLIKELY(exception == NULL)) {
534           ThrowNullPointerException(NULL, "throw with null exception");
535         } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) {
536           // This should never happen.
537           std::string temp;
538           self->ThrowNewExceptionF(self->GetCurrentLocationForThrow(),
539                                    "Ljava/lang/VirtualMachineError;",
540                                    "Throwing '%s' that is not instance of Throwable",
541                                    exception->GetClass()->GetDescriptor(&temp));
542         } else {
543           self->SetException(shadow_frame.GetCurrentLocationForThrow(), exception->AsThrowable());
544         }
545         HANDLE_PENDING_EXCEPTION();
546         break;
547       }
548       case Instruction::GOTO: {
549         PREAMBLE();
550         int8_t offset = inst->VRegA_10t(inst_data);
551         if (IsBackwardBranch(offset)) {
552           if (UNLIKELY(self->TestAllFlags())) {
553             CheckSuspend(self);
554           }
555         }
556         inst = inst->RelativeAt(offset);
557         break;
558       }
559       case Instruction::GOTO_16: {
560         PREAMBLE();
561         int16_t offset = inst->VRegA_20t();
562         if (IsBackwardBranch(offset)) {
563           if (UNLIKELY(self->TestAllFlags())) {
564             CheckSuspend(self);
565           }
566         }
567         inst = inst->RelativeAt(offset);
568         break;
569       }
570       case Instruction::GOTO_32: {
571         PREAMBLE();
572         int32_t offset = inst->VRegA_30t();
573         if (IsBackwardBranch(offset)) {
574           if (UNLIKELY(self->TestAllFlags())) {
575             CheckSuspend(self);
576           }
577         }
578         inst = inst->RelativeAt(offset);
579         break;
580       }
581       case Instruction::PACKED_SWITCH: {
582         PREAMBLE();
583         int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data);
584         if (IsBackwardBranch(offset)) {
585           if (UNLIKELY(self->TestAllFlags())) {
586             CheckSuspend(self);
587           }
588         }
589         inst = inst->RelativeAt(offset);
590         break;
591       }
592       case Instruction::SPARSE_SWITCH: {
593         PREAMBLE();
594         int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data);
595         if (IsBackwardBranch(offset)) {
596           if (UNLIKELY(self->TestAllFlags())) {
597             CheckSuspend(self);
598           }
599         }
600         inst = inst->RelativeAt(offset);
601         break;
602       }
603       case Instruction::CMPL_FLOAT: {
604         PREAMBLE();
605         float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
606         float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
607         int32_t result;
608         if (val1 > val2) {
609           result = 1;
610         } else if (val1 == val2) {
611           result = 0;
612         } else {
613           result = -1;
614         }
615         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
616         inst = inst->Next_2xx();
617         break;
618       }
619       case Instruction::CMPG_FLOAT: {
620         PREAMBLE();
621         float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
622         float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
623         int32_t result;
624         if (val1 < val2) {
625           result = -1;
626         } else if (val1 == val2) {
627           result = 0;
628         } else {
629           result = 1;
630         }
631         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
632         inst = inst->Next_2xx();
633         break;
634       }
635       case Instruction::CMPL_DOUBLE: {
636         PREAMBLE();
637         double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
638         double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
639         int32_t result;
640         if (val1 > val2) {
641           result = 1;
642         } else if (val1 == val2) {
643           result = 0;
644         } else {
645           result = -1;
646         }
647         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
648         inst = inst->Next_2xx();
649         break;
650       }
651 
652       case Instruction::CMPG_DOUBLE: {
653         PREAMBLE();
654         double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
655         double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
656         int32_t result;
657         if (val1 < val2) {
658           result = -1;
659         } else if (val1 == val2) {
660           result = 0;
661         } else {
662           result = 1;
663         }
664         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
665         inst = inst->Next_2xx();
666         break;
667       }
668       case Instruction::CMP_LONG: {
669         PREAMBLE();
670         int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x());
671         int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x());
672         int32_t result;
673         if (val1 > val2) {
674           result = 1;
675         } else if (val1 == val2) {
676           result = 0;
677         } else {
678           result = -1;
679         }
680         shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
681         inst = inst->Next_2xx();
682         break;
683       }
684       case Instruction::IF_EQ: {
685         PREAMBLE();
686         if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
687           int16_t offset = inst->VRegC_22t();
688           if (IsBackwardBranch(offset)) {
689             if (UNLIKELY(self->TestAllFlags())) {
690               CheckSuspend(self);
691             }
692           }
693           inst = inst->RelativeAt(offset);
694         } else {
695           inst = inst->Next_2xx();
696         }
697         break;
698       }
699       case Instruction::IF_NE: {
700         PREAMBLE();
701         if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
702           int16_t offset = inst->VRegC_22t();
703           if (IsBackwardBranch(offset)) {
704             if (UNLIKELY(self->TestAllFlags())) {
705               CheckSuspend(self);
706             }
707           }
708           inst = inst->RelativeAt(offset);
709         } else {
710           inst = inst->Next_2xx();
711         }
712         break;
713       }
714       case Instruction::IF_LT: {
715         PREAMBLE();
716         if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
717           int16_t offset = inst->VRegC_22t();
718           if (IsBackwardBranch(offset)) {
719             if (UNLIKELY(self->TestAllFlags())) {
720               CheckSuspend(self);
721             }
722           }
723           inst = inst->RelativeAt(offset);
724         } else {
725           inst = inst->Next_2xx();
726         }
727         break;
728       }
729       case Instruction::IF_GE: {
730         PREAMBLE();
731         if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
732           int16_t offset = inst->VRegC_22t();
733           if (IsBackwardBranch(offset)) {
734             if (UNLIKELY(self->TestAllFlags())) {
735               CheckSuspend(self);
736             }
737           }
738           inst = inst->RelativeAt(offset);
739         } else {
740           inst = inst->Next_2xx();
741         }
742         break;
743       }
744       case Instruction::IF_GT: {
745         PREAMBLE();
746         if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
747           int16_t offset = inst->VRegC_22t();
748           if (IsBackwardBranch(offset)) {
749             if (UNLIKELY(self->TestAllFlags())) {
750               CheckSuspend(self);
751             }
752           }
753           inst = inst->RelativeAt(offset);
754         } else {
755           inst = inst->Next_2xx();
756         }
757         break;
758       }
759       case Instruction::IF_LE: {
760         PREAMBLE();
761         if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
762           int16_t offset = inst->VRegC_22t();
763           if (IsBackwardBranch(offset)) {
764             if (UNLIKELY(self->TestAllFlags())) {
765               CheckSuspend(self);
766             }
767           }
768           inst = inst->RelativeAt(offset);
769         } else {
770           inst = inst->Next_2xx();
771         }
772         break;
773       }
774       case Instruction::IF_EQZ: {
775         PREAMBLE();
776         if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) {
777           int16_t offset = inst->VRegB_21t();
778           if (IsBackwardBranch(offset)) {
779             if (UNLIKELY(self->TestAllFlags())) {
780               CheckSuspend(self);
781             }
782           }
783           inst = inst->RelativeAt(offset);
784         } else {
785           inst = inst->Next_2xx();
786         }
787         break;
788       }
789       case Instruction::IF_NEZ: {
790         PREAMBLE();
791         if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) {
792           int16_t offset = inst->VRegB_21t();
793           if (IsBackwardBranch(offset)) {
794             if (UNLIKELY(self->TestAllFlags())) {
795               CheckSuspend(self);
796             }
797           }
798           inst = inst->RelativeAt(offset);
799         } else {
800           inst = inst->Next_2xx();
801         }
802         break;
803       }
804       case Instruction::IF_LTZ: {
805         PREAMBLE();
806         if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) {
807           int16_t offset = inst->VRegB_21t();
808           if (IsBackwardBranch(offset)) {
809             if (UNLIKELY(self->TestAllFlags())) {
810               CheckSuspend(self);
811             }
812           }
813           inst = inst->RelativeAt(offset);
814         } else {
815           inst = inst->Next_2xx();
816         }
817         break;
818       }
819       case Instruction::IF_GEZ: {
820         PREAMBLE();
821         if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) {
822           int16_t offset = inst->VRegB_21t();
823           if (IsBackwardBranch(offset)) {
824             if (UNLIKELY(self->TestAllFlags())) {
825               CheckSuspend(self);
826             }
827           }
828           inst = inst->RelativeAt(offset);
829         } else {
830           inst = inst->Next_2xx();
831         }
832         break;
833       }
834       case Instruction::IF_GTZ: {
835         PREAMBLE();
836         if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) {
837           int16_t offset = inst->VRegB_21t();
838           if (IsBackwardBranch(offset)) {
839             if (UNLIKELY(self->TestAllFlags())) {
840               CheckSuspend(self);
841             }
842           }
843           inst = inst->RelativeAt(offset);
844         } else {
845           inst = inst->Next_2xx();
846         }
847         break;
848       }
849       case Instruction::IF_LEZ:  {
850         PREAMBLE();
851         if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) {
852           int16_t offset = inst->VRegB_21t();
853           if (IsBackwardBranch(offset)) {
854             if (UNLIKELY(self->TestAllFlags())) {
855               CheckSuspend(self);
856             }
857           }
858           inst = inst->RelativeAt(offset);
859         } else {
860           inst = inst->Next_2xx();
861         }
862         break;
863       }
864       case Instruction::AGET_BOOLEAN: {
865         PREAMBLE();
866         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
867         if (UNLIKELY(a == NULL)) {
868           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
869           HANDLE_PENDING_EXCEPTION();
870           break;
871         }
872         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
873         BooleanArray* array = a->AsBooleanArray();
874         if (array->CheckIsValidIndex(index)) {
875           shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
876           inst = inst->Next_2xx();
877         } else {
878           HANDLE_PENDING_EXCEPTION();
879         }
880         break;
881       }
882       case Instruction::AGET_BYTE: {
883         PREAMBLE();
884         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
885         if (UNLIKELY(a == NULL)) {
886           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
887           HANDLE_PENDING_EXCEPTION();
888           break;
889         }
890         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
891         ByteArray* array = a->AsByteArray();
892         if (array->CheckIsValidIndex(index)) {
893           shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
894           inst = inst->Next_2xx();
895         } else {
896           HANDLE_PENDING_EXCEPTION();
897         }
898         break;
899       }
900       case Instruction::AGET_CHAR: {
901         PREAMBLE();
902         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
903         if (UNLIKELY(a == NULL)) {
904           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
905           HANDLE_PENDING_EXCEPTION();
906           break;
907         }
908         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
909         CharArray* array = a->AsCharArray();
910         if (array->CheckIsValidIndex(index)) {
911           shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
912           inst = inst->Next_2xx();
913         } else {
914           HANDLE_PENDING_EXCEPTION();
915         }
916         break;
917       }
918       case Instruction::AGET_SHORT: {
919         PREAMBLE();
920         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
921         if (UNLIKELY(a == NULL)) {
922           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
923           HANDLE_PENDING_EXCEPTION();
924           break;
925         }
926         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
927         ShortArray* array = a->AsShortArray();
928         if (array->CheckIsValidIndex(index)) {
929           shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
930           inst = inst->Next_2xx();
931         } else {
932           HANDLE_PENDING_EXCEPTION();
933         }
934         break;
935       }
936       case Instruction::AGET: {
937         PREAMBLE();
938         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
939         if (UNLIKELY(a == NULL)) {
940           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
941           HANDLE_PENDING_EXCEPTION();
942           break;
943         }
944         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
945         IntArray* array = a->AsIntArray();
946         if (array->CheckIsValidIndex(index)) {
947           shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
948           inst = inst->Next_2xx();
949         } else {
950           HANDLE_PENDING_EXCEPTION();
951         }
952         break;
953       }
954       case Instruction::AGET_WIDE:  {
955         PREAMBLE();
956         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
957         if (UNLIKELY(a == NULL)) {
958           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
959           HANDLE_PENDING_EXCEPTION();
960           break;
961         }
962         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
963         LongArray* array = a->AsLongArray();
964         if (array->CheckIsValidIndex(index)) {
965           shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
966           inst = inst->Next_2xx();
967         } else {
968           HANDLE_PENDING_EXCEPTION();
969         }
970         break;
971       }
972       case Instruction::AGET_OBJECT: {
973         PREAMBLE();
974         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
975         if (UNLIKELY(a == NULL)) {
976           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
977           HANDLE_PENDING_EXCEPTION();
978           break;
979         }
980         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
981         ObjectArray<Object>* array = a->AsObjectArray<Object>();
982         if (array->CheckIsValidIndex(index)) {
983           shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
984           inst = inst->Next_2xx();
985         } else {
986           HANDLE_PENDING_EXCEPTION();
987         }
988         break;
989       }
990       case Instruction::APUT_BOOLEAN: {
991         PREAMBLE();
992         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
993         if (UNLIKELY(a == NULL)) {
994           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
995           HANDLE_PENDING_EXCEPTION();
996           break;
997         }
998         uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
999         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1000         BooleanArray* array = a->AsBooleanArray();
1001         if (array->CheckIsValidIndex(index)) {
1002           array->SetWithoutChecks<transaction_active>(index, val);
1003           inst = inst->Next_2xx();
1004         } else {
1005           HANDLE_PENDING_EXCEPTION();
1006         }
1007         break;
1008       }
1009       case Instruction::APUT_BYTE: {
1010         PREAMBLE();
1011         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1012         if (UNLIKELY(a == NULL)) {
1013           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
1014           HANDLE_PENDING_EXCEPTION();
1015           break;
1016         }
1017         int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1018         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1019         ByteArray* array = a->AsByteArray();
1020         if (array->CheckIsValidIndex(index)) {
1021           array->SetWithoutChecks<transaction_active>(index, val);
1022           inst = inst->Next_2xx();
1023         } else {
1024           HANDLE_PENDING_EXCEPTION();
1025         }
1026         break;
1027       }
1028       case Instruction::APUT_CHAR: {
1029         PREAMBLE();
1030         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1031         if (UNLIKELY(a == NULL)) {
1032           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
1033           HANDLE_PENDING_EXCEPTION();
1034           break;
1035         }
1036         uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1037         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1038         CharArray* array = a->AsCharArray();
1039         if (array->CheckIsValidIndex(index)) {
1040           array->SetWithoutChecks<transaction_active>(index, val);
1041           inst = inst->Next_2xx();
1042         } else {
1043           HANDLE_PENDING_EXCEPTION();
1044         }
1045         break;
1046       }
1047       case Instruction::APUT_SHORT: {
1048         PREAMBLE();
1049         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1050         if (UNLIKELY(a == NULL)) {
1051           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
1052           HANDLE_PENDING_EXCEPTION();
1053           break;
1054         }
1055         int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1056         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1057         ShortArray* array = a->AsShortArray();
1058         if (array->CheckIsValidIndex(index)) {
1059           array->SetWithoutChecks<transaction_active>(index, val);
1060           inst = inst->Next_2xx();
1061         } else {
1062           HANDLE_PENDING_EXCEPTION();
1063         }
1064         break;
1065       }
1066       case Instruction::APUT: {
1067         PREAMBLE();
1068         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1069         if (UNLIKELY(a == NULL)) {
1070           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
1071           HANDLE_PENDING_EXCEPTION();
1072           break;
1073         }
1074         int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
1075         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1076         IntArray* array = a->AsIntArray();
1077         if (array->CheckIsValidIndex(index)) {
1078           array->SetWithoutChecks<transaction_active>(index, val);
1079           inst = inst->Next_2xx();
1080         } else {
1081           HANDLE_PENDING_EXCEPTION();
1082         }
1083         break;
1084       }
1085       case Instruction::APUT_WIDE: {
1086         PREAMBLE();
1087         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1088         if (UNLIKELY(a == NULL)) {
1089           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
1090           HANDLE_PENDING_EXCEPTION();
1091           break;
1092         }
1093         int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data));
1094         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1095         LongArray* array = a->AsLongArray();
1096         if (array->CheckIsValidIndex(index)) {
1097           array->SetWithoutChecks<transaction_active>(index, val);
1098           inst = inst->Next_2xx();
1099         } else {
1100           HANDLE_PENDING_EXCEPTION();
1101         }
1102         break;
1103       }
1104       case Instruction::APUT_OBJECT: {
1105         PREAMBLE();
1106         Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1107         if (UNLIKELY(a == NULL)) {
1108           ThrowNullPointerExceptionFromInterpreter(shadow_frame);
1109           HANDLE_PENDING_EXCEPTION();
1110           break;
1111         }
1112         int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1113         Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data));
1114         ObjectArray<Object>* array = a->AsObjectArray<Object>();
1115         if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) {
1116           array->SetWithoutChecks<transaction_active>(index, val);
1117           inst = inst->Next_2xx();
1118         } else {
1119           HANDLE_PENDING_EXCEPTION();
1120         }
1121         break;
1122       }
1123       case Instruction::IGET_BOOLEAN: {
1124         PREAMBLE();
1125         bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst, inst_data);
1126         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1127         break;
1128       }
1129       case Instruction::IGET_BYTE: {
1130         PREAMBLE();
1131         bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst, inst_data);
1132         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1133         break;
1134       }
1135       case Instruction::IGET_CHAR: {
1136         PREAMBLE();
1137         bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst, inst_data);
1138         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1139         break;
1140       }
1141       case Instruction::IGET_SHORT: {
1142         PREAMBLE();
1143         bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst, inst_data);
1144         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1145         break;
1146       }
1147       case Instruction::IGET: {
1148         PREAMBLE();
1149         bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst, inst_data);
1150         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1151         break;
1152       }
1153       case Instruction::IGET_WIDE: {
1154         PREAMBLE();
1155         bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst, inst_data);
1156         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1157         break;
1158       }
1159       case Instruction::IGET_OBJECT: {
1160         PREAMBLE();
1161         bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst, inst_data);
1162         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1163         break;
1164       }
1165       case Instruction::IGET_QUICK: {
1166         PREAMBLE();
1167         bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data);
1168         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1169         break;
1170       }
1171       case Instruction::IGET_WIDE_QUICK: {
1172         PREAMBLE();
1173         bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data);
1174         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1175         break;
1176       }
1177       case Instruction::IGET_OBJECT_QUICK: {
1178         PREAMBLE();
1179         bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data);
1180         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1181         break;
1182       }
1183       case Instruction::SGET_BOOLEAN: {
1184         PREAMBLE();
1185         bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst, inst_data);
1186         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1187         break;
1188       }
1189       case Instruction::SGET_BYTE: {
1190         PREAMBLE();
1191         bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst, inst_data);
1192         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1193         break;
1194       }
1195       case Instruction::SGET_CHAR: {
1196         PREAMBLE();
1197         bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst, inst_data);
1198         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1199         break;
1200       }
1201       case Instruction::SGET_SHORT: {
1202         PREAMBLE();
1203         bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst, inst_data);
1204         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1205         break;
1206       }
1207       case Instruction::SGET: {
1208         PREAMBLE();
1209         bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst, inst_data);
1210         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1211         break;
1212       }
1213       case Instruction::SGET_WIDE: {
1214         PREAMBLE();
1215         bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst, inst_data);
1216         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1217         break;
1218       }
1219       case Instruction::SGET_OBJECT: {
1220         PREAMBLE();
1221         bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst, inst_data);
1222         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1223         break;
1224       }
1225       case Instruction::IPUT_BOOLEAN: {
1226         PREAMBLE();
1227         bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1228         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1229         break;
1230       }
1231       case Instruction::IPUT_BYTE: {
1232         PREAMBLE();
1233         bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1234         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1235         break;
1236       }
1237       case Instruction::IPUT_CHAR: {
1238         PREAMBLE();
1239         bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1240         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1241         break;
1242       }
1243       case Instruction::IPUT_SHORT: {
1244         PREAMBLE();
1245         bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1246         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1247         break;
1248       }
1249       case Instruction::IPUT: {
1250         PREAMBLE();
1251         bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1252         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1253         break;
1254       }
1255       case Instruction::IPUT_WIDE: {
1256         PREAMBLE();
1257         bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1258         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1259         break;
1260       }
1261       case Instruction::IPUT_OBJECT: {
1262         PREAMBLE();
1263         bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1264         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1265         break;
1266       }
1267       case Instruction::IPUT_QUICK: {
1268         PREAMBLE();
1269         bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>(shadow_frame, inst, inst_data);
1270         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1271         break;
1272       }
1273       case Instruction::IPUT_WIDE_QUICK: {
1274         PREAMBLE();
1275         bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>(shadow_frame, inst, inst_data);
1276         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1277         break;
1278       }
1279       case Instruction::IPUT_OBJECT_QUICK: {
1280         PREAMBLE();
1281         bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>(shadow_frame, inst, inst_data);
1282         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1283         break;
1284       }
1285       case Instruction::SPUT_BOOLEAN: {
1286         PREAMBLE();
1287         bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1288         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1289         break;
1290       }
1291       case Instruction::SPUT_BYTE: {
1292         PREAMBLE();
1293         bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1294         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1295         break;
1296       }
1297       case Instruction::SPUT_CHAR: {
1298         PREAMBLE();
1299         bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1300         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1301         break;
1302       }
1303       case Instruction::SPUT_SHORT: {
1304         PREAMBLE();
1305         bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1306         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1307         break;
1308       }
1309       case Instruction::SPUT: {
1310         PREAMBLE();
1311         bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1312         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1313         break;
1314       }
1315       case Instruction::SPUT_WIDE: {
1316         PREAMBLE();
1317         bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1318         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1319         break;
1320       }
1321       case Instruction::SPUT_OBJECT: {
1322         PREAMBLE();
1323         bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
1324         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1325         break;
1326       }
1327       case Instruction::INVOKE_VIRTUAL: {
1328         PREAMBLE();
1329         bool success = DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1330         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1331         break;
1332       }
1333       case Instruction::INVOKE_VIRTUAL_RANGE: {
1334         PREAMBLE();
1335         bool success = DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1336         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1337         break;
1338       }
1339       case Instruction::INVOKE_SUPER: {
1340         PREAMBLE();
1341         bool success = DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1342         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1343         break;
1344       }
1345       case Instruction::INVOKE_SUPER_RANGE: {
1346         PREAMBLE();
1347         bool success = DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1348         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1349         break;
1350       }
1351       case Instruction::INVOKE_DIRECT: {
1352         PREAMBLE();
1353         bool success = DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1354         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1355         break;
1356       }
1357       case Instruction::INVOKE_DIRECT_RANGE: {
1358         PREAMBLE();
1359         bool success = DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1360         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1361         break;
1362       }
1363       case Instruction::INVOKE_INTERFACE: {
1364         PREAMBLE();
1365         bool success = DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1366         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1367         break;
1368       }
1369       case Instruction::INVOKE_INTERFACE_RANGE: {
1370         PREAMBLE();
1371         bool success = DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1372         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1373         break;
1374       }
1375       case Instruction::INVOKE_STATIC: {
1376         PREAMBLE();
1377         bool success = DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1378         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1379         break;
1380       }
1381       case Instruction::INVOKE_STATIC_RANGE: {
1382         PREAMBLE();
1383         bool success = DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
1384         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1385         break;
1386       }
1387       case Instruction::INVOKE_VIRTUAL_QUICK: {
1388         PREAMBLE();
1389         bool success = DoInvokeVirtualQuick<false>(self, shadow_frame, inst, inst_data, &result_register);
1390         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1391         break;
1392       }
1393       case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: {
1394         PREAMBLE();
1395         bool success = DoInvokeVirtualQuick<true>(self, shadow_frame, inst, inst_data, &result_register);
1396         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1397         break;
1398       }
1399       case Instruction::NEG_INT:
1400         PREAMBLE();
1401         shadow_frame.SetVReg(inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1402         inst = inst->Next_1xx();
1403         break;
1404       case Instruction::NOT_INT:
1405         PREAMBLE();
1406         shadow_frame.SetVReg(inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1407         inst = inst->Next_1xx();
1408         break;
1409       case Instruction::NEG_LONG:
1410         PREAMBLE();
1411         shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1412         inst = inst->Next_1xx();
1413         break;
1414       case Instruction::NOT_LONG:
1415         PREAMBLE();
1416         shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1417         inst = inst->Next_1xx();
1418         break;
1419       case Instruction::NEG_FLOAT:
1420         PREAMBLE();
1421         shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
1422         inst = inst->Next_1xx();
1423         break;
1424       case Instruction::NEG_DOUBLE:
1425         PREAMBLE();
1426         shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
1427         inst = inst->Next_1xx();
1428         break;
1429       case Instruction::INT_TO_LONG:
1430         PREAMBLE();
1431         shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
1432                                  shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1433         inst = inst->Next_1xx();
1434         break;
1435       case Instruction::INT_TO_FLOAT:
1436         PREAMBLE();
1437         shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1438                                   shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1439         inst = inst->Next_1xx();
1440         break;
1441       case Instruction::INT_TO_DOUBLE:
1442         PREAMBLE();
1443         shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1444                                    shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1445         inst = inst->Next_1xx();
1446         break;
1447       case Instruction::LONG_TO_INT:
1448         PREAMBLE();
1449         shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1450                              shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1451         inst = inst->Next_1xx();
1452         break;
1453       case Instruction::LONG_TO_FLOAT:
1454         PREAMBLE();
1455         shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1456                                   shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1457         inst = inst->Next_1xx();
1458         break;
1459       case Instruction::LONG_TO_DOUBLE:
1460         PREAMBLE();
1461         shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1462                                    shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1463         inst = inst->Next_1xx();
1464         break;
1465       case Instruction::FLOAT_TO_INT: {
1466         PREAMBLE();
1467         float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
1468         int32_t result = art_float_to_integral<int32_t, float>(val);
1469         shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
1470         inst = inst->Next_1xx();
1471         break;
1472       }
1473       case Instruction::FLOAT_TO_LONG: {
1474         PREAMBLE();
1475         float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
1476         int64_t result = art_float_to_integral<int64_t, float>(val);
1477         shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
1478         inst = inst->Next_1xx();
1479         break;
1480       }
1481       case Instruction::FLOAT_TO_DOUBLE:
1482         PREAMBLE();
1483         shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1484                                    shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
1485         inst = inst->Next_1xx();
1486         break;
1487       case Instruction::DOUBLE_TO_INT: {
1488         PREAMBLE();
1489         double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
1490         int32_t result = art_float_to_integral<int32_t, double>(val);
1491         shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
1492         inst = inst->Next_1xx();
1493         break;
1494       }
1495       case Instruction::DOUBLE_TO_LONG: {
1496         PREAMBLE();
1497         double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
1498         int64_t result = art_float_to_integral<int64_t, double>(val);
1499         shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
1500         inst = inst->Next_1xx();
1501         break;
1502       }
1503       case Instruction::DOUBLE_TO_FLOAT:
1504         PREAMBLE();
1505         shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1506                                   shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
1507         inst = inst->Next_1xx();
1508         break;
1509       case Instruction::INT_TO_BYTE:
1510         PREAMBLE();
1511         shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1512                              static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
1513         inst = inst->Next_1xx();
1514         break;
1515       case Instruction::INT_TO_CHAR:
1516         PREAMBLE();
1517         shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1518                              static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
1519         inst = inst->Next_1xx();
1520         break;
1521       case Instruction::INT_TO_SHORT:
1522         PREAMBLE();
1523         shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1524                              static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
1525         inst = inst->Next_1xx();
1526         break;
1527       case Instruction::ADD_INT:
1528         PREAMBLE();
1529         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1530                              shadow_frame.GetVReg(inst->VRegB_23x()) +
1531                              shadow_frame.GetVReg(inst->VRegC_23x()));
1532         inst = inst->Next_2xx();
1533         break;
1534       case Instruction::SUB_INT:
1535         PREAMBLE();
1536         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1537                              shadow_frame.GetVReg(inst->VRegB_23x()) -
1538                              shadow_frame.GetVReg(inst->VRegC_23x()));
1539         inst = inst->Next_2xx();
1540         break;
1541       case Instruction::MUL_INT:
1542         PREAMBLE();
1543         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1544                              shadow_frame.GetVReg(inst->VRegB_23x()) *
1545                              shadow_frame.GetVReg(inst->VRegC_23x()));
1546         inst = inst->Next_2xx();
1547         break;
1548       case Instruction::DIV_INT: {
1549         PREAMBLE();
1550         bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data),
1551                                    shadow_frame.GetVReg(inst->VRegB_23x()),
1552                                    shadow_frame.GetVReg(inst->VRegC_23x()));
1553         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1554         break;
1555       }
1556       case Instruction::REM_INT: {
1557         PREAMBLE();
1558         bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data),
1559                                       shadow_frame.GetVReg(inst->VRegB_23x()),
1560                                       shadow_frame.GetVReg(inst->VRegC_23x()));
1561         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1562         break;
1563       }
1564       case Instruction::SHL_INT:
1565         PREAMBLE();
1566         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1567                              shadow_frame.GetVReg(inst->VRegB_23x()) <<
1568                              (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1569         inst = inst->Next_2xx();
1570         break;
1571       case Instruction::SHR_INT:
1572         PREAMBLE();
1573         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1574                              shadow_frame.GetVReg(inst->VRegB_23x()) >>
1575                              (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1576         inst = inst->Next_2xx();
1577         break;
1578       case Instruction::USHR_INT:
1579         PREAMBLE();
1580         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1581                              static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >>
1582                              (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1583         inst = inst->Next_2xx();
1584         break;
1585       case Instruction::AND_INT:
1586         PREAMBLE();
1587         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1588                              shadow_frame.GetVReg(inst->VRegB_23x()) &
1589                              shadow_frame.GetVReg(inst->VRegC_23x()));
1590         inst = inst->Next_2xx();
1591         break;
1592       case Instruction::OR_INT:
1593         PREAMBLE();
1594         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1595                              shadow_frame.GetVReg(inst->VRegB_23x()) |
1596                              shadow_frame.GetVReg(inst->VRegC_23x()));
1597         inst = inst->Next_2xx();
1598         break;
1599       case Instruction::XOR_INT:
1600         PREAMBLE();
1601         shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
1602                              shadow_frame.GetVReg(inst->VRegB_23x()) ^
1603                              shadow_frame.GetVReg(inst->VRegC_23x()));
1604         inst = inst->Next_2xx();
1605         break;
1606       case Instruction::ADD_LONG:
1607         PREAMBLE();
1608         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1609                                  shadow_frame.GetVRegLong(inst->VRegB_23x()) +
1610                                  shadow_frame.GetVRegLong(inst->VRegC_23x()));
1611         inst = inst->Next_2xx();
1612         break;
1613       case Instruction::SUB_LONG:
1614         PREAMBLE();
1615         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1616                                  shadow_frame.GetVRegLong(inst->VRegB_23x()) -
1617                                  shadow_frame.GetVRegLong(inst->VRegC_23x()));
1618         inst = inst->Next_2xx();
1619         break;
1620       case Instruction::MUL_LONG:
1621         PREAMBLE();
1622         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1623                                  shadow_frame.GetVRegLong(inst->VRegB_23x()) *
1624                                  shadow_frame.GetVRegLong(inst->VRegC_23x()));
1625         inst = inst->Next_2xx();
1626         break;
1627       case Instruction::DIV_LONG:
1628         PREAMBLE();
1629         DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data),
1630                      shadow_frame.GetVRegLong(inst->VRegB_23x()),
1631                     shadow_frame.GetVRegLong(inst->VRegC_23x()));
1632         POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx);
1633         break;
1634       case Instruction::REM_LONG:
1635         PREAMBLE();
1636         DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data),
1637                         shadow_frame.GetVRegLong(inst->VRegB_23x()),
1638                         shadow_frame.GetVRegLong(inst->VRegC_23x()));
1639         POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx);
1640         break;
1641       case Instruction::AND_LONG:
1642         PREAMBLE();
1643         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1644                                  shadow_frame.GetVRegLong(inst->VRegB_23x()) &
1645                                  shadow_frame.GetVRegLong(inst->VRegC_23x()));
1646         inst = inst->Next_2xx();
1647         break;
1648       case Instruction::OR_LONG:
1649         PREAMBLE();
1650         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1651                                  shadow_frame.GetVRegLong(inst->VRegB_23x()) |
1652                                  shadow_frame.GetVRegLong(inst->VRegC_23x()));
1653         inst = inst->Next_2xx();
1654         break;
1655       case Instruction::XOR_LONG:
1656         PREAMBLE();
1657         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1658                                  shadow_frame.GetVRegLong(inst->VRegB_23x()) ^
1659                                  shadow_frame.GetVRegLong(inst->VRegC_23x()));
1660         inst = inst->Next_2xx();
1661         break;
1662       case Instruction::SHL_LONG:
1663         PREAMBLE();
1664         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1665                                  shadow_frame.GetVRegLong(inst->VRegB_23x()) <<
1666                                  (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1667         inst = inst->Next_2xx();
1668         break;
1669       case Instruction::SHR_LONG:
1670         PREAMBLE();
1671         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1672                                  shadow_frame.GetVRegLong(inst->VRegB_23x()) >>
1673                                  (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1674         inst = inst->Next_2xx();
1675         break;
1676       case Instruction::USHR_LONG:
1677         PREAMBLE();
1678         shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
1679                                  static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >>
1680                                  (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1681         inst = inst->Next_2xx();
1682         break;
1683       case Instruction::ADD_FLOAT:
1684         PREAMBLE();
1685         shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1686                                   shadow_frame.GetVRegFloat(inst->VRegB_23x()) +
1687                                   shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1688         inst = inst->Next_2xx();
1689         break;
1690       case Instruction::SUB_FLOAT:
1691         PREAMBLE();
1692         shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1693                                   shadow_frame.GetVRegFloat(inst->VRegB_23x()) -
1694                                   shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1695         inst = inst->Next_2xx();
1696         break;
1697       case Instruction::MUL_FLOAT:
1698         PREAMBLE();
1699         shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1700                                   shadow_frame.GetVRegFloat(inst->VRegB_23x()) *
1701                                   shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1702         inst = inst->Next_2xx();
1703         break;
1704       case Instruction::DIV_FLOAT:
1705         PREAMBLE();
1706         shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1707                                   shadow_frame.GetVRegFloat(inst->VRegB_23x()) /
1708                                   shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1709         inst = inst->Next_2xx();
1710         break;
1711       case Instruction::REM_FLOAT:
1712         PREAMBLE();
1713         shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
1714                                   fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()),
1715                                         shadow_frame.GetVRegFloat(inst->VRegC_23x())));
1716         inst = inst->Next_2xx();
1717         break;
1718       case Instruction::ADD_DOUBLE:
1719         PREAMBLE();
1720         shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
1721                                    shadow_frame.GetVRegDouble(inst->VRegB_23x()) +
1722                                    shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1723         inst = inst->Next_2xx();
1724         break;
1725       case Instruction::SUB_DOUBLE:
1726         PREAMBLE();
1727         shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
1728                                    shadow_frame.GetVRegDouble(inst->VRegB_23x()) -
1729                                    shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1730         inst = inst->Next_2xx();
1731         break;
1732       case Instruction::MUL_DOUBLE:
1733         PREAMBLE();
1734         shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
1735                                    shadow_frame.GetVRegDouble(inst->VRegB_23x()) *
1736                                    shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1737         inst = inst->Next_2xx();
1738         break;
1739       case Instruction::DIV_DOUBLE:
1740         PREAMBLE();
1741         shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
1742                                    shadow_frame.GetVRegDouble(inst->VRegB_23x()) /
1743                                    shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1744         inst = inst->Next_2xx();
1745         break;
1746       case Instruction::REM_DOUBLE:
1747         PREAMBLE();
1748         shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
1749                                    fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()),
1750                                         shadow_frame.GetVRegDouble(inst->VRegC_23x())));
1751         inst = inst->Next_2xx();
1752         break;
1753       case Instruction::ADD_INT_2ADDR: {
1754         PREAMBLE();
1755         uint4_t vregA = inst->VRegA_12x(inst_data);
1756         shadow_frame.SetVReg(vregA,
1757                              shadow_frame.GetVReg(vregA) +
1758                              shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1759         inst = inst->Next_1xx();
1760         break;
1761       }
1762       case Instruction::SUB_INT_2ADDR: {
1763         PREAMBLE();
1764         uint4_t vregA = inst->VRegA_12x(inst_data);
1765         shadow_frame.SetVReg(vregA,
1766                              shadow_frame.GetVReg(vregA) -
1767                              shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1768         inst = inst->Next_1xx();
1769         break;
1770       }
1771       case Instruction::MUL_INT_2ADDR: {
1772         PREAMBLE();
1773         uint4_t vregA = inst->VRegA_12x(inst_data);
1774         shadow_frame.SetVReg(vregA,
1775                              shadow_frame.GetVReg(vregA) *
1776                              shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1777         inst = inst->Next_1xx();
1778         break;
1779       }
1780       case Instruction::DIV_INT_2ADDR: {
1781         PREAMBLE();
1782         uint4_t vregA = inst->VRegA_12x(inst_data);
1783         bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA),
1784                                    shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1785         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx);
1786         break;
1787       }
1788       case Instruction::REM_INT_2ADDR: {
1789         PREAMBLE();
1790         uint4_t vregA = inst->VRegA_12x(inst_data);
1791         bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA),
1792                                       shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1793         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx);
1794         break;
1795       }
1796       case Instruction::SHL_INT_2ADDR: {
1797         PREAMBLE();
1798         uint4_t vregA = inst->VRegA_12x(inst_data);
1799         shadow_frame.SetVReg(vregA,
1800                              shadow_frame.GetVReg(vregA) <<
1801                              (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
1802         inst = inst->Next_1xx();
1803         break;
1804       }
1805       case Instruction::SHR_INT_2ADDR: {
1806         PREAMBLE();
1807         uint4_t vregA = inst->VRegA_12x(inst_data);
1808         shadow_frame.SetVReg(vregA,
1809                              shadow_frame.GetVReg(vregA) >>
1810                              (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
1811         inst = inst->Next_1xx();
1812         break;
1813       }
1814       case Instruction::USHR_INT_2ADDR: {
1815         PREAMBLE();
1816         uint4_t vregA = inst->VRegA_12x(inst_data);
1817         shadow_frame.SetVReg(vregA,
1818                              static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >>
1819                              (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
1820         inst = inst->Next_1xx();
1821         break;
1822       }
1823       case Instruction::AND_INT_2ADDR: {
1824         PREAMBLE();
1825         uint4_t vregA = inst->VRegA_12x(inst_data);
1826         shadow_frame.SetVReg(vregA,
1827                              shadow_frame.GetVReg(vregA) &
1828                              shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1829         inst = inst->Next_1xx();
1830         break;
1831       }
1832       case Instruction::OR_INT_2ADDR: {
1833         PREAMBLE();
1834         uint4_t vregA = inst->VRegA_12x(inst_data);
1835         shadow_frame.SetVReg(vregA,
1836                              shadow_frame.GetVReg(vregA) |
1837                              shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1838         inst = inst->Next_1xx();
1839         break;
1840       }
1841       case Instruction::XOR_INT_2ADDR: {
1842         PREAMBLE();
1843         uint4_t vregA = inst->VRegA_12x(inst_data);
1844         shadow_frame.SetVReg(vregA,
1845                              shadow_frame.GetVReg(vregA) ^
1846                              shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
1847         inst = inst->Next_1xx();
1848         break;
1849       }
1850       case Instruction::ADD_LONG_2ADDR: {
1851         PREAMBLE();
1852         uint4_t vregA = inst->VRegA_12x(inst_data);
1853         shadow_frame.SetVRegLong(vregA,
1854                                  shadow_frame.GetVRegLong(vregA) +
1855                                  shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1856         inst = inst->Next_1xx();
1857         break;
1858       }
1859       case Instruction::SUB_LONG_2ADDR: {
1860         PREAMBLE();
1861         uint4_t vregA = inst->VRegA_12x(inst_data);
1862         shadow_frame.SetVRegLong(vregA,
1863                                  shadow_frame.GetVRegLong(vregA) -
1864                                  shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1865         inst = inst->Next_1xx();
1866         break;
1867       }
1868       case Instruction::MUL_LONG_2ADDR: {
1869         PREAMBLE();
1870         uint4_t vregA = inst->VRegA_12x(inst_data);
1871         shadow_frame.SetVRegLong(vregA,
1872                                  shadow_frame.GetVRegLong(vregA) *
1873                                  shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1874         inst = inst->Next_1xx();
1875         break;
1876       }
1877       case Instruction::DIV_LONG_2ADDR: {
1878         PREAMBLE();
1879         uint4_t vregA = inst->VRegA_12x(inst_data);
1880         DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
1881                     shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1882         POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
1883         break;
1884       }
1885       case Instruction::REM_LONG_2ADDR: {
1886         PREAMBLE();
1887         uint4_t vregA = inst->VRegA_12x(inst_data);
1888         DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
1889                         shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1890         POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
1891         break;
1892       }
1893       case Instruction::AND_LONG_2ADDR: {
1894         PREAMBLE();
1895         uint4_t vregA = inst->VRegA_12x(inst_data);
1896         shadow_frame.SetVRegLong(vregA,
1897                                  shadow_frame.GetVRegLong(vregA) &
1898                                  shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1899         inst = inst->Next_1xx();
1900         break;
1901       }
1902       case Instruction::OR_LONG_2ADDR: {
1903         PREAMBLE();
1904         uint4_t vregA = inst->VRegA_12x(inst_data);
1905         shadow_frame.SetVRegLong(vregA,
1906                                  shadow_frame.GetVRegLong(vregA) |
1907                                  shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1908         inst = inst->Next_1xx();
1909         break;
1910       }
1911       case Instruction::XOR_LONG_2ADDR: {
1912         PREAMBLE();
1913         uint4_t vregA = inst->VRegA_12x(inst_data);
1914         shadow_frame.SetVRegLong(vregA,
1915                                  shadow_frame.GetVRegLong(vregA) ^
1916                                  shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
1917         inst = inst->Next_1xx();
1918         break;
1919       }
1920       case Instruction::SHL_LONG_2ADDR: {
1921         PREAMBLE();
1922         uint4_t vregA = inst->VRegA_12x(inst_data);
1923         shadow_frame.SetVRegLong(vregA,
1924                                  shadow_frame.GetVRegLong(vregA) <<
1925                                  (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
1926         inst = inst->Next_1xx();
1927         break;
1928       }
1929       case Instruction::SHR_LONG_2ADDR: {
1930         PREAMBLE();
1931         uint4_t vregA = inst->VRegA_12x(inst_data);
1932         shadow_frame.SetVRegLong(vregA,
1933                                  shadow_frame.GetVRegLong(vregA) >>
1934                                  (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
1935         inst = inst->Next_1xx();
1936         break;
1937       }
1938       case Instruction::USHR_LONG_2ADDR: {
1939         PREAMBLE();
1940         uint4_t vregA = inst->VRegA_12x(inst_data);
1941         shadow_frame.SetVRegLong(vregA,
1942                                  static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >>
1943                                  (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
1944         inst = inst->Next_1xx();
1945         break;
1946       }
1947       case Instruction::ADD_FLOAT_2ADDR: {
1948         PREAMBLE();
1949         uint4_t vregA = inst->VRegA_12x(inst_data);
1950         shadow_frame.SetVRegFloat(vregA,
1951                                   shadow_frame.GetVRegFloat(vregA) +
1952                                   shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
1953         inst = inst->Next_1xx();
1954         break;
1955       }
1956       case Instruction::SUB_FLOAT_2ADDR: {
1957         PREAMBLE();
1958         uint4_t vregA = inst->VRegA_12x(inst_data);
1959         shadow_frame.SetVRegFloat(vregA,
1960                                   shadow_frame.GetVRegFloat(vregA) -
1961                                   shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
1962         inst = inst->Next_1xx();
1963         break;
1964       }
1965       case Instruction::MUL_FLOAT_2ADDR: {
1966         PREAMBLE();
1967         uint4_t vregA = inst->VRegA_12x(inst_data);
1968         shadow_frame.SetVRegFloat(vregA,
1969                                   shadow_frame.GetVRegFloat(vregA) *
1970                                   shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
1971         inst = inst->Next_1xx();
1972         break;
1973       }
1974       case Instruction::DIV_FLOAT_2ADDR: {
1975         PREAMBLE();
1976         uint4_t vregA = inst->VRegA_12x(inst_data);
1977         shadow_frame.SetVRegFloat(vregA,
1978                                   shadow_frame.GetVRegFloat(vregA) /
1979                                   shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
1980         inst = inst->Next_1xx();
1981         break;
1982       }
1983       case Instruction::REM_FLOAT_2ADDR: {
1984         PREAMBLE();
1985         uint4_t vregA = inst->VRegA_12x(inst_data);
1986         shadow_frame.SetVRegFloat(vregA,
1987                                   fmodf(shadow_frame.GetVRegFloat(vregA),
1988                                         shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))));
1989         inst = inst->Next_1xx();
1990         break;
1991       }
1992       case Instruction::ADD_DOUBLE_2ADDR: {
1993         PREAMBLE();
1994         uint4_t vregA = inst->VRegA_12x(inst_data);
1995         shadow_frame.SetVRegDouble(vregA,
1996                                    shadow_frame.GetVRegDouble(vregA) +
1997                                    shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
1998         inst = inst->Next_1xx();
1999         break;
2000       }
2001       case Instruction::SUB_DOUBLE_2ADDR: {
2002         PREAMBLE();
2003         uint4_t vregA = inst->VRegA_12x(inst_data);
2004         shadow_frame.SetVRegDouble(vregA,
2005                                    shadow_frame.GetVRegDouble(vregA) -
2006                                    shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
2007         inst = inst->Next_1xx();
2008         break;
2009       }
2010       case Instruction::MUL_DOUBLE_2ADDR: {
2011         PREAMBLE();
2012         uint4_t vregA = inst->VRegA_12x(inst_data);
2013         shadow_frame.SetVRegDouble(vregA,
2014                                    shadow_frame.GetVRegDouble(vregA) *
2015                                    shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
2016         inst = inst->Next_1xx();
2017         break;
2018       }
2019       case Instruction::DIV_DOUBLE_2ADDR: {
2020         PREAMBLE();
2021         uint4_t vregA = inst->VRegA_12x(inst_data);
2022         shadow_frame.SetVRegDouble(vregA,
2023                                    shadow_frame.GetVRegDouble(vregA) /
2024                                    shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
2025         inst = inst->Next_1xx();
2026         break;
2027       }
2028       case Instruction::REM_DOUBLE_2ADDR: {
2029         PREAMBLE();
2030         uint4_t vregA = inst->VRegA_12x(inst_data);
2031         shadow_frame.SetVRegDouble(vregA,
2032                                    fmod(shadow_frame.GetVRegDouble(vregA),
2033                                         shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))));
2034         inst = inst->Next_1xx();
2035         break;
2036       }
2037       case Instruction::ADD_INT_LIT16:
2038         PREAMBLE();
2039         shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2040                              shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) +
2041                              inst->VRegC_22s());
2042         inst = inst->Next_2xx();
2043         break;
2044       case Instruction::RSUB_INT:
2045         PREAMBLE();
2046         shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2047                              inst->VRegC_22s() -
2048                              shadow_frame.GetVReg(inst->VRegB_22s(inst_data)));
2049         inst = inst->Next_2xx();
2050         break;
2051       case Instruction::MUL_INT_LIT16:
2052         PREAMBLE();
2053         shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2054                              shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) *
2055                              inst->VRegC_22s());
2056         inst = inst->Next_2xx();
2057         break;
2058       case Instruction::DIV_INT_LIT16: {
2059         PREAMBLE();
2060         bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data),
2061                                    shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), inst->VRegC_22s());
2062         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2063         break;
2064       }
2065       case Instruction::REM_INT_LIT16: {
2066         PREAMBLE();
2067         bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data),
2068                                       shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), inst->VRegC_22s());
2069         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2070         break;
2071       }
2072       case Instruction::AND_INT_LIT16:
2073         PREAMBLE();
2074         shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2075                              shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) &
2076                              inst->VRegC_22s());
2077         inst = inst->Next_2xx();
2078         break;
2079       case Instruction::OR_INT_LIT16:
2080         PREAMBLE();
2081         shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2082                              shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) |
2083                              inst->VRegC_22s());
2084         inst = inst->Next_2xx();
2085         break;
2086       case Instruction::XOR_INT_LIT16:
2087         PREAMBLE();
2088         shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2089                              shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^
2090                              inst->VRegC_22s());
2091         inst = inst->Next_2xx();
2092         break;
2093       case Instruction::ADD_INT_LIT8:
2094         PREAMBLE();
2095         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2096                              shadow_frame.GetVReg(inst->VRegB_22b()) +
2097                              inst->VRegC_22b());
2098         inst = inst->Next_2xx();
2099         break;
2100       case Instruction::RSUB_INT_LIT8:
2101         PREAMBLE();
2102         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2103                              inst->VRegC_22b() -
2104                              shadow_frame.GetVReg(inst->VRegB_22b()));
2105         inst = inst->Next_2xx();
2106         break;
2107       case Instruction::MUL_INT_LIT8:
2108         PREAMBLE();
2109         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2110                              shadow_frame.GetVReg(inst->VRegB_22b()) *
2111                              inst->VRegC_22b());
2112         inst = inst->Next_2xx();
2113         break;
2114       case Instruction::DIV_INT_LIT8: {
2115         PREAMBLE();
2116         bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data),
2117                                    shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
2118         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2119         break;
2120       }
2121       case Instruction::REM_INT_LIT8: {
2122         PREAMBLE();
2123         bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data),
2124                                       shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
2125         POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2126         break;
2127       }
2128       case Instruction::AND_INT_LIT8:
2129         PREAMBLE();
2130         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2131                              shadow_frame.GetVReg(inst->VRegB_22b()) &
2132                              inst->VRegC_22b());
2133         inst = inst->Next_2xx();
2134         break;
2135       case Instruction::OR_INT_LIT8:
2136         PREAMBLE();
2137         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2138                              shadow_frame.GetVReg(inst->VRegB_22b()) |
2139                              inst->VRegC_22b());
2140         inst = inst->Next_2xx();
2141         break;
2142       case Instruction::XOR_INT_LIT8:
2143         PREAMBLE();
2144         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2145                              shadow_frame.GetVReg(inst->VRegB_22b()) ^
2146                              inst->VRegC_22b());
2147         inst = inst->Next_2xx();
2148         break;
2149       case Instruction::SHL_INT_LIT8:
2150         PREAMBLE();
2151         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2152                              shadow_frame.GetVReg(inst->VRegB_22b()) <<
2153                              (inst->VRegC_22b() & 0x1f));
2154         inst = inst->Next_2xx();
2155         break;
2156       case Instruction::SHR_INT_LIT8:
2157         PREAMBLE();
2158         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2159                              shadow_frame.GetVReg(inst->VRegB_22b()) >>
2160                              (inst->VRegC_22b() & 0x1f));
2161         inst = inst->Next_2xx();
2162         break;
2163       case Instruction::USHR_INT_LIT8:
2164         PREAMBLE();
2165         shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
2166                              static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >>
2167                              (inst->VRegC_22b() & 0x1f));
2168         inst = inst->Next_2xx();
2169         break;
2170       case Instruction::UNUSED_3E ... Instruction::UNUSED_43:
2171       case Instruction::UNUSED_EB ... Instruction::UNUSED_FF:
2172       case Instruction::UNUSED_79:
2173       case Instruction::UNUSED_7A:
2174         UnexpectedOpcode(inst, mh);
2175     }
2176   }
2177 }  // NOLINT(readability/fn_size)
2178 
2179 // Explicit definitions of ExecuteSwitchImpl.
2180 template SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) HOT_ATTR
2181 JValue ExecuteSwitchImpl<true, false>(Thread* self, MethodHelper& mh,
2182                                       const DexFile::CodeItem* code_item,
2183                                       ShadowFrame& shadow_frame, JValue result_register);
2184 template SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) HOT_ATTR
2185 JValue ExecuteSwitchImpl<false, false>(Thread* self, MethodHelper& mh,
2186                                        const DexFile::CodeItem* code_item,
2187                                        ShadowFrame& shadow_frame, JValue result_register);
2188 template SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
2189 JValue ExecuteSwitchImpl<true, true>(Thread* self, MethodHelper& mh,
2190                                      const DexFile::CodeItem* code_item,
2191                                      ShadowFrame& shadow_frame, JValue result_register);
2192 template SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
2193 JValue ExecuteSwitchImpl<false, true>(Thread* self, MethodHelper& mh,
2194                                       const DexFile::CodeItem* code_item,
2195                                       ShadowFrame& shadow_frame, JValue result_register);
2196 
2197 }  // namespace interpreter
2198 }  // namespace art
2199