18ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz/* 28ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * Copyright (C) 2012 The Android Open Source Project 38ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * 48ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * Licensed under the Apache License, Version 2.0 (the "License"); 58ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * you may not use this file except in compliance with the License. 68ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * You may obtain a copy of the License at 78ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * 88ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * http://www.apache.org/licenses/LICENSE-2.0 98ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * 108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * Unless required by applicable law or agreed to in writing, software 118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * distributed under the License is distributed on an "AS IS" BASIS, 128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * See the License for the specific language governing permissions and 148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz * limitations under the License. 158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz */ 168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 175e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampe#include "interpreter_switch_impl.h" 185e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampe 19542451cc546779f5c67840e105c51205a1b0a8fdAndreas Gampe#include "base/enums.h" 208f4b056427a9d2321e3aa4f21ca8ffb18b3e5ae6David Sehr#include "base/quasi_atomic.h" 219e734c7ab4599d7747a05db0dc73c7b668cb6683David Sehr#include "dex/dex_file_types.h" 22eb7c144a6aff7da673ba53d501c46f00311d4d7fAlex Light#include "experimental_flags.h" 238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#include "interpreter_common.h" 24b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#include "jit/jit.h" 2528bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier#include "jvalue-inl.h" 26f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers#include "safe_math.h" 278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace art { 298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace interpreter { 308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 31b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light#define HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instr) \ 328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 3382aeddb83c58db5fe1e227de574eb8ced4fc6130Sebastien Hertz DCHECK(self->IsExceptionPending()); \ 347b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); \ 359fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light if (!MoveToExceptionHandler(self, shadow_frame, instr)) { \ 3603ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe /* Structured locking is to be enforced for abnormal termination, too. */ \ 3756fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame); \ 381452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { \ 3993e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ \ 40e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); \ 411452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } \ 42a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = JValue(); /* Handled in caller. */ \ 43a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; \ 448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 459fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light int32_t displacement = \ 469fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light static_cast<int32_t>(shadow_frame.GetDexPC()) - static_cast<int32_t>(dex_pc); \ 478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(displacement); \ 488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 51b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light#define HANDLE_PENDING_EXCEPTION() HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instrumentation) 52b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light 538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \ 548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(_is_exception_pending)) { \ 568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->_next_function(); \ 598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 6203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe#define HANDLE_MONITOR_CHECKS() \ 6356fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) { \ 6403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_PENDING_EXCEPTION(); \ 6503ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe } 6603ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe 678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 68fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light#define PREAMBLE_SAVE(save_ref) \ 69fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light { \ 70fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(instrumentation->HasDexPcListeners()) && \ 71fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light UNLIKELY(!DoDexPcMoveEvent(self, \ 72808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier accessor, \ 73fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame, \ 74fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light dex_pc, \ 75fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light instrumentation, \ 76fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light save_ref))) { \ 77fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light HANDLE_PENDING_EXCEPTION(); \ 78fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light break; \ 798379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } \ 80fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } \ 81fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light do {} while (false) 82fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light 83fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light#define PREAMBLE() PREAMBLE_SAVE(nullptr) 848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 85b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#define BRANCH_INSTRUMENTATION(offset) \ 86b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray do { \ 87274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (UNLIKELY(instrumentation->HasBranchListeners())) { \ 88cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light instrumentation->Branch(self, shadow_frame.GetMethod(), dex_pc, offset); \ 89274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray } \ 90b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray JValue result; \ 91cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light if (jit::Jit::MaybeDoOnStackReplacement(self, \ 92cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light shadow_frame.GetMethod(), \ 93cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light dex_pc, \ 94cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light offset, \ 95cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light &result)) { \ 9693e94f228f7a9ec5c2a29553010e585d583ac530buzbee if (interpret_one_instruction) { \ 9793e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* OSR has completed execution of the method. Signal mterp to return to caller */ \ 98e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); \ 9993e94f228f7a9ec5c2a29553010e585d583ac530buzbee } \ 100a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = result; \ 101a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; \ 102b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray } \ 1033108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray } while (false) 1043108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray 1051d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee#define HOTNESS_UPDATE() \ 1061d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee do { \ 107274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (jit != nullptr) { \ 108cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light jit->AddSamples(self, shadow_frame.GetMethod(), 1, /*with_backedges*/ true); \ 1091d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } \ 1101d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } while (false) 1111d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee 112848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light#define HANDLE_ASYNC_EXCEPTION() \ 113848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light if (UNLIKELY(self->ObserveAsyncException())) { \ 114848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_PENDING_EXCEPTION(); \ 115848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light break; \ 116848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light } \ 117848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light do {} while (false) 118848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light 119f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe#define HANDLE_BACKWARD_BRANCH(offset) \ 120f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe do { \ 121f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe if (IsBackwardBranch(offset)) { \ 122f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HOTNESS_UPDATE(); \ 123f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe /* Record new dex pc early to have consistent suspend point at loop header. */ \ 124f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe shadow_frame.SetDexPC(inst->GetDexPc(insns)); \ 125f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe self->AllowThreadSuspension(); \ 126f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } \ 127f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } while (false) 128f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe 129fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// Unlike most other events the DexPcMovedEvent can be sent when there is a pending exception (if 130fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// the next instruction is MOVE_EXCEPTION). This means it needs to be handled carefully to be able 131fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// to detect exceptions thrown by the DexPcMovedEvent itself. These exceptions could be thrown by 132fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// jvmti-agents while handling breakpoint or single step events. We had to move this into its own 133fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// function because it was making ExecuteSwitchImpl have too large a stack. 1342989a4a7f663d917c466cf8182356eca67bb8ae7Alex LightNO_INLINE static bool DoDexPcMoveEvent(Thread* self, 135808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier const CodeItemDataAccessor& accessor, 1362989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const ShadowFrame& shadow_frame, 1372989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light uint32_t dex_pc, 1382989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const instrumentation::Instrumentation* instrumentation, 1392989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light JValue* save_ref) 140fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light REQUIRES_SHARED(Locks::mutator_lock_) { 141fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light DCHECK(instrumentation->HasDexPcListeners()); 142fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light StackHandleScope<2> hs(self); 143fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light Handle<mirror::Throwable> thr(hs.NewHandle(self->GetException())); 144fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light mirror::Object* null_obj = nullptr; 145fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light HandleWrapper<mirror::Object> h( 146fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light hs.NewHandleWrapper(LIKELY(save_ref == nullptr) ? &null_obj : save_ref->GetGCRoot())); 147fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light self->ClearException(); 148fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light instrumentation->DexPcMovedEvent(self, 149808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 150fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame.GetMethod(), 151fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light dex_pc); 152fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(self->IsExceptionPending())) { 153fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // We got a new exception in the dex-pc-moved event. We just let this exception replace the old 154fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // one. 155fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // TODO It would be good to add the old exception to the suppressed exceptions of the new one if 156fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // possible. 157fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light return false; 158fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } else { 159fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(!thr.IsNull())) { 160fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light self->SetException(thr.Get()); 161fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } 162fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light return true; 163fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } 164fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light} 165fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light 166e814f9d09c0fb1b678e610780d11ce3577db3599Alex Lightstatic bool NeedsMethodExitEvent(const instrumentation::Instrumentation* ins) 167e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light REQUIRES_SHARED(Locks::mutator_lock_) { 168e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return ins->HasMethodExitListeners() || ins->HasWatchedFramePopListeners(); 169e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light} 170e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light 171e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light// Sends the normal method exit event. Returns true if the events succeeded and false if there is a 172e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light// pending exception. 173e814f9d09c0fb1b678e610780d11ce3577db3599Alex LightNO_INLINE static bool SendMethodExitEvents(Thread* self, 174e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const instrumentation::Instrumentation* instrumentation, 175e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const ShadowFrame& frame, 176e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light ObjPtr<mirror::Object> thiz, 177e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light ArtMethod* method, 178e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light uint32_t dex_pc, 179e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const JValue& result) 180e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light REQUIRES_SHARED(Locks::mutator_lock_) { 181e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light bool had_event = false; 182e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 183e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light had_event = true; 184e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation->MethodExitEvent(self, thiz.Ptr(), method, dex_pc, result); 185e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 186e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(frame.NeedsNotifyPop() && instrumentation->HasWatchedFramePopListeners())) { 187e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light had_event = true; 188e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation->WatchedFramePopped(self, frame); 189e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 190e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(had_event)) { 191e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return !self->IsExceptionPending(); 192e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } else { 193e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return true; 194e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 195e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light} 196e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light 197d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool do_access_check, bool transaction_active> 198a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbeckyvoid ExecuteSwitchImplCpp(SwitchImplContext* ctx) { 199a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky Thread* self = ctx->self; 200a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky const CodeItemDataAccessor& accessor = ctx->accessor; 201a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ShadowFrame& shadow_frame = ctx->shadow_frame; 202a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky JValue result_register = ctx->result_register; 203a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky bool interpret_one_instruction = ctx->interpret_one_instruction; 204c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin constexpr bool do_assignability_check = do_access_check; 2058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 2068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 207a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = JValue(); 208a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; 2098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 2118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 2128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 2132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier const auto* const instrumentation = Runtime::Current()->GetInstrumentation(); 214808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier const uint16_t* const insns = accessor.Insns(); 2158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 2163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t inst_data; 2171d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee jit::Jit* jit = Runtime::Current()->GetJit(); 2186918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 2191452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee do { 2208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz dex_pc = inst->GetDexPc(insns); 2218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetDexPC(dex_pc); 222e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers TraceExecution(shadow_frame, inst, dex_pc); 2233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz inst_data = inst->Fetch16(0); 2243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz switch (inst->Opcode(inst_data)) { 2258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOP: 2268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE: 2308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 2323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 2338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_FROM16: 2368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(inst_data), 2388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 2398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_16: 2428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 2448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 2458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE: 2488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 2503b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 2518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_FROM16: 2548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data), 2568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 2578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_16: 2608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 2628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 2638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT: 2668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data), 2683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data))); 2698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_FROM16: 2728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data), 2748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 2758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_16: 2788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 2808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 2818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT: 2848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI()); 2868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_WIDE: 2898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ()); 2918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_OBJECT: 294fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light PREAMBLE_SAVE(&result_register); 2953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL()); 2968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_EXCEPTION: { 2998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 300ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Throwable> exception = self->GetException(); 301270a0e16c3b8e5b95cbfdbd8996ac137c7c6322bSebastien Hertz DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction"; 302ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception.Ptr()); 3035c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz self->ClearException(); 3048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 3058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 307d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID_NO_BARRIER: { 3089d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3107b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 31103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 312e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 313e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 314e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 315e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 316808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 317e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 318e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 319e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 320e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3221452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 32393e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 324e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 3251452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 326a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = result; 327a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; 3288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 329d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID: { 3309d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3313035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceForConstructor(); 3328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3337b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 33403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 335e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 336e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 337e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 338e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 339808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 340e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 341e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 342e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 343e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3451452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 34693e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 347e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 3481452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 349a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = result; 350a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; 3518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN: { 3539d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 3563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data))); 3577b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 35803ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 359e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 360e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 361e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 362e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 363808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 364e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 365e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 366e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 367e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3691452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 37093e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 371e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 3721452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 373a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = result; 374a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; 3758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_WIDE: { 3779d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data))); 3807b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 38103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 382e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 383e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 384e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 385e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 386808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 387e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 388e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 389e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 390e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3921452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 39393e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 394e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 3951452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 396a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = result; 397a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; 3988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_OBJECT: { 4009d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 4018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 4027b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 40303ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 404bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier const size_t ref_idx = inst->VRegA_11x(inst_data); 405ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj_result = shadow_frame.GetVRegReference(ref_idx); 4062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (do_assignability_check && obj_result != nullptr) { 407cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light ObjPtr<mirror::Class> return_type = shadow_frame.GetMethod()->ResolveReturnType(); 408bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier // Re-load since it might have moved. 409bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier obj_result = shadow_frame.GetVRegReference(ref_idx); 4102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (return_type == nullptr) { 411a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // Return the pending exception. 412a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 413a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 414a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (!obj_result->VerifierInstanceOf(return_type)) { 415a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 4161ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp1, temp2; 417fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 418a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Returning '%s' that is not instance of return type '%s'", 4191ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers obj_result->GetClass()->GetDescriptor(&temp1), 4201ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers return_type->GetDescriptor(&temp2)); 421a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 422a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 423a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 424bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier result.SetL(obj_result); 425e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 426e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 427e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 428e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 429808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 430e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 431e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 432e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 433e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 4348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 435e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light // Re-load since it might have moved during the MethodExitEvent. 436e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result.SetL(shadow_frame.GetVRegReference(ref_idx)); 4371452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 43893e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 439e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 4401452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 441a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = result; 442a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; 4438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 4458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t dst = inst->VRegA_11n(inst_data); 4473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int4_t val = inst->VRegB_11n(inst_data); 4488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 4538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 4568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21s(inst_data); 4588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 4598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 4678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_31i(inst_data); 4698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 4708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 4788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21h(inst_data); 4808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 4818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 4898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); 4918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 4948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); 4968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 4998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); 5018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 5028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 5043c5aec1da27d8068e6bb97202d12efad6b4331dfSebastien Hertz PREAMBLE(); 5053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), 5068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 5078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 5108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5118a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 5128a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 5138a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_21c())); 5142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 5158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 517ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s.Ptr()); 5188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 5238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5248a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 5258a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 5268a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_31c())); 5272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 5288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 530ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s.Ptr()); 5318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 5328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 5368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 537a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 538ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 539ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 540ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 541ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 5422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 5438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 545ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c.Ptr()); 5468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5502e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson case Instruction::CONST_METHOD_HANDLE: { 5512e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson PREAMBLE(); 552e7732be2390f00b1f98b8c0066a37892ee1126f6Orion Hodson ClassLinker* cl = Runtime::Current()->GetClassLinker(); 553cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light ObjPtr<mirror::MethodHandle> mh = cl->ResolveMethodHandle(self, 554cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light inst->VRegB_21c(), 555cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light shadow_frame.GetMethod()); 5562e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson if (UNLIKELY(mh == nullptr)) { 5572e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson HANDLE_PENDING_EXCEPTION(); 5582e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } else { 5592e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), mh.Ptr()); 5602e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson inst = inst->Next_2xx(); 5612e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } 5622e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson break; 5632e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } 5642e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson case Instruction::CONST_METHOD_TYPE: { 5652e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson PREAMBLE(); 566e7732be2390f00b1f98b8c0066a37892ee1126f6Orion Hodson ClassLinker* cl = Runtime::Current()->GetClassLinker(); 567cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light ObjPtr<mirror::MethodType> mt = cl->ResolveMethodType(self, 568cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light inst->VRegB_21c(), 569cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light shadow_frame.GetMethod()); 5702e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson if (UNLIKELY(mt == nullptr)) { 5712e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson HANDLE_PENDING_EXCEPTION(); 5722e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } else { 5732e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), mt.Ptr()); 5742e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson inst = inst->Next_2xx(); 5752e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } 5762e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson break; 5772e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } 5788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 5798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 580848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 581ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5830aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 58603ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorEnter<do_assignability_check>(self, &shadow_frame, obj); 5878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 5888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 5928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 593848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 594ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5960aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 59903ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorExit<do_assignability_check>(self, &shadow_frame, obj); 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 6058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 606a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 607ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 608ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 609ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 610ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 6112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 6128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 614ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 6152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) { 6168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 6178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 6258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 626a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegC_22c()), 627ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 628ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 629ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 630ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 6312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 6328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 634ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 6352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_22c(inst_data), 6362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0); 6378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 6428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 643ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 6442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(array == nullptr)) { 6450aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 6468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 6548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 655ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = nullptr; 656a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 657ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 658ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 659ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 660ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 661848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (LIKELY(c != nullptr)) { 662848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (UNLIKELY(c->IsStringClass())) { 663848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); 6643aaa37bba53d6df0265793de48b4b0b57327e57ajessicahandojo obj = mirror::String::AllocEmptyString<true>(self, allocator_type); 665848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } else { 6660d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray obj = AllocObjectFromCode<true>( 6670d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray c.Ptr(), 668a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 669a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe Runtime::Current()->GetHeap()->GetCurrentAllocator()); 670848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 671848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 6722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6754e99b3d8955131f3fc71aa113f0fa71f0092cb6fSebastien Hertz obj->GetClass()->AssertInitializedOrInitializingInThread(self); 676b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 677b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 678b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 67945b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz AbortTransactionF(self, "Allocating finalizable object in transaction: %s", 680709b070044354d9f47641f273edacaeeb0240ab7David Sehr obj->PrettyTypeOf().c_str()); 681b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 682b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 683b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 684ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj.Ptr()); 6858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 6908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 692ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check, true>( 693a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe dex::TypeIndex(inst->VRegC_22c()), 694a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe length, 695a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe shadow_frame.GetMethod(), 696a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 697cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 6982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 6998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 701ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj.Ptr()); 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 7078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 708d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 709d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 710d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 7118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 7128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 7158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 716d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 717d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 718d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 7238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 7258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 7268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 727ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 728832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers bool success = FillArrayData(obj, payload); 729832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers if (!success) { 7308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 733d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 734832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count); 735d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 7368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 7378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 7408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 741848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 742ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> exception = 743ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 7442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(exception == nullptr)) { 7450aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("throw with null exception"); 746a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 747a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 7481ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp; 749fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 750a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 7511ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers exception->GetClass()->GetDescriptor(&temp)); 7528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 75314691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray self->SetException(exception->AsThrowable()); 7548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 7598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 760848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 7613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 76281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7631eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 764f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 7688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 769848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 7701eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 77181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7721eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 773f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 7778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 778848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 7791eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 78081f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7811eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 782f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 7868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 78881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 790f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 79681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 798f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 801647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 802647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic push 803647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic ignored "-Wfloat-equal" 804647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 8058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 8068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 8088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 8098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 8118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 8228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 8278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 8388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 8408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 8418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 8438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 8548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 8558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 8578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 8588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 8608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 870647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 871647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic pop 872647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 8738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 8748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 8768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 8778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 8798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 8908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == 8922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8931eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 89481f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8951eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 896f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 898f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 9048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != 9062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9071eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 90881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9091eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 910f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 912f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 9188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < 9202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9211eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 92281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9231eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 924f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 926f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 9328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= 9342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9351eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 93681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9371eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 938f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 940f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 9468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > 9482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9491eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 95081f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9511eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 952f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 954f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= 9622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9631eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 96481f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9651eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 966f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 968f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 9748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 9761eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 97781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9781eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 979f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 981f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 9878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 9891eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 99081f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9911eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 992f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 994f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 10021eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 100381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 10041eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 1005f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 10068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 1007f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 10088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { 10151eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 101681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 10171eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 1018f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 1020f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 10218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 10268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 10281eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 102981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 10301eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 1031f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 10328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 1033f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 10348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 10398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 10411eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 104281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 10431eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 1044f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 10458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 1046f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 10478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 10528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1053ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10550aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1060ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1061b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1062abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 10708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1071ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10730aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1078ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1079b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1080abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 10888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1089ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10910aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1096ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1097b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1098abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 11068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1107ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11082cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11090aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1114ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1115b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1116abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 11248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1125ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11270aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1132709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1133ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1134b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1135abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 11438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1144ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11460aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1151709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1152ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1153b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1154abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 11628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1163ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11650aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1170ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1171b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 11723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1181ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11830aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1189ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1190b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1191d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 11998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1200ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12020aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 12078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1208ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1209b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1210d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 12188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1219ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12210aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 12268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1227ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1228b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1229d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 12378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1238ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12400aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 12458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1246ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1247b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1248d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 12568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1257ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12590aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 12648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1265709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1266ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1267b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1268d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 12768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1277ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12790aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 12848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1285709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1286ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1287b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1288d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 12968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1297ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12990aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 13018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1304ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 1305ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1306b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1307d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 13088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 13098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 13108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 13118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13162cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>( 13172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>( 13242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 13298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>( 13312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 13368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>( 13382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 13438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>( 13452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 13508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>( 13522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 13578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>( 13592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 13648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 13668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 13708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 13728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 13768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 13788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1381ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BOOLEAN_QUICK: { 1382ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1383ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data); 1384ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1385ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1386ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1387ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BYTE_QUICK: { 1388ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1389ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data); 1390ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1391ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1392ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1393ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_CHAR_QUICK: { 1394ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1395ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data); 1396ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1397ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1398ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1399ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_SHORT_QUICK: { 1400ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1401ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data); 1402ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1403ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1404ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 14058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 14068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1407bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check, 1408bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BYTE: { 14138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1414bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check, 1415bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_CHAR: { 14208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1421bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check, 1422bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 14278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1428bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check, 1429bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 14348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1435bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check, 1436bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 14418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1442bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check, 1443bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1449bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check, 1450bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 14558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 14572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 14628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, 14642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 14698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, 14712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, 14782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 14838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, 14852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 14908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, 14922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 14978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, 14992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 15048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>( 15062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 15078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 151037f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BOOLEAN_QUICK: { 151137f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 15122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>( 15132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 151437f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 151537f05ef45e0393de812d51261dc293240c17294dFred Shih break; 151637f05ef45e0393de812d51261dc293240c17294dFred Shih } 151737f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BYTE_QUICK: { 151837f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 15192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>( 15202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 152137f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 152237f05ef45e0393de812d51261dc293240c17294dFred Shih break; 152337f05ef45e0393de812d51261dc293240c17294dFred Shih } 152437f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_CHAR_QUICK: { 152537f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 15262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>( 15272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 152837f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 152937f05ef45e0393de812d51261dc293240c17294dFred Shih break; 153037f05ef45e0393de812d51261dc293240c17294dFred Shih } 153137f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_SHORT_QUICK: { 153237f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 15332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>( 15342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 153537f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 153637f05ef45e0393de812d51261dc293240c17294dFred Shih break; 153737f05ef45e0393de812d51261dc293240c17294dFred Shih } 15388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 15398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>( 15412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 15428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 15468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>( 15482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 15498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 15538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 15552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BYTE: { 15608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, 15622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_CHAR: { 15678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, 15692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 15748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, 15762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 15818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, 15832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 15888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, 15902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 15958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, 15972cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 16028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, false, do_access_check>( 16042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 16098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, true, do_access_check>( 16112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 16168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, false, do_access_check>( 16182cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 16238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, true, do_access_check>( 16252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 16308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, false, do_access_check>( 16322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 16378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, true, do_access_check>( 16392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 16448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, false, do_access_check>( 16462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 16518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, true, do_access_check>( 16532cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 16588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, false, do_access_check>( 16602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 16658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, true, do_access_check>( 16672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 16728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<false>( 16742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 16798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<true>( 16812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16859823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC: { 16869823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1687269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1688c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<false /* is_range */>( 16899823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 16909823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 16919823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 16929823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 16939823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC_RANGE: { 16949823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1695269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1696c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<true /* is_range */>( 16979823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 16989823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 16999823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 17009823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 1701c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM: { 1702c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1703c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1704c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<false /* is_range */>( 1705c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1706c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1707c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1708c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 1709c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM_RANGE: { 1710c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1711c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1712c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<true /* is_range */>( 1713c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1714c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1715c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1716c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 17178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 17202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 17262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 17308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 17322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 17368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 17382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 17428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17432cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegFloat( 17442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegDouble( 17502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 17518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1755450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1756450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 17608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1761450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1762450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 17668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1767450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1768450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 17728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1773450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1774450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 17788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1779450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1780450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 17848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1785450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1786450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1792450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 17933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 17988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17993b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1800450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 18013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 18068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1807450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1808450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 18098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 18128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1814450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 18153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 18168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1822450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 18233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 18288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1829450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1830450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 18318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 18348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>( 18362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 18378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 18408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>( 18422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 18438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 18468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>( 18482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 18498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1851f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::ADD_INT: { 18528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1854f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()), 1855f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 18568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1858f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers } 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1862f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()), 1863f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 18648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 18678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1869f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()), 1870f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 18778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 18848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 18858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 18908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 18938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 19008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 19018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 19048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 19078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 19138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 19218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 19228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 19258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 19288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 19298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 19328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1934f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1935f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 19368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 19398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1941f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1942f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 19438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 19468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1948f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1949f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 19508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 19538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 19558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 1956f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x())); 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 19588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 19608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 19678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 19708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 19748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 19778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 19848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 19888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 19918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 19958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 20028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 20058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 20068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 20098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 20128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 20198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 20238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 20268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 20278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 20308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 20338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 20348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 20378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 20408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 20418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 20448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 20478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 20518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 20548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 20588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 20618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 20658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 20688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 20728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 20758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 20768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 20798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 2081f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA), 2082f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 20878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 2090f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(vregA), 2091f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 20968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 2099f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(vregA), 2100f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 21018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 21058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 21083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 21108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 21138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 21163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 21218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 21253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 21268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 21308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 21343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 21358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 21398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 21433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 21448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 21488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 21523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 21578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 21613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 21668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 21703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 21758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2178f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(vregA), 2179f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 21848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2187f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(vregA), 2188f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 21938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2196f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(vregA), 2197f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 22028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 22053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 22078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 22108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 22133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 22158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 22188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 22223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 22278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 22313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 22368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 22403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 22458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 22493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 22508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 22548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 22583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 22598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 22638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 22673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 22688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 22728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 22763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 22818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 22853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 22908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 22943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 22998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 23028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 23033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 23048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 23088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 23118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 23123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 23138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 23178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 23213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 23228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 23268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 23303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 23318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 23358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 23393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 23408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 23448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 23483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 23498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 23538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 23573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 23588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 23628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2364f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2365f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 23668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2368f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::RSUB_INT_LIT16: 23698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2371f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22s(), 2372f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_22s(inst_data)))); 23738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 23768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2378f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2379f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 23808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 23838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 23852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 23862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 23878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 23918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 23932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 23942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 23958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 23998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 24013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 24028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 24038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 24068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 24083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 24098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 24108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 24138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 24153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ 24168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 24178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 24208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2422f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 24238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 24268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2428f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b()))); 24298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 24328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2434f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 24358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 24388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 24408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 24418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 24428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 24458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 24478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 24488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 24498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 24528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 24558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 24568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 24598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 24628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 24638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 24668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 24698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 24708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 24738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 24768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 24808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 24838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 24878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 24908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 24942e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson case Instruction::UNUSED_79 ... Instruction::UNUSED_7A: 24958ec3bd2b31ccbc9027b8e9b1949dd1804bb6d30fNarayan Kamath case Instruction::UNUSED_F3 ... Instruction::UNUSED_F9: 2496e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers UnexpectedOpcode(inst, shadow_frame); 24978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24981452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } while (!interpret_one_instruction); 24991452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee // Record where we stopped. 25001452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(inst->GetDexPc(insns)); 2501a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky ctx->result = result_register; 2502a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky return; 25038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 25048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 2505a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbecky// Explicit definitions of ExecuteSwitchImplCpp. 25065e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2507a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbeckyvoid ExecuteSwitchImplCpp<true, false>(SwitchImplContext* ctx); 25085e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2509a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbeckyvoid ExecuteSwitchImplCpp<false, false>(SwitchImplContext* ctx); 25105e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2511a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbeckyvoid ExecuteSwitchImplCpp<true, true>(SwitchImplContext* ctx); 25125e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2513a4d1f0ebc411488af45c490725f8e71c06d1b202David Srbeckyvoid ExecuteSwitchImplCpp<false, true>(SwitchImplContext* ctx); 25148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 25158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 25168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2517