interpreter_switch_impl.cc revision 8ece050d85fc244c72610244e440b0e00aa618fa
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 178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#include "interpreter_common.h" 188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace art { 208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertznamespace interpreter { 218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define HANDLE_PENDING_EXCEPTION() \ 238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CHECK(self->IsExceptionPending()); \ 258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, \ 268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->GetDexPc(insns), \ 278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz this_object_ref, \ 288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation); \ 298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (found_dex_pc == DexFile::kDexNoIndex) { \ 308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); /* Handled in caller. */ \ 318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t displacement = static_cast<int32_t>(found_dex_pc) - static_cast<int32_t>(dex_pc); \ 338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(displacement); \ 348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \ 388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(_is_exception_pending)) { \ 408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->_next_function(); \ 438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define PREAMBLE() 488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertztemplate<bool do_access_check> 508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertzstatic JValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShadowFrame& shadow_frame, JValue result_register) { 528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); 558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); 588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz // As the 'this' object won't change during the execution of current code, we 608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz // want to cache it in local variables. Nevertheless, in order to let the 618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz // garbage collector access it, we store it into sirt references. 628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz SirtRef<Object> this_object_ref(self, shadow_frame.GetThisObject(code_item->ins_size_)); 638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.. 668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { 678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation->MethodEnterEvent(self, this_object_ref.get(), 688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), 0); 698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* const insns = code_item->insns_; 728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz while (true) { 748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz dex_pc = inst->GetDexPc(insns); 758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetDexPC(dex_pc); 768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CheckSuspend(self); 788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasDexPcListeners())) { 808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation->DexPcMovedEvent(self, this_object_ref.get(), 818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), dex_pc); 828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz TraceExecution(shadow_frame, inst, dex_pc, mh); 848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz switch (inst->Opcode()) { 858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOP: 868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE: 908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_FROM16: 968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(), 988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_16: 1028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 1058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE: 1088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), 1108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 1118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_FROM16: 1148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(), 1168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 1178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_16: 1208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 1228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 1238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT: 1268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(), 1288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x())); 1298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_FROM16: 1328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(), 1348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 1358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_16: 1388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 1408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 1418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT: 1448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(), result_register.GetI()); 1468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_WIDE: 1498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(), result_register.GetJ()); 1518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_OBJECT: 1548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), result_register.GetL()); 1568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_EXCEPTION: { 1598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Throwable* exception = self->GetException(NULL); 1618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->ClearException(); 1628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), exception); 1638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_VOID: { 1678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 1698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 1708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 1718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 1738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 1758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_VOID_BARRIER: { 1778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ANDROID_MEMBAR_STORE(); 1798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 1808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 1818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 1828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 1848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 1868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN: { 1888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 1908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 1918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x())); 1928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 1938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 1948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 1968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 1988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_WIDE: { 2008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x())); 2038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 2048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 2058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 2078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_OBJECT: { 2118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 2148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetL(shadow_frame.GetVRegReference(inst->VRegA_11x())); 2158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 2168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 2178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 2198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 2238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t dst = inst->VRegA_11n(); 2258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int4_t val = inst->VRegB_11n(); 2268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 2278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 2288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 2298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 2348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint8_t dst = inst->VRegA_21s(); 2368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 2378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 2388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 2398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 2408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 2458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint8_t dst = inst->VRegA_31i(); 2478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 2488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 2498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 2508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 2518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 2568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint8_t dst = inst->VRegA_21h(); 2588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 2598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 2608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 2618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 2628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 2678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(), inst->VRegB_21s()); 2698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 2728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(), inst->VRegB_31i()); 2748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 2758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 2778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(), inst->VRegB_51l()); 2798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 2808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 2828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(), 2838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 2848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 2878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_21c()); 2898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(s == NULL)) { 2908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 2918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 2928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), s); 2938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 2988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_31c()); 3008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(s == NULL)) { 3018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_31c(), s); 3048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 3098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 3118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 3128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 3138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), c); 3168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 3218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 3238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 3248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 3258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoMonitorEnter(self, obj); 3288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 3298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 3338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 3358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 3368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 3378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoMonitorExit(self, obj); 3408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 3418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 3458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 3478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 3488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 3498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c()); 3528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 3538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 3548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 3628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(), 3648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 3658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 3668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 3698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22c(), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 3708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 3758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x()); 3778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(array == NULL)) { 3788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 3798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), array->AsArray()->GetLength()); 3828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 3838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 3878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* obj = AllocObjectFromCode(inst->VRegB_21c(), shadow_frame.GetMethod(), 3898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, do_access_check); 3908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 3918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), obj); 3948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 3998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c()); 4018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* obj = AllocArrayFromCode(inst->VRegC_22c(), shadow_frame.GetMethod(), 4028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz length, self, do_access_check); 4038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 4048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22c(), obj); 4078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 4128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFilledNewArray<false, do_access_check>(inst, shadow_frame, 4148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, &result_register); 4158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 4168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 4198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFilledNewArray<true, do_access_check>(inst, shadow_frame, 4218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, &result_register); 4228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 4238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 4268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t()); 4288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 4298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA"); 4308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Array* array = obj->AsArray(); 4348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 4358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 4368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 4378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 4388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 4398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 4408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz "Ljava/lang/ArrayIndexOutOfBoundsException;", 4418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz "failed FILL_ARRAY_DATA; length=%d, index=%d", 4428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetLength(), payload->element_count); 4438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t size_in_bytes = payload->element_count * payload->element_width; 4478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes); 4488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 4498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 4528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x()); 4548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(exception == NULL)) { 4558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerException(NULL, "throw with null exception"); 4568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->SetException(shadow_frame.GetCurrentLocationForThrow(), exception->AsThrowable()); 4588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegA_10t()); 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 4688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegA_20t()); 4708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 4738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegA_30t()); 4758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 4788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame); 4808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 4818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 4848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame); 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 4878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 4908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 4928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 4938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 4948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 4958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 4968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 4978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 4988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 5008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 5028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 5068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 5088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 5098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 5108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 5118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 5128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 5138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 5148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 5168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 5188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 5228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 5248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 5258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 5268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 5278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 5288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 5298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 5308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 5328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 5348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 5388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 5398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 5418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 5428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 5438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 5448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 5458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 5468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 5478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 5498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 5518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 5558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 5578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 5588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 5598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 5608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 5618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 5628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 5638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 5658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 5678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 5718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) == shadow_frame.GetVReg(inst->VRegB_22t())) { 5738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 5748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 5808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) != shadow_frame.GetVReg(inst->VRegB_22t())) { 5828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 5838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 5898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) < shadow_frame.GetVReg(inst->VRegB_22t())) { 5918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 5928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 5948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 5988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) >= shadow_frame.GetVReg(inst->VRegB_22t())) { 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 6078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) > shadow_frame.GetVReg(inst->VRegB_22t())) { 6098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 6108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 6168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) <= shadow_frame.GetVReg(inst->VRegB_22t())) { 6188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 6198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 6258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) == 0) { 6278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 6288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 6348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) != 0) { 6368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 6378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 6438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) < 0) { 6458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 6468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) >= 0) { 6548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 6558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 6618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) > 0) { 6638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 6648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 6708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) <= 0) { 6728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 6798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 6818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 6828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 6838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 6878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz BooleanArray* array = a->AsBooleanArray(); 6888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 6898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 6908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 6938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 6978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 6998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 7058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ByteArray* array = a->AsByteArray(); 7068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 7078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 7088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 7158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 7178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 7238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CharArray* array = a->AsCharArray(); 7248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 7258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 7268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 7338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 7358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 7368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 7418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShortArray* array = a->AsShortArray(); 7428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 7438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 7448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 7518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 7538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 7548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 7598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz IntArray* array = a->AsIntArray(); 7608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 7618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 7628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 7698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 7718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 7728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 7778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LongArray* array = a->AsLongArray(); 7788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 7798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), array->GetData()[index]); 7808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 7878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 7898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 7908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 7928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 7958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(), array->GetWithoutChecks(index)); 7988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 8058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 8088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 8098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 8138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz BooleanArray* array = a->AsBooleanArray(); 8158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 8168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetData()[index] = val; 8178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 8278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 8288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 8328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ByteArray* array = a->AsByteArray(); 8348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 8358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetData()[index] = val; 8368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 8438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 8468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 8478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 8518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CharArray* array = a->AsCharArray(); 8538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 8548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetData()[index] = val; 8558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 8628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 8658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 8668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 8708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShortArray* array = a->AsShortArray(); 8728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 8738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetData()[index] = val; 8748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 8818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 8848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 8858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz IntArray* array = a->AsIntArray(); 8918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 8928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetData()[index] = val; 8938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 9008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 9038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 9048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x()); 9088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LongArray* array = a->AsLongArray(); 9108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index))) { 9118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetData()[index] = val; 9128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 9198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 9228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 9238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x()); 9288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 9298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(array->IsValidIndex(index) && array->CheckAssignable(val))) { 9308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->SetWithoutChecks(index, val); 9318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 9388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 9408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 9468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 9508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 9528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 9568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 9588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 9628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 9648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 9688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 9708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 9748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 9768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 9808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 9828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 9868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 9888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 9928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 9948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 9958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 9988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BYTE: { 10048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 10068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_CHAR: { 10108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 10128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 10168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 10188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 10228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 10248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 10288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 10308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 10348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 10408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 10428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 10468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 10488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 10528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 10548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 10588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 10608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 10648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 10668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 10708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 10728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 10788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 10848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 10888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 10908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 10968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 10978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 11008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 11028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BYTE: { 11068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 11088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_CHAR: { 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 11148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 11188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 11208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 11248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 11268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 11308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 11328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 11368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 11388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 11428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, &result_register); 11448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 11488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, &result_register); 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 11548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, &result_register); 11568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, &result_register); 11628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, &result_register); 11688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 11728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, &result_register); 11748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 11788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, &result_register); 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, &result_register); 11868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 11908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, &result_register); 11928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 11968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, &result_register); 11988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 11998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 12028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvokeVirtualQuick<false>(self, shadow_frame, inst, &result_register); 12048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 12088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoInvokeVirtualQuick<true>(self, shadow_frame, inst, &result_register); 12108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 12148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), -shadow_frame.GetVReg(inst->VRegB_12x())); 12168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), ~shadow_frame.GetVReg(inst->VRegB_12x())); 12218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 12248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), -shadow_frame.GetVRegLong(inst->VRegB_12x())); 12268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 12298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), ~shadow_frame.GetVRegLong(inst->VRegB_12x())); 12318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 12348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), -shadow_frame.GetVRegFloat(inst->VRegB_12x())); 12368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 12398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), -shadow_frame.GetVRegDouble(inst->VRegB_12x())); 12418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 12448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 12468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 12498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 12518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 12548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 12568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 12598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 12618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 12648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 12668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 12698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 12718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 12748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 12768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 12778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val != val) { 12788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 12798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val > static_cast<float>(kMaxInt)) { 12808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = kMaxInt; 12818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val < static_cast<float>(kMinInt)) { 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = kMinInt; 12838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 12848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = val; 12858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 12878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 12888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 12918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 12938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t result; 12948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val != val) { 12958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 12968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val > static_cast<float>(kMaxLong)) { 12978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = kMaxLong; 12988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val < static_cast<float>(kMinLong)) { 12998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = kMinLong; 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 13018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = val; 13028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 13048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 13088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegFloat(inst->VRegB_12x())); 13108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 13168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val != val) { 13178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 13188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val > static_cast<double>(kMaxInt)) { 13198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = kMaxInt; 13208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val < static_cast<double>(kMinInt)) { 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = kMinInt; 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 13238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = val; 13248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 13268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 13308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 13328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t result; 13338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val != val) { 13348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 13358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val > static_cast<double>(kMaxLong)) { 13368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = kMaxLong; 13378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val < static_cast<double>(kMinLong)) { 13388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = kMinLong; 13398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 13408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = val; 13418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 13438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 13478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegDouble(inst->VRegB_12x())); 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 13528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 13548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 13558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 13588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 13608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 13618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 13648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 13668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 13678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT: 13708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 13728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) + 13738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 13748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 13758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 13778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 13798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) - 13808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 13818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 13828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 13848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 13868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) * 13878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 13888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 13898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 13918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(), 13938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 13948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 13958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 13998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(), 14018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 14028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 14038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 14048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 14078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 14098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 14108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 14118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 14148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 14168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 14178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 14218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 14238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 14248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 14258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 14288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 14308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 14318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 14328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 14358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 14378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 14388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 14398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 14428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 14448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 14458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 14468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 14498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 14518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) + 14528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 14538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 14568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 14588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) - 14598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 14608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 14638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 14658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) * 14668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 14678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 14708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(), 14728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 14738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 14748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 14758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 14778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(), 14798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 14808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 14818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 14828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 14848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 14868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 14878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 14888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 14918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 14938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 14948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 14968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 14988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 15008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 15018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 15028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 15058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 15078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 15088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 15098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 15128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 15148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 15158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 15168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 15198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 15218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 15228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 15238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 15268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 15288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 15298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 15308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 15338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 15358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 15368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 15378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 15408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 15428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 15438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 15448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 15478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 15498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 15508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 15518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 15548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 15568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 15578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 15618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 15638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 15648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 15688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 15708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 15718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 15758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 15778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 15788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 15828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 15858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 15898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 15928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 15938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 15968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 15988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 15998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) + 16008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 16018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 16058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) - 16098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 16108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 16178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) * 16188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 16198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 16238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 16268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 16278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 16288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 16318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 16348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 16358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 16368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 16398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 16438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 16448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 16488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 16518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 16528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 16538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 16578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 16608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 16618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 16628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 16668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 16698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 16758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 16788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 16798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 16808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 16878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 16888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 16898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 16928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 16938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 16958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 16968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) + 16978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 16988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 16998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 17028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 17058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) - 17068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 17078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 17118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 17148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) * 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 17168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 17208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 17238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 17258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 17288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 17318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 17328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 17368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 17398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 17498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 17508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 17578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 17588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 17598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 17638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 17668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 17678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 17688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 17728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 17758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 17768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 17778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 17818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 17848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 17858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 17868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 17928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 17938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 17958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 18048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 18088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 18118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 18128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 18138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 18218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 18228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 18268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 18298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 18308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x()))); 18318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 18358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 18408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 18478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 18488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 18498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 18538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 18568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 18578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 18588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 18628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 18658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 18678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint4_t vregA = inst->VRegA_12x(); 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 18758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x()))); 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) + 18838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 18848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT: 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 18898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s() - 18908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s())); 18918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 18968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) * 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 18988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 19018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(), 19038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 19048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(), 19108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) & 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 19198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 19228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 19248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) | 19258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 19268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 19298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 19318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) ^ 19328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 19338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 19368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) + 19398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 19408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 19438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b() - 19468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b())); 19478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 19508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 19528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) * 19538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 19548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(), 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 19608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 19648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(), 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 19678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 19738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 19748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 19758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 19828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 19888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 19898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 19958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 19968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 19978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 20028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 20038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 20068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 20098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 20108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_EB ... Instruction::UNUSED_FF: 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_79: 20158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_7A: 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz UnexpectedOpcode(inst, mh); 20178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 20218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 20228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertztemplate JValue ExecuteSwitchImpl<true>(Thread* self, MethodHelper& mh, 20238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const DexFile::CodeItem* code_item, 20248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 20258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertztemplate JValue ExecuteSwitchImpl<false>(Thread* self, MethodHelper& mh, 20268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const DexFile::CodeItem* code_item, 20278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 20308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2031