interpreter_switch_impl.cc revision bd208d8e73084b691d9cfbe870120fe53863ce07
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(); \ 338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, \ 348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->GetDexPc(insns), \ 35b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light instr); \ 368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (found_dex_pc == DexFile::kDexNoIndex) { \ 3703ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe /* Structured locking is to be enforced for abnormal termination, too. */ \ 3856fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame); \ 391452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { \ 4093e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ \ 411452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); \ 421452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } \ 438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); /* Handled in caller. */ \ 448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t displacement = static_cast<int32_t>(found_dex_pc) - static_cast<int32_t>(dex_pc); \ 468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(displacement); \ 478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 50b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light#define HANDLE_PENDING_EXCEPTION() HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(instrumentation) 51b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light 528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \ 538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(_is_exception_pending)) { \ 558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->_next_function(); \ 588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 6103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe#define HANDLE_MONITOR_CHECKS() \ 6256fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) { \ 6303ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_PENDING_EXCEPTION(); \ 6403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe } 6503ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe 668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 67fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light#define PREAMBLE_SAVE(save_ref) \ 68fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light { \ 69fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(instrumentation->HasDexPcListeners()) && \ 70fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light UNLIKELY(!DoDexPcMoveEvent(self, \ 71fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light code_item, \ 72fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame, \ 73fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light dex_pc, \ 74fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light instrumentation, \ 75fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light save_ref))) { \ 76fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light HANDLE_PENDING_EXCEPTION(); \ 77fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light break; \ 788379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } \ 79fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } \ 80fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light do {} while (false) 81fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light 82fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light#define PREAMBLE() PREAMBLE_SAVE(nullptr) 838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 84b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#define BRANCH_INSTRUMENTATION(offset) \ 85b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray do { \ 86274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (UNLIKELY(instrumentation->HasBranchListeners())) { \ 87274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray instrumentation->Branch(self, method, dex_pc, offset); \ 88274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray } \ 89b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray JValue result; \ 90b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray if (jit::Jit::MaybeDoOnStackReplacement(self, method, dex_pc, offset, &result)) { \ 9193e94f228f7a9ec5c2a29553010e585d583ac530buzbee if (interpret_one_instruction) { \ 9293e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* OSR has completed execution of the method. Signal mterp to return to caller */ \ 9393e94f228f7a9ec5c2a29553010e585d583ac530buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); \ 9493e94f228f7a9ec5c2a29553010e585d583ac530buzbee } \ 95b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray return result; \ 96b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray } \ 973108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray } while (false) 983108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray 991d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee#define HOTNESS_UPDATE() \ 1001d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee do { \ 101274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (jit != nullptr) { \ 10271cd50fb67fa48667b0ab59aa436a582c04ba43dNicolas Geoffray jit->AddSamples(self, method, 1, /*with_backedges*/ true); \ 1031d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } \ 1041d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } while (false) 1051d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee 106f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe#define HANDLE_BACKWARD_BRANCH(offset) \ 107f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe do { \ 108f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe if (IsBackwardBranch(offset)) { \ 109f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HOTNESS_UPDATE(); \ 110f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe /* Record new dex pc early to have consistent suspend point at loop header. */ \ 111f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe shadow_frame.SetDexPC(inst->GetDexPc(insns)); \ 112f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe self->AllowThreadSuspension(); \ 113f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } \ 114f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } while (false) 115f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe 116fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// Unlike most other events the DexPcMovedEvent can be sent when there is a pending exception (if 117fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// the next instruction is MOVE_EXCEPTION). This means it needs to be handled carefully to be able 118fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// to detect exceptions thrown by the DexPcMovedEvent itself. These exceptions could be thrown by 119fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// jvmti-agents while handling breakpoint or single step events. We had to move this into its own 120fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light// function because it was making ExecuteSwitchImpl have too large a stack. 1212989a4a7f663d917c466cf8182356eca67bb8ae7Alex LightNO_INLINE static bool DoDexPcMoveEvent(Thread* self, 1222989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const DexFile::CodeItem* code_item, 1232989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const ShadowFrame& shadow_frame, 1242989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light uint32_t dex_pc, 1252989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light const instrumentation::Instrumentation* instrumentation, 1262989a4a7f663d917c466cf8182356eca67bb8ae7Alex Light JValue* save_ref) 127fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light REQUIRES_SHARED(Locks::mutator_lock_) { 128fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light DCHECK(instrumentation->HasDexPcListeners()); 129fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light StackHandleScope<2> hs(self); 130fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light Handle<mirror::Throwable> thr(hs.NewHandle(self->GetException())); 131fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light mirror::Object* null_obj = nullptr; 132fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light HandleWrapper<mirror::Object> h( 133fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light hs.NewHandleWrapper(LIKELY(save_ref == nullptr) ? &null_obj : save_ref->GetGCRoot())); 134fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light self->ClearException(); 135fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light instrumentation->DexPcMovedEvent(self, 136fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame.GetThisObject(code_item->ins_size_), 137fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light shadow_frame.GetMethod(), 138fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light dex_pc); 139fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(self->IsExceptionPending())) { 140fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // We got a new exception in the dex-pc-moved event. We just let this exception replace the old 141fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // one. 142fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // TODO It would be good to add the old exception to the suppressed exceptions of the new one if 143fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light // possible. 144fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light return false; 145fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } else { 146fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light if (UNLIKELY(!thr.IsNull())) { 147fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light self->SetException(thr.Get()); 148fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } 149fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light return true; 150fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light } 151fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light} 152fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light 153d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool do_access_check, bool transaction_active> 154e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, 1551452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 1561452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction) { 157c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin constexpr bool do_assignability_check = do_access_check; 1588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 1598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 1608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); 1618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 1638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 1648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 1652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier const auto* const instrumentation = Runtime::Current()->GetInstrumentation(); 1668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* const insns = code_item->insns_; 1678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 1683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t inst_data; 1691d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee ArtMethod* method = shadow_frame.GetMethod(); 1701d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee jit::Jit* jit = Runtime::Current()->GetJit(); 1716918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 1721452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee do { 1738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz dex_pc = inst->GetDexPc(insns); 1748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetDexPC(dex_pc); 175e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers TraceExecution(shadow_frame, inst, dex_pc); 1763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz inst_data = inst->Fetch16(0); 1773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz switch (inst->Opcode(inst_data)) { 1788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOP: 1798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE: 1838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 1868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_FROM16: 1898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(inst_data), 1918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 1928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_16: 1958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 1988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE: 2018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 2033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 2048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_FROM16: 2078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data), 2098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 2108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_16: 2138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 2158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 2168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT: 2198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data), 2213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data))); 2228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_FROM16: 2258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data), 2278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 2288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_16: 2318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 2338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 2348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT: 2378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI()); 2398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_WIDE: 2428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ()); 2448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_OBJECT: 247fc90567ec0bcd14f6096ab05bb2b9b6028fa796dAlex Light PREAMBLE_SAVE(&result_register); 2483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL()); 2498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_EXCEPTION: { 2528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 253ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Throwable> exception = self->GetException(); 254270a0e16c3b8e5b95cbfdbd8996ac137c7c6322bSebastien Hertz DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction"; 255ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception.Ptr()); 2565c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz self->ClearException(); 2578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 260d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID_NO_BARRIER: { 2619d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 2628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2637b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 26403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 2658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 266947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 269b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light if (UNLIKELY(self->IsExceptionPending())) { 270b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light // Don't send another method exit event. 271b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 272b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light } 2738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2741452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 27593e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 2761452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 2771452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 2788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 280d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID: { 2819d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 2823035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceForConstructor(); 2838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2847b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 28503ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 2868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 287947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 290b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light if (UNLIKELY(self->IsExceptionPending())) { 291b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light // Don't send another method exit event. 292b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 293b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light } 2948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2951452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 29693e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 2971452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 2981452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 2998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN: { 3029d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 3053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data))); 3067b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 30703ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 3088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 309947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 3108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 3118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 312b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light if (UNLIKELY(self->IsExceptionPending())) { 313b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light // Don't send another method exit event. 314b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 315b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light } 3168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3171452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 31893e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3191452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3201452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_WIDE: { 3249d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data))); 3277b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 32803ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 3298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 330947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 3318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 3328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 333b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light if (UNLIKELY(self->IsExceptionPending())) { 334b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light // Don't send another method exit event. 335b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 336b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light } 3378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3381452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 33993e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3401452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3411452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_OBJECT: { 3459d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 3468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 3477b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 34803ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 349bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier const size_t ref_idx = inst->VRegA_11x(inst_data); 350ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj_result = shadow_frame.GetVRegReference(ref_idx); 3512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (do_assignability_check && obj_result != nullptr) { 352b45528c1f1b83ca8c970f439b54fbfcfda6908eaVladimir Marko ObjPtr<mirror::Class> return_type = method->ResolveReturnType(); 353bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier // Re-load since it might have moved. 354bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier obj_result = shadow_frame.GetVRegReference(ref_idx); 3552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (return_type == nullptr) { 356a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // Return the pending exception. 357a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 358a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 359a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (!obj_result->VerifierInstanceOf(return_type)) { 360a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 3611ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp1, temp2; 362fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 363a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Returning '%s' that is not instance of return type '%s'", 3641ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers obj_result->GetClass()->GetDescriptor(&temp1), 3651ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers return_type->GetDescriptor(&temp2)); 366a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 367a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 368a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 369bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier result.SetL(obj_result); 3708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 371947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 3728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 3738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 374b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light if (UNLIKELY(self->IsExceptionPending())) { 375b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light // Don't send another method exit event. 376b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light HANDLE_PENDING_EXCEPTION_WITH_INSTRUMENTATION(nullptr); 377b7edcda968bb0cbaa69a3ad387fcd3194f5612beAlex Light } 378d76615851af31791c7b1549e8c4609152237b9ceAlex Light // Re-load since it might have moved during the MethodExitEvent. 379d76615851af31791c7b1549e8c4609152237b9ceAlex Light result.SetL(shadow_frame.GetVRegReference(ref_idx)); 3808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3811452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 38293e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3831452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3841452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 3888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t dst = inst->VRegA_11n(inst_data); 3903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int4_t val = inst->VRegB_11n(inst_data); 3918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 3968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 3998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21s(inst_data); 4018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 4028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 4108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_31i(inst_data); 4128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 4138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 4218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21h(inst_data); 4238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 4248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 4258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 4262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 4278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 4328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); 4348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 4378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); 4398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 4428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); 4448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 4458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 4473c5aec1da27d8068e6bb97202d12efad6b4331dfSebastien Hertz PREAMBLE(); 4483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), 4498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 4508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 4538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4548a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 4558a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 4568a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_21c())); 4572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 4588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 460ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s.Ptr()); 4618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 4668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4678a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 4688a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 4698a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_31c())); 4702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 4718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 473ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s.Ptr()); 4748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 4798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 480a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 481ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 482ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 483ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 484ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 4852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 488ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c.Ptr()); 4898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 4948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 495ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 4962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 4970aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 50003ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorEnter<do_assignability_check>(self, &shadow_frame, obj); 5018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 5028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 5068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 507ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5082cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5090aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 51203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorExit<do_assignability_check>(self, &shadow_frame, obj); 5138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 5148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 5188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 519a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 520ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 521ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 522ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 523ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 5242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 5258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 527ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 5282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) { 5298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 5308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 5388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 539a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegC_22c()), 540ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 541ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 542ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 543ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 5442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 5458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 547ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 5482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_22c(inst_data), 5492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0); 5508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 5558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 556ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 5572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(array == nullptr)) { 5580aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 5598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 5628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 5638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 5678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 568ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = nullptr; 569a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 570ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 571ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 572ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 573ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 574848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (LIKELY(c != nullptr)) { 575848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (UNLIKELY(c->IsStringClass())) { 576848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); 5773aaa37bba53d6df0265793de48b4b0b57327e57ajessicahandojo obj = mirror::String::AllocEmptyString<true>(self, allocator_type); 578848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } else { 5790d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray obj = AllocObjectFromCode<true>( 5800d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray c.Ptr(), 581a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 582a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe Runtime::Current()->GetHeap()->GetCurrentAllocator()); 583848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 584848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 5852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5884e99b3d8955131f3fc71aa113f0fa71f0092cb6fSebastien Hertz obj->GetClass()->AssertInitializedOrInitializingInThread(self); 589b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 590b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 591b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 59245b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz AbortTransactionF(self, "Allocating finalizable object in transaction: %s", 593709b070044354d9f47641f273edacaeeb0240ab7David Sehr obj->PrettyTypeOf().c_str()); 594b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 595b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 596b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 597ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj.Ptr()); 5988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 6038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 605ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check, true>( 606a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe dex::TypeIndex(inst->VRegC_22c()), 607a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe length, 608a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe shadow_frame.GetMethod(), 609a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 610cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 6112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 6128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 614ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj.Ptr()); 6158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 6208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 621d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 622d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 623d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 6248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 6258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 6288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 629d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 630d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 631d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 6328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 6338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 6368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 6388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 6398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 640ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 641832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers bool success = FillArrayData(obj, payload); 642832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers if (!success) { 6438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 646d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 647832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count); 648d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 654ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> exception = 655ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 6562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(exception == nullptr)) { 6570aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("throw with null exception"); 658a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 659a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 6601ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp; 661fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 662a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 6631ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers exception->GetClass()->GetDescriptor(&temp)); 6648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 66514691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray self->SetException(exception->AsThrowable()); 6668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 6718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 67381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6741eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 675f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 6798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6801eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 68181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6821eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 683f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 6878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6881eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 68981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 691f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 6958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 69781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 699f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 70581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 707f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 710647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 711647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic push 712647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic ignored "-Wfloat-equal" 713647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 7148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 7158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 7178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 7318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 7338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 7348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 7368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 7478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 7498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 7508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 7638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 7648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 7668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 7678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 7698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 779647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 780647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic pop 781647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 7828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 7838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 7858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 7868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 7998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == 8012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8021eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 80381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8041eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 805f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 807f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 8138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != 8152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8161eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 81781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8181eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 819f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 821f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 8278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < 8292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8301eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 83181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8321eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 833f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 835f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 8418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= 8432cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8441eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 84581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8461eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 847f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 849f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 8558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > 8572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8581eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 85981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8601eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 861f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 863f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 8698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= 8712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8721eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 87381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8741eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 875f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 877f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 8838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 8851eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 88681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8871eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 888f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 890f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 8968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 8981eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 89981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9001eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 901f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 903f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 9098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 9111eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 91281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9131eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 914f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 916f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 9228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { 9241eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 92581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9261eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 927f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 929f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 9358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 9371eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 93881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9391eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 940f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 942f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 9488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 9501eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 95181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9521eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 953f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 9548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 955f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 9618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 962ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9640aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 969ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 970b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 971abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 9798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 980ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9820aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 987ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 988b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 989abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 998ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10000aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1005ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1006b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1007abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 10158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1016ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10180aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1023ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1024b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1025abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 10338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1034ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10360aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1041709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1042ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1043b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1044abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 10528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1053ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10550aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1060709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1061ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1062b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1063abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 10718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1072ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10740aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1079ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1080b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 10813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 10898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1090ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10920aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1098ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1099b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1100d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 11088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1109ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11110aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1117ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1118b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1119d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 11278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1128ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11300aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1136ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1137b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1138d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 11468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1147ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11490aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1155ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1156b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1157d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 11658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1166ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11680aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1174709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1175ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1176b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1177d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 11858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1186ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11880aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 11938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1194709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1195ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1196b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1197d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1206ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 12072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 12080aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 12098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1213ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 1214ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1215b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1216d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 12188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 12208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 12248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>( 12262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 12318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>( 12332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 12388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>( 12402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 12458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>( 12472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12532cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>( 12542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 12598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>( 12612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 12668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>( 12682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 12738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 12758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 12798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 12818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 12858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 12878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1290ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BOOLEAN_QUICK: { 1291ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1292ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data); 1293ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1294ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1295ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1296ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BYTE_QUICK: { 1297ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1298ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data); 1299ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1300ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1301ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1302ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_CHAR_QUICK: { 1303ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1304ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data); 1305ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1306ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1307ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1308ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_SHORT_QUICK: { 1309ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1310ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data); 1311ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1312ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1313ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 13148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1316bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check, 1317bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BYTE: { 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1323bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check, 1324bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_CHAR: { 13298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1330bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check, 1331bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 13368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1337bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check, 1338bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 13438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1344bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check, 1345bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 13508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1351bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check, 1352bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 13578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1358bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check, 1359bd208d8e73084b691d9cfbe870120fe53863ce07Chang Xing transaction_active>(self, shadow_frame, inst, inst_data); 13608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 13648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 13662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 13718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, 13732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 13788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, 13802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 13858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, 13872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 13928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, 13942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 13998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, 14012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 14068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, 14082cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 14138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>( 14152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 141937f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BOOLEAN_QUICK: { 142037f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>( 14222cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 142337f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 142437f05ef45e0393de812d51261dc293240c17294dFred Shih break; 142537f05ef45e0393de812d51261dc293240c17294dFred Shih } 142637f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BYTE_QUICK: { 142737f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>( 14292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 143037f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 143137f05ef45e0393de812d51261dc293240c17294dFred Shih break; 143237f05ef45e0393de812d51261dc293240c17294dFred Shih } 143337f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_CHAR_QUICK: { 143437f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>( 14362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 143737f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 143837f05ef45e0393de812d51261dc293240c17294dFred Shih break; 143937f05ef45e0393de812d51261dc293240c17294dFred Shih } 144037f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_SHORT_QUICK: { 144137f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>( 14432cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 144437f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 144537f05ef45e0393de812d51261dc293240c17294dFred Shih break; 144637f05ef45e0393de812d51261dc293240c17294dFred Shih } 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>( 14502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 14558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>( 14572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 14628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 14642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BYTE: { 14698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, 14712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_CHAR: { 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, 14782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 14838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, 14852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 14908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, 14922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 14978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, 14992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 15048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, 15062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 15078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 15118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, false, do_access_check>( 15132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 15188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, true, do_access_check>( 15202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 15258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, false, do_access_check>( 15272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 15328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, true, do_access_check>( 15342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 15398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, false, do_access_check>( 15412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 15468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, true, do_access_check>( 15482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 15538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, false, do_access_check>( 15552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 15608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, true, do_access_check>( 15622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 15678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, false, do_access_check>( 15692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 15748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, true, do_access_check>( 15762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 15818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<false>( 15832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 15888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<true>( 15902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15949823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC: { 15959823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1596269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1597c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<false /* is_range */>( 15989823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 15999823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 16009823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 16019823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 16029823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC_RANGE: { 16039823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1604269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1605c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<true /* is_range */>( 16069823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 16079823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 16089823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 16099823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 1610c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM: { 1611c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1612c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1613c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<false /* is_range */>( 1614c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1615c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1616c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1617c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 1618c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM_RANGE: { 1619c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1620c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1621c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<true /* is_range */>( 1622c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1623c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1624c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1625c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 16268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 16278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 16292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 16338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 16352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 16398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 16412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 16458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 16472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 16518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegFloat( 16532cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 16548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 16578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegDouble( 16592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 16608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1664450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1665450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 16698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1670450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1671450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 16758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1676450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1677450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 16818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1682450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1683450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 16878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1688450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1689450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 16938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1694450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1695450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 16998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1701450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 17023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 17038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 17078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1709450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 17103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 17118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1716450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1717450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1723450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 17243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 17258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1731450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 17323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 17378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1738450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1739450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 17438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>( 17452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 17498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>( 17512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 17528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 17558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>( 17572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 17588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1760f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::ADD_INT: { 17618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1763f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()), 1764f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1767f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers } 17688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1771f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()), 1772f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 17768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1778f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()), 1779f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 17858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 17868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 17888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 17918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 17938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 17968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 18068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 18098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 18138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 18168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 18238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 18308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 18348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 18368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 18378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 18418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1843f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1844f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 18488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1850f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1851f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 18528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 18558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1857f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1858f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 18628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 18648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 1865f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x())); 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 18678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 18698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 18838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 18868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 18908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 18938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 19008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 19048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 19078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 19138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 19218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 19228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 19258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 19288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 19298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 19328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 19358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 19368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 19398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 19428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 19438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 19468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 19498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 19508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 19538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 19568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 19608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 19678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 19708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 19748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 19778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 19848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 19888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 1990f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA), 1991f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 19968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 1999f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(vregA), 2000f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 20058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 2008f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(vregA), 2009f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 20108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 20173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 20198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 20228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 20253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 20278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 20308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 20343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 20358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 20398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 20433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 20448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 20488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 20523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 20538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 20578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 20613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 20668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 20703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 20758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 20793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 20848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2087f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(vregA), 2088f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 20938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2096f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(vregA), 2097f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 21028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2105f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(vregA), 2106f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 21078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 21118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 21143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 21168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 21198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 21223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 21248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 21313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 21403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 21458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 21493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 21548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 21583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 21598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 21673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 21728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 21763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 21778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 21818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 21853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 21908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 21943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 21998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 22033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 22088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 22123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 22138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 22178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 22208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 22213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 22228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 22268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 22303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 22318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 22358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 22393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 22408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 22448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 22483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 22498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 22538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 22573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 22588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 22628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 22648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 22663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 22678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 22718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2273f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2274f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 22758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2277f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::RSUB_INT_LIT16: 22788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2280f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22s(), 2281f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_22s(inst_data)))); 22828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 22858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2287f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2288f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 22898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 22928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 22942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 22952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 22968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 23008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 23022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 23032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 23048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 23088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 23103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 23118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 23128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 23158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 23173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 23188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 23198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 23228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 23243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ 23258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 23268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 23298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2331f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 23328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 23358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2337f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b()))); 23388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 23418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2343f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 23448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 23478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 23498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 23508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 23548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 23568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 23578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 23618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 23648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 23688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 23718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 23758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 23788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 23828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 23858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 23868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 23898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 23928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 23938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 23968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 23998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 24008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 24018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 24028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 24038ec3bd2b31ccbc9027b8e9b1949dd1804bb6d30fNarayan Kamath case Instruction::UNUSED_F3 ... Instruction::UNUSED_F9: 2404c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::UNUSED_FE ... Instruction::UNUSED_FF: 24058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_79: 24068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_7A: 2407e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers UnexpectedOpcode(inst, shadow_frame); 24088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24091452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } while (!interpret_one_instruction); 24101452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee // Record where we stopped. 24111452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(inst->GetDexPc(insns)); 2412d6b48dbe715fbf1431394d2b6ef75cb19a4012ddbuzbee return result_register; 24138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 24148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 24158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 24165e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2417e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, false>(Thread* self, const DexFile::CodeItem* code_item, 24181452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24191452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24205e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2421e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, false>(Thread* self, const DexFile::CodeItem* code_item, 24221452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24231452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24245e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2425e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, true>(Thread* self, const DexFile::CodeItem* code_item, 24261452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24271452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24285e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2429e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, true>(Thread* self, const DexFile::CodeItem* code_item, 24301452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24311452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 24338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 24348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2435