interpreter_switch_impl.cc revision 9fb1ab1f6bb58bdaccef78bc81b3202d0121e2ed
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" 20eb7c144a6aff7da673ba53d501c46f00311d4d7fAlex Light#include "experimental_flags.h" 218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#include "interpreter_common.h" 22b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#include "jit/jit.h" 2328bd2e4f151267b34b8e1eb19c489d8d547bbf5cMathieu Chartier#include "jvalue-inl.h" 24f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers#include "safe_math.h" 258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace art { 278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace interpreter { 288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 29b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light#define HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instr) \ 308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 3182aeddb83c58db5fe1e227de574eb8ced4fc6130Sebastien Hertz DCHECK(self->IsExceptionPending()); \ 327b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); \ 339fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light if (!MoveToExceptionHandler(self, shadow_frame, instr)) { \ 3403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe /* Structured locking is to be enforced for abnormal termination, too. */ \ 3556fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame); \ 361452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { \ 3793e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ \ 381452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); \ 391452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } \ 408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); /* Handled in caller. */ \ 418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 429fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light int32_t displacement = \ 439fb1ab1f6bb58bdaccef78bc81b3202d0121e2edAlex Light static_cast<int32_t>(shadow_frame.GetDexPC()) - static_cast<int32_t>(dex_pc); \ 448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(displacement); \ 458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 48b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light#define HANDLE_PENDING_EXCEPTION() HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instrumentation) 49b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light 508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \ 518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(_is_exception_pending)) { \ 538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->_next_function(); \ 568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 5903ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe#define HANDLE_MONITOR_CHECKS() \ 6056fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) { \ 6103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_PENDING_EXCEPTION(); \ 6203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe } 6303ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe 648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 65fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light#define PREAMBLE_SAVE(save_ref) \ 66fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light { \ 67fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(instrumentation->HasDexPcListeners()) && \ 68fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light UNLIKELY(!DoDexPcMoveEvent(self, \ 69fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light code_item, \ 70fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame, \ 71fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light dex_pc, \ 72fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light instrumentation, \ 73fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light save_ref))) { \ 74fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light HANDLE_PENDING_EXCEPTION(); \ 75fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light break; \ 768379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } \ 77fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } \ 78fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light do {} while (false) 79fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light 80fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light#define PREAMBLE() PREAMBLE_SAVE(nullptr) 818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 82b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#define BRANCH_INSTRUMENTATION(offset) \ 83b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray do { \ 84274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (UNLIKELY(instrumentation->HasBranchListeners())) { \ 85274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray instrumentation->Branch(self, method, dex_pc, offset); \ 86274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray } \ 87b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray JValue result; \ 88b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray if (jit::Jit::MaybeDoOnStackReplacement(self, method, dex_pc, offset, &result)) { \ 8993e94f228f7a9ec5c2a29553010e585d583ac530buzbee if (interpret_one_instruction) { \ 9093e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* OSR has completed execution of the method. Signal mterp to return to caller */ \ 9193e94f228f7a9ec5c2a29553010e585d583ac530buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); \ 9293e94f228f7a9ec5c2a29553010e585d583ac530buzbee } \ 93b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray return result; \ 94b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray } \ 953108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray } while (false) 963108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray 971d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee#define HOTNESS_UPDATE() \ 981d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee do { \ 99274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (jit != nullptr) { \ 10071cd50fb67fa48667b0ab59aa436a582c04ba43dNicolas Geoffray jit->AddSamples(self, method, 1, /*with_backedges*/ true); \ 1011d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } \ 1021d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } while (false) 1031d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee 104f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe#define HANDLE_BACKWARD_BRANCH(offset) \ 105f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe do { \ 106f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe if (IsBackwardBranch(offset)) { \ 107f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HOTNESS_UPDATE(); \ 108f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe /* Record new dex pc early to have consistent suspend point at loop header. */ \ 109f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe shadow_frame.SetDexPC(inst->GetDexPc(insns)); \ 110f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe self->AllowThreadSuspension(); \ 111f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } \ 112f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } while (false) 113f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe 114fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// Unlike most other events the DexPcMovedEvent can be sent when there is a pending exception (if 115fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// the next instruction is MOVE_EXCEPTION). This means it needs to be handled carefully to be able 116fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// to detect exceptions thrown by the DexPcMovedEvent itself. These exceptions could be thrown by 117fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// jvmti-agents while handling breakpoint or single step events. We had to move this into its own 118fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// function because it was making ExecuteSwitchImpl have too large a stack. 1192989a4a7f663d917c466cf8182356eca67bb8ae7Alex LightNO_INLINE static bool DoDexPcMoveEvent(Thread* self, 1202989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const DexFile::CodeItem* code_item, 1212989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const ShadowFrame& shadow_frame, 1222989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light uint32_t dex_pc, 1232989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const instrumentation::Instrumentation* instrumentation, 1242989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light JValue* save_ref) 125fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light REQUIRES_SHARED(Locks::mutator_lock_) { 126fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light DCHECK(instrumentation->HasDexPcListeners()); 127fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light StackHandleScope<2> hs(self); 128fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light Handle<mirror::Throwable> thr(hs.NewHandle(self->GetException())); 129fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light mirror::Object* null_obj = nullptr; 130fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light HandleWrapper<mirror::Object> h( 131fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light hs.NewHandleWrapper(LIKELY(save_ref == nullptr) ? &null_obj : save_ref->GetGCRoot())); 132fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light self->ClearException(); 133fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light instrumentation->DexPcMovedEvent(self, 134fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame.GetThisObject(code_item->ins_size_), 135fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame.GetMethod(), 136fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light dex_pc); 137fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(self->IsExceptionPending())) { 138fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // We got a new exception in the dex-pc-moved event. We just let this exception replace the old 139fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // one. 140fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // TODO It would be good to add the old exception to the suppressed exceptions of the new one if 141fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // possible. 142fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light return false; 143fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } else { 144fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(!thr.IsNull())) { 145fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light self->SetException(thr.Get()); 146fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } 147fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light return true; 148fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } 149fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light} 150fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light 151e814f9d09c0fb1b678e610780d11ce3577db3599Alex Lightstatic bool NeedsMethodExitEvent(const instrumentation::Instrumentation* ins) 152e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light REQUIRES_SHARED(Locks::mutator_lock_) { 153e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return ins->HasMethodExitListeners() || ins->HasWatchedFramePopListeners(); 154e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light} 155e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light 156e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light// Sends the normal method exit event. Returns true if the events succeeded and false if there is a 157e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light// pending exception. 158e814f9d09c0fb1b678e610780d11ce3577db3599Alex LightNO_INLINE static bool SendMethodExitEvents(Thread* self, 159e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const instrumentation::Instrumentation* instrumentation, 160e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const ShadowFrame& frame, 161e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light ObjPtr<mirror::Object> thiz, 162e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light ArtMethod* method, 163e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light uint32_t dex_pc, 164e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light const JValue& result) 165e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light REQUIRES_SHARED(Locks::mutator_lock_) { 166e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light bool had_event = false; 167e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 168e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light had_event = true; 169e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation->MethodExitEvent(self, thiz.Ptr(), method, dex_pc, result); 170e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 171e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(frame.NeedsNotifyPop() && instrumentation->HasWatchedFramePopListeners())) { 172e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light had_event = true; 173e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation->WatchedFramePopped(self, frame); 174e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 175e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(had_event)) { 176e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return !self->IsExceptionPending(); 177e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } else { 178e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light return true; 179e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light } 180e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light} 181e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light 182d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool do_access_check, bool transaction_active> 183e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, 1841452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 1851452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction) { 186c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin constexpr bool do_assignability_check = do_access_check; 1878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 1888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 1898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); 1908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 1928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 1938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 1942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier const auto* const instrumentation = Runtime::Current()->GetInstrumentation(); 1958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* const insns = code_item->insns_; 1968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 1973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t inst_data; 1981d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee ArtMethod* method = shadow_frame.GetMethod(); 1991d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee jit::Jit* jit = Runtime::Current()->GetJit(); 2006918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 2011452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee do { 2028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz dex_pc = inst->GetDexPc(insns); 2038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetDexPC(dex_pc); 204e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers TraceExecution(shadow_frame, inst, dex_pc); 2053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz inst_data = inst->Fetch16(0); 2063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz switch (inst->Opcode(inst_data)) { 2078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOP: 2088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE: 2128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 2143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 2158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_FROM16: 2188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(inst_data), 2208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 2218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_16: 2248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 2268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 2278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE: 2308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 2323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 2338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_FROM16: 2368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data), 2388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 2398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_16: 2428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 2448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 2458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT: 2488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data), 2503b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data))); 2518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_FROM16: 2548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data), 2568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 2578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_16: 2608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 2628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 2638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT: 2668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI()); 2688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_WIDE: 2718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ()); 2738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_OBJECT: 276fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light PREAMBLE_SAVE(&result_register); 2773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL()); 2788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_EXCEPTION: { 2818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 282ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Throwable> exception = self->GetException(); 283270a0e16c3b8e5b95cbfdbd8996ac137c7c6322bSebastien Hertz DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction"; 284ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception.Ptr()); 2855c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz self->ClearException(); 2868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 289d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID_NO_BARRIER: { 2909d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 2918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2927b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 29303ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 294e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 295e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 296e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 297e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 298e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetThisObject(code_item->ins_size_), 299e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 300e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 301e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 302e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3041452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 30593e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3061452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3071452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 310d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID: { 3119d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3123035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceForConstructor(); 3138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3147b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 31503ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 316e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 317e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 318e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 319e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 320e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetThisObject(code_item->ins_size_), 321e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 322e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 323e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 324e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3261452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 32793e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3281452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3291452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN: { 3339d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 3363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data))); 3377b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 33803ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 339e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 340e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 341e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 342e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 343e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetThisObject(code_item->ins_size_), 344e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 345e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 346e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 347e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3491452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 35093e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3511452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3521452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_WIDE: { 3569d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data))); 3597b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 36003ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 361e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 362e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 363e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 364e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 365e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetThisObject(code_item->ins_size_), 366e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 367e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 368e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 369e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 3708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3711452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 37293e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3731452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3741452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_OBJECT: { 3789d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3807b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 38103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 382bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier const size_t ref_idx = inst->VRegA_11x(inst_data); 383ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj_result = shadow_frame.GetVRegReference(ref_idx); 3842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (do_assignability_check && obj_result != nullptr) { 385b45528c1f1b83ca8c970f439b54fbfcfda6908eaVladimir Marko ObjPtr<mirror::Class> return_type = method->ResolveReturnType(); 386bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier // Re-load since it might have moved. 387bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier obj_result = shadow_frame.GetVRegReference(ref_idx); 3882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (return_type == nullptr) { 389a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // Return the pending exception. 390a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 391a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 392a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (!obj_result->VerifierInstanceOf(return_type)) { 393a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 3941ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp1, temp2; 395fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 396a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Returning '%s' that is not instance of return type '%s'", 3971ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers obj_result->GetClass()->GetDescriptor(&temp1), 3981ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers return_type->GetDescriptor(&temp2)); 399a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 400a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 401a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 402bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier result.SetL(obj_result); 403e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light if (UNLIKELY(NeedsMethodExitEvent(instrumentation) && 404e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light !SendMethodExitEvents(self, 405e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light instrumentation, 406e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame, 407e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetThisObject(code_item->ins_size_), 408e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light shadow_frame.GetMethod(), 409e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light inst->GetDexPc(insns), 410e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result))) { 411e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 4128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 413e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light // Re-load since it might have moved during the MethodExitEvent. 414e814f9d09c0fb1b678e610780d11ce3577db3599Alex Light result.SetL(shadow_frame.GetVRegReference(ref_idx)); 4151452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 41693e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 4171452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 4181452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 4198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 4208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 4228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t dst = inst->VRegA_11n(inst_data); 4243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int4_t val = inst->VRegB_11n(inst_data); 4258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 4308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 4338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21s(inst_data); 4358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 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_2xx(); 4418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 4448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_31i(inst_data); 4468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 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_3xx(); 4528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 4558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21h(inst_data); 4578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 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_2xx(); 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 4668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); 4688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 4718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); 4738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 4768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); 4788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 4798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 4813c5aec1da27d8068e6bb97202d12efad6b4331dfSebastien Hertz PREAMBLE(); 4823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), 4838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 4848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 4878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4888a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 4898a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 4908a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_21c())); 4912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 4928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 494ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s.Ptr()); 4958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 5008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5018a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 5028a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 5038a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_31c())); 5042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 5058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 507ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s.Ptr()); 5088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 5098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 5138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 514a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 515ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 516ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 517ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 518ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 5192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 5208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 522ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c.Ptr()); 5238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 5288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 529ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5310aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 53403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorEnter<do_assignability_check>(self, &shadow_frame, obj); 5358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 5368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 5408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 541ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5430aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 54603ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorExit<do_assignability_check>(self, &shadow_frame, obj); 5478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 5488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 5528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 553a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 554ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 555ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 556ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 557ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 5582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 5598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 561ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 5622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) { 5638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 5648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 5728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 573a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegC_22c()), 574ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 575ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 576ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 577ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 5782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 5798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 581ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 5822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_22c(inst_data), 5832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0); 5848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 5898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 590ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 5912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(array == nullptr)) { 5920aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 5968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 5978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 602ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = nullptr; 603a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 604ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 605ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 606ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 607ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 608848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (LIKELY(c != nullptr)) { 609848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (UNLIKELY(c->IsStringClass())) { 610848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); 6113aaa37bba53d6df0265793de48b4b0b57327e57ajessicahandojo obj = mirror::String::AllocEmptyString<true>(self, allocator_type); 612848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } else { 6130d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray obj = AllocObjectFromCode<true>( 6140d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray c.Ptr(), 615a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 616a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe Runtime::Current()->GetHeap()->GetCurrentAllocator()); 617848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 618848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 6192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 6208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6224e99b3d8955131f3fc71aa113f0fa71f0092cb6fSebastien Hertz obj->GetClass()->AssertInitializedOrInitializingInThread(self); 623b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 624b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 625b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 62645b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz AbortTransactionF(self, "Allocating finalizable object in transaction: %s", 627709b070044354d9f47641f273edacaeeb0240ab7David Sehr obj->PrettyTypeOf().c_str()); 628b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 629b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 630b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 631ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj.Ptr()); 6328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 6378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 639ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check, true>( 640a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe dex::TypeIndex(inst->VRegC_22c()), 641a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe length, 642a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe shadow_frame.GetMethod(), 643a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 644cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 6452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 6468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 648ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj.Ptr()); 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 6548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 655d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 656d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 657d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 6588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 6598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 6628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 663d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 664d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 665d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 6668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 6678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 6708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 6728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 674ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 675832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers bool success = FillArrayData(obj, payload); 676832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers if (!success) { 6778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 680d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 681832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count); 682d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 6838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 6848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 6878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 688ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> exception = 689ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 6902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(exception == nullptr)) { 6910aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("throw with null exception"); 692a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 693a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 6941ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp; 695fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 696a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 6971ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers exception->GetClass()->GetDescriptor(&temp)); 6988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 69914691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray self->SetException(exception->AsThrowable()); 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 7058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 70781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7081eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 709f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 7138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7141eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 71581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7161eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 717f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7221eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 72381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7241eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 725f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 7298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 73181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 733f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 7378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 73981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 741f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 744647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 745647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic push 746647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic ignored "-Wfloat-equal" 747647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 7488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 7498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 7518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 7528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 7658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 7678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 7688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 7708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 7818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 7838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 7848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 7988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 8008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 8018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 8038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 813647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 814647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic pop 815647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 8168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 8178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 8198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 8208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 8218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 8228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 8278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 8298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 8338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == 8352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8361eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 83781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8381eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 839f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 841f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 8478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != 8492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8501eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 85181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8521eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 853f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 855f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 8618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < 8632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8641eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 86581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8661eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 867f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 869f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 8758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= 8772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8781eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 87981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8801eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 881f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 883f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > 8912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8921eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 89381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8941eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 895f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 897f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 9038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= 9052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 9061eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 90781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9081eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 909f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 911f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 9178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 9191eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 92081f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9211eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 922f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 924f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 9308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 9321eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 93381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9341eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 935f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 937f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 9451eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 94681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9471eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 948f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 950f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 9568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { 9581eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 95981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9601eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 961f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 963f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 9698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 9711eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 97281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9731eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 974f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 976f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 9828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 9841eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 98581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9861eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 987f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 989f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 9958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 996ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9972cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9980aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1003ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1004b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1005abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1014ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10160aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1021ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1022b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1023abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 10318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1032ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10340aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1039ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1040b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1041abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 10498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1050ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10520aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1057ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1058b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1059abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 10678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1068ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10700aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1075709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1076ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1077b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1078abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 10868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1087ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10890aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1094709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1095ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1096b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1097abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 11058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1106ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11080aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1113ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1114b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 11153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 11168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 11238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1124ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11260aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1132ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1133b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1134d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 11428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1143ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11450aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1151ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1152b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1153d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 11618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1162ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11640aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1170ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1171b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1172d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1181ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11830aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1189ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1190b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1191d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 11998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1200ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12020aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 12078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1208709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1209ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1210b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1211d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1220ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12220aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 12278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1228709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1229ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1230b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1231d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 12398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1240ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12420aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1247ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 1248ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1249b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1250d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 12588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>( 12602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 12658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>( 12672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 12728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>( 12742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 12798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>( 12812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 12868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>( 12882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 12938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>( 12952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>( 13022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 13078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 13098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 13198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1324ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BOOLEAN_QUICK: { 1325ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1326ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data); 1327ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1328ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1329ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1330ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BYTE_QUICK: { 1331ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1332ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data); 1333ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1334ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1335ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1336ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_CHAR_QUICK: { 1337ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1338ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data); 1339ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1340ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1341ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1342ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_SHORT_QUICK: { 1343ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1344ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data); 1345ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1346ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1347ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1350bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check, 1351bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BYTE: { 13568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1357bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check, 1358bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_CHAR: { 13638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1364bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check, 1365bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 13708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1371bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check, 1372bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 13778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1378bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check, 1379bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 13848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1385bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check, 1386bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 13918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1392bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check, 1393bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 13988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 14002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 14058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, 14072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 14128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, 14142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, 14212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 14268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, 14282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 14338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, 14352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 14408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, 14422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>( 14492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 145337f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BOOLEAN_QUICK: { 145437f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>( 14562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 145737f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 145837f05ef45e0393de812d51261dc293240c17294dFred Shih break; 145937f05ef45e0393de812d51261dc293240c17294dFred Shih } 146037f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BYTE_QUICK: { 146137f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>( 14632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 146437f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 146537f05ef45e0393de812d51261dc293240c17294dFred Shih break; 146637f05ef45e0393de812d51261dc293240c17294dFred Shih } 146737f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_CHAR_QUICK: { 146837f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>( 14702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 147137f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 147237f05ef45e0393de812d51261dc293240c17294dFred Shih break; 147337f05ef45e0393de812d51261dc293240c17294dFred Shih } 147437f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_SHORT_QUICK: { 147537f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>( 14772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 147837f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 147937f05ef45e0393de812d51261dc293240c17294dFred Shih break; 148037f05ef45e0393de812d51261dc293240c17294dFred Shih } 14818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 14828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>( 14842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 14898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>( 14912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 14968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14972cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 14982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BYTE: { 15038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, 15052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_CHAR: { 15108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, 15122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 15178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15182cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, 15192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 15248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, 15262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 15318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, 15332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 15388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, 15402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 15458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, false, do_access_check>( 15472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 15528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15532cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, true, do_access_check>( 15542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, false, do_access_check>( 15612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, true, do_access_check>( 15682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, false, do_access_check>( 15752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, true, do_access_check>( 15822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 15878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, false, do_access_check>( 15892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 15948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, true, do_access_check>( 15962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 16018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, false, do_access_check>( 16032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16092cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, true, do_access_check>( 16102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16162cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<false>( 16172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<true>( 16242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 16258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 16268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16289823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC: { 16299823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1630269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1631c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<false /* is_range */>( 16329823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 16339823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 16349823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 16359823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 16369823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC_RANGE: { 16379823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1638269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1639c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<true /* is_range */>( 16409823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 16419823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 16429823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 16439823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 1644c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM: { 1645c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1646c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1647c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<false /* is_range */>( 1648c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1649c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1650c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1651c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 1652c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM_RANGE: { 1653c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1654c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1655c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<true /* is_range */>( 1656c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1657c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1658c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1659c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 16608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 16618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 16632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 16678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 16692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 16738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 16752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 16798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 16812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 16858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegFloat( 16872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 16888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 16918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegDouble( 16932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 16948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 16978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1698450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1699450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 17038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1704450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1705450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 17098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1710450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1711450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1716450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1717450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1722450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1723450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1728450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1729450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 17308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1735450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 17363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 17378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1743450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 17443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 17498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1750450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1751450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 17528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 17558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1757450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 17583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 17598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 17638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1765450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 17663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 17678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1772450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1773450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 17748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 17778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>( 17792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 17808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>( 17852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 17868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 17898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>( 17912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 17928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1794f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::ADD_INT: { 17958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1797f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()), 1798f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1801f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers } 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1805f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()), 1806f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 18078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 18108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1812f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()), 1813f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 18148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 18198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 18228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 18288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 18308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 18338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 18368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 18408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 18438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 18478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 18508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 18548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 18578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 18618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 18648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 18688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 18758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1877f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1878f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1884f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1885f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 18868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 18898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1891f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1892f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 18938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 18968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 18988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 1899f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x())); 19008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 19018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 19038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 19058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 19108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 19138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 19248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 19288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 19318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 19348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 19418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 19528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 19558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 19568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 19708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 19738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 19778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 19848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 19978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 20128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 20158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 20178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 20188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 20198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 20228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 2024f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA), 2025f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 20308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 2033f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(vregA), 2034f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 20398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 2042f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(vregA), 2043f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 20488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 20513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 20538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 20568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 20593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 20618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 20683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 20698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 20738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 20773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 20788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 20828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 20863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 20878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 20918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 20953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 21008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 21038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 21043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 21058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_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))); 21148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2121f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(vregA), 2122f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2130f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(vregA), 2131f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2139f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(vregA), 2140f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 21458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 21483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 21538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 21563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 21588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 21618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 21653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 21708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 21743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 21798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 21833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 21888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 21923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 21938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 21978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 22013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 22028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 22068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 22098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 22103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 22118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 22158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 22193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 22248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 22283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 22338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 22373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 22428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 22463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 22518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 22553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 22568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 22608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 22643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 22658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 22698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 22733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 22748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 22788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 22823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 22838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 22878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 22913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 22928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 22968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 23003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 23018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 23028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 23058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2307f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2308f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 23098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2311f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::RSUB_INT_LIT16: 23128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2314f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22s(), 2315f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_22s(inst_data)))); 23168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 23198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2321f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2322f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 23238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 23268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 23282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 23292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 23308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 23348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 23362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 23372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 23388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 23428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 23443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 23458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 23468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 23498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23503b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 23513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 23528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 23538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 23568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 23583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ 23598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 23608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 23638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2365f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 23668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 23698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2371f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b()))); 23728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 23758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2377f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 23788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 23818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 23838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 23848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 23888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 23908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 23918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 23958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 23988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 24028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 24058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 24068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 24098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 24128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 24138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 24168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 24198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 24238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 24268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 24308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 24313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 24328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 24338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 24378ec3bd2b31ccbc9027b8e9b1949dd1804bb6d30fNarayan Kamath case Instruction::UNUSED_F3 ... Instruction::UNUSED_F9: 2438c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::UNUSED_FE ... Instruction::UNUSED_FF: 24398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_79: 24408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_7A: 2441e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers UnexpectedOpcode(inst, shadow_frame); 24428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24431452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } while (!interpret_one_instruction); 24441452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee // Record where we stopped. 24451452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(inst->GetDexPc(insns)); 2446d6b48dbe715fbf1431394d2b6ef75cb19a4012ddbuzbee return result_register; 24478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 24488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 24498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 24505e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2451e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, false>(Thread* self, const DexFile::CodeItem* code_item, 24521452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24531452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24545e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2455e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, false>(Thread* self, const DexFile::CodeItem* code_item, 24561452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24571452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24585e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2459e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, true>(Thread* self, const DexFile::CodeItem* code_item, 24601452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24611452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24625e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2463e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, true>(Thread* self, const DexFile::CodeItem* code_item, 24641452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24651452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 24678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 24688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2469