interpreter_switch_impl.cc revision c069a30d42aefd902c20e8bc09dfad1683f07ded
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 298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define HANDLE_PENDING_EXCEPTION() \ 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), \ 358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation); \ 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 508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \ 518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(_is_exception_pending)) { \ 538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->_next_function(); \ 568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 5903ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe#define HANDLE_MONITOR_CHECKS() \ 6056fdd0e63812764bbeb8cc52e376d3fd1f270052Andreas Gampe if (!DoMonitorCheckOnExit<do_assignability_check>(self, &shadow_frame)) { \ 6103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_PENDING_EXCEPTION(); \ 6203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe } 6303ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe 648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 658379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz#define PREAMBLE() \ 668379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz do { \ 679d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz if (UNLIKELY(instrumentation->HasDexPcListeners())) { \ 688379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), \ 698379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz shadow_frame.GetMethod(), dex_pc); \ 708379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } \ 718379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } while (false) 728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 73b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#define BRANCH_INSTRUMENTATION(offset) \ 74b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray do { \ 75274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (UNLIKELY(instrumentation->HasBranchListeners())) { \ 76274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray instrumentation->Branch(self, method, dex_pc, offset); \ 77274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray } \ 78b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray JValue result; \ 79b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray if (jit::Jit::MaybeDoOnStackReplacement(self, method, dex_pc, offset, &result)) { \ 8093e94f228f7a9ec5c2a29553010e585d583ac530buzbee if (interpret_one_instruction) { \ 8193e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* OSR has completed execution of the method. Signal mterp to return to caller */ \ 8293e94f228f7a9ec5c2a29553010e585d583ac530buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); \ 8393e94f228f7a9ec5c2a29553010e585d583ac530buzbee } \ 84b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray return result; \ 85b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray } \ 863108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray } while (false) 873108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray 881d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee#define HOTNESS_UPDATE() \ 891d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee do { \ 90274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (jit != nullptr) { \ 9171cd50fb67fa48667b0ab59aa436a582c04ba43dNicolas Geoffray jit->AddSamples(self, method, 1, /*with_backedges*/ true); \ 921d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } \ 931d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } while (false) 941d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee 95f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe#define HANDLE_BACKWARD_BRANCH(offset) \ 96f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe do { \ 97f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe if (IsBackwardBranch(offset)) { \ 98f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HOTNESS_UPDATE(); \ 99f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe /* Record new dex pc early to have consistent suspend point at loop header. */ \ 100f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe shadow_frame.SetDexPC(inst->GetDexPc(insns)); \ 101f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe self->AllowThreadSuspension(); \ 102f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } \ 103f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe } while (false) 104f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe 105d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool do_access_check, bool transaction_active> 106e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, 1071452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 1081452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction) { 109c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin constexpr bool do_assignability_check = do_access_check; 1108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 1118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 1128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); 1138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 1158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 1168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 1172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier const auto* const instrumentation = Runtime::Current()->GetInstrumentation(); 1188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* const insns = code_item->insns_; 1198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 1203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t inst_data; 1211d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee ArtMethod* method = shadow_frame.GetMethod(); 1221d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee jit::Jit* jit = Runtime::Current()->GetJit(); 1236918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 1241452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee do { 1258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz dex_pc = inst->GetDexPc(insns); 1268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetDexPC(dex_pc); 127e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers TraceExecution(shadow_frame, inst, dex_pc); 1283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz inst_data = inst->Fetch16(0); 1293b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz switch (inst->Opcode(inst_data)) { 1308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOP: 1318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE: 1358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 1388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_FROM16: 1418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(inst_data), 1438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 1448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_16: 1478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 1508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE: 1538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 1568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_FROM16: 1598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data), 1618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 1628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_16: 1658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 1678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 1688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT: 1718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data), 1733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data))); 1748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_FROM16: 1778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data), 1798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 1808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_16: 1838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 1858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 1868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT: 1898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI()); 1918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_WIDE: 1948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ()); 1968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_OBJECT: 1998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL()); 2018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_EXCEPTION: { 2048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 205ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Throwable> exception = self->GetException(); 206270a0e16c3b8e5b95cbfdbd8996ac137c7c6322bSebastien Hertz DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction"; 207ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception.Ptr()); 2085c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz self->ClearException(); 2098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 212d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID_NO_BARRIER: { 2139d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 2148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2157b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 21603ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 2178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 218947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 2218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2221452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 22393e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 2241452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 2251452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 2268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 228d7cbf8a6629942e7bd315ffae7e1c77b082f3e11Mathieu Chartier case Instruction::RETURN_VOID: { 2299d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 2303035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceForConstructor(); 2318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2327b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 23303ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 2348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 235947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 2388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2391452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 24093e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 2411452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 2421452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 2438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN: { 2469d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 2478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 2493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data))); 2507b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 25103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 2528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 253947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 2568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2571452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 25893e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 2591452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 2601452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 2618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_WIDE: { 2649d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 2658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data))); 2677b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 26803ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 2698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 270947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 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 } 2808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_OBJECT: { 2819d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz PREAMBLE(); 2828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2837b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 28403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_MONITOR_CHECKS(); 285bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier const size_t ref_idx = inst->VRegA_11x(inst_data); 286ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj_result = shadow_frame.GetVRegReference(ref_idx); 2872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (do_assignability_check && obj_result != nullptr) { 288942fd3130254d8276cbfe8e6201825e9c49e9b2cVladimir Marko ObjPtr<mirror::Class> return_type = method->GetReturnType(true /* resolve */); 289bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier // Re-load since it might have moved. 290bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier obj_result = shadow_frame.GetVRegReference(ref_idx); 2912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (return_type == nullptr) { 292a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // Return the pending exception. 293a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 294a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 295a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (!obj_result->VerifierInstanceOf(return_type)) { 296a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 2971ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp1, temp2; 298fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 299a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Returning '%s' that is not instance of return type '%s'", 3001ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers obj_result->GetClass()->GetDescriptor(&temp1), 3011ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers return_type->GetDescriptor(&temp2)); 302a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 303a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 304a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 305bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier result.SetL(obj_result); 3068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 307947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 3088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 3098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 3108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3111452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 31293e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3131452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3141452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 3188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t dst = inst->VRegA_11n(inst_data); 3203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int4_t val = inst->VRegB_11n(inst_data); 3218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 3268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 3298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21s(inst_data); 3318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 3328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 3408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_31i(inst_data); 3428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 3438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 3518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21h(inst_data); 3538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 3548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 3628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); 3648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 3678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); 3698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 3728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); 3748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 3758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 3773c5aec1da27d8068e6bb97202d12efad6b4331dfSebastien Hertz PREAMBLE(); 3783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), 3798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 3808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 3838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3848a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 3858a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 3868a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_21c())); 3872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 3888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 390ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s.Ptr()); 3918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 3968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3978a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 3988a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 3998a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_31c())); 4002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 4018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 403ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s.Ptr()); 4048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 4098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 410a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 411ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 412ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 413ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 414ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 4152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 418ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c.Ptr()); 4198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 4248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 425ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 4262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 4270aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 43003ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorEnter<do_assignability_check>(self, &shadow_frame, obj); 4318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 4328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 4368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 437ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 4382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 4390aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 44203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorExit<do_assignability_check>(self, &shadow_frame, obj); 4438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 4448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 4488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 449a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 450ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 451ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 452ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 453ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 4542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 457ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 4582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) { 4598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 4608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 4688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 469a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegC_22c()), 470ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 471ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 472ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 473ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 4742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 477ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 4782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_22c(inst_data), 4792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0); 4808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 486ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 4872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(array == nullptr)) { 4880aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 4928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 4938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 4978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 498ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = nullptr; 499a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 500ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 501ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 502ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 503ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 504848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (LIKELY(c != nullptr)) { 505848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (UNLIKELY(c->IsStringClass())) { 506848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); 5073aaa37bba53d6df0265793de48b4b0b57327e57ajessicahandojo obj = mirror::String::AllocEmptyString<true>(self, allocator_type); 508848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } else { 5090d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray obj = AllocObjectFromCode<true>( 5100d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray c.Ptr(), 511a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 512a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe Runtime::Current()->GetHeap()->GetCurrentAllocator()); 513848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 514848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 5152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5184e99b3d8955131f3fc71aa113f0fa71f0092cb6fSebastien Hertz obj->GetClass()->AssertInitializedOrInitializingInThread(self); 519b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 520b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 521b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 52245b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz AbortTransactionF(self, "Allocating finalizable object in transaction: %s", 523709b070044354d9f47641f273edacaeeb0240ab7David Sehr obj->PrettyTypeOf().c_str()); 524b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 525b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 526b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 527ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj.Ptr()); 5288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 5338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 535ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check, true>( 536a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe dex::TypeIndex(inst->VRegC_22c()), 537a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe length, 538a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe shadow_frame.GetMethod(), 539a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 540cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 5412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 544ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj.Ptr()); 5458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 5508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 551d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 552d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 553d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 5548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 5558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 5588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 559d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 560d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 561d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 5628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 5638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 5668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 5688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 5698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 570ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 571832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers bool success = FillArrayData(obj, payload); 572832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers if (!success) { 5738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 576d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 577832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count); 578d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 5798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 5808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 5838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 584ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> exception = 585ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(exception == nullptr)) { 5870aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("throw with null exception"); 588a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 589a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 5901ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp; 591fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 592a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 5931ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers exception->GetClass()->GetDescriptor(&temp)); 5948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 59514691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray self->SetException(exception->AsThrowable()); 5968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 60381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6041eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 605f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 6098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6101eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 61181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6121eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 613f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 6178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6181eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 61981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6201eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 621f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 6258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 62781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 629f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 6338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 63581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 637f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 640647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 641647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic push 642647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic ignored "-Wfloat-equal" 643647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 6448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 6458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 6618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 6778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 6938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 6948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 709647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 710647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic pop 711647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 7128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 7138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 7158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 7168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 7298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == 7312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7321eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 73381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7341eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 735f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 737f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 7438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != 7452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7461eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 74781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7481eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 749f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 751f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 7578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < 7592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7601eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 76181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7621eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 763f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 765f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 7718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= 7732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7741eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 77581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7761eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 777f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 779f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 7858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > 7872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7881eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 78981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 791f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 793f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 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_EQZ: { 8138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 8151eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 81681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8171eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 818f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 820f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 8281eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 82981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8301eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 831f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 833f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 8398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 8411eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 84281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8431eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 844f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 846f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 8528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { 8541eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 85581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8561eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 857f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 859f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 8658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 8671eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 86881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8691eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 870f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 872f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 8788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 8801eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 88181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8821eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 883f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 885f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 8918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 892ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 8940aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 8958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 899ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 900b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 901abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 9098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 910ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9120aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 917ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 918b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 919abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 928ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9300aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 935ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 936b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 937abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 946ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9480aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 953ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 954b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 955abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 9638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 964ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9660aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 971709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 972ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 973b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 974abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 9828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 983ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9850aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 990709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 991ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 992b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 993abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1002ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10040aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1009ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1010b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 10113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1020ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10220aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1028ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1029b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1030d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1039ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10410aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1047ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1048b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1049d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1058ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10600aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1066ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1067b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1068d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1077ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10790aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1085ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1086b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1087d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 10958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1096ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10972cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10980aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1104709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1105ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1106b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1107d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 11158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1116ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11180aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 11238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1124709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1125ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1126b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1127d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 11358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1136ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11380aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1143ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 1144ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1145b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1146d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 11548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>( 11562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 11618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>( 11632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 11688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>( 11702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 11758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>( 11772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 11828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>( 11842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 11898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>( 11912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 11968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11972cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>( 11982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 12038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 12098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 12158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1220ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BOOLEAN_QUICK: { 1221ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1222ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data); 1223ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1224ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1225ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1226ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BYTE_QUICK: { 1227ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1228ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data); 1229ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1230ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1231ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1232ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_CHAR_QUICK: { 1233ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1234ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data); 1235ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1236ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1237ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1238ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_SHORT_QUICK: { 1239ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1240ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data); 1241ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1242ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1243ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 12448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 12458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, 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::SGET_BYTE: { 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12532cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, 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::SGET_CHAR: { 12598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, 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::SGET_SHORT: { 12668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, 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::SGET: { 12738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>( 12752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 12808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>( 12822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 12878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>( 12892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 12948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 12962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 12978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 13018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, 13032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 13088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13092cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, 13102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13162cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, 13172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier 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::IPUT: { 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, 13242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier 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::IPUT_WIDE: { 13298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, 13312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier 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::IPUT_OBJECT: { 13368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, 13382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier 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::IPUT_QUICK: { 13438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>( 13452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 13468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 134937f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BOOLEAN_QUICK: { 135037f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>( 13522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 135337f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 135437f05ef45e0393de812d51261dc293240c17294dFred Shih break; 135537f05ef45e0393de812d51261dc293240c17294dFred Shih } 135637f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BYTE_QUICK: { 135737f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>( 13592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 136037f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 136137f05ef45e0393de812d51261dc293240c17294dFred Shih break; 136237f05ef45e0393de812d51261dc293240c17294dFred Shih } 136337f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_CHAR_QUICK: { 136437f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>( 13662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 136737f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 136837f05ef45e0393de812d51261dc293240c17294dFred Shih break; 136937f05ef45e0393de812d51261dc293240c17294dFred Shih } 137037f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_SHORT_QUICK: { 137137f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>( 13732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 137437f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 137537f05ef45e0393de812d51261dc293240c17294dFred Shih break; 137637f05ef45e0393de812d51261dc293240c17294dFred Shih } 13778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 13788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>( 13802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 13818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 13858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>( 13872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 13888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 13928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, 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::SPUT_BYTE: { 13998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, 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::SPUT_CHAR: { 14068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, 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::SPUT_SHORT: { 14138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, 14152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 14208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, 14222cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 14278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, 14292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 14348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, 14362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 14418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, false, do_access_check>( 14432cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, true, do_access_check>( 14502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 14558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, false, do_access_check>( 14572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 14628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, true, do_access_check>( 14642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 14698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, false, do_access_check>( 14712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, true, do_access_check>( 14782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 14838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, false, do_access_check>( 14852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 14908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, true, do_access_check>( 14922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 14978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, false, do_access_check>( 14992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 15048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, true, do_access_check>( 15062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 15118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<false>( 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_QUICK: { 15188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<true>( 15202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15249823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC: { 15259823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1526269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1527c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<false /* is_range */>( 15289823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 15299823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 15309823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 15319823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 15329823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC_RANGE: { 15339823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1534269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1535c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokePolymorphic<true /* is_range */>( 15369823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 15379823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 15389823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 15399823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 1540c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM: { 1541c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1542c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1543c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<false /* is_range */>( 1544c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1545c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1546c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1547c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 1548c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::INVOKE_CUSTOM_RANGE: { 1549c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson PREAMBLE(); 1550c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 1551c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson bool success = DoInvokeCustom<true /* is_range */>( 1552c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson self, shadow_frame, inst, inst_data, &result_register); 1553c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 1554c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson break; 1555c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson } 15568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 15578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 15592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 15638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 15652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 15698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 15712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 15758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 15772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 15788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 15818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegFloat( 15832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 15878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegDouble( 15892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 15908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 15938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1594450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1595450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 15998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1600450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1601450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 16058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1606450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1607450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 16118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1612450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1613450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 16178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1618450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1619450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 16238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1624450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1625450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 16298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1631450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 16323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 16338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 16378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1639450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 16403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 16418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 16458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1646450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1647450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 16488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 16518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1653450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 16543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 16558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 16598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1661450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 16623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 16678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1668450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1669450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 16738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>( 16752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 16798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>( 16812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 16858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>( 16872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1690f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::ADD_INT: { 16918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1693f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()), 1694f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 16958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1697f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers } 16988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 16998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1701f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()), 1702f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 17068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1708f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()), 1709f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 17138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 17168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 17238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 17268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 17328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 17368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 17398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 17438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 17508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 17578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 17608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 17648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 17678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1773f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1774f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 17758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 17788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1780f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1781f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 17858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1787f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1788f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 17898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 17928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 1795f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x())); 17968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 18018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 18048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 18068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 18098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 18138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 18168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 18238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 18308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 18318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 18348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 18378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 18418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 18488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 18518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 18558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 18588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 18628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 18658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 18698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 18838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 18858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 18868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 18908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 18928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 18938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 19008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 19048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 19078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 1920f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA), 1921f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 19268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 1929f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(vregA), 1930f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 19358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 1938f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(vregA), 1939f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 19448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 19473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 19498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 19528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 19553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 19608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 19643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 19733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 19823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 19913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 19968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 20003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 20058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 20093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2017f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(vregA), 2018f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 20238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2026f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(vregA), 2027f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 20328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2035f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(vregA), 2036f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 20418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 20443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 20498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20503b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 20523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 20548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 20578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 20613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 20668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 20703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 20758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 20793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 20848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 20883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 20898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 20938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 20973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 20988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 21028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 21063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 21078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 21118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 21153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 21208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 21243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 21298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 21333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 21388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 21423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 21478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 21513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 21528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 21568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 21603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 21658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 21693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 21748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 21783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 21838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 21873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 21928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 21963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 21978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 22018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2203f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2204f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 22058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2207f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::RSUB_INT_LIT16: 22088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2210f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22s(), 2211f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_22s(inst_data)))); 22128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 22158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2217f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2218f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 22198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 22228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 22242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 22252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 22268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 22308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 22322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 22332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 22348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 22388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 22403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 22418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 22428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 22458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 22473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 22488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 22498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 22528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 22543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ 22558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 22568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 22598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2261f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 22628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 22658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2267f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b()))); 22688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 22718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2273f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 22748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 22778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 22798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 22808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 22848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 22868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 22878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 22918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 22938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 22948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 22958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 22988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22993b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 23018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 23058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 23088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 23128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 23158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 23168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 23198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 23228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 23238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 23268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 23298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 23308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 23338ec3bd2b31ccbc9027b8e9b1949dd1804bb6d30fNarayan Kamath case Instruction::UNUSED_F3 ... Instruction::UNUSED_F9: 2334c069a30d42aefd902c20e8bc09dfad1683f07dedOrion Hodson case Instruction::UNUSED_FE ... Instruction::UNUSED_FF: 23358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_79: 23368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_7A: 2337e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers UnexpectedOpcode(inst, shadow_frame); 23388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23391452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } while (!interpret_one_instruction); 23401452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee // Record where we stopped. 23411452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(inst->GetDexPc(insns)); 2342d6b48dbe715fbf1431394d2b6ef75cb19a4012ddbuzbee return result_register; 23438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 23448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 23458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 23465e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2347e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, false>(Thread* self, const DexFile::CodeItem* code_item, 23481452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 23491452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 23505e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2351e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, false>(Thread* self, const DexFile::CodeItem* code_item, 23521452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 23531452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 23545e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2355e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, true>(Thread* self, const DexFile::CodeItem* code_item, 23561452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 23571452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 23585e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2359e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, true>(Thread* self, const DexFile::CodeItem* code_item, 23601452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 23611452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 23628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 23638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 23648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2365