blob: 52eacd564f9dcabd076696614323cca4b9ec50ea [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
Andreas Gampe5e26eb12016-08-22 17:54:17 -070017#include "interpreter_switch_impl.h"
18
Andreas Gampe542451c2016-07-26 09:02:02 -070019#include "base/enums.h"
Alex Lighteb7c1442015-08-31 13:17:42 -070020#include "experimental_flags.h"
Sebastien Hertz8ece0502013-08-07 11:26:41 +020021#include "interpreter_common.h"
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +000022#include "jit/jit.h"
Mathieu Chartier28bd2e42016-10-04 13:54:57 -070023#include "jvalue-inl.h"
Ian Rogersf72a11d2014-10-30 15:41:08 -070024#include "safe_math.h"
Sebastien Hertz8ece0502013-08-07 11:26:41 +020025
26namespace art {
27namespace interpreter {
28
29#define HANDLE_PENDING_EXCEPTION() \
30 do { \
Sebastien Hertz82aeddb2014-05-20 20:09:45 +020031 DCHECK(self->IsExceptionPending()); \
Ian Rogers7b078e82014-09-10 14:44:24 -070032 self->AllowThreadSuspension(); \
Sebastien Hertz8ece0502013-08-07 11:26:41 +020033 uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, \
34 inst->GetDexPc(insns), \
Sebastien Hertz8ece0502013-08-07 11:26:41 +020035 instrumentation); \
36 if (found_dex_pc == DexFile::kDexNoIndex) { \
Andreas Gampe03ec9302015-08-27 17:41:47 -070037 /* Structured locking is to be enforced for abnormal termination, too. */ \
Andreas Gampe56fdd0e2016-04-28 14:56:54 -070038 DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame); \
buzbee1452bee2015-03-06 14:43:04 -080039 if (interpret_one_instruction) { \
buzbee93e94f22016-04-07 13:52:48 -070040 /* Signal mterp to return to caller */ \
buzbee1452bee2015-03-06 14:43:04 -080041 shadow_frame.SetDexPC(DexFile::kDexNoIndex); \
42 } \
Sebastien Hertz8ece0502013-08-07 11:26:41 +020043 return JValue(); /* Handled in caller. */ \
44 } else { \
45 int32_t displacement = static_cast<int32_t>(found_dex_pc) - static_cast<int32_t>(dex_pc); \
46 inst = inst->RelativeAt(displacement); \
47 } \
48 } while (false)
49
50#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \
51 do { \
52 if (UNLIKELY(_is_exception_pending)) { \
53 HANDLE_PENDING_EXCEPTION(); \
54 } else { \
55 inst = inst->_next_function(); \
56 } \
57 } while (false)
58
Andreas Gampe03ec9302015-08-27 17:41:47 -070059#define HANDLE_MONITOR_CHECKS() \
Andreas Gampe56fdd0e2016-04-28 14:56:54 -070060 if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) { \
Andreas Gampe03ec9302015-08-27 17:41:47 -070061 HANDLE_PENDING_EXCEPTION(); \
62 }
63
Sebastien Hertz8ece0502013-08-07 11:26:41 +020064// Code to run before each dex instruction.
Sebastien Hertz8379b222014-02-24 17:38:15 +010065#define PREAMBLE() \
66 do { \
Sebastien Hertz9d6bf692015-04-10 12:12:33 +020067 if (UNLIKELY(instrumentation->HasDexPcListeners())) { \
Sebastien Hertz8379b222014-02-24 17:38:15 +010068 instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), \
69 shadow_frame.GetMethod(), dex_pc); \
70 } \
71 } while (false)
Sebastien Hertz8ece0502013-08-07 11:26:41 +020072
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +000073#define BRANCH_INSTRUMENTATION(offset) \
74 do { \
Nicolas Geoffray274fe4a2016-04-12 16:33:24 +010075 if (UNLIKELY(instrumentation->HasBranchListeners())) { \
76 instrumentation->Branch(self, method, dex_pc, offset); \
77 } \
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +000078 JValue result; \
79 if (jit::Jit::MaybeDoOnStackReplacement(self, method, dex_pc, offset, &result)) { \
buzbee93e94f22016-04-07 13:52:48 -070080 if (interpret_one_instruction) { \
81 /* OSR has completed execution of the method. Signal mterp to return to caller */ \
82 shadow_frame.SetDexPC(DexFile::kDexNoIndex); \
83 } \
Nicolas Geoffrayb331feb2016-02-05 16:51:53 +000084 return result; \
85 } \
Nicolas Geoffray3108daf2015-11-24 16:32:33 +000086 } while (false)
87
Bill Buzbee1d011d92016-04-04 16:59:29 +000088#define HOTNESS_UPDATE() \
89 do { \
Nicolas Geoffray274fe4a2016-04-12 16:33:24 +010090 if (jit != nullptr) { \
Nicolas Geoffray71cd50f2016-04-14 15:00:33 +010091 jit->AddSamples(self, method, 1, /*with_backedges*/ true); \
Bill Buzbee1d011d92016-04-04 16:59:29 +000092 } \
93 } while (false)
94
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010095template<bool do_access_check, bool transaction_active>
Ian Rogerse94652f2014-12-02 11:13:19 -080096JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item,
buzbee1452bee2015-03-06 14:43:04 -080097 ShadowFrame& shadow_frame, JValue result_register,
98 bool interpret_one_instruction) {
Igor Murashkinc449e8b2015-06-10 15:56:42 -070099 constexpr bool do_assignability_check = do_access_check;
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200100 if (UNLIKELY(!shadow_frame.HasReferenceArray())) {
101 LOG(FATAL) << "Invalid shadow frame for interpreter use";
102 return JValue();
103 }
104 self->VerifyStack();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200105
106 uint32_t dex_pc = shadow_frame.GetDexPC();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700107 const auto* const instrumentation = Runtime::Current()->GetInstrumentation();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200108 const uint16_t* const insns = code_item->insns_;
109 const Instruction* inst = Instruction::At(insns + dex_pc);
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200110 uint16_t inst_data;
Bill Buzbee1d011d92016-04-04 16:59:29 +0000111 ArtMethod* method = shadow_frame.GetMethod();
112 jit::Jit* jit = Runtime::Current()->GetJit();
Igor Murashkin6918bf12015-09-27 19:19:06 -0700113
buzbee1452bee2015-03-06 14:43:04 -0800114 do {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200115 dex_pc = inst->GetDexPc(insns);
116 shadow_frame.SetDexPC(dex_pc);
Ian Rogerse94652f2014-12-02 11:13:19 -0800117 TraceExecution(shadow_frame, inst, dex_pc);
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200118 inst_data = inst->Fetch16(0);
119 switch (inst->Opcode(inst_data)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200120 case Instruction::NOP:
121 PREAMBLE();
122 inst = inst->Next_1xx();
123 break;
124 case Instruction::MOVE:
125 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200126 shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
127 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200128 inst = inst->Next_1xx();
129 break;
130 case Instruction::MOVE_FROM16:
131 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200132 shadow_frame.SetVReg(inst->VRegA_22x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200133 shadow_frame.GetVReg(inst->VRegB_22x()));
134 inst = inst->Next_2xx();
135 break;
136 case Instruction::MOVE_16:
137 PREAMBLE();
138 shadow_frame.SetVReg(inst->VRegA_32x(),
139 shadow_frame.GetVReg(inst->VRegB_32x()));
140 inst = inst->Next_3xx();
141 break;
142 case Instruction::MOVE_WIDE:
143 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200144 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
145 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200146 inst = inst->Next_1xx();
147 break;
148 case Instruction::MOVE_WIDE_FROM16:
149 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200150 shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200151 shadow_frame.GetVRegLong(inst->VRegB_22x()));
152 inst = inst->Next_2xx();
153 break;
154 case Instruction::MOVE_WIDE_16:
155 PREAMBLE();
156 shadow_frame.SetVRegLong(inst->VRegA_32x(),
157 shadow_frame.GetVRegLong(inst->VRegB_32x()));
158 inst = inst->Next_3xx();
159 break;
160 case Instruction::MOVE_OBJECT:
161 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200162 shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data),
163 shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200164 inst = inst->Next_1xx();
165 break;
166 case Instruction::MOVE_OBJECT_FROM16:
167 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200168 shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200169 shadow_frame.GetVRegReference(inst->VRegB_22x()));
170 inst = inst->Next_2xx();
171 break;
172 case Instruction::MOVE_OBJECT_16:
173 PREAMBLE();
174 shadow_frame.SetVRegReference(inst->VRegA_32x(),
175 shadow_frame.GetVRegReference(inst->VRegB_32x()));
176 inst = inst->Next_3xx();
177 break;
178 case Instruction::MOVE_RESULT:
179 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200180 shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200181 inst = inst->Next_1xx();
182 break;
183 case Instruction::MOVE_RESULT_WIDE:
184 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200185 shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200186 inst = inst->Next_1xx();
187 break;
188 case Instruction::MOVE_RESULT_OBJECT:
189 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200190 shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200191 inst = inst->Next_1xx();
192 break;
193 case Instruction::MOVE_EXCEPTION: {
194 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700195 ObjPtr<mirror::Throwable> exception = self->GetException();
Sebastien Hertz270a0e12015-01-16 19:49:09 +0100196 DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction";
Mathieu Chartieref41db72016-10-25 15:08:01 -0700197 shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception.Ptr());
Sebastien Hertz5c004902014-05-21 10:07:42 +0200198 self->ClearException();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200199 inst = inst->Next_1xx();
200 break;
201 }
Mathieu Chartierd7cbf8a2015-03-19 12:43:20 -0700202 case Instruction::RETURN_VOID_NO_BARRIER: {
Sebastien Hertz9d6bf692015-04-10 12:12:33 +0200203 PREAMBLE();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200204 JValue result;
Ian Rogers7b078e82014-09-10 14:44:24 -0700205 self->AllowThreadSuspension();
Andreas Gampe03ec9302015-08-27 17:41:47 -0700206 HANDLE_MONITOR_CHECKS();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200207 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200208 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200209 shadow_frame.GetMethod(), inst->GetDexPc(insns),
210 result);
211 }
buzbee1452bee2015-03-06 14:43:04 -0800212 if (interpret_one_instruction) {
buzbee93e94f22016-04-07 13:52:48 -0700213 /* Signal mterp to return to caller */
buzbee1452bee2015-03-06 14:43:04 -0800214 shadow_frame.SetDexPC(DexFile::kDexNoIndex);
215 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200216 return result;
217 }
Mathieu Chartierd7cbf8a2015-03-19 12:43:20 -0700218 case Instruction::RETURN_VOID: {
Sebastien Hertz9d6bf692015-04-10 12:12:33 +0200219 PREAMBLE();
Hans Boehm30359612014-05-21 17:46:23 -0700220 QuasiAtomic::ThreadFenceForConstructor();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200221 JValue result;
Ian Rogers7b078e82014-09-10 14:44:24 -0700222 self->AllowThreadSuspension();
Andreas Gampe03ec9302015-08-27 17:41:47 -0700223 HANDLE_MONITOR_CHECKS();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200224 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200225 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200226 shadow_frame.GetMethod(), inst->GetDexPc(insns),
227 result);
228 }
buzbee1452bee2015-03-06 14:43:04 -0800229 if (interpret_one_instruction) {
buzbee93e94f22016-04-07 13:52:48 -0700230 /* Signal mterp to return to caller */
buzbee1452bee2015-03-06 14:43:04 -0800231 shadow_frame.SetDexPC(DexFile::kDexNoIndex);
232 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200233 return result;
234 }
235 case Instruction::RETURN: {
Sebastien Hertz9d6bf692015-04-10 12:12:33 +0200236 PREAMBLE();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200237 JValue result;
238 result.SetJ(0);
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200239 result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data)));
Ian Rogers7b078e82014-09-10 14:44:24 -0700240 self->AllowThreadSuspension();
Andreas Gampe03ec9302015-08-27 17:41:47 -0700241 HANDLE_MONITOR_CHECKS();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200242 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200243 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200244 shadow_frame.GetMethod(), inst->GetDexPc(insns),
245 result);
246 }
buzbee1452bee2015-03-06 14:43:04 -0800247 if (interpret_one_instruction) {
buzbee93e94f22016-04-07 13:52:48 -0700248 /* Signal mterp to return to caller */
buzbee1452bee2015-03-06 14:43:04 -0800249 shadow_frame.SetDexPC(DexFile::kDexNoIndex);
250 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200251 return result;
252 }
253 case Instruction::RETURN_WIDE: {
Sebastien Hertz9d6bf692015-04-10 12:12:33 +0200254 PREAMBLE();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200255 JValue result;
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200256 result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data)));
Ian Rogers7b078e82014-09-10 14:44:24 -0700257 self->AllowThreadSuspension();
Andreas Gampe03ec9302015-08-27 17:41:47 -0700258 HANDLE_MONITOR_CHECKS();
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);
263 }
buzbee1452bee2015-03-06 14:43:04 -0800264 if (interpret_one_instruction) {
buzbee93e94f22016-04-07 13:52:48 -0700265 /* Signal mterp to return to caller */
buzbee1452bee2015-03-06 14:43:04 -0800266 shadow_frame.SetDexPC(DexFile::kDexNoIndex);
267 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200268 return result;
269 }
270 case Instruction::RETURN_OBJECT: {
Sebastien Hertz9d6bf692015-04-10 12:12:33 +0200271 PREAMBLE();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200272 JValue result;
Ian Rogers7b078e82014-09-10 14:44:24 -0700273 self->AllowThreadSuspension();
Andreas Gampe03ec9302015-08-27 17:41:47 -0700274 HANDLE_MONITOR_CHECKS();
Mathieu Chartierbfd9a432014-05-21 17:43:44 -0700275 const size_t ref_idx = inst->VRegA_11x(inst_data);
Mathieu Chartieref41db72016-10-25 15:08:01 -0700276 ObjPtr<mirror::Object> obj_result = shadow_frame.GetVRegReference(ref_idx);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700277 if (do_assignability_check && obj_result != nullptr) {
Andreas Gampe542451c2016-07-26 09:02:02 -0700278 PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700279 ObjPtr<mirror::Class> return_type = method->GetReturnType(true /* resolve */,
280 pointer_size);
Mathieu Chartierbfd9a432014-05-21 17:43:44 -0700281 // Re-load since it might have moved.
282 obj_result = shadow_frame.GetVRegReference(ref_idx);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700283 if (return_type == nullptr) {
Jeff Haoa3faaf42013-09-03 19:07:00 -0700284 // Return the pending exception.
285 HANDLE_PENDING_EXCEPTION();
286 }
287 if (!obj_result->VerifierInstanceOf(return_type)) {
288 // This should never happen.
Ian Rogers1ff3c982014-08-12 02:30:58 -0700289 std::string temp1, temp2;
Orion Hodsonfef06642016-11-25 16:07:11 +0000290 self->ThrowNewExceptionF("Ljava/lang/InternalError;",
Jeff Haoa3faaf42013-09-03 19:07:00 -0700291 "Returning '%s' that is not instance of return type '%s'",
Ian Rogers1ff3c982014-08-12 02:30:58 -0700292 obj_result->GetClass()->GetDescriptor(&temp1),
293 return_type->GetDescriptor(&temp2));
Jeff Haoa3faaf42013-09-03 19:07:00 -0700294 HANDLE_PENDING_EXCEPTION();
295 }
296 }
Mathieu Chartierbfd9a432014-05-21 17:43:44 -0700297 result.SetL(obj_result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200298 if (UNLIKELY(instrumentation->HasMethodExitListeners())) {
Sebastien Hertz947ff082013-09-17 14:10:13 +0200299 instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200300 shadow_frame.GetMethod(), inst->GetDexPc(insns),
301 result);
302 }
buzbee1452bee2015-03-06 14:43:04 -0800303 if (interpret_one_instruction) {
buzbee93e94f22016-04-07 13:52:48 -0700304 /* Signal mterp to return to caller */
buzbee1452bee2015-03-06 14:43:04 -0800305 shadow_frame.SetDexPC(DexFile::kDexNoIndex);
306 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200307 return result;
308 }
309 case Instruction::CONST_4: {
310 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200311 uint4_t dst = inst->VRegA_11n(inst_data);
312 int4_t val = inst->VRegB_11n(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200313 shadow_frame.SetVReg(dst, val);
314 if (val == 0) {
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700315 shadow_frame.SetVRegReference(dst, nullptr);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200316 }
317 inst = inst->Next_1xx();
318 break;
319 }
320 case Instruction::CONST_16: {
321 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200322 uint8_t dst = inst->VRegA_21s(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200323 int16_t val = inst->VRegB_21s();
324 shadow_frame.SetVReg(dst, val);
325 if (val == 0) {
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700326 shadow_frame.SetVRegReference(dst, nullptr);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200327 }
328 inst = inst->Next_2xx();
329 break;
330 }
331 case Instruction::CONST: {
332 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200333 uint8_t dst = inst->VRegA_31i(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200334 int32_t val = inst->VRegB_31i();
335 shadow_frame.SetVReg(dst, val);
336 if (val == 0) {
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700337 shadow_frame.SetVRegReference(dst, nullptr);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200338 }
339 inst = inst->Next_3xx();
340 break;
341 }
342 case Instruction::CONST_HIGH16: {
343 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200344 uint8_t dst = inst->VRegA_21h(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200345 int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16);
346 shadow_frame.SetVReg(dst, val);
347 if (val == 0) {
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700348 shadow_frame.SetVRegReference(dst, nullptr);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200349 }
350 inst = inst->Next_2xx();
351 break;
352 }
353 case Instruction::CONST_WIDE_16:
354 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200355 shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200356 inst = inst->Next_2xx();
357 break;
358 case Instruction::CONST_WIDE_32:
359 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200360 shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200361 inst = inst->Next_3xx();
362 break;
363 case Instruction::CONST_WIDE:
364 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200365 shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200366 inst = inst->Next_51l();
367 break;
368 case Instruction::CONST_WIDE_HIGH16:
Sebastien Hertz3c5aec12014-06-04 09:41:21 +0200369 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200370 shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200371 static_cast<uint64_t>(inst->VRegB_21h()) << 48);
372 inst = inst->Next_2xx();
373 break;
374 case Instruction::CONST_STRING: {
375 PREAMBLE();
Andreas Gampe8a0128a2016-11-28 07:38:35 -0800376 ObjPtr<mirror::String> s = ResolveString(self,
377 shadow_frame,
378 dex::StringIndex(inst->VRegB_21c()));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700379 if (UNLIKELY(s == nullptr)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200380 HANDLE_PENDING_EXCEPTION();
381 } else {
Mathieu Chartieref41db72016-10-25 15:08:01 -0700382 shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s.Ptr());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200383 inst = inst->Next_2xx();
384 }
385 break;
386 }
387 case Instruction::CONST_STRING_JUMBO: {
388 PREAMBLE();
Andreas Gampe8a0128a2016-11-28 07:38:35 -0800389 ObjPtr<mirror::String> s = ResolveString(self,
390 shadow_frame,
391 dex::StringIndex(inst->VRegB_31c()));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700392 if (UNLIKELY(s == nullptr)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200393 HANDLE_PENDING_EXCEPTION();
394 } else {
Mathieu Chartieref41db72016-10-25 15:08:01 -0700395 shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s.Ptr());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200396 inst = inst->Next_3xx();
397 }
398 break;
399 }
400 case Instruction::CONST_CLASS: {
401 PREAMBLE();
Andreas Gampea5b09a62016-11-17 15:21:22 -0800402 ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()),
Mathieu Chartieref41db72016-10-25 15:08:01 -0700403 shadow_frame.GetMethod(),
404 self,
405 false,
406 do_access_check);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700407 if (UNLIKELY(c == nullptr)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200408 HANDLE_PENDING_EXCEPTION();
409 } else {
Mathieu Chartieref41db72016-10-25 15:08:01 -0700410 shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c.Ptr());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200411 inst = inst->Next_2xx();
412 }
413 break;
414 }
415 case Instruction::MONITOR_ENTER: {
416 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700417 ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700418 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000419 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200420 HANDLE_PENDING_EXCEPTION();
421 } else {
Andreas Gampe03ec9302015-08-27 17:41:47 -0700422 DoMonitorEnter<do_assignability_check>(self, &shadow_frame, obj);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200423 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
424 }
425 break;
426 }
427 case Instruction::MONITOR_EXIT: {
428 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700429 ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700430 if (UNLIKELY(obj == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000431 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200432 HANDLE_PENDING_EXCEPTION();
433 } else {
Andreas Gampe03ec9302015-08-27 17:41:47 -0700434 DoMonitorExit<do_assignability_check>(self, &shadow_frame, obj);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200435 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
436 }
437 break;
438 }
439 case Instruction::CHECK_CAST: {
440 PREAMBLE();
Andreas Gampea5b09a62016-11-17 15:21:22 -0800441 ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()),
Mathieu Chartieref41db72016-10-25 15:08:01 -0700442 shadow_frame.GetMethod(),
443 self,
444 false,
445 do_access_check);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700446 if (UNLIKELY(c == nullptr)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200447 HANDLE_PENDING_EXCEPTION();
448 } else {
Mathieu Chartieref41db72016-10-25 15:08:01 -0700449 ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700450 if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200451 ThrowClassCastException(c, obj->GetClass());
452 HANDLE_PENDING_EXCEPTION();
453 } else {
454 inst = inst->Next_2xx();
455 }
456 }
457 break;
458 }
459 case Instruction::INSTANCE_OF: {
460 PREAMBLE();
Andreas Gampea5b09a62016-11-17 15:21:22 -0800461 ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegC_22c()),
Mathieu Chartieref41db72016-10-25 15:08:01 -0700462 shadow_frame.GetMethod(),
463 self,
464 false,
465 do_access_check);
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700466 if (UNLIKELY(c == nullptr)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200467 HANDLE_PENDING_EXCEPTION();
468 } else {
Mathieu Chartieref41db72016-10-25 15:08:01 -0700469 ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700470 shadow_frame.SetVReg(inst->VRegA_22c(inst_data),
471 (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200472 inst = inst->Next_2xx();
473 }
474 break;
475 }
476 case Instruction::ARRAY_LENGTH: {
477 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700478 ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700479 if (UNLIKELY(array == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000480 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200481 HANDLE_PENDING_EXCEPTION();
482 } else {
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200483 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200484 inst = inst->Next_1xx();
485 }
486 break;
487 }
488 case Instruction::NEW_INSTANCE: {
489 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700490 ObjPtr<mirror::Object> obj = nullptr;
Andreas Gampea5b09a62016-11-17 15:21:22 -0800491 ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()),
Mathieu Chartieref41db72016-10-25 15:08:01 -0700492 shadow_frame.GetMethod(),
493 self,
494 false,
495 do_access_check);
Jeff Hao848f70a2014-01-15 13:49:50 -0800496 if (LIKELY(c != nullptr)) {
497 if (UNLIKELY(c->IsStringClass())) {
498 gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator();
jessicahandojo3aaa37b2016-07-29 14:46:37 -0700499 obj = mirror::String::AllocEmptyString<true>(self, allocator_type);
Jeff Hao848f70a2014-01-15 13:49:50 -0800500 } else {
501 obj = AllocObjectFromCode<do_access_check, true>(
Andreas Gampea5b09a62016-11-17 15:21:22 -0800502 dex::TypeIndex(inst->VRegB_21c()),
503 shadow_frame.GetMethod(),
504 self,
505 Runtime::Current()->GetHeap()->GetCurrentAllocator());
Jeff Hao848f70a2014-01-15 13:49:50 -0800506 }
507 }
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700508 if (UNLIKELY(obj == nullptr)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200509 HANDLE_PENDING_EXCEPTION();
510 } else {
Sebastien Hertz4e99b3d2014-06-24 14:35:40 +0200511 obj->GetClass()->AssertInitializedOrInitializingInThread(self);
Mathieu Chartierb2c7ead2014-04-29 11:13:16 -0700512 // Don't allow finalizable objects to be allocated during a transaction since these can't
513 // be finalized without a started runtime.
514 if (transaction_active && obj->GetClass()->IsFinalizable()) {
Sebastien Hertz45b15972015-04-03 16:07:05 +0200515 AbortTransactionF(self, "Allocating finalizable object in transaction: %s",
David Sehr709b0702016-10-13 09:12:37 -0700516 obj->PrettyTypeOf().c_str());
Mathieu Chartierb2c7ead2014-04-29 11:13:16 -0700517 HANDLE_PENDING_EXCEPTION();
518 break;
519 }
Mathieu Chartieref41db72016-10-25 15:08:01 -0700520 shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj.Ptr());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200521 inst = inst->Next_2xx();
522 }
523 break;
524 }
525 case Instruction::NEW_ARRAY: {
526 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200527 int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data));
Mathieu Chartieref41db72016-10-25 15:08:01 -0700528 ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check, true>(
Andreas Gampea5b09a62016-11-17 15:21:22 -0800529 dex::TypeIndex(inst->VRegC_22c()),
530 length,
531 shadow_frame.GetMethod(),
532 self,
Mathieu Chartiercbb2d202013-11-14 17:45:16 -0800533 Runtime::Current()->GetHeap()->GetCurrentAllocator());
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700534 if (UNLIKELY(obj == nullptr)) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200535 HANDLE_PENDING_EXCEPTION();
536 } else {
Mathieu Chartieref41db72016-10-25 15:08:01 -0700537 shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj.Ptr());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200538 inst = inst->Next_2xx();
539 }
540 break;
541 }
542 case Instruction::FILLED_NEW_ARRAY: {
543 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100544 bool success =
545 DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self,
546 &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200547 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
548 break;
549 }
550 case Instruction::FILLED_NEW_ARRAY_RANGE: {
551 PREAMBLE();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100552 bool success =
553 DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame,
554 self, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200555 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
556 break;
557 }
558 case Instruction::FILL_ARRAY_DATA: {
559 PREAMBLE();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200560 const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t();
561 const Instruction::ArrayDataPayload* payload =
562 reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr);
Mathieu Chartieref41db72016-10-25 15:08:01 -0700563 ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data));
Ian Rogers832336b2014-10-08 15:35:22 -0700564 bool success = FillArrayData(obj, payload);
565 if (!success) {
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200566 HANDLE_PENDING_EXCEPTION();
567 break;
568 }
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100569 if (transaction_active) {
Ian Rogers832336b2014-10-08 15:35:22 -0700570 RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100571 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200572 inst = inst->Next_3xx();
573 break;
574 }
575 case Instruction::THROW: {
576 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700577 ObjPtr<mirror::Object> exception =
578 shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data));
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700579 if (UNLIKELY(exception == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000580 ThrowNullPointerException("throw with null exception");
Jeff Haoa3faaf42013-09-03 19:07:00 -0700581 } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) {
582 // This should never happen.
Ian Rogers1ff3c982014-08-12 02:30:58 -0700583 std::string temp;
Orion Hodsonfef06642016-11-25 16:07:11 +0000584 self->ThrowNewExceptionF("Ljava/lang/InternalError;",
Jeff Haoa3faaf42013-09-03 19:07:00 -0700585 "Throwing '%s' that is not instance of Throwable",
Ian Rogers1ff3c982014-08-12 02:30:58 -0700586 exception->GetClass()->GetDescriptor(&temp));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200587 } else {
Nicolas Geoffray14691c52015-03-05 10:40:17 +0000588 self->SetException(exception->AsThrowable());
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200589 }
590 HANDLE_PENDING_EXCEPTION();
591 break;
592 }
593 case Instruction::GOTO: {
594 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200595 int8_t offset = inst->VRegA_10t(inst_data);
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000596 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200597 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000598 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700599 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200600 }
601 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200602 break;
603 }
604 case Instruction::GOTO_16: {
605 PREAMBLE();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200606 int16_t offset = inst->VRegA_20t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000607 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200608 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000609 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700610 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200611 }
612 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200613 break;
614 }
615 case Instruction::GOTO_32: {
616 PREAMBLE();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200617 int32_t offset = inst->VRegA_30t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000618 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200619 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000620 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700621 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200622 }
623 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200624 break;
625 }
626 case Instruction::PACKED_SWITCH: {
627 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200628 int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data);
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000629 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200630 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000631 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700632 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200633 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200634 inst = inst->RelativeAt(offset);
635 break;
636 }
637 case Instruction::SPARSE_SWITCH: {
638 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200639 int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data);
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000640 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200641 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000642 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700643 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200644 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200645 inst = inst->RelativeAt(offset);
646 break;
647 }
Ian Rogers647b1a82014-10-10 11:02:11 -0700648
Ian Rogers647b1a82014-10-10 11:02:11 -0700649#pragma clang diagnostic push
650#pragma clang diagnostic ignored "-Wfloat-equal"
Ian Rogers647b1a82014-10-10 11:02:11 -0700651
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200652 case Instruction::CMPL_FLOAT: {
653 PREAMBLE();
654 float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
655 float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
656 int32_t result;
657 if (val1 > val2) {
658 result = 1;
659 } else if (val1 == val2) {
660 result = 0;
661 } else {
662 result = -1;
663 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200664 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200665 inst = inst->Next_2xx();
666 break;
667 }
668 case Instruction::CMPG_FLOAT: {
669 PREAMBLE();
670 float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x());
671 float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x());
672 int32_t result;
673 if (val1 < val2) {
674 result = -1;
675 } else if (val1 == val2) {
676 result = 0;
677 } else {
678 result = 1;
679 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200680 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200681 inst = inst->Next_2xx();
682 break;
683 }
684 case Instruction::CMPL_DOUBLE: {
685 PREAMBLE();
686 double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
687 double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
688 int32_t result;
689 if (val1 > val2) {
690 result = 1;
691 } else if (val1 == val2) {
692 result = 0;
693 } else {
694 result = -1;
695 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200696 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200697 inst = inst->Next_2xx();
698 break;
699 }
700
701 case Instruction::CMPG_DOUBLE: {
702 PREAMBLE();
703 double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x());
704 double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x());
705 int32_t result;
706 if (val1 < val2) {
707 result = -1;
708 } else if (val1 == val2) {
709 result = 0;
710 } else {
711 result = 1;
712 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200713 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200714 inst = inst->Next_2xx();
715 break;
716 }
Ian Rogers647b1a82014-10-10 11:02:11 -0700717
Ian Rogers647b1a82014-10-10 11:02:11 -0700718#pragma clang diagnostic pop
Ian Rogers647b1a82014-10-10 11:02:11 -0700719
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200720 case Instruction::CMP_LONG: {
721 PREAMBLE();
722 int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x());
723 int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x());
724 int32_t result;
725 if (val1 > val2) {
726 result = 1;
727 } else if (val1 == val2) {
728 result = 0;
729 } else {
730 result = -1;
731 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200732 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200733 inst = inst->Next_2xx();
734 break;
735 }
736 case Instruction::IF_EQ: {
737 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700738 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) ==
739 shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200740 int16_t offset = inst->VRegC_22t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000741 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200742 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000743 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700744 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200745 }
746 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200747 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800748 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200749 inst = inst->Next_2xx();
750 }
751 break;
752 }
753 case Instruction::IF_NE: {
754 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700755 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) !=
756 shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200757 int16_t offset = inst->VRegC_22t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000758 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200759 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000760 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700761 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200762 }
763 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200764 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800765 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200766 inst = inst->Next_2xx();
767 }
768 break;
769 }
770 case Instruction::IF_LT: {
771 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700772 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <
773 shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200774 int16_t offset = inst->VRegC_22t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000775 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200776 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000777 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700778 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200779 }
780 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200781 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800782 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200783 inst = inst->Next_2xx();
784 }
785 break;
786 }
787 case Instruction::IF_GE: {
788 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700789 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >=
790 shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200791 int16_t offset = inst->VRegC_22t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000792 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200793 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000794 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700795 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200796 }
797 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200798 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800799 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200800 inst = inst->Next_2xx();
801 }
802 break;
803 }
804 case Instruction::IF_GT: {
805 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700806 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >
807 shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200808 int16_t offset = inst->VRegC_22t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000809 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200810 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000811 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700812 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200813 }
814 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200815 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800816 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200817 inst = inst->Next_2xx();
818 }
819 break;
820 }
821 case Instruction::IF_LE: {
822 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700823 if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <=
824 shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200825 int16_t offset = inst->VRegC_22t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000826 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200827 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000828 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700829 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200830 }
831 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200832 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800833 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200834 inst = inst->Next_2xx();
835 }
836 break;
837 }
838 case Instruction::IF_EQZ: {
839 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200840 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200841 int16_t offset = inst->VRegB_21t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000842 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200843 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000844 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700845 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200846 }
847 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200848 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800849 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200850 inst = inst->Next_2xx();
851 }
852 break;
853 }
854 case Instruction::IF_NEZ: {
855 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200856 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200857 int16_t offset = inst->VRegB_21t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000858 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200859 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000860 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700861 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200862 }
863 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200864 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800865 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200866 inst = inst->Next_2xx();
867 }
868 break;
869 }
870 case Instruction::IF_LTZ: {
871 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200872 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200873 int16_t offset = inst->VRegB_21t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000874 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200875 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000876 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700877 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200878 }
879 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200880 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800881 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200882 inst = inst->Next_2xx();
883 }
884 break;
885 }
886 case Instruction::IF_GEZ: {
887 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200888 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200889 int16_t offset = inst->VRegB_21t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000890 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200891 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000892 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700893 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200894 }
895 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200896 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800897 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200898 inst = inst->Next_2xx();
899 }
900 break;
901 }
902 case Instruction::IF_GTZ: {
903 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200904 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200905 int16_t offset = inst->VRegB_21t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000906 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200907 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000908 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700909 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200910 }
911 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200912 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800913 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200914 inst = inst->Next_2xx();
915 }
916 break;
917 }
918 case Instruction::IF_LEZ: {
919 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +0200920 if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) {
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200921 int16_t offset = inst->VRegB_21t();
Nicolas Geoffray81f0f952016-01-20 16:25:19 +0000922 BRANCH_INSTRUMENTATION(offset);
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200923 if (IsBackwardBranch(offset)) {
Bill Buzbee1d011d92016-04-04 16:59:29 +0000924 HOTNESS_UPDATE();
Ian Rogers7b078e82014-09-10 14:44:24 -0700925 self->AllowThreadSuspension();
Sebastien Hertz1eda2262013-09-09 16:53:14 +0200926 }
927 inst = inst->RelativeAt(offset);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200928 } else {
buzbeef1dcacc2016-02-24 14:24:24 -0800929 BRANCH_INSTRUMENTATION(2);
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200930 inst = inst->Next_2xx();
931 }
932 break;
933 }
934 case Instruction::AGET_BOOLEAN: {
935 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700936 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700937 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000938 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200939 HANDLE_PENDING_EXCEPTION();
940 break;
941 }
942 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -0700943 ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700944 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100945 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200946 inst = inst->Next_2xx();
947 } else {
948 HANDLE_PENDING_EXCEPTION();
949 }
950 break;
951 }
952 case Instruction::AGET_BYTE: {
953 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700954 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700955 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000956 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200957 HANDLE_PENDING_EXCEPTION();
958 break;
959 }
960 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -0700961 ObjPtr<mirror::ByteArray> array = a->AsByteArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700962 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100963 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200964 inst = inst->Next_2xx();
965 } else {
966 HANDLE_PENDING_EXCEPTION();
967 }
968 break;
969 }
970 case Instruction::AGET_CHAR: {
971 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700972 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700973 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000974 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200975 HANDLE_PENDING_EXCEPTION();
976 break;
977 }
978 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -0700979 ObjPtr<mirror::CharArray> array = a->AsCharArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700980 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100981 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200982 inst = inst->Next_2xx();
983 } else {
984 HANDLE_PENDING_EXCEPTION();
985 }
986 break;
987 }
988 case Instruction::AGET_SHORT: {
989 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -0700990 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -0700991 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +0000992 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +0200993 HANDLE_PENDING_EXCEPTION();
994 break;
995 }
996 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -0700997 ObjPtr<mirror::ShortArray> array = a->AsShortArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700998 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +0100999 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001000 inst = inst->Next_2xx();
1001 } else {
1002 HANDLE_PENDING_EXCEPTION();
1003 }
1004 break;
1005 }
1006 case Instruction::AGET: {
1007 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001008 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001009 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001010 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001011 HANDLE_PENDING_EXCEPTION();
1012 break;
1013 }
1014 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
David Sehr709b0702016-10-13 09:12:37 -07001015 DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001016 ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001017 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +01001018 shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001019 inst = inst->Next_2xx();
1020 } else {
1021 HANDLE_PENDING_EXCEPTION();
1022 }
1023 break;
1024 }
1025 case Instruction::AGET_WIDE: {
1026 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001027 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001028 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001029 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001030 HANDLE_PENDING_EXCEPTION();
1031 break;
1032 }
1033 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
David Sehr709b0702016-10-13 09:12:37 -07001034 DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001035 ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001036 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzabff6432014-01-27 18:01:39 +01001037 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001038 inst = inst->Next_2xx();
1039 } else {
1040 HANDLE_PENDING_EXCEPTION();
1041 }
1042 break;
1043 }
1044 case Instruction::AGET_OBJECT: {
1045 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001046 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001047 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001048 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001049 HANDLE_PENDING_EXCEPTION();
1050 break;
1051 }
1052 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -07001053 ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001054 if (array->CheckIsValidIndex(index)) {
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001055 shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001056 inst = inst->Next_2xx();
1057 } else {
1058 HANDLE_PENDING_EXCEPTION();
1059 }
1060 break;
1061 }
1062 case Instruction::APUT_BOOLEAN: {
1063 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001064 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001065 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001066 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001067 HANDLE_PENDING_EXCEPTION();
1068 break;
1069 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001070 uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001071 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -07001072 ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001073 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001074 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001075 inst = inst->Next_2xx();
1076 } else {
1077 HANDLE_PENDING_EXCEPTION();
1078 }
1079 break;
1080 }
1081 case Instruction::APUT_BYTE: {
1082 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001083 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001084 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001085 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001086 HANDLE_PENDING_EXCEPTION();
1087 break;
1088 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001089 int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001090 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -07001091 ObjPtr<mirror::ByteArray> array = a->AsByteArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001092 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001093 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001094 inst = inst->Next_2xx();
1095 } else {
1096 HANDLE_PENDING_EXCEPTION();
1097 }
1098 break;
1099 }
1100 case Instruction::APUT_CHAR: {
1101 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001102 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001103 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001104 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001105 HANDLE_PENDING_EXCEPTION();
1106 break;
1107 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001108 uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001109 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -07001110 ObjPtr<mirror::CharArray> array = a->AsCharArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001111 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001112 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001113 inst = inst->Next_2xx();
1114 } else {
1115 HANDLE_PENDING_EXCEPTION();
1116 }
1117 break;
1118 }
1119 case Instruction::APUT_SHORT: {
1120 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001121 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001122 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001123 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001124 HANDLE_PENDING_EXCEPTION();
1125 break;
1126 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001127 int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001128 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -07001129 ObjPtr<mirror::ShortArray> array = a->AsShortArray();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001130 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001131 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001132 inst = inst->Next_2xx();
1133 } else {
1134 HANDLE_PENDING_EXCEPTION();
1135 }
1136 break;
1137 }
1138 case Instruction::APUT: {
1139 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001140 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001141 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001142 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001143 HANDLE_PENDING_EXCEPTION();
1144 break;
1145 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001146 int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001147 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
David Sehr709b0702016-10-13 09:12:37 -07001148 DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001149 ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001150 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001151 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001152 inst = inst->Next_2xx();
1153 } else {
1154 HANDLE_PENDING_EXCEPTION();
1155 }
1156 break;
1157 }
1158 case Instruction::APUT_WIDE: {
1159 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001160 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001161 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001162 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001163 HANDLE_PENDING_EXCEPTION();
1164 break;
1165 }
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001166 int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001167 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
David Sehr709b0702016-10-13 09:12:37 -07001168 DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001169 ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001170 if (array->CheckIsValidIndex(index)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001171 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001172 inst = inst->Next_2xx();
1173 } else {
1174 HANDLE_PENDING_EXCEPTION();
1175 }
1176 break;
1177 }
1178 case Instruction::APUT_OBJECT: {
1179 PREAMBLE();
Mathieu Chartieref41db72016-10-25 15:08:01 -07001180 ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x());
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001181 if (UNLIKELY(a == nullptr)) {
Nicolas Geoffray0aa50ce2015-03-10 11:03:29 +00001182 ThrowNullPointerExceptionFromInterpreter();
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001183 HANDLE_PENDING_EXCEPTION();
1184 break;
1185 }
1186 int32_t index = shadow_frame.GetVReg(inst->VRegC_23x());
Mathieu Chartieref41db72016-10-25 15:08:01 -07001187 ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data));
1188 ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>();
Ian Rogersb0fa5dc2014-04-28 16:47:08 -07001189 if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) {
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +01001190 array->SetWithoutChecks<transaction_active>(index, val);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001191 inst = inst->Next_2xx();
1192 } else {
1193 HANDLE_PENDING_EXCEPTION();
1194 }
1195 break;
1196 }
1197 case Instruction::IGET_BOOLEAN: {
1198 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001199 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(
1200 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001201 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1202 break;
1203 }
1204 case Instruction::IGET_BYTE: {
1205 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001206 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(
1207 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::IGET_CHAR: {
1212 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001213 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(
1214 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001215 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1216 break;
1217 }
1218 case Instruction::IGET_SHORT: {
1219 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001220 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(
1221 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001222 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1223 break;
1224 }
1225 case Instruction::IGET: {
1226 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001227 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(
1228 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001229 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1230 break;
1231 }
1232 case Instruction::IGET_WIDE: {
1233 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001234 bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(
1235 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001236 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1237 break;
1238 }
1239 case Instruction::IGET_OBJECT: {
1240 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001241 bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(
1242 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001243 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1244 break;
1245 }
1246 case Instruction::IGET_QUICK: {
1247 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001248 bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001249 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1250 break;
1251 }
1252 case Instruction::IGET_WIDE_QUICK: {
1253 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001254 bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001255 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1256 break;
1257 }
1258 case Instruction::IGET_OBJECT_QUICK: {
1259 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001260 bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001261 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1262 break;
1263 }
Mathieu Chartierffc605c2014-12-10 10:35:44 -08001264 case Instruction::IGET_BOOLEAN_QUICK: {
1265 PREAMBLE();
1266 bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data);
1267 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1268 break;
1269 }
1270 case Instruction::IGET_BYTE_QUICK: {
1271 PREAMBLE();
1272 bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data);
1273 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1274 break;
1275 }
1276 case Instruction::IGET_CHAR_QUICK: {
1277 PREAMBLE();
1278 bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data);
1279 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1280 break;
1281 }
1282 case Instruction::IGET_SHORT_QUICK: {
1283 PREAMBLE();
1284 bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data);
1285 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1286 break;
1287 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001288 case Instruction::SGET_BOOLEAN: {
1289 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001290 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(
1291 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::SGET_BYTE: {
1296 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001297 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(
1298 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001299 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1300 break;
1301 }
1302 case Instruction::SGET_CHAR: {
1303 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001304 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(
1305 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001306 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1307 break;
1308 }
1309 case Instruction::SGET_SHORT: {
1310 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001311 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(
1312 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001313 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1314 break;
1315 }
1316 case Instruction::SGET: {
1317 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001318 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(
1319 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001320 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1321 break;
1322 }
1323 case Instruction::SGET_WIDE: {
1324 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001325 bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(
1326 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001327 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1328 break;
1329 }
1330 case Instruction::SGET_OBJECT: {
1331 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001332 bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(
1333 self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001334 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1335 break;
1336 }
1337 case Instruction::IPUT_BOOLEAN: {
1338 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001339 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check,
1340 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001341 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1342 break;
1343 }
1344 case Instruction::IPUT_BYTE: {
1345 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001346 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check,
1347 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001348 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1349 break;
1350 }
1351 case Instruction::IPUT_CHAR: {
1352 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001353 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check,
1354 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001355 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1356 break;
1357 }
1358 case Instruction::IPUT_SHORT: {
1359 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001360 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check,
1361 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001362 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1363 break;
1364 }
1365 case Instruction::IPUT: {
1366 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001367 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check,
1368 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001369 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1370 break;
1371 }
1372 case Instruction::IPUT_WIDE: {
1373 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001374 bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check,
1375 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001376 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1377 break;
1378 }
1379 case Instruction::IPUT_OBJECT: {
1380 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001381 bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check,
1382 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001383 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1384 break;
1385 }
1386 case Instruction::IPUT_QUICK: {
1387 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001388 bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>(
1389 shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001390 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1391 break;
1392 }
Fred Shih37f05ef2014-07-16 18:38:08 -07001393 case Instruction::IPUT_BOOLEAN_QUICK: {
1394 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001395 bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>(
1396 shadow_frame, inst, inst_data);
Fred Shih37f05ef2014-07-16 18:38:08 -07001397 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1398 break;
1399 }
1400 case Instruction::IPUT_BYTE_QUICK: {
1401 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001402 bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>(
1403 shadow_frame, inst, inst_data);
Fred Shih37f05ef2014-07-16 18:38:08 -07001404 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1405 break;
1406 }
1407 case Instruction::IPUT_CHAR_QUICK: {
1408 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001409 bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>(
1410 shadow_frame, inst, inst_data);
Fred Shih37f05ef2014-07-16 18:38:08 -07001411 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1412 break;
1413 }
1414 case Instruction::IPUT_SHORT_QUICK: {
1415 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001416 bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>(
1417 shadow_frame, inst, inst_data);
Fred Shih37f05ef2014-07-16 18:38:08 -07001418 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1419 break;
1420 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001421 case Instruction::IPUT_WIDE_QUICK: {
1422 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001423 bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>(
1424 shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001425 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1426 break;
1427 }
1428 case Instruction::IPUT_OBJECT_QUICK: {
1429 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001430 bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>(
1431 shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001432 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1433 break;
1434 }
1435 case Instruction::SPUT_BOOLEAN: {
1436 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001437 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check,
1438 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001439 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1440 break;
1441 }
1442 case Instruction::SPUT_BYTE: {
1443 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001444 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check,
1445 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001446 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1447 break;
1448 }
1449 case Instruction::SPUT_CHAR: {
1450 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001451 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check,
1452 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001453 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1454 break;
1455 }
1456 case Instruction::SPUT_SHORT: {
1457 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001458 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check,
1459 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001460 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1461 break;
1462 }
1463 case Instruction::SPUT: {
1464 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001465 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check,
1466 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001467 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1468 break;
1469 }
1470 case Instruction::SPUT_WIDE: {
1471 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001472 bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check,
1473 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001474 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1475 break;
1476 }
1477 case Instruction::SPUT_OBJECT: {
1478 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001479 bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check,
1480 transaction_active>(self, shadow_frame, inst, inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001481 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1482 break;
1483 }
1484 case Instruction::INVOKE_VIRTUAL: {
1485 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001486 bool success = DoInvoke<kVirtual, false, do_access_check>(
1487 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001488 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1489 break;
1490 }
1491 case Instruction::INVOKE_VIRTUAL_RANGE: {
1492 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001493 bool success = DoInvoke<kVirtual, true, do_access_check>(
1494 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001495 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1496 break;
1497 }
1498 case Instruction::INVOKE_SUPER: {
1499 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001500 bool success = DoInvoke<kSuper, false, do_access_check>(
1501 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001502 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1503 break;
1504 }
1505 case Instruction::INVOKE_SUPER_RANGE: {
1506 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001507 bool success = DoInvoke<kSuper, true, do_access_check>(
1508 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001509 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1510 break;
1511 }
1512 case Instruction::INVOKE_DIRECT: {
1513 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001514 bool success = DoInvoke<kDirect, false, do_access_check>(
1515 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001516 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1517 break;
1518 }
1519 case Instruction::INVOKE_DIRECT_RANGE: {
1520 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001521 bool success = DoInvoke<kDirect, true, do_access_check>(
1522 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001523 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1524 break;
1525 }
1526 case Instruction::INVOKE_INTERFACE: {
1527 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001528 bool success = DoInvoke<kInterface, false, do_access_check>(
1529 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001530 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1531 break;
1532 }
1533 case Instruction::INVOKE_INTERFACE_RANGE: {
1534 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001535 bool success = DoInvoke<kInterface, true, do_access_check>(
1536 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001537 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1538 break;
1539 }
1540 case Instruction::INVOKE_STATIC: {
1541 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001542 bool success = DoInvoke<kStatic, false, do_access_check>(
1543 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001544 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1545 break;
1546 }
1547 case Instruction::INVOKE_STATIC_RANGE: {
1548 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001549 bool success = DoInvoke<kStatic, true, do_access_check>(
1550 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001551 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1552 break;
1553 }
1554 case Instruction::INVOKE_VIRTUAL_QUICK: {
1555 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001556 bool success = DoInvokeVirtualQuick<false>(
1557 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001558 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1559 break;
1560 }
1561 case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: {
1562 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001563 bool success = DoInvokeVirtualQuick<true>(
1564 self, shadow_frame, inst, inst_data, &result_register);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001565 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx);
1566 break;
1567 }
Narayan Kamath9823e782016-08-03 12:46:58 +01001568 case Instruction::INVOKE_POLYMORPHIC: {
1569 PREAMBLE();
Narayan Kamath269cb432016-10-28 10:19:54 +01001570 DCHECK(Runtime::Current()->IsMethodHandlesEnabled());
Narayan Kamath9823e782016-08-03 12:46:58 +01001571 bool success = DoInvokePolymorphic<false, do_access_check>(
1572 self, shadow_frame, inst, inst_data, &result_register);
1573 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx);
1574 break;
1575 }
1576 case Instruction::INVOKE_POLYMORPHIC_RANGE: {
1577 PREAMBLE();
Narayan Kamath269cb432016-10-28 10:19:54 +01001578 DCHECK(Runtime::Current()->IsMethodHandlesEnabled());
Narayan Kamath9823e782016-08-03 12:46:58 +01001579 bool success = DoInvokePolymorphic<true, do_access_check>(
1580 self, shadow_frame, inst, inst_data, &result_register);
1581 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx);
1582 break;
Narayan Kamath9823e782016-08-03 12:46:58 +01001583 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001584 case Instruction::NEG_INT:
1585 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001586 shadow_frame.SetVReg(
1587 inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001588 inst = inst->Next_1xx();
1589 break;
1590 case Instruction::NOT_INT:
1591 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001592 shadow_frame.SetVReg(
1593 inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001594 inst = inst->Next_1xx();
1595 break;
1596 case Instruction::NEG_LONG:
1597 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001598 shadow_frame.SetVRegLong(
1599 inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001600 inst = inst->Next_1xx();
1601 break;
1602 case Instruction::NOT_LONG:
1603 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001604 shadow_frame.SetVRegLong(
1605 inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001606 inst = inst->Next_1xx();
1607 break;
1608 case Instruction::NEG_FLOAT:
1609 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001610 shadow_frame.SetVRegFloat(
1611 inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001612 inst = inst->Next_1xx();
1613 break;
1614 case Instruction::NEG_DOUBLE:
1615 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001616 shadow_frame.SetVRegDouble(
1617 inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001618 inst = inst->Next_1xx();
1619 break;
1620 case Instruction::INT_TO_LONG:
1621 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001622 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data),
1623 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001624 inst = inst->Next_1xx();
1625 break;
1626 case Instruction::INT_TO_FLOAT:
1627 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001628 shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1629 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001630 inst = inst->Next_1xx();
1631 break;
1632 case Instruction::INT_TO_DOUBLE:
1633 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001634 shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1635 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001636 inst = inst->Next_1xx();
1637 break;
1638 case Instruction::LONG_TO_INT:
1639 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001640 shadow_frame.SetVReg(inst->VRegA_12x(inst_data),
1641 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001642 inst = inst->Next_1xx();
1643 break;
1644 case Instruction::LONG_TO_FLOAT:
1645 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001646 shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1647 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001648 inst = inst->Next_1xx();
1649 break;
1650 case Instruction::LONG_TO_DOUBLE:
1651 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001652 shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1653 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001654 inst = inst->Next_1xx();
1655 break;
1656 case Instruction::FLOAT_TO_INT: {
1657 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001658 float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
Ian Rogers450dcb52013-09-20 17:36:02 -07001659 int32_t result = art_float_to_integral<int32_t, float>(val);
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001660 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001661 inst = inst->Next_1xx();
1662 break;
1663 }
1664 case Instruction::FLOAT_TO_LONG: {
1665 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001666 float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data));
Ian Rogers450dcb52013-09-20 17:36:02 -07001667 int64_t result = art_float_to_integral<int64_t, float>(val);
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001668 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001669 inst = inst->Next_1xx();
1670 break;
1671 }
1672 case Instruction::FLOAT_TO_DOUBLE:
1673 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001674 shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data),
1675 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001676 inst = inst->Next_1xx();
1677 break;
1678 case Instruction::DOUBLE_TO_INT: {
1679 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001680 double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
Ian Rogers450dcb52013-09-20 17:36:02 -07001681 int32_t result = art_float_to_integral<int32_t, double>(val);
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001682 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001683 inst = inst->Next_1xx();
1684 break;
1685 }
1686 case Instruction::DOUBLE_TO_LONG: {
1687 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001688 double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data));
Ian Rogers450dcb52013-09-20 17:36:02 -07001689 int64_t result = art_float_to_integral<int64_t, double>(val);
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001690 shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001691 inst = inst->Next_1xx();
1692 break;
1693 }
1694 case Instruction::DOUBLE_TO_FLOAT:
1695 PREAMBLE();
Ian Rogers450dcb52013-09-20 17:36:02 -07001696 shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data),
1697 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001698 inst = inst->Next_1xx();
1699 break;
1700 case Instruction::INT_TO_BYTE:
1701 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001702 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>(
1703 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001704 inst = inst->Next_1xx();
1705 break;
1706 case Instruction::INT_TO_CHAR:
1707 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001708 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>(
1709 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001710 inst = inst->Next_1xx();
1711 break;
1712 case Instruction::INT_TO_SHORT:
1713 PREAMBLE();
Mathieu Chartier2cebb242015-04-21 16:50:40 -07001714 shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>(
1715 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001716 inst = inst->Next_1xx();
1717 break;
Ian Rogersf72a11d2014-10-30 15:41:08 -07001718 case Instruction::ADD_INT: {
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001719 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001720 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001721 SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()),
1722 shadow_frame.GetVReg(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001723 inst = inst->Next_2xx();
1724 break;
Ian Rogersf72a11d2014-10-30 15:41:08 -07001725 }
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001726 case Instruction::SUB_INT:
1727 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001728 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001729 SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()),
1730 shadow_frame.GetVReg(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001731 inst = inst->Next_2xx();
1732 break;
1733 case Instruction::MUL_INT:
1734 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001735 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001736 SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()),
1737 shadow_frame.GetVReg(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001738 inst = inst->Next_2xx();
1739 break;
1740 case Instruction::DIV_INT: {
1741 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001742 bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001743 shadow_frame.GetVReg(inst->VRegB_23x()),
1744 shadow_frame.GetVReg(inst->VRegC_23x()));
1745 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1746 break;
1747 }
1748 case Instruction::REM_INT: {
1749 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001750 bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001751 shadow_frame.GetVReg(inst->VRegB_23x()),
1752 shadow_frame.GetVReg(inst->VRegC_23x()));
1753 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
1754 break;
1755 }
1756 case Instruction::SHL_INT:
1757 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001758 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001759 shadow_frame.GetVReg(inst->VRegB_23x()) <<
1760 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1761 inst = inst->Next_2xx();
1762 break;
1763 case Instruction::SHR_INT:
1764 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001765 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001766 shadow_frame.GetVReg(inst->VRegB_23x()) >>
1767 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1768 inst = inst->Next_2xx();
1769 break;
1770 case Instruction::USHR_INT:
1771 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001772 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001773 static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >>
1774 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f));
1775 inst = inst->Next_2xx();
1776 break;
1777 case Instruction::AND_INT:
1778 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001779 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001780 shadow_frame.GetVReg(inst->VRegB_23x()) &
1781 shadow_frame.GetVReg(inst->VRegC_23x()));
1782 inst = inst->Next_2xx();
1783 break;
1784 case Instruction::OR_INT:
1785 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001786 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001787 shadow_frame.GetVReg(inst->VRegB_23x()) |
1788 shadow_frame.GetVReg(inst->VRegC_23x()));
1789 inst = inst->Next_2xx();
1790 break;
1791 case Instruction::XOR_INT:
1792 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001793 shadow_frame.SetVReg(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001794 shadow_frame.GetVReg(inst->VRegB_23x()) ^
1795 shadow_frame.GetVReg(inst->VRegC_23x()));
1796 inst = inst->Next_2xx();
1797 break;
1798 case Instruction::ADD_LONG:
1799 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001800 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001801 SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1802 shadow_frame.GetVRegLong(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001803 inst = inst->Next_2xx();
1804 break;
1805 case Instruction::SUB_LONG:
1806 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001807 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001808 SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1809 shadow_frame.GetVRegLong(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001810 inst = inst->Next_2xx();
1811 break;
1812 case Instruction::MUL_LONG:
1813 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001814 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001815 SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()),
1816 shadow_frame.GetVRegLong(inst->VRegC_23x())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001817 inst = inst->Next_2xx();
1818 break;
1819 case Instruction::DIV_LONG:
1820 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001821 DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001822 shadow_frame.GetVRegLong(inst->VRegB_23x()),
Ian Rogersf72a11d2014-10-30 15:41:08 -07001823 shadow_frame.GetVRegLong(inst->VRegC_23x()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001824 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx);
1825 break;
1826 case Instruction::REM_LONG:
1827 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001828 DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001829 shadow_frame.GetVRegLong(inst->VRegB_23x()),
1830 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1831 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx);
1832 break;
1833 case Instruction::AND_LONG:
1834 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001835 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001836 shadow_frame.GetVRegLong(inst->VRegB_23x()) &
1837 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1838 inst = inst->Next_2xx();
1839 break;
1840 case Instruction::OR_LONG:
1841 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001842 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001843 shadow_frame.GetVRegLong(inst->VRegB_23x()) |
1844 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1845 inst = inst->Next_2xx();
1846 break;
1847 case Instruction::XOR_LONG:
1848 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001849 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001850 shadow_frame.GetVRegLong(inst->VRegB_23x()) ^
1851 shadow_frame.GetVRegLong(inst->VRegC_23x()));
1852 inst = inst->Next_2xx();
1853 break;
1854 case Instruction::SHL_LONG:
1855 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001856 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001857 shadow_frame.GetVRegLong(inst->VRegB_23x()) <<
1858 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1859 inst = inst->Next_2xx();
1860 break;
1861 case Instruction::SHR_LONG:
1862 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001863 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001864 shadow_frame.GetVRegLong(inst->VRegB_23x()) >>
1865 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1866 inst = inst->Next_2xx();
1867 break;
1868 case Instruction::USHR_LONG:
1869 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001870 shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001871 static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >>
1872 (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f));
1873 inst = inst->Next_2xx();
1874 break;
1875 case Instruction::ADD_FLOAT:
1876 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001877 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001878 shadow_frame.GetVRegFloat(inst->VRegB_23x()) +
1879 shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1880 inst = inst->Next_2xx();
1881 break;
1882 case Instruction::SUB_FLOAT:
1883 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001884 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001885 shadow_frame.GetVRegFloat(inst->VRegB_23x()) -
1886 shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1887 inst = inst->Next_2xx();
1888 break;
1889 case Instruction::MUL_FLOAT:
1890 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001891 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001892 shadow_frame.GetVRegFloat(inst->VRegB_23x()) *
1893 shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1894 inst = inst->Next_2xx();
1895 break;
1896 case Instruction::DIV_FLOAT:
1897 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001898 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001899 shadow_frame.GetVRegFloat(inst->VRegB_23x()) /
1900 shadow_frame.GetVRegFloat(inst->VRegC_23x()));
1901 inst = inst->Next_2xx();
1902 break;
1903 case Instruction::REM_FLOAT:
1904 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001905 shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001906 fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()),
1907 shadow_frame.GetVRegFloat(inst->VRegC_23x())));
1908 inst = inst->Next_2xx();
1909 break;
1910 case Instruction::ADD_DOUBLE:
1911 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001912 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001913 shadow_frame.GetVRegDouble(inst->VRegB_23x()) +
1914 shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1915 inst = inst->Next_2xx();
1916 break;
1917 case Instruction::SUB_DOUBLE:
1918 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001919 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001920 shadow_frame.GetVRegDouble(inst->VRegB_23x()) -
1921 shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1922 inst = inst->Next_2xx();
1923 break;
1924 case Instruction::MUL_DOUBLE:
1925 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001926 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001927 shadow_frame.GetVRegDouble(inst->VRegB_23x()) *
1928 shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1929 inst = inst->Next_2xx();
1930 break;
1931 case Instruction::DIV_DOUBLE:
1932 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001933 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001934 shadow_frame.GetVRegDouble(inst->VRegB_23x()) /
1935 shadow_frame.GetVRegDouble(inst->VRegC_23x()));
1936 inst = inst->Next_2xx();
1937 break;
1938 case Instruction::REM_DOUBLE:
1939 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001940 shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001941 fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()),
1942 shadow_frame.GetVRegDouble(inst->VRegC_23x())));
1943 inst = inst->Next_2xx();
1944 break;
1945 case Instruction::ADD_INT_2ADDR: {
1946 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001947 uint4_t vregA = inst->VRegA_12x(inst_data);
Ian Rogersf72a11d2014-10-30 15:41:08 -07001948 shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA),
1949 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001950 inst = inst->Next_1xx();
1951 break;
1952 }
1953 case Instruction::SUB_INT_2ADDR: {
1954 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001955 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001956 shadow_frame.SetVReg(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07001957 SafeSub(shadow_frame.GetVReg(vregA),
1958 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001959 inst = inst->Next_1xx();
1960 break;
1961 }
1962 case Instruction::MUL_INT_2ADDR: {
1963 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001964 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001965 shadow_frame.SetVReg(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07001966 SafeMul(shadow_frame.GetVReg(vregA),
1967 shadow_frame.GetVReg(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001968 inst = inst->Next_1xx();
1969 break;
1970 }
1971 case Instruction::DIV_INT_2ADDR: {
1972 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001973 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001974 bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001975 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001976 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx);
1977 break;
1978 }
1979 case Instruction::REM_INT_2ADDR: {
1980 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001981 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001982 bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001983 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001984 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx);
1985 break;
1986 }
1987 case Instruction::SHL_INT_2ADDR: {
1988 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001989 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001990 shadow_frame.SetVReg(vregA,
1991 shadow_frame.GetVReg(vregA) <<
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001992 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001993 inst = inst->Next_1xx();
1994 break;
1995 }
1996 case Instruction::SHR_INT_2ADDR: {
1997 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02001998 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02001999 shadow_frame.SetVReg(vregA,
2000 shadow_frame.GetVReg(vregA) >>
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002001 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002002 inst = inst->Next_1xx();
2003 break;
2004 }
2005 case Instruction::USHR_INT_2ADDR: {
2006 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002007 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002008 shadow_frame.SetVReg(vregA,
2009 static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >>
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002010 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002011 inst = inst->Next_1xx();
2012 break;
2013 }
2014 case Instruction::AND_INT_2ADDR: {
2015 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002016 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002017 shadow_frame.SetVReg(vregA,
2018 shadow_frame.GetVReg(vregA) &
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002019 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002020 inst = inst->Next_1xx();
2021 break;
2022 }
2023 case Instruction::OR_INT_2ADDR: {
2024 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002025 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002026 shadow_frame.SetVReg(vregA,
2027 shadow_frame.GetVReg(vregA) |
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002028 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002029 inst = inst->Next_1xx();
2030 break;
2031 }
2032 case Instruction::XOR_INT_2ADDR: {
2033 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002034 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002035 shadow_frame.SetVReg(vregA,
2036 shadow_frame.GetVReg(vregA) ^
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002037 shadow_frame.GetVReg(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002038 inst = inst->Next_1xx();
2039 break;
2040 }
2041 case Instruction::ADD_LONG_2ADDR: {
2042 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002043 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002044 shadow_frame.SetVRegLong(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07002045 SafeAdd(shadow_frame.GetVRegLong(vregA),
2046 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002047 inst = inst->Next_1xx();
2048 break;
2049 }
2050 case Instruction::SUB_LONG_2ADDR: {
2051 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002052 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002053 shadow_frame.SetVRegLong(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07002054 SafeSub(shadow_frame.GetVRegLong(vregA),
2055 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002056 inst = inst->Next_1xx();
2057 break;
2058 }
2059 case Instruction::MUL_LONG_2ADDR: {
2060 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002061 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002062 shadow_frame.SetVRegLong(vregA,
Ian Rogersf72a11d2014-10-30 15:41:08 -07002063 SafeMul(shadow_frame.GetVRegLong(vregA),
2064 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002065 inst = inst->Next_1xx();
2066 break;
2067 }
2068 case Instruction::DIV_LONG_2ADDR: {
2069 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002070 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002071 DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002072 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002073 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
2074 break;
2075 }
2076 case Instruction::REM_LONG_2ADDR: {
2077 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002078 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002079 DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002080 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002081 POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx);
2082 break;
2083 }
2084 case Instruction::AND_LONG_2ADDR: {
2085 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002086 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002087 shadow_frame.SetVRegLong(vregA,
2088 shadow_frame.GetVRegLong(vregA) &
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002089 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002090 inst = inst->Next_1xx();
2091 break;
2092 }
2093 case Instruction::OR_LONG_2ADDR: {
2094 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002095 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002096 shadow_frame.SetVRegLong(vregA,
2097 shadow_frame.GetVRegLong(vregA) |
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002098 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002099 inst = inst->Next_1xx();
2100 break;
2101 }
2102 case Instruction::XOR_LONG_2ADDR: {
2103 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002104 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002105 shadow_frame.SetVRegLong(vregA,
2106 shadow_frame.GetVRegLong(vregA) ^
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002107 shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002108 inst = inst->Next_1xx();
2109 break;
2110 }
2111 case Instruction::SHL_LONG_2ADDR: {
2112 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002113 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002114 shadow_frame.SetVRegLong(vregA,
2115 shadow_frame.GetVRegLong(vregA) <<
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002116 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002117 inst = inst->Next_1xx();
2118 break;
2119 }
2120 case Instruction::SHR_LONG_2ADDR: {
2121 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002122 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002123 shadow_frame.SetVRegLong(vregA,
2124 shadow_frame.GetVRegLong(vregA) >>
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002125 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002126 inst = inst->Next_1xx();
2127 break;
2128 }
2129 case Instruction::USHR_LONG_2ADDR: {
2130 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002131 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002132 shadow_frame.SetVRegLong(vregA,
2133 static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >>
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002134 (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002135 inst = inst->Next_1xx();
2136 break;
2137 }
2138 case Instruction::ADD_FLOAT_2ADDR: {
2139 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002140 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002141 shadow_frame.SetVRegFloat(vregA,
2142 shadow_frame.GetVRegFloat(vregA) +
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002143 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002144 inst = inst->Next_1xx();
2145 break;
2146 }
2147 case Instruction::SUB_FLOAT_2ADDR: {
2148 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002149 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002150 shadow_frame.SetVRegFloat(vregA,
2151 shadow_frame.GetVRegFloat(vregA) -
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002152 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002153 inst = inst->Next_1xx();
2154 break;
2155 }
2156 case Instruction::MUL_FLOAT_2ADDR: {
2157 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002158 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002159 shadow_frame.SetVRegFloat(vregA,
2160 shadow_frame.GetVRegFloat(vregA) *
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002161 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002162 inst = inst->Next_1xx();
2163 break;
2164 }
2165 case Instruction::DIV_FLOAT_2ADDR: {
2166 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002167 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002168 shadow_frame.SetVRegFloat(vregA,
2169 shadow_frame.GetVRegFloat(vregA) /
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002170 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002171 inst = inst->Next_1xx();
2172 break;
2173 }
2174 case Instruction::REM_FLOAT_2ADDR: {
2175 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002176 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002177 shadow_frame.SetVRegFloat(vregA,
2178 fmodf(shadow_frame.GetVRegFloat(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002179 shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002180 inst = inst->Next_1xx();
2181 break;
2182 }
2183 case Instruction::ADD_DOUBLE_2ADDR: {
2184 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002185 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002186 shadow_frame.SetVRegDouble(vregA,
2187 shadow_frame.GetVRegDouble(vregA) +
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002188 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002189 inst = inst->Next_1xx();
2190 break;
2191 }
2192 case Instruction::SUB_DOUBLE_2ADDR: {
2193 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002194 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002195 shadow_frame.SetVRegDouble(vregA,
2196 shadow_frame.GetVRegDouble(vregA) -
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002197 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002198 inst = inst->Next_1xx();
2199 break;
2200 }
2201 case Instruction::MUL_DOUBLE_2ADDR: {
2202 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002203 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002204 shadow_frame.SetVRegDouble(vregA,
2205 shadow_frame.GetVRegDouble(vregA) *
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002206 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002207 inst = inst->Next_1xx();
2208 break;
2209 }
2210 case Instruction::DIV_DOUBLE_2ADDR: {
2211 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002212 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002213 shadow_frame.SetVRegDouble(vregA,
2214 shadow_frame.GetVRegDouble(vregA) /
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002215 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002216 inst = inst->Next_1xx();
2217 break;
2218 }
2219 case Instruction::REM_DOUBLE_2ADDR: {
2220 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002221 uint4_t vregA = inst->VRegA_12x(inst_data);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002222 shadow_frame.SetVRegDouble(vregA,
2223 fmod(shadow_frame.GetVRegDouble(vregA),
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002224 shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002225 inst = inst->Next_1xx();
2226 break;
2227 }
2228 case Instruction::ADD_INT_LIT16:
2229 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002230 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002231 SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2232 inst->VRegC_22s()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002233 inst = inst->Next_2xx();
2234 break;
Ian Rogersf72a11d2014-10-30 15:41:08 -07002235 case Instruction::RSUB_INT_LIT16:
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002236 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002237 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002238 SafeSub(inst->VRegC_22s(),
2239 shadow_frame.GetVReg(inst->VRegB_22s(inst_data))));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002240 inst = inst->Next_2xx();
2241 break;
2242 case Instruction::MUL_INT_LIT16:
2243 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002244 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002245 SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2246 inst->VRegC_22s()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002247 inst = inst->Next_2xx();
2248 break;
2249 case Instruction::DIV_INT_LIT16: {
2250 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002251 bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data),
Mathieu Chartier2cebb242015-04-21 16:50:40 -07002252 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2253 inst->VRegC_22s());
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002254 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2255 break;
2256 }
2257 case Instruction::REM_INT_LIT16: {
2258 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002259 bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data),
Mathieu Chartier2cebb242015-04-21 16:50:40 -07002260 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)),
2261 inst->VRegC_22s());
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002262 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2263 break;
2264 }
2265 case Instruction::AND_INT_LIT16:
2266 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002267 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2268 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) &
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002269 inst->VRegC_22s());
2270 inst = inst->Next_2xx();
2271 break;
2272 case Instruction::OR_INT_LIT16:
2273 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002274 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2275 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) |
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002276 inst->VRegC_22s());
2277 inst = inst->Next_2xx();
2278 break;
2279 case Instruction::XOR_INT_LIT16:
2280 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002281 shadow_frame.SetVReg(inst->VRegA_22s(inst_data),
2282 shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002283 inst->VRegC_22s());
2284 inst = inst->Next_2xx();
2285 break;
2286 case Instruction::ADD_INT_LIT8:
2287 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002288 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002289 SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002290 inst = inst->Next_2xx();
2291 break;
2292 case Instruction::RSUB_INT_LIT8:
2293 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002294 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002295 SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b())));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002296 inst = inst->Next_2xx();
2297 break;
2298 case Instruction::MUL_INT_LIT8:
2299 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002300 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Ian Rogersf72a11d2014-10-30 15:41:08 -07002301 SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()));
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002302 inst = inst->Next_2xx();
2303 break;
2304 case Instruction::DIV_INT_LIT8: {
2305 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002306 bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002307 shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
2308 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2309 break;
2310 }
2311 case Instruction::REM_INT_LIT8: {
2312 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002313 bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002314 shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b());
2315 POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx);
2316 break;
2317 }
2318 case Instruction::AND_INT_LIT8:
2319 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002320 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002321 shadow_frame.GetVReg(inst->VRegB_22b()) &
2322 inst->VRegC_22b());
2323 inst = inst->Next_2xx();
2324 break;
2325 case Instruction::OR_INT_LIT8:
2326 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002327 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002328 shadow_frame.GetVReg(inst->VRegB_22b()) |
2329 inst->VRegC_22b());
2330 inst = inst->Next_2xx();
2331 break;
2332 case Instruction::XOR_INT_LIT8:
2333 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002334 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002335 shadow_frame.GetVReg(inst->VRegB_22b()) ^
2336 inst->VRegC_22b());
2337 inst = inst->Next_2xx();
2338 break;
2339 case Instruction::SHL_INT_LIT8:
2340 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002341 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002342 shadow_frame.GetVReg(inst->VRegB_22b()) <<
2343 (inst->VRegC_22b() & 0x1f));
2344 inst = inst->Next_2xx();
2345 break;
2346 case Instruction::SHR_INT_LIT8:
2347 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002348 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002349 shadow_frame.GetVReg(inst->VRegB_22b()) >>
2350 (inst->VRegC_22b() & 0x1f));
2351 inst = inst->Next_2xx();
2352 break;
2353 case Instruction::USHR_INT_LIT8:
2354 PREAMBLE();
Sebastien Hertz3b588e02013-09-11 14:33:18 +02002355 shadow_frame.SetVReg(inst->VRegA_22b(inst_data),
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002356 static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >>
2357 (inst->VRegC_22b() & 0x1f));
2358 inst = inst->Next_2xx();
2359 break;
2360 case Instruction::UNUSED_3E ... Instruction::UNUSED_43:
Narayan Kamath8ec3bd22016-08-03 12:46:23 +01002361 case Instruction::UNUSED_F3 ... Instruction::UNUSED_F9:
2362 case Instruction::UNUSED_FC ... Instruction::UNUSED_FF:
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002363 case Instruction::UNUSED_79:
2364 case Instruction::UNUSED_7A:
Ian Rogerse94652f2014-12-02 11:13:19 -08002365 UnexpectedOpcode(inst, shadow_frame);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002366 }
buzbee1452bee2015-03-06 14:43:04 -08002367 } while (!interpret_one_instruction);
2368 // Record where we stopped.
2369 shadow_frame.SetDexPC(inst->GetDexPc(insns));
buzbeed6b48db2016-01-28 15:48:55 -08002370 return result_register;
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002371} // NOLINT(readability/fn_size)
2372
2373// Explicit definitions of ExecuteSwitchImpl.
Andreas Gampe5e26eb12016-08-22 17:54:17 -07002374template HOT_ATTR
Ian Rogerse94652f2014-12-02 11:13:19 -08002375JValue ExecuteSwitchImpl<true, false>(Thread* self, const DexFile::CodeItem* code_item,
buzbee1452bee2015-03-06 14:43:04 -08002376 ShadowFrame& shadow_frame, JValue result_register,
2377 bool interpret_one_instruction);
Andreas Gampe5e26eb12016-08-22 17:54:17 -07002378template HOT_ATTR
Ian Rogerse94652f2014-12-02 11:13:19 -08002379JValue ExecuteSwitchImpl<false, false>(Thread* self, const DexFile::CodeItem* code_item,
buzbee1452bee2015-03-06 14:43:04 -08002380 ShadowFrame& shadow_frame, JValue result_register,
2381 bool interpret_one_instruction);
Andreas Gampe5e26eb12016-08-22 17:54:17 -07002382template
Ian Rogerse94652f2014-12-02 11:13:19 -08002383JValue ExecuteSwitchImpl<true, true>(Thread* self, const DexFile::CodeItem* code_item,
buzbee1452bee2015-03-06 14:43:04 -08002384 ShadowFrame& shadow_frame, JValue result_register,
2385 bool interpret_one_instruction);
Andreas Gampe5e26eb12016-08-22 17:54:17 -07002386template
Ian Rogerse94652f2014-12-02 11:13:19 -08002387JValue ExecuteSwitchImpl<false, true>(Thread* self, const DexFile::CodeItem* code_item,
buzbee1452bee2015-03-06 14:43:04 -08002388 ShadowFrame& shadow_frame, JValue result_register,
2389 bool interpret_one_instruction);
Sebastien Hertz8ece0502013-08-07 11:26:41 +02002390
2391} // namespace interpreter
2392} // namespace art