interpreter_switch_impl.cc revision cc917d9f0495402f5301aa9df0071ad38ab78142
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" 209e734c7ab4599d7747a05db0dc73c7b668cb6683David Sehr#include "dex/dex_file_types.h" 21eb7c144a6aff7da673ba53d501c46f00311d4d7fAlex Light#include "experimental_flags.h" 228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#include "interpreter_common.h" 23b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#include "jit/jit.h" 2428bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier#include "jvalue-inl.h" 25f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers#include "safe_math.h" 268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace art { 288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace interpreter { 298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 30b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light#define HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instr) \ 318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 3282aeddb83c58db5fe1e227de574eb8ced4fc6130Sebastien Hertz DCHECK(self->IsExceptionPending()); \ 337b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); \ 349fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light if (!MoveToExceptionHandler(self, shadow_frame, instr)) { \ 3503ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe /* Structured locking is to be enforced for abnormal termination, too. */ \ 3656fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame); \ 371452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { \ 3893e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ \ 39e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); \ 401452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } \ 418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); /* Handled in caller. */ \ 428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 439fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light int32_t displacement = \ 449fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light static_cast<int32_t>(shadow_frame.GetDexPC()) - static_cast<int32_t>(dex_pc); \ 458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(displacement); \ 468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 49b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light#define HANDLE_PENDING_EXCEPTION() HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instrumentation) 50b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light 518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \ 528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(_is_exception_pending)) { \ 548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->_next_function(); \ 578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 6003ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe#define HANDLE_MONITOR_CHECKS() \ 6156fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) { \ 6203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_PENDING_EXCEPTION(); \ 6303ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe } 6403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe 658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 66fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light#define PREAMBLE_SAVE(save_ref) \ 67fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light { \ 68fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(instrumentation->HasDexPcListeners()) && \ 69fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light UNLIKELY(!DoDexPcMoveEvent(self, \ 70808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier accessor, \ 71fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame, \ 72fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light dex_pc, \ 73fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light instrumentation, \ 74fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light save_ref))) { \ 75fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light HANDLE_PENDING_EXCEPTION(); \ 76fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light break; \ 778379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } \ 78fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } \ 79fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light do {} while (false) 80fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light 81fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light#define PREAMBLE() PREAMBLE_SAVE(nullptr) 828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 83b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#define BRANCH_INSTRUMENTATION(offset) \ 84b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray do { \ 85274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (UNLIKELY(instrumentation->HasBranchListeners())) { \ 86cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light instrumentation->Branch(self, shadow_frame.GetMethod(), dex_pc, offset); \ 87274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray } \ 88b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray JValue result; \ 89cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light if (jit::Jit::MaybeDoOnStackReplacement(self, \ 90cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light shadow_frame.GetMethod(), \ 91cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light dex_pc, \ 92cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light offset, \ 93cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light &result)) { \ 9493e94f228f7a9ec5c2a29553010e585d583ac530buzbee if (interpret_one_instruction) { \ 9593e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* OSR has completed execution of the method. Signal mterp to return to caller */ \ 96e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); \ 9793e94f228f7a9ec5c2a29553010e585d583ac530buzbee } \ 98b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray return result; \ 99b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray } \ 1003108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray } while (false) 1013108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray 1021d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee#define HOTNESS_UPDATE() \ 1031d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee do { \ 104274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (jit != nullptr) { \ 105cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light jit->AddSamples(self, shadow_frame.GetMethod(), 1, /*with_backedges*/ true); \ 1061d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } \ 1071d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } while (false) 1081d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee 109848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light#define HANDLE_ASYNC_EXCEPTION() \ 110848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light if (UNLIKELY(self->ObserveAsyncException())) { \ 111848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_PENDING_EXCEPTION(); \ 112848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light break; \ 113848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light } \ 114848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light do {} while (false) 115848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light 116f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe#define HANDLE_BACKWARD_BRANCH(offset) \ 117f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe do { \ 118f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe if (IsBackwardBranch(offset)) { \ 119f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HOTNESS_UPDATE(); \ 120f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe /* Record new dex pc early to have consistent suspend point at loop header. */ \ 121f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe shadow_frame.SetDexPC(inst->GetDexPc(insns)); \ 122f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe self->AllowThreadSuspension(); \ 123f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } \ 124f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } while (false) 125f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe 126fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// Unlike most other events the DexPcMovedEvent can be sent when there is a pending exception (if 127fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// the next instruction is MOVE_EXCEPTION). This means it needs to be handled carefully to be able 128fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// to detect exceptions thrown by the DexPcMovedEvent itself. These exceptions could be thrown by 129fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// jvmti-agents while handling breakpoint or single step events. We had to move this into its own 130fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// function because it was making ExecuteSwitchImpl have too large a stack. 1312989a4a7f663d917c466cf8182356eca67bb8ae7Alex LightNO_INLINE static bool DoDexPcMoveEvent(Thread* self, 132808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier const CodeItemDataAccessor& accessor, 1332989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const ShadowFrame& shadow_frame, 1342989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light uint32_t dex_pc, 1352989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const instrumentation::Instrumentation* instrumentation, 1362989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light JValue* save_ref) 137fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light REQUIRES_SHARED(Locks::mutator_lock_) { 138fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light DCHECK(instrumentation->HasDexPcListeners()); 139fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light StackHandleScope<2> hs(self); 140fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light Handle<mirror::Throwable> thr(hs.NewHandle(self->GetException())); 141fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light mirror::Object* null_obj = nullptr; 142fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light HandleWrapper<mirror::Object> h( 143fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light hs.NewHandleWrapper(LIKELY(save_ref == nullptr) ? &null_obj : save_ref->GetGCRoot())); 144fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light self->ClearException(); 145fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light instrumentation->DexPcMovedEvent(self, 146808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 147fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame.GetMethod(), 148fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light dex_pc); 149fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(self->IsExceptionPending())) { 150fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // We got a new exception in the dex-pc-moved event. We just let this exception replace the old 151fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // one. 152fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // TODO It would be good to add the old exception to the suppressed exceptions of the new one if 153fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // possible. 154fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light return false; 155fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } else { 156fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(!thr.IsNull())) { 157fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light self->SetException(thr.Get()); 158fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } 159fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light return true; 160fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } 161fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light} 162fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light 163e814f9d09c0fb1b678e610780d11ce3577db3599Alex Lightstatic bool NeedsMethodExitEvent(const instrumentation::Instrumentation* ins) 164e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light REQUIRES_SHARED(Locks::mutator_lock_) { 165e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return ins->HasMethodExitListeners() || ins->HasWatchedFramePopListeners(); 166e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light} 167e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light 168e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light// Sends the normal method exit event. Returns true if the events succeeded and false if there is a 169e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light// pending exception. 170e814f9d09c0fb1b678e610780d11ce3577db3599Alex LightNO_INLINE static bool SendMethodExitEvents(Thread* self, 171e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const instrumentation::Instrumentation* instrumentation, 172e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const ShadowFrame& frame, 173e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light ObjPtr<mirror::Object> thiz, 174e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light ArtMethod* method, 175e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light uint32_t dex_pc, 176e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const JValue& result) 177e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light REQUIRES_SHARED(Locks::mutator_lock_) { 178e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light bool had_event = false; 179e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 180e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light had_event = true; 181e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation->MethodExitEvent(self, thiz.Ptr(), method, dex_pc, result); 182e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 183e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(frame.NeedsNotifyPop() && instrumentation->HasWatchedFramePopListeners())) { 184e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light had_event = true; 185e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation->WatchedFramePopped(self, frame); 186e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 187e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(had_event)) { 188e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return !self->IsExceptionPending(); 189e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } else { 190e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return true; 191e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 192e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light} 193e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light 194d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool do_access_check, bool transaction_active> 195808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu ChartierJValue ExecuteSwitchImpl(Thread* self, const CodeItemDataAccessor& accessor, 1961452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 1971452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction) { 198c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin constexpr bool do_assignability_check = do_access_check; 1998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 2008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 2018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); 2028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 2048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 2058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 2062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier const auto* const instrumentation = Runtime::Current()->GetInstrumentation(); 207808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier const uint16_t* const insns = accessor.Insns(); 2088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 2093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t inst_data; 2101d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee jit::Jit* jit = Runtime::Current()->GetJit(); 2116918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 2121452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee do { 2138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz dex_pc = inst->GetDexPc(insns); 2148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetDexPC(dex_pc); 215e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers TraceExecution(shadow_frame, inst, dex_pc); 2163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz inst_data = inst->Fetch16(0); 2173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz switch (inst->Opcode(inst_data)) { 2188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOP: 2198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE: 2238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 2253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 2268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_FROM16: 2298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(inst_data), 2318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 2328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_16: 2358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 2378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 2388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE: 2418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 2433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 2448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_FROM16: 2478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data), 2498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 2508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_16: 2538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 2558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 2568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT: 2598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data), 2613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data))); 2628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_FROM16: 2658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data), 2678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 2688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_16: 2718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 2738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 2748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT: 2778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI()); 2798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_WIDE: 2828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ()); 2848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_OBJECT: 287fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light PREAMBLE_SAVE(&result_register); 2883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL()); 2898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_EXCEPTION: { 2928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 293ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Throwable> exception = self->GetException(); 294270a0e16c3b8e5b95cbfdbd8996ac137c7c6322bSebastien Hertz DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction"; 295ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception.Ptr()); 2965c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz self->ClearException(); 2978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 300d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID_NO_BARRIER: { 3019d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3037b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 30403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 305e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 306e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 307e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 308e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 309808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 310e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 311e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 312e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 313e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3151452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 31693e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 317e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 3181452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 321d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID: { 3229d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3233035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceForConstructor(); 3248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3257b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 32603ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 327e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 328e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 329e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 330e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 331808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 332e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 333e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 334e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 335e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3371452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 33893e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 339e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 3401452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN: { 3449d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 3473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data))); 3487b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 34903ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 350e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 351e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 352e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 353e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 354808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 355e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 356e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 357e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 358e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3601452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 36193e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 362e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 3631452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_WIDE: { 3679d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data))); 3707b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 37103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 372e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 373e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 374e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 375e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 376808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 377e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 378e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 379e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 380e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3821452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 38393e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 384e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 3851452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_OBJECT: { 3899d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3917b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 39203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 393bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier const size_t ref_idx = inst->VRegA_11x(inst_data); 394ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj_result = shadow_frame.GetVRegReference(ref_idx); 3952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (do_assignability_check && obj_result != nullptr) { 396cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light ObjPtr<mirror::Class> return_type = shadow_frame.GetMethod()->ResolveReturnType(); 397bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier // Re-load since it might have moved. 398bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier obj_result = shadow_frame.GetVRegReference(ref_idx); 3992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (return_type == nullptr) { 400a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // Return the pending exception. 401a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 402a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 403a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (!obj_result->VerifierInstanceOf(return_type)) { 404a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 4051ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp1, temp2; 406fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 407a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Returning '%s' that is not instance of return type '%s'", 4081ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers obj_result->GetClass()->GetDescriptor(&temp1), 4091ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers return_type->GetDescriptor(&temp2)); 410a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 411a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 412a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 413bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier result.SetL(obj_result); 414e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 415e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 416e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 417e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 418808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu Chartier shadow_frame.GetThisObject(accessor.InsSize()), 419e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 420e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 421e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 422e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 4238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 424e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light // Re-load since it might have moved during the MethodExitEvent. 425e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result.SetL(shadow_frame.GetVRegReference(ref_idx)); 4261452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 42793e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 428e2abbc604ce003c776c00ecf1293796bb4c4ac5aAndreas Gampe shadow_frame.SetDexPC(dex::kDexNoIndex); 4291452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 4308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 4318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 4338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t dst = inst->VRegA_11n(inst_data); 4353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int4_t val = inst->VRegB_11n(inst_data); 4368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 4418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 4448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21s(inst_data); 4468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 4478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 4558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_31i(inst_data); 4578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 4588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 4668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21h(inst_data); 4688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 4698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 4778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); 4798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 4828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); 4848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 4878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); 4898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 4908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 4923c5aec1da27d8068e6bb97202d12efad6b4331dfSebastien Hertz PREAMBLE(); 4933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), 4948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 4958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 4988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4998a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 5008a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 5018a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_21c())); 5022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 5038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 505ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s.Ptr()); 5068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 5118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5128a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 5138a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 5148a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_31c())); 5152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 5168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 518ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s.Ptr()); 5198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 5208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 5248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 525a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 526ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 527ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 528ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 529ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 5302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 5318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 533ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c.Ptr()); 5348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5382e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson case Instruction::CONST_METHOD_HANDLE: { 5392e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson PREAMBLE(); 540e7732be2390f00b1f98b8c0066a37892ee1126f6Orion Hodson ClassLinker* cl = Runtime::Current()->GetClassLinker(); 541cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light ObjPtr<mirror::MethodHandle> mh = cl->ResolveMethodHandle(self, 542cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light inst->VRegB_21c(), 543cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light shadow_frame.GetMethod()); 5442e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson if (UNLIKELY(mh == nullptr)) { 5452e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson HANDLE_PENDING_EXCEPTION(); 5462e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } else { 5472e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), mh.Ptr()); 5482e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson inst = inst->Next_2xx(); 5492e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } 5502e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson break; 5512e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } 5522e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson case Instruction::CONST_METHOD_TYPE: { 5532e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson PREAMBLE(); 554e7732be2390f00b1f98b8c0066a37892ee1126f6Orion Hodson ClassLinker* cl = Runtime::Current()->GetClassLinker(); 555cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light ObjPtr<mirror::MethodType> mt = cl->ResolveMethodType(self, 556cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light inst->VRegB_21c(), 557cc917d9f0495402f5301aa9df0071ad38ab78142Alex Light shadow_frame.GetMethod()); 5582e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson if (UNLIKELY(mt == nullptr)) { 5592e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson HANDLE_PENDING_EXCEPTION(); 5602e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } else { 5612e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), mt.Ptr()); 5622e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson inst = inst->Next_2xx(); 5632e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } 5642e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson break; 5652e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson } 5668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 5678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 568848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 569ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5710aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 57403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorEnter<do_assignability_check>(self, &shadow_frame, obj); 5758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 5768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 5808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 581848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 582ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5840aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 58703ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorExit<do_assignability_check>(self, &shadow_frame, obj); 5888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 5898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 5938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 594a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 595ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 596ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 597ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 598ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 5992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 602ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 6032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) { 6048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 6058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 6138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 614a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegC_22c()), 615ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 616ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 617ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 618ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 6192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 6208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 622ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 6232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_22c(inst_data), 6242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0); 6258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 6308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 631ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 6322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(array == nullptr)) { 6330aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 6348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 6378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 6388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 6428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 643ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = nullptr; 644a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 645ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 646ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 647ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 648ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 649848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (LIKELY(c != nullptr)) { 650848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (UNLIKELY(c->IsStringClass())) { 651848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); 6523aaa37bba53d6df0265793de48b4b0b57327e57ajessicahandojo obj = mirror::String::AllocEmptyString<true>(self, allocator_type); 653848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } else { 6540d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray obj = AllocObjectFromCode<true>( 6550d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray c.Ptr(), 656a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 657a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe Runtime::Current()->GetHeap()->GetCurrentAllocator()); 658848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 659848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 6602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 6618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6634e99b3d8955131f3fc71aa113f0fa71f0092cb6fSebastien Hertz obj->GetClass()->AssertInitializedOrInitializingInThread(self); 664b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 665b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 666b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 66745b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz AbortTransactionF(self, "Allocating finalizable object in transaction: %s", 668709b070044354d9f47641f273edacaeeb0240ab7David Sehr obj->PrettyTypeOf().c_str()); 669b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 670b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 671b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 672ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj.Ptr()); 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 6788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 680ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check, true>( 681a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe dex::TypeIndex(inst->VRegC_22c()), 682a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe length, 683a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe shadow_frame.GetMethod(), 684a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 685cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 6862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 6878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 689ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj.Ptr()); 6908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 6958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 696d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 697d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 698d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 6998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 704d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 705d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 706d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 7078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 7088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 7118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 7138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 7148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 715ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 716832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers bool success = FillArrayData(obj, payload); 717832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers if (!success) { 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 721d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 722832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count); 723d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 7248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 7258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 7288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 729848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 730ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> exception = 731ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 7322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(exception == nullptr)) { 7330aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("throw with null exception"); 734a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 735a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 7361ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp; 737fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 738a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 7391ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers exception->GetClass()->GetDescriptor(&temp)); 7408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 74114691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray self->SetException(exception->AsThrowable()); 7428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 7478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 748848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 7493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 75081f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7511eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 752f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 7568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 757848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 7581eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 75981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7601eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 761f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 7658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 766848574ca50bb7e2d109608359d1086b3ca6bb4b3Alex Light HANDLE_ASYNC_EXCEPTION(); 7671eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 76881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7691eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 770f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 7748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 77681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 778f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 7828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 78481f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 786f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 789647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 790647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic push 791647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic ignored "-Wfloat-equal" 792647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 7938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 8108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 8128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 8138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 8158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 8288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 8298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 8318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 8428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 8438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 8458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 8468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 8488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 858647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 859647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic pop 860647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 8618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 8628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 8658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 8678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 8788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == 8802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8811eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 88281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8831eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 884f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 886f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 8928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != 8942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8951eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 89681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8971eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 898f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 900f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 9068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < 9082cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9091eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 91081f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9111eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 912f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 914f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 9208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= 9222cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9231eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 92481f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9251eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 926f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 928f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 9348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > 9362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9371eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 93881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9391eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 940f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 942f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 9488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= 9502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9511eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 95281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9531eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 954f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 956f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 9628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 9641eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 96581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9661eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 967f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 969f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 9758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 9771eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 97881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9791eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 980f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 982f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 9888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 9901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 99181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9921eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 993f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 995f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { 10031eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 100481f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 10051eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 1006f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 10078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 1008f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 10098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 10148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 10161eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 101781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 10181eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 1019f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 10208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 1021f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 10228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 10278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 10291eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 103081f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 10311eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 1032f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 10338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 1034f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 10408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1041ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10430aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1048ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1049b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1050abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 10588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1059ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10610aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1066ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1067b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1068abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1077ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10790aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1084ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1085b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1086abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1095ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10970aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1102ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1103b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1104abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1113ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11150aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1120709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1121ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1122b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1123abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1132ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11340aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1139709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1140ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1141b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1142abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1151ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11530aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1158ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1159b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 11603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 11688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1169ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11710aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1177ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1178b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1179d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 11878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1188ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11900aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1196ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1197b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1198d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 12068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1207ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12082cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12090aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 12148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1215ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1216b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1217d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 12258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1226ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12280aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 12338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1234ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1235b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1236d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 12448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1245ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12470aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1253709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1254ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1255b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1256d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 12648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1265ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12670aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 12728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1273709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1274ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1275b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1276d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 12848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1285ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12870aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1292ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 1293ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1294b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1295d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 13038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>( 13052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 13108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>( 13122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 13178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13182cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>( 13192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 13248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>( 13262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 13318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>( 13332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 13388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>( 13402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 13458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>( 13472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 13528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 13548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 13588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 13608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 13648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 13668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1369ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BOOLEAN_QUICK: { 1370ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1371ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data); 1372ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1373ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1374ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1375ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BYTE_QUICK: { 1376ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1377ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data); 1378ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1379ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1380ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1381ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_CHAR_QUICK: { 1382ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1383ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data); 1384ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1385ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1386ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1387ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_SHORT_QUICK: { 1388ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1389ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data); 1390ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1391ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1392ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 13938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 13948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1395bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check, 1396bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BYTE: { 14018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1402bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check, 1403bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_CHAR: { 14088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1409bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check, 1410bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 14158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1416bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check, 1417bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 14228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1423bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check, 1424bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 14298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1430bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check, 1431bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 14368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1437bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check, 1438bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 14398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 14438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 14452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 14508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, 14522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 14578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, 14592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 14648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, 14662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 14718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, 14732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 14788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, 14802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 14858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, 14872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 14928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>( 14942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 149837f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BOOLEAN_QUICK: { 149937f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 15002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>( 15012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 150237f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 150337f05ef45e0393de812d51261dc293240c17294dFred Shih break; 150437f05ef45e0393de812d51261dc293240c17294dFred Shih } 150537f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BYTE_QUICK: { 150637f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 15072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>( 15082cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 150937f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 151037f05ef45e0393de812d51261dc293240c17294dFred Shih break; 151137f05ef45e0393de812d51261dc293240c17294dFred Shih } 151237f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_CHAR_QUICK: { 151337f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 15142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>( 15152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 151637f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 151737f05ef45e0393de812d51261dc293240c17294dFred Shih break; 151837f05ef45e0393de812d51261dc293240c17294dFred Shih } 151937f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_SHORT_QUICK: { 152037f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 15212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>( 15222cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 152337f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 152437f05ef45e0393de812d51261dc293240c17294dFred Shih break; 152537f05ef45e0393de812d51261dc293240c17294dFred Shih } 15268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 15278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>( 15292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 15308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 15348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>( 15362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 15378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 15418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 15432cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BYTE: { 15488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, 15502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_CHAR: { 15558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, 15572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 15628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, 15642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 15698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, 15712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 15768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, 15782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 15838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, 15852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 15908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, false, do_access_check>( 15922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 15978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, true, do_access_check>( 15992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 16048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, false, do_access_check>( 16062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 16118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, true, do_access_check>( 16132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 16188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, false, do_access_check>( 16202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 16258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, true, do_access_check>( 16272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 16328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, false, do_access_check>( 16342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 16398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, true, do_access_check>( 16412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 16468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, false, do_access_check>( 16482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 16538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, true, do_access_check>( 16552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 16608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<false>( 16622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 16678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<true>( 16692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16739823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC: { 16749823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1675269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1676c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<false /* is_range */>( 16779823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 16789823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 16799823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 16809823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 16819823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC_RANGE: { 16829823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1683269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1684c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<true /* is_range */>( 16859823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 16869823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 16879823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 16889823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 1689c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM: { 1690c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1691c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1692c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<false /* is_range */>( 1693c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1694c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1695c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1696c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 1697c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM_RANGE: { 1698c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1699c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1700c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<true /* is_range */>( 1701c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1702c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1703c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1704c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 17058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 17068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 17082cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 17128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 17142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 17202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 17262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 17308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegFloat( 17322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 17368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegDouble( 17382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 17398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 17428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1743450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1744450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1749450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1750450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1755450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(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::LONG_TO_INT: 17608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1761450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1762450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 17668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1767450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1768450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 17728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1773450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(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::FLOAT_TO_INT: { 17788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1780450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 17813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 17868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1788450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 17893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1795450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1796450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 18008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1802450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 18033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 18048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 18088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1810450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 18113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 18128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 18168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1817450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1818450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 18198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 18228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>( 18242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 18288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>( 18302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 18318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 18348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>( 18362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 18378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1839f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::ADD_INT: { 18408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1842f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()), 1843f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1846f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers } 18478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 18488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1850f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()), 1851f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 18528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 18558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1857f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()), 1858f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 18628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 18648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 18658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 18678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 18708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 18758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 18788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 18858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 18928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 18958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 19018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 19038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 19108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 19138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 19168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1922f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1923f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 19248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1929f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1930f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 19318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 19348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1936f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1937f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 19418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 19438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 1944f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x())); 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 19468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 19508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 19538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 19558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 19588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 19798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 19978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 20008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 20158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 20188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 20218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 20228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 20258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 20278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 20328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 20358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 20398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 20428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 20498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 20538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 20568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 20638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 20678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 2069f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA), 2070f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 20758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 2078f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(vregA), 2079f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 20848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 2087f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(vregA), 2088f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 20938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 20963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 20988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 21018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 21043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 21068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 21098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 21133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 21148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 21223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 21313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 21403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 21458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 21493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 21548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 21583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2166f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(vregA), 2167f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 21728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2175f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(vregA), 2176f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 21818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2184f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(vregA), 2185f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 21908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 21933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 21958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 21988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21993b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 22013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 22038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 22068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 22103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 22158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 22193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 22248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 22283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 22298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 22338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 22373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 22388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 22428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 22463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 22478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 22518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 22553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 22568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 22608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 22643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 22698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 22733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 22788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 22823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 22878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 22913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 22968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 23003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 23018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 23058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 23093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 23108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 23148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 23183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 23198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 23238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 23273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 23288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 23328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 23363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 23378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 23418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 23438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 23448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 23453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 23468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 23508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2352f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2353f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 23548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2356f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::RSUB_INT_LIT16: 23578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2359f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22s(), 2360f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_22s(inst_data)))); 23618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 23648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2366f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2367f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 23688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 23718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 23732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 23742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 23758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 23798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 23812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 23822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 23838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 23878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 23893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 23908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 23918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 23948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 23963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 23978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 23988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 24018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 24033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ 24048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 24058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 24088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2410f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 24118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 24148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2416f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b()))); 24178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 24208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2422f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 24238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 24268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 24288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 24298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 24308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 24338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 24358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 24368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 24378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 24408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 24438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 24448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 24478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 24508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 24518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 24548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 24578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 24588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 24618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 24648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 24688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 24718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 24758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 24788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 24822e59994c3c586d8b753e4b14a94c81bce3dba1a9Orion Hodson case Instruction::UNUSED_79 ... Instruction::UNUSED_7A: 24838ec3bd2b31ccbc9027b8e9b1949dd1804bb6d30fNarayan Kamath case Instruction::UNUSED_F3 ... Instruction::UNUSED_F9: 2484e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers UnexpectedOpcode(inst, shadow_frame); 24858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24861452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } while (!interpret_one_instruction); 24871452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee // Record where we stopped. 24881452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(inst->GetDexPc(insns)); 2489d6b48dbe715fbf1431394d2b6ef75cb19a4012ddbuzbee return result_register; 24908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 24918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 24928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 24935e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2494808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu ChartierJValue ExecuteSwitchImpl<true, false>(Thread* self, const CodeItemDataAccessor& accessor, 24951452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24961452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24975e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2498808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu ChartierJValue ExecuteSwitchImpl<false, false>(Thread* self, const CodeItemDataAccessor& accessor, 24991452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 25001452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 25015e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2502808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu ChartierJValue ExecuteSwitchImpl<true, true>(Thread* self, const CodeItemDataAccessor& accessor, 25031452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 25041452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 25055e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2506808c7a57bb913b13c22884f57cdacd59bf1fdb3fMathieu ChartierJValue ExecuteSwitchImpl<false, true>(Thread* self, const CodeItemDataAccessor& accessor, 25071452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 25081452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 25098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 25108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 25118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2512