blob: 9313c750eb09ea2d144a95c026663e192609cfe3 [file] [log] [blame]
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001/*
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"
Ian Rogersf72a11d2014-10-30 15:41:08 -070018#include "safe_math.h"
Sebastien Hertz8ece0502013-08-07 11:26:41 +020019
20namespace art {
21namespace interpreter {
22
23#define HANDLE_PENDING_EXCEPTION() \
24 do { \
Sebastien Hertz82aeddb2014-05-20 20:09:45 +020025 DCHECK(self->IsExceptionPending()); \
Ian Rogers7b078e82014-09-10 14:44:24 -070026 self->AllowThreadSuspension(); \
Sebastien Hertz8ece0502013-08-07 11:26:41 +020027 uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, \
28 inst->GetDexPc(insns), \
Sebastien Hertz8ece0502013-08-07 11:26:41 +020029 instrumentation); \
30 if (found_dex_pc == DexFile::kDexNoIndex) { \
31 return JValue(); /* Handled in caller. */ \
32 } else { \
33 int32_t displacement = static_cast<int32_t>(found_dex_pc) - static_cast<int32_t>(dex_pc); \
34 inst = inst->RelativeAt(displacement); \
35 } \
36 } while (false)
37
38#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \
39 do { \
40 if (UNLIKELY(_is_exception_pending)) { \
41 HANDLE_PENDING_EXCEPTION(); \
42 } else { \
43 inst = inst->_next_function(); \
44 } \
45 } while (false)
46
47// Code to run before each dex instruction.
Sebastien Hertz8379b222014-02-24 17:38:15 +010048#define PREAMBLE() \
49 do { \
50 DCHECK(!inst->IsReturn()); \
51 if (UNLIKELY(notified_method_entry_event)) { \
52 notified_method_entry_event = false; \
53 } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { \
54 instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), \
55 shadow_frame.GetMethod(), dex_pc); \
56 } \
57 } while (false)
Sebastien Hertz8ece0502013-08-07 11:26:41 +020058
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010059template<bool do_access_check, bool transaction_active>
Ian Rogerse94652f2014-12-02 11:13:19 -080060JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item,
Sebastien Hertz8379b222014-02-24 17:38:15 +010061 ShadowFrame& shadow_frame, JValue result_register) {
Jeff Haoa3faaf42013-09-03 19:07:00 -070062 bool do_assignability_check = do_access_check;
Sebastien Hertz8ece0502013-08-07 11:26:41 +020063 if (UNLIKELY(!shadow_frame.HasReferenceArray())) {
64 LOG(FATAL) << "Invalid shadow frame for interpreter use";
65 return JValue();
66 }
67 self->VerifyStack();
Sebastien Hertz8ece0502013-08-07 11:26:41 +020068
69 uint32_t dex_pc = shadow_frame.GetDexPC();
Sebastien Hertz8379b222014-02-24 17:38:15 +010070 bool notified_method_entry_event = false;
Sebastien Hertz947ff082013-09-17 14:10:13 +020071 const instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation();
Sebastien Hertz270a0e12015-01-16 19:49:09 +010072 if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.
73 if (kIsDebugBuild) {
74 self->AssertNoPendingException();
75 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +020076 if (UNLIKELY(instrumentation->HasMethodEntryListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +020077 instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +020078 shadow_frame.GetMethod(), 0);
Sebastien Hertz8379b222014-02-24 17:38:15 +010079 notified_method_entry_event = true;
Sebastien Hertz8ece0502013-08-07 11:26:41 +020080 }
81 }
82 const uint16_t* const insns = code_item->insns_;
83 const Instruction* inst = Instruction::At(insns + dex_pc);
Sebastien Hertz3b588e02013-09-11 14:33:18 +020084 uint16_t inst_data;
Sebastien Hertz8ece0502013-08-07 11:26:41 +020085 while (true) {
86 dex_pc = inst->GetDexPc(insns);
87 shadow_frame.SetDexPC(dex_pc);
Ian Rogerse94652f2014-12-02 11:13:19 -080088 TraceExecution(shadow_frame, inst, dex_pc);
Sebastien Hertz3b588e02013-09-11 14:33:18 +020089 inst_data = inst->Fetch16(0);
90 switch (inst->Opcode(inst_data)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +020091 case Instruction::NOP:
92 PREAMBLE();
93 inst = inst->Next_1xx();
94 break;
95 case Instruction::MOVE:
96 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +020097 shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
98 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +020099 inst = inst->Next_1xx();
100 break;
101 case Instruction::MOVE_FROM16:
102 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200103 shadow_frame.SetVReg(inst->VRegA_22x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200104 shadow_frame.GetVReg(inst->VRegB_22x()));
105 inst = inst->Next_2xx();
106 break;
107 case Instruction::MOVE_16:
108 PREAMBLE();
109 shadow_frame.SetVReg(inst->VRegA_32x(),
110 shadow_frame.GetVReg(inst->VRegB_32x()));
111 inst = inst->Next_3xx();
112 break;
113 case Instruction::MOVE_WIDE:
114 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200115 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
116 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200117 inst = inst->Next_1xx();
118 break;
119 case Instruction::MOVE_WIDE_FROM16:
120 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200121 shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200122 shadow_frame.GetVRegLong(inst->VRegB_22x()));
123 inst = inst->Next_2xx();
124 break;
125 case Instruction::MOVE_WIDE_16:
126 PREAMBLE();
127 shadow_frame.SetVRegLong(inst->VRegA_32x(),
128 shadow_frame.GetVRegLong(inst->VRegB_32x()));
129 inst = inst->Next_3xx();
130 break;
131 case Instruction::MOVE_OBJECT:
132 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200133 shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data),
134 shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200135 inst = inst->Next_1xx();
136 break;
137 case Instruction::MOVE_OBJECT_FROM16:
138 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200139 shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200140 shadow_frame.GetVRegReference(inst->VRegB_22x()));
141 inst = inst->Next_2xx();
142 break;
143 case Instruction::MOVE_OBJECT_16:
144 PREAMBLE();
145 shadow_frame.SetVRegReference(inst->VRegA_32x(),
146 shadow_frame.GetVRegReference(inst->VRegB_32x()));
147 inst = inst->Next_3xx();
148 break;
149 case Instruction::MOVE_RESULT:
150 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200151 shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200152 inst = inst->Next_1xx();
153 break;
154 case Instruction::MOVE_RESULT_WIDE:
155 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200156 shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200157 inst = inst->Next_1xx();
158 break;
159 case Instruction::MOVE_RESULT_OBJECT:
160 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200161 shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200162 inst = inst->Next_1xx();
163 break;
164 case Instruction::MOVE_EXCEPTION: {
165 PREAMBLE();
Nicolas Geoffray14691c52015-03-05 10:40:17 +0000166 Throwable* exception = self->GetException();
Sebastien Hertz270a0e12015-01-16 19:49:09 +0100167 DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction";
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200168 shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception);
Sebastien Hertz5c004902014-05-21 10:07:42 +0200169 self->ClearException();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200170 inst = inst->Next_1xx();
171 break;
172 }
173 case Instruction::RETURN_VOID: {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200174 JValue result;
Sebastien Hertz043036f2013-09-09 18:26:48 +0200175 if (do_access_check) {
176 // If access checks are required then the dex-to-dex compiler and analysis of
177 // whether the class has final fields hasn't been performed. Conservatively
178 // perform the memory barrier now.
Hans Boehm30359612014-05-21 17:46:23 -0700179 QuasiAtomic::ThreadFenceForConstructor();
Sebastien Hertz043036f2013-09-09 18:26:48 +0200180 }
Ian Rogers7b078e82014-09-10 14:44:24 -0700181 self->AllowThreadSuspension();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200182 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200183 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200184 shadow_frame.GetMethod(), inst->GetDexPc(insns),
185 result);
Sebastien Hertze713d932014-05-15 10:48:53 +0200186 } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
187 instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
188 shadow_frame.GetMethod(), dex_pc);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200189 }
190 return result;
191 }
192 case Instruction::RETURN_VOID_BARRIER: {
Hans Boehm30359612014-05-21 17:46:23 -0700193 QuasiAtomic::ThreadFenceForConstructor();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200194 JValue result;
Ian Rogers7b078e82014-09-10 14:44:24 -0700195 self->AllowThreadSuspension();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200196 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200197 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200198 shadow_frame.GetMethod(), inst->GetDexPc(insns),
199 result);
Sebastien Hertze713d932014-05-15 10:48:53 +0200200 } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
201 instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
202 shadow_frame.GetMethod(), dex_pc);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200203 }
204 return result;
205 }
206 case Instruction::RETURN: {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200207 JValue result;
208 result.SetJ(0);
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200209 result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data)));
Ian Rogers7b078e82014-09-10 14:44:24 -0700210 self->AllowThreadSuspension();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200211 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200212 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200213 shadow_frame.GetMethod(), inst->GetDexPc(insns),
214 result);
Sebastien Hertze713d932014-05-15 10:48:53 +0200215 } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
216 instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
217 shadow_frame.GetMethod(), dex_pc);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200218 }
219 return result;
220 }
221 case Instruction::RETURN_WIDE: {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200222 JValue result;
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200223 result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data)));
Ian Rogers7b078e82014-09-10 14:44:24 -0700224 self->AllowThreadSuspension();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200225 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200226 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200227 shadow_frame.GetMethod(), inst->GetDexPc(insns),
228 result);
Sebastien Hertze713d932014-05-15 10:48:53 +0200229 } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
230 instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
231 shadow_frame.GetMethod(), dex_pc);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200232 }
233 return result;
234 }
235 case Instruction::RETURN_OBJECT: {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200236 JValue result;
Ian Rogers7b078e82014-09-10 14:44:24 -0700237 self->AllowThreadSuspension();
Mathieu Chartierbfd9a432014-05-21 17:43:44 -0700238 const size_t ref_idx = inst->VRegA_11x(inst_data);
239 Object* obj_result = shadow_frame.GetVRegReference(ref_idx);
Jeff Haoa3faaf42013-09-03 19:07:00 -0700240 if (do_assignability_check && obj_result != NULL) {
Ian Rogersded66a02014-10-28 18:12:55 -0700241 Class* return_type = shadow_frame.GetMethod()->GetReturnType();
Mathieu Chartierbfd9a432014-05-21 17:43:44 -0700242 // Re-load since it might have moved.
243 obj_result = shadow_frame.GetVRegReference(ref_idx);
Jeff Haoa3faaf42013-09-03 19:07:00 -0700244 if (return_type == NULL) {
245 // Return the pending exception.
246 HANDLE_PENDING_EXCEPTION();
247 }
248 if (!obj_result->VerifierInstanceOf(return_type)) {
249 // This should never happen.
Ian Rogers1ff3c982014-08-12 02:30:58 -0700250 std::string temp1, temp2;
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000251 self->ThrowNewExceptionF("Ljava/lang/VirtualMachineError;",
Jeff Haoa3faaf42013-09-03 19:07:00 -0700252 "Returning '%s' that is not instance of return type '%s'",
Ian Rogers1ff3c982014-08-12 02:30:58 -0700253 obj_result->GetClass()->GetDescriptor(&temp1),
254 return_type->GetDescriptor(&temp2));
Jeff Haoa3faaf42013-09-03 19:07:00 -0700255 HANDLE_PENDING_EXCEPTION();
256 }
257 }
Mathieu Chartierbfd9a432014-05-21 17:43:44 -0700258 result.SetL(obj_result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200259 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200260 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200261 shadow_frame.GetMethod(), inst->GetDexPc(insns),
262 result);
Sebastien Hertze713d932014-05-15 10:48:53 +0200263 } else if (UNLIKELY(instrumentation->HasDexPcListeners())) {
264 instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
265 shadow_frame.GetMethod(), dex_pc);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200266 }
267 return result;
268 }
269 case Instruction::CONST_4: {
270 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200271 uint4_t dst = inst->VRegA_11n(inst_data);
272 int4_t val = inst->VRegB_11n(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200273 shadow_frame.SetVReg(dst, val);
274 if (val == 0) {
275 shadow_frame.SetVRegReference(dst, NULL);
276 }
277 inst = inst->Next_1xx();
278 break;
279 }
280 case Instruction::CONST_16: {
281 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200282 uint8_t dst = inst->VRegA_21s(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200283 int16_t val = inst->VRegB_21s();
284 shadow_frame.SetVReg(dst, val);
285 if (val == 0) {
286 shadow_frame.SetVRegReference(dst, NULL);
287 }
288 inst = inst->Next_2xx();
289 break;
290 }
291 case Instruction::CONST: {
292 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200293 uint8_t dst = inst->VRegA_31i(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200294 int32_t val = inst->VRegB_31i();
295 shadow_frame.SetVReg(dst, val);
296 if (val == 0) {
297 shadow_frame.SetVRegReference(dst, NULL);
298 }
299 inst = inst->Next_3xx();
300 break;
301 }
302 case Instruction::CONST_HIGH16: {
303 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200304 uint8_t dst = inst->VRegA_21h(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200305 int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16);
306 shadow_frame.SetVReg(dst, val);
307 if (val == 0) {
308 shadow_frame.SetVRegReference(dst, NULL);
309 }
310 inst = inst->Next_2xx();
311 break;
312 }
313 case Instruction::CONST_WIDE_16:
314 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200315 shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200316 inst = inst->Next_2xx();
317 break;
318 case Instruction::CONST_WIDE_32:
319 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200320 shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200321 inst = inst->Next_3xx();
322 break;
323 case Instruction::CONST_WIDE:
324 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200325 shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200326 inst = inst->Next_51l();
327 break;
328 case Instruction::CONST_WIDE_HIGH16:
Sebastien Hertz3c5aec12014-06-04 09:41:21 +0200329 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200330 shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200331 static_cast<uint64_t>(inst->VRegB_21h()) << 48);
332 inst = inst->Next_2xx();
333 break;
334 case Instruction::CONST_STRING: {
335 PREAMBLE();
Ian Rogers6786a582014-10-28 12:49:06 -0700336 String* s = ResolveString(self, shadow_frame, inst->VRegB_21c());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200337 if (UNLIKELY(s == NULL)) {
338 HANDLE_PENDING_EXCEPTION();
339 } else {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200340 shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200341 inst = inst->Next_2xx();
342 }
343 break;
344 }
345 case Instruction::CONST_STRING_JUMBO: {
346 PREAMBLE();
Ian Rogers6786a582014-10-28 12:49:06 -0700347 String* s = ResolveString(self, shadow_frame, inst->VRegB_31c());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200348 if (UNLIKELY(s == NULL)) {
349 HANDLE_PENDING_EXCEPTION();
350 } else {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200351 shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200352 inst = inst->Next_3xx();
353 }
354 break;
355 }
356 case Instruction::CONST_CLASS: {
357 PREAMBLE();
358 Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(),
359 self, false, do_access_check);
360 if (UNLIKELY(c == NULL)) {
361 HANDLE_PENDING_EXCEPTION();
362 } else {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200363 shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200364 inst = inst->Next_2xx();
365 }
366 break;
367 }
368 case Instruction::MONITOR_ENTER: {
369 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200370 Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200371 if (UNLIKELY(obj == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000372 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200373 HANDLE_PENDING_EXCEPTION();
374 } else {
375 DoMonitorEnter(self, obj);
376 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
377 }
378 break;
379 }
380 case Instruction::MONITOR_EXIT: {
381 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200382 Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200383 if (UNLIKELY(obj == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000384 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200385 HANDLE_PENDING_EXCEPTION();
386 } else {
387 DoMonitorExit(self, obj);
388 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
389 }
390 break;
391 }
392 case Instruction::CHECK_CAST: {
393 PREAMBLE();
394 Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(),
395 self, false, do_access_check);
396 if (UNLIKELY(c == NULL)) {
397 HANDLE_PENDING_EXCEPTION();
398 } else {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200399 Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200400 if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) {
401 ThrowClassCastException(c, obj->GetClass());
402 HANDLE_PENDING_EXCEPTION();
403 } else {
404 inst = inst->Next_2xx();
405 }
406 }
407 break;
408 }
409 case Instruction::INSTANCE_OF: {
410 PREAMBLE();
411 Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(),
412 self, false, do_access_check);
413 if (UNLIKELY(c == NULL)) {
414 HANDLE_PENDING_EXCEPTION();
415 } else {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200416 Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data));
417 shadow_frame.SetVReg(inst->VRegA_22c(inst_data), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200418 inst = inst->Next_2xx();
419 }
420 break;
421 }
422 case Instruction::ARRAY_LENGTH: {
423 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200424 Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200425 if (UNLIKELY(array == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000426 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200427 HANDLE_PENDING_EXCEPTION();
428 } else {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200429 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200430 inst = inst->Next_1xx();
431 }
432 break;
433 }
434 case Instruction::NEW_INSTANCE: {
435 PREAMBLE();
Mathieu Chartierb2c7ead2014-04-29 11:13:16 -0700436 Runtime* runtime = Runtime::Current();
Mathieu Chartiercbb2d202013-11-14 17:45:16 -0800437 Object* obj = AllocObjectFromCode<do_access_check, true>(
438 inst->VRegB_21c(), shadow_frame.GetMethod(), self,
Mathieu Chartierb2c7ead2014-04-29 11:13:16 -0700439 runtime->GetHeap()->GetCurrentAllocator());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200440 if (UNLIKELY(obj == NULL)) {
441 HANDLE_PENDING_EXCEPTION();
442 } else {
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200443 obj->GetClass()->AssertInitializedOrInitializingInThread(self);
Mathieu Chartierb2c7ead2014-04-29 11:13:16 -0700444 // Don't allow finalizable objects to be allocated during a transaction since these can't
445 // be finalized without a started runtime.
446 if (transaction_active && obj->GetClass()->IsFinalizable()) {
Ian Rogers2fa98e22014-05-06 15:26:39 -0700447 AbortTransaction(self, "Allocating finalizable object in transaction: %s",
Mathieu Chartierb2c7ead2014-04-29 11:13:16 -0700448 PrettyTypeOf(obj).c_str());
449 HANDLE_PENDING_EXCEPTION();
450 break;
451 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200452 shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200453 inst = inst->Next_2xx();
454 }
455 break;
456 }
457 case Instruction::NEW_ARRAY: {
458 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200459 int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data));
Mathieu Chartiercbb2d202013-11-14 17:45:16 -0800460 Object* obj = AllocArrayFromCode<do_access_check, true>(
Andreas Gampe1cc7dba2014-12-17 18:43:01 -0800461 inst->VRegC_22c(), length, shadow_frame.GetMethod(), self,
Mathieu Chartiercbb2d202013-11-14 17:45:16 -0800462 Runtime::Current()->GetHeap()->GetCurrentAllocator());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200463 if (UNLIKELY(obj == NULL)) {
464 HANDLE_PENDING_EXCEPTION();
465 } else {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200466 shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200467 inst = inst->Next_2xx();
468 }
469 break;
470 }
471 case Instruction::FILLED_NEW_ARRAY: {
472 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100473 bool success =
474 DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self,
475 &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200476 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
477 break;
478 }
479 case Instruction::FILLED_NEW_ARRAY_RANGE: {
480 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100481 bool success =
482 DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame,
483 self, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200484 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
485 break;
486 }
487 case Instruction::FILL_ARRAY_DATA: {
488 PREAMBLE();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200489 const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t();
490 const Instruction::ArrayDataPayload* payload =
491 reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr);
Ian Rogers832336b2014-10-08 15:35:22 -0700492 Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data));
493 bool success = FillArrayData(obj, payload);
494 if (!success) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200495 HANDLE_PENDING_EXCEPTION();
496 break;
497 }
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100498 if (transaction_active) {
Ian Rogers832336b2014-10-08 15:35:22 -0700499 RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100500 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200501 inst = inst->Next_3xx();
502 break;
503 }
504 case Instruction::THROW: {
505 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200506 Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200507 if (UNLIKELY(exception == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000508 ThrowNullPointerException("throw with null exception");
Jeff Haoa3faaf42013-09-03 19:07:00 -0700509 } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) {
510 // This should never happen.
Ian Rogers1ff3c982014-08-12 02:30:58 -0700511 std::string temp;
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000512 self->ThrowNewExceptionF("Ljava/lang/VirtualMachineError;",
Jeff Haoa3faaf42013-09-03 19:07:00 -0700513 "Throwing '%s' that is not instance of Throwable",
Ian Rogers1ff3c982014-08-12 02:30:58 -0700514 exception->GetClass()->GetDescriptor(&temp));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200515 } else {
Nicolas Geoffray14691c52015-03-05 10:40:17 +0000516 self->SetException(exception->AsThrowable());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200517 }
518 HANDLE_PENDING_EXCEPTION();
519 break;
520 }
521 case Instruction::GOTO: {
522 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200523 int8_t offset = inst->VRegA_10t(inst_data);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200524 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700525 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200526 }
527 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200528 break;
529 }
530 case Instruction::GOTO_16: {
531 PREAMBLE();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200532 int16_t offset = inst->VRegA_20t();
533 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700534 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200535 }
536 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200537 break;
538 }
539 case Instruction::GOTO_32: {
540 PREAMBLE();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200541 int32_t offset = inst->VRegA_30t();
542 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700543 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200544 }
545 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200546 break;
547 }
548 case Instruction::PACKED_SWITCH: {
549 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200550 int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200551 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700552 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200553 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200554 inst = inst->RelativeAt(offset);
555 break;
556 }
557 case Instruction::SPARSE_SWITCH: {
558 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200559 int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200560 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700561 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200562 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200563 inst = inst->RelativeAt(offset);
564 break;
565 }
Ian Rogers647b1a82014-10-10 11:02:11 -0700566
567#if defined(__clang__)
568#pragma clang diagnostic push
569#pragma clang diagnostic ignored "-Wfloat-equal"
570#endif
571
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200572 case Instruction::CMPL_FLOAT: {
573 PREAMBLE();
574 float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
575 float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
576 int32_t result;
577 if (val1 > val2) {
578 result = 1;
579 } else if (val1 == val2) {
580 result = 0;
581 } else {
582 result = -1;
583 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200584 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200585 inst = inst->Next_2xx();
586 break;
587 }
588 case Instruction::CMPG_FLOAT: {
589 PREAMBLE();
590 float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
591 float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
592 int32_t result;
593 if (val1 < val2) {
594 result = -1;
595 } else if (val1 == val2) {
596 result = 0;
597 } else {
598 result = 1;
599 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200600 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200601 inst = inst->Next_2xx();
602 break;
603 }
604 case Instruction::CMPL_DOUBLE: {
605 PREAMBLE();
606 double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
607 double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
608 int32_t result;
609 if (val1 > val2) {
610 result = 1;
611 } else if (val1 == val2) {
612 result = 0;
613 } else {
614 result = -1;
615 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200616 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200617 inst = inst->Next_2xx();
618 break;
619 }
620
621 case Instruction::CMPG_DOUBLE: {
622 PREAMBLE();
623 double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
624 double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
625 int32_t result;
626 if (val1 < val2) {
627 result = -1;
628 } else if (val1 == val2) {
629 result = 0;
630 } else {
631 result = 1;
632 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200633 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200634 inst = inst->Next_2xx();
635 break;
636 }
Ian Rogers647b1a82014-10-10 11:02:11 -0700637
638#if defined(__clang__)
639#pragma clang diagnostic pop
640#endif
641
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200642 case Instruction::CMP_LONG: {
643 PREAMBLE();
644 int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x());
645 int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x());
646 int32_t result;
647 if (val1 > val2) {
648 result = 1;
649 } else if (val1 == val2) {
650 result = 0;
651 } else {
652 result = -1;
653 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200654 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200655 inst = inst->Next_2xx();
656 break;
657 }
658 case Instruction::IF_EQ: {
659 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200660 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200661 int16_t offset = inst->VRegC_22t();
662 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700663 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200664 }
665 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200666 } else {
667 inst = inst->Next_2xx();
668 }
669 break;
670 }
671 case Instruction::IF_NE: {
672 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200673 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200674 int16_t offset = inst->VRegC_22t();
675 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700676 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200677 }
678 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200679 } else {
680 inst = inst->Next_2xx();
681 }
682 break;
683 }
684 case Instruction::IF_LT: {
685 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200686 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200687 int16_t offset = inst->VRegC_22t();
688 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700689 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200690 }
691 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200692 } else {
693 inst = inst->Next_2xx();
694 }
695 break;
696 }
697 case Instruction::IF_GE: {
698 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200699 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200700 int16_t offset = inst->VRegC_22t();
701 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700702 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200703 }
704 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200705 } else {
706 inst = inst->Next_2xx();
707 }
708 break;
709 }
710 case Instruction::IF_GT: {
711 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200712 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200713 int16_t offset = inst->VRegC_22t();
714 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700715 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200716 }
717 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200718 } else {
719 inst = inst->Next_2xx();
720 }
721 break;
722 }
723 case Instruction::IF_LE: {
724 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200725 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200726 int16_t offset = inst->VRegC_22t();
727 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700728 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200729 }
730 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200731 } else {
732 inst = inst->Next_2xx();
733 }
734 break;
735 }
736 case Instruction::IF_EQZ: {
737 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200738 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200739 int16_t offset = inst->VRegB_21t();
740 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700741 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200742 }
743 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200744 } else {
745 inst = inst->Next_2xx();
746 }
747 break;
748 }
749 case Instruction::IF_NEZ: {
750 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200751 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200752 int16_t offset = inst->VRegB_21t();
753 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700754 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200755 }
756 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200757 } else {
758 inst = inst->Next_2xx();
759 }
760 break;
761 }
762 case Instruction::IF_LTZ: {
763 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200764 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200765 int16_t offset = inst->VRegB_21t();
766 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700767 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200768 }
769 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200770 } else {
771 inst = inst->Next_2xx();
772 }
773 break;
774 }
775 case Instruction::IF_GEZ: {
776 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200777 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200778 int16_t offset = inst->VRegB_21t();
779 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700780 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200781 }
782 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200783 } else {
784 inst = inst->Next_2xx();
785 }
786 break;
787 }
788 case Instruction::IF_GTZ: {
789 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200790 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200791 int16_t offset = inst->VRegB_21t();
792 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700793 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200794 }
795 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200796 } else {
797 inst = inst->Next_2xx();
798 }
799 break;
800 }
801 case Instruction::IF_LEZ: {
802 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200803 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200804 int16_t offset = inst->VRegB_21t();
805 if (IsBackwardBranch(offset)) {
Ian Rogers7b078e82014-09-10 14:44:24 -0700806 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200807 }
808 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200809 } else {
810 inst = inst->Next_2xx();
811 }
812 break;
813 }
814 case Instruction::AGET_BOOLEAN: {
815 PREAMBLE();
816 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
817 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000818 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200819 HANDLE_PENDING_EXCEPTION();
820 break;
821 }
822 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
823 BooleanArray* array = a->AsBooleanArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700824 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100825 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200826 inst = inst->Next_2xx();
827 } else {
828 HANDLE_PENDING_EXCEPTION();
829 }
830 break;
831 }
832 case Instruction::AGET_BYTE: {
833 PREAMBLE();
834 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
835 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000836 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200837 HANDLE_PENDING_EXCEPTION();
838 break;
839 }
840 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
841 ByteArray* array = a->AsByteArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700842 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100843 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200844 inst = inst->Next_2xx();
845 } else {
846 HANDLE_PENDING_EXCEPTION();
847 }
848 break;
849 }
850 case Instruction::AGET_CHAR: {
851 PREAMBLE();
852 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
853 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000854 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200855 HANDLE_PENDING_EXCEPTION();
856 break;
857 }
858 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
859 CharArray* array = a->AsCharArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700860 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100861 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200862 inst = inst->Next_2xx();
863 } else {
864 HANDLE_PENDING_EXCEPTION();
865 }
866 break;
867 }
868 case Instruction::AGET_SHORT: {
869 PREAMBLE();
870 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
871 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000872 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200873 HANDLE_PENDING_EXCEPTION();
874 break;
875 }
876 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
877 ShortArray* array = a->AsShortArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700878 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100879 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200880 inst = inst->Next_2xx();
881 } else {
882 HANDLE_PENDING_EXCEPTION();
883 }
884 break;
885 }
886 case Instruction::AGET: {
887 PREAMBLE();
888 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
889 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000890 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200891 HANDLE_PENDING_EXCEPTION();
892 break;
893 }
894 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
895 IntArray* array = a->AsIntArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700896 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100897 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200898 inst = inst->Next_2xx();
899 } else {
900 HANDLE_PENDING_EXCEPTION();
901 }
902 break;
903 }
904 case Instruction::AGET_WIDE: {
905 PREAMBLE();
906 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
907 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000908 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200909 HANDLE_PENDING_EXCEPTION();
910 break;
911 }
912 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
913 LongArray* array = a->AsLongArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700914 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100915 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200916 inst = inst->Next_2xx();
917 } else {
918 HANDLE_PENDING_EXCEPTION();
919 }
920 break;
921 }
922 case Instruction::AGET_OBJECT: {
923 PREAMBLE();
924 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
925 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000926 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200927 HANDLE_PENDING_EXCEPTION();
928 break;
929 }
930 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
931 ObjectArray<Object>* array = a->AsObjectArray<Object>();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700932 if (array->CheckIsValidIndex(index)) {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200933 shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200934 inst = inst->Next_2xx();
935 } else {
936 HANDLE_PENDING_EXCEPTION();
937 }
938 break;
939 }
940 case Instruction::APUT_BOOLEAN: {
941 PREAMBLE();
942 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
943 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000944 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200945 HANDLE_PENDING_EXCEPTION();
946 break;
947 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200948 uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200949 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
950 BooleanArray* array = a->AsBooleanArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700951 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100952 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200953 inst = inst->Next_2xx();
954 } else {
955 HANDLE_PENDING_EXCEPTION();
956 }
957 break;
958 }
959 case Instruction::APUT_BYTE: {
960 PREAMBLE();
961 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
962 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000963 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200964 HANDLE_PENDING_EXCEPTION();
965 break;
966 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200967 int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200968 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
969 ByteArray* array = a->AsByteArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700970 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100971 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200972 inst = inst->Next_2xx();
973 } else {
974 HANDLE_PENDING_EXCEPTION();
975 }
976 break;
977 }
978 case Instruction::APUT_CHAR: {
979 PREAMBLE();
980 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
981 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000982 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200983 HANDLE_PENDING_EXCEPTION();
984 break;
985 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200986 uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200987 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
988 CharArray* array = a->AsCharArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700989 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100990 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200991 inst = inst->Next_2xx();
992 } else {
993 HANDLE_PENDING_EXCEPTION();
994 }
995 break;
996 }
997 case Instruction::APUT_SHORT: {
998 PREAMBLE();
999 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1000 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001001 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001002 HANDLE_PENDING_EXCEPTION();
1003 break;
1004 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001005 int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001006 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1007 ShortArray* array = a->AsShortArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001008 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001009 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001010 inst = inst->Next_2xx();
1011 } else {
1012 HANDLE_PENDING_EXCEPTION();
1013 }
1014 break;
1015 }
1016 case Instruction::APUT: {
1017 PREAMBLE();
1018 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1019 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001020 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001021 HANDLE_PENDING_EXCEPTION();
1022 break;
1023 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001024 int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001025 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1026 IntArray* array = a->AsIntArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001027 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001028 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001029 inst = inst->Next_2xx();
1030 } else {
1031 HANDLE_PENDING_EXCEPTION();
1032 }
1033 break;
1034 }
1035 case Instruction::APUT_WIDE: {
1036 PREAMBLE();
1037 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1038 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001039 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001040 HANDLE_PENDING_EXCEPTION();
1041 break;
1042 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001043 int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001044 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
1045 LongArray* array = a->AsLongArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001046 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001047 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001048 inst = inst->Next_2xx();
1049 } else {
1050 HANDLE_PENDING_EXCEPTION();
1051 }
1052 break;
1053 }
1054 case Instruction::APUT_OBJECT: {
1055 PREAMBLE();
1056 Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x());
1057 if (UNLIKELY(a == NULL)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001058 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001059 HANDLE_PENDING_EXCEPTION();
1060 break;
1061 }
1062 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001063 Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001064 ObjectArray<Object>* array = a->AsObjectArray<Object>();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001065 if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001066 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001067 inst = inst->Next_2xx();
1068 } else {
1069 HANDLE_PENDING_EXCEPTION();
1070 }
1071 break;
1072 }
1073 case Instruction::IGET_BOOLEAN: {
1074 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001075 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001076 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1077 break;
1078 }
1079 case Instruction::IGET_BYTE: {
1080 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001081 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001082 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1083 break;
1084 }
1085 case Instruction::IGET_CHAR: {
1086 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001087 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001088 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1089 break;
1090 }
1091 case Instruction::IGET_SHORT: {
1092 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001093 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001094 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1095 break;
1096 }
1097 case Instruction::IGET: {
1098 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001099 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001100 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1101 break;
1102 }
1103 case Instruction::IGET_WIDE: {
1104 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001105 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001106 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1107 break;
1108 }
1109 case Instruction::IGET_OBJECT: {
1110 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001111 bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001112 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1113 break;
1114 }
1115 case Instruction::IGET_QUICK: {
1116 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001117 bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001118 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1119 break;
1120 }
1121 case Instruction::IGET_WIDE_QUICK: {
1122 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001123 bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001124 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1125 break;
1126 }
1127 case Instruction::IGET_OBJECT_QUICK: {
1128 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001129 bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001130 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1131 break;
1132 }
Mathieu Chartierffc605c2014-12-10 10:35:44 -08001133 case Instruction::IGET_BOOLEAN_QUICK: {
1134 PREAMBLE();
1135 bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data);
1136 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1137 break;
1138 }
1139 case Instruction::IGET_BYTE_QUICK: {
1140 PREAMBLE();
1141 bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data);
1142 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1143 break;
1144 }
1145 case Instruction::IGET_CHAR_QUICK: {
1146 PREAMBLE();
1147 bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data);
1148 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1149 break;
1150 }
1151 case Instruction::IGET_SHORT_QUICK: {
1152 PREAMBLE();
1153 bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data);
1154 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1155 break;
1156 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001157 case Instruction::SGET_BOOLEAN: {
1158 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001159 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001160 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1161 break;
1162 }
1163 case Instruction::SGET_BYTE: {
1164 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001165 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001166 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1167 break;
1168 }
1169 case Instruction::SGET_CHAR: {
1170 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001171 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001172 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1173 break;
1174 }
1175 case Instruction::SGET_SHORT: {
1176 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001177 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001178 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1179 break;
1180 }
1181 case Instruction::SGET: {
1182 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001183 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001184 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1185 break;
1186 }
1187 case Instruction::SGET_WIDE: {
1188 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001189 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001190 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1191 break;
1192 }
1193 case Instruction::SGET_OBJECT: {
1194 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001195 bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001196 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1197 break;
1198 }
1199 case Instruction::IPUT_BOOLEAN: {
1200 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001201 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001202 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1203 break;
1204 }
1205 case Instruction::IPUT_BYTE: {
1206 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001207 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001208 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1209 break;
1210 }
1211 case Instruction::IPUT_CHAR: {
1212 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001213 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001214 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1215 break;
1216 }
1217 case Instruction::IPUT_SHORT: {
1218 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001219 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001220 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1221 break;
1222 }
1223 case Instruction::IPUT: {
1224 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001225 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001226 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1227 break;
1228 }
1229 case Instruction::IPUT_WIDE: {
1230 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001231 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001232 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1233 break;
1234 }
1235 case Instruction::IPUT_OBJECT: {
1236 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001237 bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001238 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1239 break;
1240 }
1241 case Instruction::IPUT_QUICK: {
1242 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001243 bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001244 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1245 break;
1246 }
Fred Shih37f05ef2014-07-16 18:38:08 -07001247 case Instruction::IPUT_BOOLEAN_QUICK: {
1248 PREAMBLE();
1249 bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>(shadow_frame, inst, inst_data);
1250 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1251 break;
1252 }
1253 case Instruction::IPUT_BYTE_QUICK: {
1254 PREAMBLE();
1255 bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>(shadow_frame, inst, inst_data);
1256 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1257 break;
1258 }
1259 case Instruction::IPUT_CHAR_QUICK: {
1260 PREAMBLE();
1261 bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>(shadow_frame, inst, inst_data);
1262 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1263 break;
1264 }
1265 case Instruction::IPUT_SHORT_QUICK: {
1266 PREAMBLE();
1267 bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>(shadow_frame, inst, inst_data);
1268 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1269 break;
1270 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001271 case Instruction::IPUT_WIDE_QUICK: {
1272 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001273 bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001274 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1275 break;
1276 }
1277 case Instruction::IPUT_OBJECT_QUICK: {
1278 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001279 bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001280 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1281 break;
1282 }
1283 case Instruction::SPUT_BOOLEAN: {
1284 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001285 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001286 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1287 break;
1288 }
1289 case Instruction::SPUT_BYTE: {
1290 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001291 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001292 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1293 break;
1294 }
1295 case Instruction::SPUT_CHAR: {
1296 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001297 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001298 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1299 break;
1300 }
1301 case Instruction::SPUT_SHORT: {
1302 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001303 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001304 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1305 break;
1306 }
1307 case Instruction::SPUT: {
1308 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001309 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001310 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1311 break;
1312 }
1313 case Instruction::SPUT_WIDE: {
1314 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001315 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001316 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1317 break;
1318 }
1319 case Instruction::SPUT_OBJECT: {
1320 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001321 bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001322 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1323 break;
1324 }
1325 case Instruction::INVOKE_VIRTUAL: {
1326 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001327 bool success = DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001328 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1329 break;
1330 }
1331 case Instruction::INVOKE_VIRTUAL_RANGE: {
1332 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001333 bool success = DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001334 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1335 break;
1336 }
1337 case Instruction::INVOKE_SUPER: {
1338 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001339 bool success = DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001340 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1341 break;
1342 }
1343 case Instruction::INVOKE_SUPER_RANGE: {
1344 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001345 bool success = DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001346 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1347 break;
1348 }
1349 case Instruction::INVOKE_DIRECT: {
1350 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001351 bool success = DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001352 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1353 break;
1354 }
1355 case Instruction::INVOKE_DIRECT_RANGE: {
1356 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001357 bool success = DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001358 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1359 break;
1360 }
1361 case Instruction::INVOKE_INTERFACE: {
1362 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001363 bool success = DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001364 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1365 break;
1366 }
1367 case Instruction::INVOKE_INTERFACE_RANGE: {
1368 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001369 bool success = DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001370 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1371 break;
1372 }
1373 case Instruction::INVOKE_STATIC: {
1374 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001375 bool success = DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001376 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1377 break;
1378 }
1379 case Instruction::INVOKE_STATIC_RANGE: {
1380 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001381 bool success = DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001382 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1383 break;
1384 }
1385 case Instruction::INVOKE_VIRTUAL_QUICK: {
1386 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001387 bool success = DoInvokeVirtualQuick<false>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001388 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1389 break;
1390 }
1391 case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: {
1392 PREAMBLE();
Sebastien Hertzc61124b2013-09-10 11:44:19 +02001393 bool success = DoInvokeVirtualQuick<true>(self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001394 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1395 break;
1396 }
1397 case Instruction::NEG_INT:
1398 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001399 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001400 inst = inst->Next_1xx();
1401 break;
1402 case Instruction::NOT_INT:
1403 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001404 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001405 inst = inst->Next_1xx();
1406 break;
1407 case Instruction::NEG_LONG:
1408 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001409 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001410 inst = inst->Next_1xx();
1411 break;
1412 case Instruction::NOT_LONG:
1413 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001414 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001415 inst = inst->Next_1xx();
1416 break;
1417 case Instruction::NEG_FLOAT:
1418 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001419 shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001420 inst = inst->Next_1xx();
1421 break;
1422 case Instruction::NEG_DOUBLE:
1423 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001424 shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001425 inst = inst->Next_1xx();
1426 break;
1427 case Instruction::INT_TO_LONG:
1428 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001429 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
1430 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001431 inst = inst->Next_1xx();
1432 break;
1433 case Instruction::INT_TO_FLOAT:
1434 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001435 shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1436 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001437 inst = inst->Next_1xx();
1438 break;
1439 case Instruction::INT_TO_DOUBLE:
1440 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001441 shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1442 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001443 inst = inst->Next_1xx();
1444 break;
1445 case Instruction::LONG_TO_INT:
1446 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001447 shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1448 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001449 inst = inst->Next_1xx();
1450 break;
1451 case Instruction::LONG_TO_FLOAT:
1452 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001453 shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1454 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001455 inst = inst->Next_1xx();
1456 break;
1457 case Instruction::LONG_TO_DOUBLE:
1458 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001459 shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1460 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001461 inst = inst->Next_1xx();
1462 break;
1463 case Instruction::FLOAT_TO_INT: {
1464 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001465 float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
Ian Rogers450dcb52013-09-20 17:36:02 -07001466 int32_t result = art_float_to_integral<int32_t, float>(val);
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001467 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001468 inst = inst->Next_1xx();
1469 break;
1470 }
1471 case Instruction::FLOAT_TO_LONG: {
1472 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001473 float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
Ian Rogers450dcb52013-09-20 17:36:02 -07001474 int64_t result = art_float_to_integral<int64_t, float>(val);
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001475 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001476 inst = inst->Next_1xx();
1477 break;
1478 }
1479 case Instruction::FLOAT_TO_DOUBLE:
1480 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001481 shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1482 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001483 inst = inst->Next_1xx();
1484 break;
1485 case Instruction::DOUBLE_TO_INT: {
1486 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001487 double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
Ian Rogers450dcb52013-09-20 17:36:02 -07001488 int32_t result = art_float_to_integral<int32_t, double>(val);
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001489 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001490 inst = inst->Next_1xx();
1491 break;
1492 }
1493 case Instruction::DOUBLE_TO_LONG: {
1494 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001495 double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
Ian Rogers450dcb52013-09-20 17:36:02 -07001496 int64_t result = art_float_to_integral<int64_t, double>(val);
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001497 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001498 inst = inst->Next_1xx();
1499 break;
1500 }
1501 case Instruction::DOUBLE_TO_FLOAT:
1502 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001503 shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1504 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001505 inst = inst->Next_1xx();
1506 break;
1507 case Instruction::INT_TO_BYTE:
1508 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001509 shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1510 static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001511 inst = inst->Next_1xx();
1512 break;
1513 case Instruction::INT_TO_CHAR:
1514 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001515 shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1516 static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001517 inst = inst->Next_1xx();
1518 break;
1519 case Instruction::INT_TO_SHORT:
1520 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001521 shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1522 static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001523 inst = inst->Next_1xx();
1524 break;
Ian Rogersf72a11d2014-10-30 15:41:08 -07001525 case Instruction::ADD_INT: {
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001526 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001527 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001528 SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()),
1529 shadow_frame.GetVReg(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001530 inst = inst->Next_2xx();
1531 break;
Ian Rogersf72a11d2014-10-30 15:41:08 -07001532 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001533 case Instruction::SUB_INT:
1534 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001535 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001536 SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()),
1537 shadow_frame.GetVReg(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001538 inst = inst->Next_2xx();
1539 break;
1540 case Instruction::MUL_INT:
1541 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001542 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001543 SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()),
1544 shadow_frame.GetVReg(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001545 inst = inst->Next_2xx();
1546 break;
1547 case Instruction::DIV_INT: {
1548 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001549 bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001550 shadow_frame.GetVReg(inst->VRegB_23x()),
1551 shadow_frame.GetVReg(inst->VRegC_23x()));
1552 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1553 break;
1554 }
1555 case Instruction::REM_INT: {
1556 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001557 bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001558 shadow_frame.GetVReg(inst->VRegB_23x()),
1559 shadow_frame.GetVReg(inst->VRegC_23x()));
1560 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1561 break;
1562 }
1563 case Instruction::SHL_INT:
1564 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001565 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001566 shadow_frame.GetVReg(inst->VRegB_23x()) <<
1567 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1568 inst = inst->Next_2xx();
1569 break;
1570 case Instruction::SHR_INT:
1571 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001572 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001573 shadow_frame.GetVReg(inst->VRegB_23x()) >>
1574 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1575 inst = inst->Next_2xx();
1576 break;
1577 case Instruction::USHR_INT:
1578 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001579 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001580 static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >>
1581 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1582 inst = inst->Next_2xx();
1583 break;
1584 case Instruction::AND_INT:
1585 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001586 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001587 shadow_frame.GetVReg(inst->VRegB_23x()) &
1588 shadow_frame.GetVReg(inst->VRegC_23x()));
1589 inst = inst->Next_2xx();
1590 break;
1591 case Instruction::OR_INT:
1592 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001593 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001594 shadow_frame.GetVReg(inst->VRegB_23x()) |
1595 shadow_frame.GetVReg(inst->VRegC_23x()));
1596 inst = inst->Next_2xx();
1597 break;
1598 case Instruction::XOR_INT:
1599 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001600 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001601 shadow_frame.GetVReg(inst->VRegB_23x()) ^
1602 shadow_frame.GetVReg(inst->VRegC_23x()));
1603 inst = inst->Next_2xx();
1604 break;
1605 case Instruction::ADD_LONG:
1606 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001607 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001608 SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1609 shadow_frame.GetVRegLong(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001610 inst = inst->Next_2xx();
1611 break;
1612 case Instruction::SUB_LONG:
1613 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001614 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001615 SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1616 shadow_frame.GetVRegLong(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001617 inst = inst->Next_2xx();
1618 break;
1619 case Instruction::MUL_LONG:
1620 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001621 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001622 SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1623 shadow_frame.GetVRegLong(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001624 inst = inst->Next_2xx();
1625 break;
1626 case Instruction::DIV_LONG:
1627 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001628 DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001629 shadow_frame.GetVRegLong(inst->VRegB_23x()),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001630 shadow_frame.GetVRegLong(inst->VRegC_23x()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001631 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx);
1632 break;
1633 case Instruction::REM_LONG:
1634 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001635 DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001636 shadow_frame.GetVRegLong(inst->VRegB_23x()),
1637 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1638 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx);
1639 break;
1640 case Instruction::AND_LONG:
1641 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001642 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001643 shadow_frame.GetVRegLong(inst->VRegB_23x()) &
1644 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1645 inst = inst->Next_2xx();
1646 break;
1647 case Instruction::OR_LONG:
1648 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001649 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001650 shadow_frame.GetVRegLong(inst->VRegB_23x()) |
1651 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1652 inst = inst->Next_2xx();
1653 break;
1654 case Instruction::XOR_LONG:
1655 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001656 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001657 shadow_frame.GetVRegLong(inst->VRegB_23x()) ^
1658 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1659 inst = inst->Next_2xx();
1660 break;
1661 case Instruction::SHL_LONG:
1662 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001663 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001664 shadow_frame.GetVRegLong(inst->VRegB_23x()) <<
1665 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1666 inst = inst->Next_2xx();
1667 break;
1668 case Instruction::SHR_LONG:
1669 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001670 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001671 shadow_frame.GetVRegLong(inst->VRegB_23x()) >>
1672 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1673 inst = inst->Next_2xx();
1674 break;
1675 case Instruction::USHR_LONG:
1676 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001677 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001678 static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >>
1679 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1680 inst = inst->Next_2xx();
1681 break;
1682 case Instruction::ADD_FLOAT:
1683 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001684 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001685 shadow_frame.GetVRegFloat(inst->VRegB_23x()) +
1686 shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1687 inst = inst->Next_2xx();
1688 break;
1689 case Instruction::SUB_FLOAT:
1690 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001691 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001692 shadow_frame.GetVRegFloat(inst->VRegB_23x()) -
1693 shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1694 inst = inst->Next_2xx();
1695 break;
1696 case Instruction::MUL_FLOAT:
1697 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001698 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001699 shadow_frame.GetVRegFloat(inst->VRegB_23x()) *
1700 shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1701 inst = inst->Next_2xx();
1702 break;
1703 case Instruction::DIV_FLOAT:
1704 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001705 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001706 shadow_frame.GetVRegFloat(inst->VRegB_23x()) /
1707 shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1708 inst = inst->Next_2xx();
1709 break;
1710 case Instruction::REM_FLOAT:
1711 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001712 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001713 fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()),
1714 shadow_frame.GetVRegFloat(inst->VRegC_23x())));
1715 inst = inst->Next_2xx();
1716 break;
1717 case Instruction::ADD_DOUBLE:
1718 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001719 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001720 shadow_frame.GetVRegDouble(inst->VRegB_23x()) +
1721 shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1722 inst = inst->Next_2xx();
1723 break;
1724 case Instruction::SUB_DOUBLE:
1725 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001726 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001727 shadow_frame.GetVRegDouble(inst->VRegB_23x()) -
1728 shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1729 inst = inst->Next_2xx();
1730 break;
1731 case Instruction::MUL_DOUBLE:
1732 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001733 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001734 shadow_frame.GetVRegDouble(inst->VRegB_23x()) *
1735 shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1736 inst = inst->Next_2xx();
1737 break;
1738 case Instruction::DIV_DOUBLE:
1739 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001740 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001741 shadow_frame.GetVRegDouble(inst->VRegB_23x()) /
1742 shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1743 inst = inst->Next_2xx();
1744 break;
1745 case Instruction::REM_DOUBLE:
1746 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001747 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001748 fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()),
1749 shadow_frame.GetVRegDouble(inst->VRegC_23x())));
1750 inst = inst->Next_2xx();
1751 break;
1752 case Instruction::ADD_INT_2ADDR: {
1753 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001754 uint4_t vregA = inst->VRegA_12x(inst_data);
Ian Rogersf72a11d2014-10-30 15:41:08 -07001755 shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA),
1756 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001757 inst = inst->Next_1xx();
1758 break;
1759 }
1760 case Instruction::SUB_INT_2ADDR: {
1761 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001762 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001763 shadow_frame.SetVReg(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07001764 SafeSub(shadow_frame.GetVReg(vregA),
1765 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001766 inst = inst->Next_1xx();
1767 break;
1768 }
1769 case Instruction::MUL_INT_2ADDR: {
1770 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001771 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001772 shadow_frame.SetVReg(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07001773 SafeMul(shadow_frame.GetVReg(vregA),
1774 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001775 inst = inst->Next_1xx();
1776 break;
1777 }
1778 case Instruction::DIV_INT_2ADDR: {
1779 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001780 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001781 bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001782 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001783 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx);
1784 break;
1785 }
1786 case Instruction::REM_INT_2ADDR: {
1787 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001788 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001789 bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001790 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001791 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx);
1792 break;
1793 }
1794 case Instruction::SHL_INT_2ADDR: {
1795 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001796 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001797 shadow_frame.SetVReg(vregA,
1798 shadow_frame.GetVReg(vregA) <<
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001799 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001800 inst = inst->Next_1xx();
1801 break;
1802 }
1803 case Instruction::SHR_INT_2ADDR: {
1804 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001805 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001806 shadow_frame.SetVReg(vregA,
1807 shadow_frame.GetVReg(vregA) >>
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001808 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001809 inst = inst->Next_1xx();
1810 break;
1811 }
1812 case Instruction::USHR_INT_2ADDR: {
1813 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001814 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001815 shadow_frame.SetVReg(vregA,
1816 static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >>
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001817 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001818 inst = inst->Next_1xx();
1819 break;
1820 }
1821 case Instruction::AND_INT_2ADDR: {
1822 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001823 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001824 shadow_frame.SetVReg(vregA,
1825 shadow_frame.GetVReg(vregA) &
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001826 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001827 inst = inst->Next_1xx();
1828 break;
1829 }
1830 case Instruction::OR_INT_2ADDR: {
1831 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001832 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001833 shadow_frame.SetVReg(vregA,
1834 shadow_frame.GetVReg(vregA) |
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001835 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001836 inst = inst->Next_1xx();
1837 break;
1838 }
1839 case Instruction::XOR_INT_2ADDR: {
1840 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001841 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001842 shadow_frame.SetVReg(vregA,
1843 shadow_frame.GetVReg(vregA) ^
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001844 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001845 inst = inst->Next_1xx();
1846 break;
1847 }
1848 case Instruction::ADD_LONG_2ADDR: {
1849 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001850 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001851 shadow_frame.SetVRegLong(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07001852 SafeAdd(shadow_frame.GetVRegLong(vregA),
1853 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001854 inst = inst->Next_1xx();
1855 break;
1856 }
1857 case Instruction::SUB_LONG_2ADDR: {
1858 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001859 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001860 shadow_frame.SetVRegLong(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07001861 SafeSub(shadow_frame.GetVRegLong(vregA),
1862 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001863 inst = inst->Next_1xx();
1864 break;
1865 }
1866 case Instruction::MUL_LONG_2ADDR: {
1867 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001868 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001869 shadow_frame.SetVRegLong(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07001870 SafeMul(shadow_frame.GetVRegLong(vregA),
1871 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001872 inst = inst->Next_1xx();
1873 break;
1874 }
1875 case Instruction::DIV_LONG_2ADDR: {
1876 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001877 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001878 DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001879 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001880 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
1881 break;
1882 }
1883 case Instruction::REM_LONG_2ADDR: {
1884 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001885 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001886 DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001887 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001888 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
1889 break;
1890 }
1891 case Instruction::AND_LONG_2ADDR: {
1892 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001893 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001894 shadow_frame.SetVRegLong(vregA,
1895 shadow_frame.GetVRegLong(vregA) &
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001896 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001897 inst = inst->Next_1xx();
1898 break;
1899 }
1900 case Instruction::OR_LONG_2ADDR: {
1901 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001902 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001903 shadow_frame.SetVRegLong(vregA,
1904 shadow_frame.GetVRegLong(vregA) |
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001905 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001906 inst = inst->Next_1xx();
1907 break;
1908 }
1909 case Instruction::XOR_LONG_2ADDR: {
1910 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001911 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001912 shadow_frame.SetVRegLong(vregA,
1913 shadow_frame.GetVRegLong(vregA) ^
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001914 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001915 inst = inst->Next_1xx();
1916 break;
1917 }
1918 case Instruction::SHL_LONG_2ADDR: {
1919 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001920 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001921 shadow_frame.SetVRegLong(vregA,
1922 shadow_frame.GetVRegLong(vregA) <<
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001923 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001924 inst = inst->Next_1xx();
1925 break;
1926 }
1927 case Instruction::SHR_LONG_2ADDR: {
1928 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001929 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001930 shadow_frame.SetVRegLong(vregA,
1931 shadow_frame.GetVRegLong(vregA) >>
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001932 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001933 inst = inst->Next_1xx();
1934 break;
1935 }
1936 case Instruction::USHR_LONG_2ADDR: {
1937 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001938 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001939 shadow_frame.SetVRegLong(vregA,
1940 static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >>
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001941 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001942 inst = inst->Next_1xx();
1943 break;
1944 }
1945 case Instruction::ADD_FLOAT_2ADDR: {
1946 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001947 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001948 shadow_frame.SetVRegFloat(vregA,
1949 shadow_frame.GetVRegFloat(vregA) +
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001950 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001951 inst = inst->Next_1xx();
1952 break;
1953 }
1954 case Instruction::SUB_FLOAT_2ADDR: {
1955 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001956 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001957 shadow_frame.SetVRegFloat(vregA,
1958 shadow_frame.GetVRegFloat(vregA) -
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001959 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001960 inst = inst->Next_1xx();
1961 break;
1962 }
1963 case Instruction::MUL_FLOAT_2ADDR: {
1964 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001965 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001966 shadow_frame.SetVRegFloat(vregA,
1967 shadow_frame.GetVRegFloat(vregA) *
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001968 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001969 inst = inst->Next_1xx();
1970 break;
1971 }
1972 case Instruction::DIV_FLOAT_2ADDR: {
1973 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001974 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001975 shadow_frame.SetVRegFloat(vregA,
1976 shadow_frame.GetVRegFloat(vregA) /
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001977 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001978 inst = inst->Next_1xx();
1979 break;
1980 }
1981 case Instruction::REM_FLOAT_2ADDR: {
1982 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001983 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001984 shadow_frame.SetVRegFloat(vregA,
1985 fmodf(shadow_frame.GetVRegFloat(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001986 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001987 inst = inst->Next_1xx();
1988 break;
1989 }
1990 case Instruction::ADD_DOUBLE_2ADDR: {
1991 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001992 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001993 shadow_frame.SetVRegDouble(vregA,
1994 shadow_frame.GetVRegDouble(vregA) +
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001995 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001996 inst = inst->Next_1xx();
1997 break;
1998 }
1999 case Instruction::SUB_DOUBLE_2ADDR: {
2000 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002001 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002002 shadow_frame.SetVRegDouble(vregA,
2003 shadow_frame.GetVRegDouble(vregA) -
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002004 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002005 inst = inst->Next_1xx();
2006 break;
2007 }
2008 case Instruction::MUL_DOUBLE_2ADDR: {
2009 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002010 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002011 shadow_frame.SetVRegDouble(vregA,
2012 shadow_frame.GetVRegDouble(vregA) *
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002013 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002014 inst = inst->Next_1xx();
2015 break;
2016 }
2017 case Instruction::DIV_DOUBLE_2ADDR: {
2018 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002019 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002020 shadow_frame.SetVRegDouble(vregA,
2021 shadow_frame.GetVRegDouble(vregA) /
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002022 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002023 inst = inst->Next_1xx();
2024 break;
2025 }
2026 case Instruction::REM_DOUBLE_2ADDR: {
2027 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002028 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002029 shadow_frame.SetVRegDouble(vregA,
2030 fmod(shadow_frame.GetVRegDouble(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002031 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002032 inst = inst->Next_1xx();
2033 break;
2034 }
2035 case Instruction::ADD_INT_LIT16:
2036 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002037 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002038 SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2039 inst->VRegC_22s()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002040 inst = inst->Next_2xx();
2041 break;
Ian Rogersf72a11d2014-10-30 15:41:08 -07002042 case Instruction::RSUB_INT_LIT16:
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002043 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002044 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002045 SafeSub(inst->VRegC_22s(),
2046 shadow_frame.GetVReg(inst->VRegB_22s(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002047 inst = inst->Next_2xx();
2048 break;
2049 case Instruction::MUL_INT_LIT16:
2050 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002051 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002052 SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2053 inst->VRegC_22s()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002054 inst = inst->Next_2xx();
2055 break;
2056 case Instruction::DIV_INT_LIT16: {
2057 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002058 bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data),
2059 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), inst->VRegC_22s());
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002060 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2061 break;
2062 }
2063 case Instruction::REM_INT_LIT16: {
2064 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002065 bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data),
2066 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), inst->VRegC_22s());
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002067 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2068 break;
2069 }
2070 case Instruction::AND_INT_LIT16:
2071 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002072 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2073 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) &
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002074 inst->VRegC_22s());
2075 inst = inst->Next_2xx();
2076 break;
2077 case Instruction::OR_INT_LIT16:
2078 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002079 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2080 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) |
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002081 inst->VRegC_22s());
2082 inst = inst->Next_2xx();
2083 break;
2084 case Instruction::XOR_INT_LIT16:
2085 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002086 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2087 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002088 inst->VRegC_22s());
2089 inst = inst->Next_2xx();
2090 break;
2091 case Instruction::ADD_INT_LIT8:
2092 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002093 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002094 SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002095 inst = inst->Next_2xx();
2096 break;
2097 case Instruction::RSUB_INT_LIT8:
2098 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002099 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002100 SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002101 inst = inst->Next_2xx();
2102 break;
2103 case Instruction::MUL_INT_LIT8:
2104 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002105 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002106 SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002107 inst = inst->Next_2xx();
2108 break;
2109 case Instruction::DIV_INT_LIT8: {
2110 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002111 bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002112 shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
2113 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2114 break;
2115 }
2116 case Instruction::REM_INT_LIT8: {
2117 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002118 bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002119 shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
2120 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2121 break;
2122 }
2123 case Instruction::AND_INT_LIT8:
2124 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002125 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002126 shadow_frame.GetVReg(inst->VRegB_22b()) &
2127 inst->VRegC_22b());
2128 inst = inst->Next_2xx();
2129 break;
2130 case Instruction::OR_INT_LIT8:
2131 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002132 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002133 shadow_frame.GetVReg(inst->VRegB_22b()) |
2134 inst->VRegC_22b());
2135 inst = inst->Next_2xx();
2136 break;
2137 case Instruction::XOR_INT_LIT8:
2138 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002139 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002140 shadow_frame.GetVReg(inst->VRegB_22b()) ^
2141 inst->VRegC_22b());
2142 inst = inst->Next_2xx();
2143 break;
2144 case Instruction::SHL_INT_LIT8:
2145 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002146 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002147 shadow_frame.GetVReg(inst->VRegB_22b()) <<
2148 (inst->VRegC_22b() & 0x1f));
2149 inst = inst->Next_2xx();
2150 break;
2151 case Instruction::SHR_INT_LIT8:
2152 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002153 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002154 shadow_frame.GetVReg(inst->VRegB_22b()) >>
2155 (inst->VRegC_22b() & 0x1f));
2156 inst = inst->Next_2xx();
2157 break;
2158 case Instruction::USHR_INT_LIT8:
2159 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002160 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002161 static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >>
2162 (inst->VRegC_22b() & 0x1f));
2163 inst = inst->Next_2xx();
2164 break;
2165 case Instruction::UNUSED_3E ... Instruction::UNUSED_43:
Mathieu Chartierffc605c2014-12-10 10:35:44 -08002166 case Instruction::UNUSED_F3 ... Instruction::UNUSED_FF:
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002167 case Instruction::UNUSED_79:
2168 case Instruction::UNUSED_7A:
Ian Rogerse94652f2014-12-02 11:13:19 -08002169 UnexpectedOpcode(inst, shadow_frame);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002170 }
2171 }
2172} // NOLINT(readability/fn_size)
2173
2174// Explicit definitions of ExecuteSwitchImpl.
Sebastien Hertzc6714852013-09-30 16:42:32 +02002175template SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) HOT_ATTR
Ian Rogerse94652f2014-12-02 11:13:19 -08002176JValue ExecuteSwitchImpl<true, false>(Thread* self, const DexFile::CodeItem* code_item,
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002177 ShadowFrame& shadow_frame, JValue result_register);
Sebastien Hertzc6714852013-09-30 16:42:32 +02002178template SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) HOT_ATTR
Ian Rogerse94652f2014-12-02 11:13:19 -08002179JValue ExecuteSwitchImpl<false, false>(Thread* self, const DexFile::CodeItem* code_item,
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002180 ShadowFrame& shadow_frame, JValue result_register);
2181template SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
Ian Rogerse94652f2014-12-02 11:13:19 -08002182JValue ExecuteSwitchImpl<true, true>(Thread* self, const DexFile::CodeItem* code_item,
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002183 ShadowFrame& shadow_frame, JValue result_register);
2184template SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
Ian Rogerse94652f2014-12-02 11:13:19 -08002185JValue ExecuteSwitchImpl<false, true>(Thread* self, const DexFile::CodeItem* code_item,
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01002186 ShadowFrame& shadow_frame, JValue result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002187
2188} // namespace interpreter
2189} // namespace art