interpreter_switch_impl.cc revision 274fe4adcb0610a9920be7814d9beb9cac6417ce
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 176918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin#include "base/stl_util.h" // MakeUnique 18eb7c144a6aff7da673ba53d501c46f00311d4d7fAlex Light#include "experimental_flags.h" 198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#include "interpreter_common.h" 20b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#include "jit/jit.h" 21f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers#include "safe_math.h" 228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 236918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin#include <memory> // std::unique_ptr 246918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace art { 268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace interpreter { 278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define HANDLE_PENDING_EXCEPTION() \ 298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 3082aeddb83c58db5fe1e227de574eb8ced4fc6130Sebastien Hertz DCHECK(self->IsExceptionPending()); \ 317b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); \ 328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, \ 338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->GetDexPc(insns), \ 348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation); \ 358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (found_dex_pc == DexFile::kDexNoIndex) { \ 3603ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe /* Structured locking is to be enforced for abnormal termination, too. */ \ 3703ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe shadow_frame.GetLockCountData(). \ 3803ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe CheckAllMonitorsReleasedOrThrow<do_assignability_check>(self); \ 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() \ 6003ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe if (!shadow_frame.GetLockCountData(). \ 6103ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe CheckAllMonitorsReleasedOrThrow<do_assignability_check>(self)) { \ 6203ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe HANDLE_PENDING_EXCEPTION(); \ 6303ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe } 6403ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe 658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 668379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz#define PREAMBLE() \ 678379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz do { \ 689d6bf69ad3012a9d843268fdd5325b6719b6d5f2Sebastien Hertz if (UNLIKELY(instrumentation->HasDexPcListeners())) { \ 698379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), \ 708379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz shadow_frame.GetMethod(), dex_pc); \ 718379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } \ 728379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } while (false) 738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 74b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray#define BRANCH_INSTRUMENTATION(offset) \ 75b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray do { \ 76274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (UNLIKELY(instrumentation->HasBranchListeners())) { \ 77274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray instrumentation->Branch(self, method, dex_pc, offset); \ 78274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray } \ 79b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray JValue result; \ 80b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray if (jit::Jit::MaybeDoOnStackReplacement(self, method, dex_pc, offset, &result)) { \ 8193e94f228f7a9ec5c2a29553010e585d583ac530buzbee if (interpret_one_instruction) { \ 8293e94f228f7a9ec5c2a29553010e585d583ac530buzbee /* OSR has completed execution of the method. Signal mterp to return to caller */ \ 8393e94f228f7a9ec5c2a29553010e585d583ac530buzbee shadow_frame.SetDexPC(DexFile::kDexNoIndex); \ 8493e94f228f7a9ec5c2a29553010e585d583ac530buzbee } \ 85b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray return result; \ 86b331febbab8e916680faba722cc84b66b84218a3Nicolas Geoffray } \ 873108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray } while (false) 883108daf19ab1e8e9a5ebf980df1db84cef54770bNicolas Geoffray 891d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee#define HOTNESS_UPDATE() \ 901d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee do { \ 91274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray if (jit != nullptr) { \ 92274fe4adcb0610a9920be7814d9beb9cac6417ceNicolas Geoffray jit->AddSamples(self, method, 1); \ 931d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } \ 941d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee } while (false) 951d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee 96158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkinstatic bool IsExperimentalInstructionEnabled(const Instruction *inst) { 97158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin DCHECK(inst->IsExperimental()); 98eb7c144a6aff7da673ba53d501c46f00311d4d7fAlex Light return Runtime::Current()->AreExperimentalFlagsEnabled(ExperimentalFlags::kLambdas); 99158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin} 100158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 101d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool do_access_check, bool transaction_active> 102e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, 1031452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 1041452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction) { 105c449e8b79aaaf156ce055524c41474cc1200ed5aIgor Murashkin constexpr bool do_assignability_check = do_access_check; 1068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 1078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 1088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); 1098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 1118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 1128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 1132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier const auto* const instrumentation = Runtime::Current()->GetInstrumentation(); 1148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* const insns = code_item->insns_; 1158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 1163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t inst_data; 1171d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee ArtMethod* method = shadow_frame.GetMethod(); 1181d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee jit::Jit* jit = Runtime::Current()->GetJit(); 1196918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 1206918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin // TODO: collapse capture-variable+create-lambda into one opcode, then we won't need 1216918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin // to keep this live for the scope of the entire function call. 1226918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin std::unique_ptr<lambda::ClosureBuilder> lambda_closure_builder; 1236918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin size_t lambda_captured_variable_index = 0; 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(); 20514691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray Throwable* exception = self->GetException(); 206270a0e16c3b8e5b95cbfdbd8996ac137c7c6322bSebastien Hertz DCHECK(exception != nullptr) << "No pending exception on MOVE_EXCEPTION instruction"; 2073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception); 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); 286bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier Object* obj_result = shadow_frame.GetVRegReference(ref_idx); 2872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (do_assignability_check && obj_result != nullptr) { 28805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko size_t pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize(); 28905792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko Class* return_type = shadow_frame.GetMethod()->GetReturnType(true /* resolve */, 29005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko 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; 3000aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray self->ThrowNewExceptionF("Ljava/lang/VirtualMachineError;", 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(); 3866786a58659420c0631a1ebe1f2fde434b8bcd1e4Ian Rogers String* s = ResolveString(self, shadow_frame, inst->VRegB_21c()); 3872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 3888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s); 3918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 3968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3976786a58659420c0631a1ebe1f2fde434b8bcd1e4Ian Rogers String* s = ResolveString(self, shadow_frame, inst->VRegB_31c()); 3982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(s == nullptr)) { 3998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s); 4028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 4078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 4098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 4102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c); 4148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 4198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 4212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 4220aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 42503ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorEnter<do_assignability_check>(self, &shadow_frame, obj); 4268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 4278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 4318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 4332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 4340aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 43703ec930faded5bbfa096533ce60b6893847922dbAndreas Gampe DoMonitorExit<do_assignability_check>(self, &shadow_frame, obj); 4388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 4398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 4438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 4458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 4462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 4502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj != nullptr && !obj->InstanceOf(c))) { 4518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 4528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 4608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(), 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 4632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(c == nullptr)) { 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 4672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_22c(inst_data), 4682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier (obj != nullptr && obj->InstanceOf(c)) ? 1 : 0); 4698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 4748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 4762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(array == nullptr)) { 4770aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 4788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 4818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 4828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 487848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao Object* obj = nullptr; 488848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 489848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao self, false, do_access_check); 490848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (LIKELY(c != nullptr)) { 491848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao if (UNLIKELY(c->IsStringClass())) { 492848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator(); 493848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao mirror::SetStringCountVisitor visitor(0); 494848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao obj = String::Alloc<true>(self, 0, allocator_type, visitor); 495848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } else { 496848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao obj = AllocObjectFromCode<do_access_check, true>( 497848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao inst->VRegB_21c(), shadow_frame.GetMethod(), self, 498848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao Runtime::Current()->GetHeap()->GetCurrentAllocator()); 499848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 500848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao } 5012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5044e99b3d8955131f3fc71aa113f0fa71f0092cb6fSebastien Hertz obj->GetClass()->AssertInitializedOrInitializingInThread(self); 505b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 506b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 507b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 50845b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz AbortTransactionF(self, "Allocating finalizable object in transaction: %s", 50945b1597c152af90f6d5792d02b64fd4e7c81ac9dSebastien Hertz PrettyTypeOf(obj).c_str()); 510b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 511b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 512b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 5133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj); 5148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 5198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 521cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Object* obj = AllocArrayFromCode<do_access_check, true>( 5221cc7dbabd03e0a6c09d68161417a21bd6f9df371Andreas Gampe inst->VRegC_22c(), length, shadow_frame.GetMethod(), self, 523cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 5242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(obj == nullptr)) { 5258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj); 5288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 5338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 534d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 535d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 536d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 5378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 5388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 5418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 542d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 543d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 544d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 5458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 5468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 5498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 5518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 5528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 553832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 554832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers bool success = FillArrayData(obj, payload); 555832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers if (!success) { 5568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 559d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 560832336b3c9eb892045a8de1bb12c9361112ca3c5Ian Rogers RecordArrayElementsInTransaction(obj->AsArray(), payload->element_count); 561d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 5628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 5638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 5668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(exception == nullptr)) { 5690aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerException("throw with null exception"); 570a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 571a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 5721ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers std::string temp; 5730aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray self->ThrowNewExceptionF("Ljava/lang/VirtualMachineError;", 574a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 5751ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers exception->GetClass()->GetDescriptor(&temp)); 5768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 57714691c5e786e8c2c5734f687e4c96217340771beNicolas Geoffray self->SetException(exception->AsThrowable()); 5788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 5838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 58581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 5861eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5871d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 5887b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 5891eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 5918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 5948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5951eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 59681f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 5971eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5981d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 5997b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 6001eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6011eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 6028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 6058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6061eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 60781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6081eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 6091d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 6107b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 6111eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6121eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 6138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 6168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 61881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6191eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 6201d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 6217b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 6221eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 6248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 6278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 62981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 6301eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 6311d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 6327b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 6331eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 6358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 637647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 638647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#if defined(__clang__) 639647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic push 640647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic ignored "-Wfloat-equal" 641647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#endif 642647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 6438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 6448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 6608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 6768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 6928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 6938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 708647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 709647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#if defined(__clang__) 710647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#pragma clang diagnostic pop 711647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers#endif 712647b1a86f518d8db0331b3d52a96392b7a62504bIan Rogers 7138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 7148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 7168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 7178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 7228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 7248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 7268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 7308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == 7322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7331eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 73481f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7351eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7361d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 7377b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 7381eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7391eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 741f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 7478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != 7492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7501eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 75181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7521eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7531d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 7547b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 7551eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7561eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 758f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 7648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < 7662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7671eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 76881f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7691eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7701d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 7717b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 7721eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7731eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 775f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 7818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= 7832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7841eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 78581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 7861eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7871d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 7887b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 7891eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 792f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 7938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 7988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > 8002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8011eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 80281f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8031eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8041d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 8057b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 8061eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8071eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(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_LE: { 8158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8162cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= 8172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 8181eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 81981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8201eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8211d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 8227b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 8231eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8241eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 826f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 8328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 8341eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 83581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8361eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8371d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 8387b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 8391eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8401eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 842f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 8488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 8501eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 85181f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8521eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8531d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 8547b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 8551eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8561eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 858f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 8661eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 86781f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 8681eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8691d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 8707b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 8711eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8721eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(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_GEZ: { 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 if (IsBackwardBranch(offset)) { 8851d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 8867b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 8871eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8881eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 890f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 8918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 8968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 8981eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 89981f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9001eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 9011d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 9027b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 9031eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 9041eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 9058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 906f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 9128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 9141eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 91581f0f953c4bb159997046c962d44cb1898b1778dNicolas Geoffray BRANCH_INSTRUMENTATION(offset); 9161eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 9171d011d9306fd4ff57d72411775d415a86f5ed398Bill Buzbee HOTNESS_UPDATE(); 9187b078e8c04f3e1451dbdd18543c8b9692b5b067eIan Rogers self->AllowThreadSuspension(); 9191eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 9201eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 9218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 922f1dcaccfac4a9e022ea49752a774552b2f791489buzbee BRANCH_INSTRUMENTATION(2); 9238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 9288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9310aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz BooleanArray* array = a->AsBooleanArray(); 937b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 938abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 9468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9482cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9490aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ByteArray* array = a->AsByteArray(); 955b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 956abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 9648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9670aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CharArray* array = a->AsCharArray(); 973b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 974abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 9828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9842cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 9850aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 9868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShortArray* array = a->AsShortArray(); 991b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 992abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10030aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1008e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier DCHECK(a->IsIntArray() || a->IsFloatArray()) << PrettyTypeOf(a); 1009e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier auto* array = down_cast<IntArray*>(a); 1010b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1011abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10220aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1027e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier DCHECK(a->IsLongArray() || a->IsDoubleArray()) << PrettyTypeOf(a); 1028e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier auto* array = down_cast<LongArray*>(a); 1029b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1030abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10410aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 1047b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 10483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 10498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10590aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz BooleanArray* array = a->AsBooleanArray(); 1066b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1067d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10772cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10780aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ByteArray* array = a->AsByteArray(); 1085b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1086d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 10970aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 10988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CharArray* array = a->AsCharArray(); 1104b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1105d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 11138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11152cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11160aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 11228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShortArray* array = a->AsShortArray(); 1123b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1124d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 11328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11350aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 11408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1141e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier DCHECK(a->IsIntArray() || a->IsFloatArray()) << PrettyTypeOf(a); 1142e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier auto* array = down_cast<IntArray*>(a); 1143b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1144d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 11528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11550aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 1161e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier DCHECK(a->IsLongArray() || a->IsDoubleArray()) << PrettyTypeOf(a); 1162e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier LongArray* array = down_cast<LongArray*>(a); 1163b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1164d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 11728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(a == nullptr)) { 11750aa50ce2fb75bfc2e815a0c33adf9b049561923bNicolas Geoffray ThrowNullPointerExceptionFromInterpreter(); 11768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 11803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 11818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 1182b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1183d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 11918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, 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_BYTE: { 11988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11992cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, 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_CHAR: { 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12062cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>( 12072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 12128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12132cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>( 12142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12202cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>( 12212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 12268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>( 12282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 12338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12342cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>( 12352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 12408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 12428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 12468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 12488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 12548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1257ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BOOLEAN_QUICK: { 1258ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1259ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimBoolean>(shadow_frame, inst, inst_data); 1260ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1261ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1262ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1263ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_BYTE_QUICK: { 1264ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1265ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimByte>(shadow_frame, inst, inst_data); 1266ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1267ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1268ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1269ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_CHAR_QUICK: { 1270ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1271ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimChar>(shadow_frame, inst, inst_data); 1272ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1273ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1274ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 1275ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier case Instruction::IGET_SHORT_QUICK: { 1276ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier PREAMBLE(); 1277ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier bool success = DoIGetQuick<Primitive::kPrimShort>(shadow_frame, inst, inst_data); 1278ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 1279ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier break; 1280ffc605cd817e79d6c7602a87543bb31f24d3a99fMathieu Chartier } 12818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12832cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, 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_BYTE: { 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12902cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, 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::SGET_CHAR: { 12968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12972cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>( 12982cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 12998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 13038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13042cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>( 13052cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 13108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13112cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>( 13122cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 13178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13182cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>( 13192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 13248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13252cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>( 13262cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data); 13278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 13318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13322cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, 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_BYTE: { 13388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13392cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, 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_CHAR: { 13458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13462cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, 13472cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 13528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13532cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, 13542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 13598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, 13612cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 13668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13672cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, 13682cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 13738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13742cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, 13752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 13768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 13808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>( 13822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 13838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 138637f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BOOLEAN_QUICK: { 138737f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimBoolean, transaction_active>( 13892cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 139037f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 139137f05ef45e0393de812d51261dc293240c17294dFred Shih break; 139237f05ef45e0393de812d51261dc293240c17294dFred Shih } 139337f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_BYTE_QUICK: { 139437f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 13952cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimByte, transaction_active>( 13962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 139737f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 139837f05ef45e0393de812d51261dc293240c17294dFred Shih break; 139937f05ef45e0393de812d51261dc293240c17294dFred Shih } 140037f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_CHAR_QUICK: { 140137f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14022cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimChar, transaction_active>( 14032cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 140437f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 140537f05ef45e0393de812d51261dc293240c17294dFred Shih break; 140637f05ef45e0393de812d51261dc293240c17294dFred Shih } 140737f05ef45e0393de812d51261dc293240c17294dFred Shih case Instruction::IPUT_SHORT_QUICK: { 140837f05ef45e0393de812d51261dc293240c17294dFred Shih PREAMBLE(); 14092cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimShort, transaction_active>( 14102cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 141137f05ef45e0393de812d51261dc293240c17294dFred Shih POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 141237f05ef45e0393de812d51261dc293240c17294dFred Shih break; 141337f05ef45e0393de812d51261dc293240c17294dFred Shih } 14148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 14158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14162cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>( 14172cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 14228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14232cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>( 14242cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame, inst, inst_data); 14258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 14298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, 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_BYTE: { 14368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, 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::SPUT_CHAR: { 14438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14442cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, 14452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 14508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, 14522cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 14578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14582cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, 14592cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 14648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14652cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, 14662cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 14718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14722cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, 14732cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier transaction_active>(self, shadow_frame, inst, inst_data); 14748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 14788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, false, 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_VIRTUAL_RANGE: { 14858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kVirtual, true, 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_SUPER: { 14928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, false, 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_SUPER_RANGE: { 14998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15002cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kSuper, true, 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_DIRECT: { 15068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15072cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, false, 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_DIRECT_RANGE: { 15138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15142cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kDirect, true, do_access_check>( 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_INTERFACE: { 15208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15212cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, false, do_access_check>( 15222cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 15278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15282cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kInterface, true, do_access_check>( 15292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 15348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, false, do_access_check>( 15362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 15418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvoke<kStatic, true, do_access_check>( 15432cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 15488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15492cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<false>( 15502cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 15558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15562cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier bool success = DoInvokeVirtualQuick<true>( 15572cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier self, shadow_frame, inst, inst_data, &result_register); 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 15628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15632cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 15642cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 15688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15692cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg( 15702cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 15718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 15748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15752cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 15762cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 15778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15812cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegLong( 15822cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 15838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegFloat( 15882cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 15898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 15928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15932cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVRegDouble( 15942cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 15958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 15988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1599450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1600450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 16048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1605450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1606450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 16108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1611450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1612450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 16138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 16168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1617450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1618450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1623450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1624450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 16288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1629450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1630450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 16318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 16348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1636450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 16373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 16388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1644450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 16453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 16468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1651450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1652450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 16538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1658450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 16593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 16608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1666450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 16673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 16688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 16728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1673450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1674450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 16758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 16788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16792cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int8_t>( 16802cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16852cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<uint16_t>( 16862cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 16908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.SetVReg(inst->VRegA_12x(inst_data), static_cast<int16_t>( 16922cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 16938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1695f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::ADD_INT: { 16968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1698f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_23x()), 1699f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1702f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers } 17038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 17048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1706f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(inst->VRegB_23x()), 1707f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 17118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 1713f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_23x()), 1714f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegC_23x()))); 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 17208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 17238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 17268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 17288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 17318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 17348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 17378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 17388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 17448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 17518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 17528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 17558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 17588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 17628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 17658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 17728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 17738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 17768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1778f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1779f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 17808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1785f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1786f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 17878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 1792f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(inst->VRegB_23x()), 1793f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x()))); 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 1800f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegC_23x())); 18018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 18048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 18068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 18078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 18098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 18118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 18148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 18188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 18218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 18288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 18298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 18358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 18368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 18428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 18438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 18468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 18488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 18498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 18508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 18538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 18568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 18638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 18678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 18708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 18778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 18788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 18838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 18848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 18858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 18908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 18918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 18928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 18958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 18988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 19058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 19128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 19138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 19168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 19198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 1925f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.SetVReg(vregA, SafeAdd(shadow_frame.GetVReg(vregA), 1926f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 19318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 1934f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVReg(vregA), 1935f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 19408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 1943f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(vregA), 1944f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 19498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19503b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 19523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 19548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 19603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 19693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 19748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 19783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 19873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 19888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 19958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 19963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 19978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 20053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 20108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 20143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 20158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 20198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2022f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVRegLong(vregA), 2023f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20293b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2031f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(shadow_frame.GetVRegLong(vregA), 2032f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 20378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 2040f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVRegLong(vregA), 2041f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data)))); 20428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 20493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 20518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 20548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 20573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 20598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 20628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 20663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 20718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 20753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 20808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 20843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 20858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 20898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 20928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 20933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 20948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 20988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20993b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 21023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 21038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 21078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 21108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 21113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 21128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 21168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 21203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 21258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 21293b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 21348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 21383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 21438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 21473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 21488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 21528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21533b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 21558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 21563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 21578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 21618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 21653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 21708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 21743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 21798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 21833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 21888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 21918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 21923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 21938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 21948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 21978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 21998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 22008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 22013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 22028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 22038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 22068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2208f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2209f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 22108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2212f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers case Instruction::RSUB_INT_LIT16: 22138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2215f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22s(), 2216f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers shadow_frame.GetVReg(inst->VRegB_22s(inst_data)))); 22178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 22208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 2222f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 2223f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers inst->VRegC_22s())); 22248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 22278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 22292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 22302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 22318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 22358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 22372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), 22382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier inst->VRegC_22s()); 22398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 22438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 22453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 22468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 22478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 22508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 22523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 22538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 22548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 22578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 22593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ 22608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 22618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 22648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2266f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeAdd(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 22678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 22708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2272f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeSub(inst->VRegC_22b(), shadow_frame.GetVReg(inst->VRegB_22b()))); 22738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 22768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 2278f72a11dd4b0dd86bc4b1baa37bfa47fc8d5572b5Ian Rogers SafeMul(shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b())); 22798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 22808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 22828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 22848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 22858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 22898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 22918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 22928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 22938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 22948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 22958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 22968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 22973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 22988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 22998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 23038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 23068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 23108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 23138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 23148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 23178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 23208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 23218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 23248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 23278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 23288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 23308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 23318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 23323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 23338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 23348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 23358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 23368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2337158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin case Instruction::INVOKE_LAMBDA: { 2338158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin if (!IsExperimentalInstructionEnabled(inst)) { 2339158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin UnexpectedOpcode(inst, shadow_frame); 2340158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin } 2341158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 2342158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin PREAMBLE(); 2343158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin bool success = DoInvokeLambda<do_access_check>(self, shadow_frame, inst, inst_data, 2344158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin &result_register); 2345158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 2346158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin break; 2347158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin } 23486918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin case Instruction::CAPTURE_VARIABLE: { 23496918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin if (!IsExperimentalInstructionEnabled(inst)) { 23506918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin UnexpectedOpcode(inst, shadow_frame); 23516918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin } 23526918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 23536918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin if (lambda_closure_builder == nullptr) { 23546918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin lambda_closure_builder = MakeUnique<lambda::ClosureBuilder>(); 23556918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin } 23566918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 23576918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin PREAMBLE(); 23586918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin bool success = DoCaptureVariable<do_access_check>(self, 23596918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin inst, 23606918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin /*inout*/shadow_frame, 23616918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin /*inout*/lambda_closure_builder.get()); 23626918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23636918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin break; 23646918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin } 2365158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin case Instruction::CREATE_LAMBDA: { 2366158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin if (!IsExperimentalInstructionEnabled(inst)) { 2367158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin UnexpectedOpcode(inst, shadow_frame); 2368158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin } 2369158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 2370158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin PREAMBLE(); 23716918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 23726918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin if (lambda_closure_builder == nullptr) { 23736918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin // DoCreateLambda always needs a ClosureBuilder, even if it has 0 captured variables. 23746918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin lambda_closure_builder = MakeUnique<lambda::ClosureBuilder>(); 23756918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin } 23766918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 23776918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin // TODO: these allocations should not leak, and the lambda method should not be local. 23786918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin lambda::Closure* lambda_closure = 23796918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin reinterpret_cast<lambda::Closure*>(alloca(lambda_closure_builder->GetSize())); 23806918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin bool success = DoCreateLambda<do_access_check>(self, 23816918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin inst, 23826918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin /*inout*/shadow_frame, 23836918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin /*inout*/lambda_closure_builder.get(), 23846918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin /*inout*/lambda_closure); 23856918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin lambda_closure_builder.reset(nullptr); // reset state of variables captured 23866918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 23876918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin break; 23886918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin } 23896918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin case Instruction::LIBERATE_VARIABLE: { 23906918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin if (!IsExperimentalInstructionEnabled(inst)) { 23916918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin UnexpectedOpcode(inst, shadow_frame); 23926918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin } 23936918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin 23946918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin PREAMBLE(); 23956918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin bool success = DoLiberateVariable<do_access_check>(self, 23966918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin inst, 23976918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin lambda_captured_variable_index, 23986918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin /*inout*/shadow_frame); 23996918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin // Temporarily only allow sequences of 'liberate-variable, liberate-variable, ...' 24006918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin lambda_captured_variable_index++; 2401158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 2402158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin break; 2403158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin } 24046918bf13eb855b3aa8ccdddda2d27ae8c60cec56Igor Murashkin case Instruction::UNUSED_F4: { 2405158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin if (!IsExperimentalInstructionEnabled(inst)) { 2406158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin UnexpectedOpcode(inst, shadow_frame); 2407158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin } 2408158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin 2409158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin CHECK(false); // TODO(iam): Implement opcodes for lambdas 2410158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin break; 2411158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin } 24122ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin case Instruction::BOX_LAMBDA: { 24132ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin if (!IsExperimentalInstructionEnabled(inst)) { 24142ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin UnexpectedOpcode(inst, shadow_frame); 24152ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin } 24162ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 24172ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin PREAMBLE(); 24182ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin bool success = DoBoxLambda<do_access_check>(self, shadow_frame, inst, inst_data); 24192ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 24202ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin break; 24212ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin } 24222ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin case Instruction::UNBOX_LAMBDA: { 24232ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin if (!IsExperimentalInstructionEnabled(inst)) { 24242ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin UnexpectedOpcode(inst, shadow_frame); 24252ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin } 24262ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin 24272ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin PREAMBLE(); 24282ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin bool success = DoUnboxLambda<do_access_check>(self, shadow_frame, inst, inst_data); 24292ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 24302ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin break; 24312ee54e249ad21c74f29a161e248bebe7d22fddf1Igor Murashkin } 24328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 2433158f35c98e2ec0d40d2c032b8cdce5fb60944a7fIgor Murashkin case Instruction::UNUSED_FA ... Instruction::UNUSED_FF: 24348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_79: 24358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_7A: 2436e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian Rogers UnexpectedOpcode(inst, shadow_frame); 24378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 24381452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee } while (!interpret_one_instruction); 24391452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee // Record where we stopped. 24401452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee shadow_frame.SetDexPC(inst->GetDexPc(insns)); 2441d6b48dbe715fbf1431394d2b6ef75cb19a4012ddbuzbee return result_register; 24428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 24438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 24448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 244590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartiertemplate SHARED_REQUIRES(Locks::mutator_lock_) HOT_ATTR 2446e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, false>(Thread* self, const DexFile::CodeItem* code_item, 24471452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24481452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 244990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartiertemplate SHARED_REQUIRES(Locks::mutator_lock_) HOT_ATTR 2450e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, false>(Thread* self, const DexFile::CodeItem* code_item, 24511452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24521452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 245390443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartiertemplate SHARED_REQUIRES(Locks::mutator_lock_) 2454e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<true, true>(Thread* self, const DexFile::CodeItem* code_item, 24551452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24561452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 245790443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartiertemplate SHARED_REQUIRES(Locks::mutator_lock_) 2458e94652f1e321b2c8b71acbe5b07d2ebf69fbdb99Ian RogersJValue ExecuteSwitchImpl<false, true>(Thread* self, const DexFile::CodeItem* code_item, 24591452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee ShadowFrame& shadow_frame, JValue result_register, 24601452bee8f06b9f76a333ddf4760e4beaa82f8099buzbee bool interpret_one_instruction); 24618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 24628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 24638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2464