interpreter_switch_impl.cc revision 0d3998b5ff619364acf47bec0b541e7a49bd6fe7
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) { 288542451cc546779f5c67840e105c51205a1b0a8fdAndreas Gampe PointerSize pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize(); 289ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Class> return_type = method->GetReturnType(true /* resolve */, 290ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier pointer_size); 291bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier // Re-load since it might have moved. 292bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier obj_result = shadow_frame.GetVRegReference(ref_idx); 2932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (return_type == nullptr) { 294a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // Return the pending exception. 295a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 296a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 297a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (!obj_result->VerifierInstanceOf(return_type)) { 298a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 2991ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp1, temp2; 300fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 301a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Returning '%s' that is not instance of return type '%s'", 3021ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers obj_result->GetClass()->GetDescriptor(&temp1), 3031ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers return_type->GetDescriptor(&temp2)); 304a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 305a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 306a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 307bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier result.SetL(obj_result); 3088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 309947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 3108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 3118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 3128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3131452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee if (interpret_one_instruction) { 31493e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* Signal mterp to return to caller */ 3151452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); 3161452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } 3178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 3188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 3208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t dst = inst->VRegA_11n(inst_data); 3223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int4_t val = inst->VRegB_11n(inst_data); 3238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 3288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 3318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21s(inst_data); 3338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 3348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 3428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_31i(inst_data); 3448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 3458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 3538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21h(inst_data); 3558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 3568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegReference(dst, nullptr); 3598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 3648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); 3668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 3698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); 3718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 3748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); 3768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 3778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 3793c5aec1da27d8068e6bb97202d12efad6b4331dfSebastien Hertz PREAMBLE(); 3803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), 3818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 3828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 3858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3868a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 3878a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 3888a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_21c())); 3892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 3908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 392ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s.Ptr()); 3938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 3988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3998a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe ObjPtr<mirror::String> s = ResolveString(self, 4008a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe shadow_frame, 4018a0128a5ca0784f6d2b4ca27907e8967a74bc4c5Andreas Gampe dex::StringIndex(inst->VRegB_31c())); 4022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 4038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 405ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s.Ptr()); 4068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 4118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 412a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 413ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 414ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 415ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 416ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 4172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 420ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c.Ptr()); 4218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 4268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 427ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 4282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 4290aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 43203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorEnter<do_assignability_check>(self, &shadow_frame, obj); 4338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 4348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 4388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 439ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 4402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 4410aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 44403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorExit<do_assignability_check>(self, &shadow_frame, obj); 4458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 4468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 4508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 451a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 452ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 453ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 454ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 455ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 4562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 459ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 4602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) { 4618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 4708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 471a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegC_22c()), 472ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 473ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 474ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 475ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 4762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 479ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 4802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_22c(inst_data), 4812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0); 4828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 4878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 488ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 4892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(array == nullptr)) { 4900aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 4948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 4958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 4998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 500ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = nullptr; 501a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe ObjPtr<mirror::Class> c = ResolveVerifyAndClinit(dex::TypeIndex(inst->VRegB_21c()), 502ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetMethod(), 503ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier self, 504ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier false, 505ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier do_access_check); 506848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (LIKELY(c != nullptr)) { 507848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (UNLIKELY(c->IsStringClass())) { 508848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); 5093aaa37bba53d6df0265793de48b4b0b57327e57ajessicahandojo obj = mirror::String::AllocEmptyString<true>(self, allocator_type); 510848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } else { 5110d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray obj = AllocObjectFromCode<true>( 5120d3998b5ff619364acf47bec0b541e7a49bd6fe7Nicolas Geoffray c.Ptr(), 513a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 514a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe Runtime::Current()->GetHeap()->GetCurrentAllocator()); 515848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 516848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 5172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5204e99b3d8955131f3fc71aa113f0fa71f0092cb6fSebastien Hertz obj->GetClass()->AssertInitializedOrInitializingInThread(self); 521b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 522b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 523b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 52445b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz AbortTransactionF(self, "Allocating finalizable object in transaction: %s", 525709b070044354d9f47641f273edacaeeb0240ab7David Sehr obj->PrettyTypeOf().c_str()); 526b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 527b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 528b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 529ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj.Ptr()); 5308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 5358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 537ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = AllocArrayFromCode<do_access_check, true>( 538a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe dex::TypeIndex(inst->VRegC_22c()), 539a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe length, 540a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe shadow_frame.GetMethod(), 541a5b09a67034e57a6e10231dd4bd92f4cb50b824cAndreas Gampe self, 542cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 5432cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 546ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj.Ptr()); 5478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 5528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 553d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 554d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 555d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 5568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 5578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 5608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 561d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 562d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 563d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 5648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 5658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 5688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 5708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 5718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 572ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 573832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers bool success = FillArrayData(obj, payload); 574832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers if (!success) { 5758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 578d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 579832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count); 580d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 5818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 5828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 5858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 586ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> exception = 587ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(exception == nullptr)) { 5890aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("throw with null exception"); 590a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 591a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 5921ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp; 593fef0664fa7b480032f17c60f767bcca43a659d8aOrion Hodson self->ThrowNewExceptionF("Ljava/lang/InternalError;", 594a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 5951ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers exception->GetClass()->GetDescriptor(&temp)); 5968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 59714691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray self->SetException(exception->AsThrowable()); 5988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 6038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 60581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6061eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 607f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 6118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6121eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 61381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6141eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 615f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 6198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6201eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 62181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6221eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 623f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 6278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 62981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 631f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 6358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 63781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 639f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 6408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 642647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 643647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic push 644647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic ignored "-Wfloat-equal" 645647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 6468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 6478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 6638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 6798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 6958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 6968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 7018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 711647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 712647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic pop 713647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 7148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 7158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 7178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 7318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == 7332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7341eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 73581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7361eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 737f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 739f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 7458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != 7472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7481eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 74981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7501eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 751f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 753f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 7598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < 7612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7621eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 76381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7641eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 765f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 767f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 7738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= 7752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7761eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 77781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7781eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 779f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 781f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 7878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > 7892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 79181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7921eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 793f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 795f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 8018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= 8032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8041eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 80581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8061eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 807f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 809f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 8158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 8171eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 81881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8191eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 820f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 822f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 8288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8293b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 8301eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 83181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8321eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 833f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 835f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 8418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 8431eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 84481f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8451eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 846f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 848f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 8548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { 8561eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 85781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8581eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 859f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 861f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 8678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 8691eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 87081f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8711eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 872f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 874f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 8808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 8821eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 88381f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8841eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 885f4f7637ef078cbd0812432f5a4051858c80f6309Andreas Gampe HANDLE_BACKWARD_BRANCH(offset); 8868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 887f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 8938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 894ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 8960aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 8978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 901ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 902b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 903abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 9118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 912ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9140aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 919ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 920b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 921abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 9298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 930ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9320aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 937ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 938b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 939abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 9478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 948ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9500aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 955ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 956b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 957abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 9658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 966ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9680aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 973709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 974ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 975b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 976abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 9848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 985ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9870aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 992709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 993ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 994b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 995abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 10038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1004ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10060aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1011ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1012b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 10133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 10218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1022ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10240aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1030ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::BooleanArray> array = a->AsBooleanArray(); 1031b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1032d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 10408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1041ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10430aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1049ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ByteArray> array = a->AsByteArray(); 1050b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1051d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 10598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1060ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10620aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1068ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::CharArray> array = a->AsCharArray(); 1069b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1070d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 10788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1079ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10810aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1087ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ShortArray> array = a->AsShortArray(); 1088b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1089d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 10978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1098ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11000aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1106709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsIntArray() || a->IsFloatArray()) << a->PrettyTypeOf(); 1107ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::IntArray> array = ObjPtr<mirror::IntArray>::DownCast(a); 1108b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1109d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 11178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1118ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11200aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 11258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1126709b070044354d9f47641f273edacaeeb0240ab7David Sehr DCHECK(a->IsLongArray() || a->IsDoubleArray()) << a->PrettyTypeOf(); 1127ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::LongArray> array = ObjPtr<mirror::LongArray>::DownCast(a); 1128b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1129d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 11378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1138ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11400aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1145ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::Object> val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 1146ef41db7a3f322a1feb305fdb457410c4cea94d00Mathieu Chartier ObjPtr<mirror::ObjectArray<mirror::Object>> array = a->AsObjectArray<mirror::Object>(); 1147b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1148d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 11568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>( 11582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 11638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>( 11652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 11708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11712cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>( 11722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 11778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11782cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>( 11792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>( 11862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 11918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>( 11932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 11948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 11988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>( 12002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 12078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 12138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1222ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BOOLEAN_QUICK: { 1223ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1224ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data); 1225ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1226ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1227ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1228ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BYTE_QUICK: { 1229ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1230ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data); 1231ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1232ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1233ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1234ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_CHAR_QUICK: { 1235ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1236ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data); 1237ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1238ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1239ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1240ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_SHORT_QUICK: { 1241ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1242ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data); 1243ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1244ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1245ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 12468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 12478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>( 12492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BYTE: { 12548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12552cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>( 12562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_CHAR: { 12618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>( 12632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 12688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>( 12702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 12758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>( 12772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>( 12842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>( 12912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 12968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12972cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 12982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 12998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 13038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, 13052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 13108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, 13122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 13178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13182cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, 13192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 13248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, 13262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 13318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, 13332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 13388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, 13402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 13458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>( 13472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 135137f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BOOLEAN_QUICK: { 135237f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13532cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>( 13542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 135537f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 135637f05ef45e0393de812d51261dc293240c17294dFred Shih break; 135737f05ef45e0393de812d51261dc293240c17294dFred Shih } 135837f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BYTE_QUICK: { 135937f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>( 13612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 136237f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 136337f05ef45e0393de812d51261dc293240c17294dFred Shih break; 136437f05ef45e0393de812d51261dc293240c17294dFred Shih } 136537f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_CHAR_QUICK: { 136637f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>( 13682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 136937f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 137037f05ef45e0393de812d51261dc293240c17294dFred Shih break; 137137f05ef45e0393de812d51261dc293240c17294dFred Shih } 137237f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_SHORT_QUICK: { 137337f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>( 13752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 137637f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 137737f05ef45e0393de812d51261dc293240c17294dFred Shih break; 137837f05ef45e0393de812d51261dc293240c17294dFred Shih } 13798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 13808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>( 13822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 13838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 13878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>( 13892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 13908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 13948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, 13962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BYTE: { 14018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, 14032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_CHAR: { 14088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14092cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, 14102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 14158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14162cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, 14172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 14228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, 14242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 14298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, 14312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 14368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, 14382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 14438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, false, do_access_check>( 14452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 14508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, true, do_access_check>( 14522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 14578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, false, do_access_check>( 14592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 14648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, true, do_access_check>( 14662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 14718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, false, do_access_check>( 14732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 14788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, true, do_access_check>( 14802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 14858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, false, do_access_check>( 14872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 14928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, true, do_access_check>( 14942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 14998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, false, do_access_check>( 15012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 15068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, true, do_access_check>( 15082cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 15138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<false>( 15152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 15208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<true>( 15222cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15269823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC: { 15279823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1528269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 15299823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath bool success = DoInvokePolymorphic<false, do_access_check>( 15309823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 15319823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 15329823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 15339823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 15349823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath case Instruction::INVOKE_POLYMORPHIC_RANGE: { 15359823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath PREAMBLE(); 1536269cb43d6df76b52a42c1c7a9436c92bd0dcdad6Narayan Kamath DCHECK(Runtime::Current()->IsMethodHandlesEnabled()); 15379823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath bool success = DoInvokePolymorphic<true, do_access_check>( 15389823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath self, shadow_frame, inst, inst_data, &result_register); 15399823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_4xx); 15409823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath break; 15419823e788ed3368ecf826c44bfa16ccabfcbe32f8Narayan Kamath } 15428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 15438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 15452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 15498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 15512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 15558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 15572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 15618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 15632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 15648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 15678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegFloat( 15692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 15708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegDouble( 15752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 15768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1580450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1581450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 15858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1586450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1587450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1592450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1593450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 15978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1598450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1599450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 16038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1604450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1605450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 16098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1610450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1611450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1617450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 16183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 16198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 16238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1625450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 16263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 16278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 16318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1632450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1633450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 16348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 16378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1639450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 16403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 16418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 16458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1647450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 16483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 16538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1654450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1655450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 16598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>( 16612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 16658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>( 16672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>( 16732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1676f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::ADD_INT: { 16778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1679f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()), 1680f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 16818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1683f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers } 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 16858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1687f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()), 1688f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 16898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 16928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1694f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()), 1695f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 16968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 16998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 17018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 17028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 17048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 17078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 17098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 17108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 17128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 17198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 17228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 17258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 17268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(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::AND_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())); 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 17438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_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::ADD_LONG: 17578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1759f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1760f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 17618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 17648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1766f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1767f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 17688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1773f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(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::DIV_LONG: 17788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 17808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 1781f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x())); 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 17858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 17878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 17888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 17898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 17928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 17958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 17968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_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::SHL_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.GetVReg(inst->VRegC_23x()) & 0x3f)); 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_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.GetVReg(inst->VRegC_23x()) & 0x3f)); 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(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::ADD_FLOAT: 18348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 18378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 18418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_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::DIV_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::REM_FLOAT: 18628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(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::ADD_DOUBLE: 18698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 18788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_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::DIV_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::REM_DOUBLE: 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(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::ADD_INT_2ADDR: { 19048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 1906f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA), 1907f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 19128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 1915f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(vregA), 1916f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 19218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 1924f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(vregA), 1925f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 19308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 19333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 19358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 19413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 19438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 19468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 19503b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 19558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 19593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 19648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 19683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 19738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 19773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 19828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 19863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 19918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 19953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 20008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2003f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(vregA), 2004f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 20098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2012f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(vregA), 2013f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 20188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2021f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(vregA), 2022f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 20278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 20303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 20328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 20358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 20383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 20408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 20438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 20473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 20528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 20563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 20618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 20653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 20708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 20743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 20758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 20798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 20833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 20848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 20888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 20923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 20938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 20978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 21013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 21068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 21103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 21158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 21193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 21248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 21283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 21338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 21373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 21388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 21428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 21463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 21518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 21553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 21608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 21643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 21698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 21733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 21788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 21823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 21838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 21878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2189f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2190f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 21918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2193f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::RSUB_INT_LIT16: 21948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2196f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22s(), 2197f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_22s(inst_data)))); 21988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 22018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2203f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2204f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 22058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 22088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 22102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 22112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 22128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 22168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 22182cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 22192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 22208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 22248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 22263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 22278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 22288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 22318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 22333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 22348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 22358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_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::ADD_INT_LIT8: 22458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2247f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 22488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 22518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2253f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b()))); 22548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 22578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2259f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 22608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 22638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 22658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 22668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 22708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 22728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 22738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 22778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 22798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 22808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 22818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 22848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 22868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 22878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 22888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_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::SHL_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() & 0x1f)); 23028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_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() & 0x1f)); 23098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 23128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(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::UNUSED_3E ... Instruction::UNUSED_43: 23198ec3bd2b31ccbc9027b8e9b1949dd1804bb6d30fNarayan Kamath case Instruction::UNUSED_F3 ... Instruction::UNUSED_F9: 23208ec3bd2b31ccbc9027b8e9b1949dd1804bb6d30fNarayan Kamath case Instruction::UNUSED_FC ... Instruction::UNUSED_FF: 23218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_79: 23228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_7A: 2323e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers UnexpectedOpcode(inst, shadow_frame); 23248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 23251452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } while (!interpret_one_instruction); 23261452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee // Record where we stopped. 23271452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(inst->GetDexPc(insns)); 2328d6b48dbe715fbf1431394d2b6ef75cb19a4012ddbuzbee return result_register; 23298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 23308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 23318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 23325e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2333e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, false>(Thread* self, const DexFile::CodeItem* code_item, 23341452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 23351452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 23365e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate HOT_ATTR 2337e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, false>(Thread* self, const DexFile::CodeItem* code_item, 23381452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 23391452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 23405e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2341e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, true>(Thread* self, const DexFile::CodeItem* code_item, 23421452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 23431452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 23445e26eb1dc8ea89b2ebf4ce4b40cbe18542758fbdAndreas Gampetemplate 2345e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, true>(Thread* self, const DexFile::CodeItem* code_item, 23461452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 23471452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 23488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 23498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 23508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2351