interpreter_switch_impl.cc revision 3c5aec1da27d8068e6bb97202d12efad6b4331df
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 { \ 2482aeddb83c58db5fe1e227de574eb8ced4fc6130Sebastien Hertz DCHECK(self->IsExceptionPending()); \ 251eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { \ 261eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); \ 271eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } \ 28947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz Object* this_object = shadow_frame.GetThisObject(code_item->ins_size_); \ 298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, \ 308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->GetDexPc(insns), \ 31947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz this_object, \ 328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation); \ 338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (found_dex_pc == DexFile::kDexNoIndex) { \ 348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); /* Handled in caller. */ \ 358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t displacement = static_cast<int32_t>(found_dex_pc) - static_cast<int32_t>(dex_pc); \ 378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(displacement); \ 388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \ 428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(_is_exception_pending)) { \ 448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->_next_function(); \ 478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 518379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz#define PREAMBLE() \ 528379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz do { \ 538379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz DCHECK(!inst->IsReturn()); \ 548379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz if (UNLIKELY(notified_method_entry_event)) { \ 558379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz notified_method_entry_event = false; \ 568379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { \ 578379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), \ 588379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz shadow_frame.GetMethod(), dex_pc); \ 598379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } \ 608379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } while (false) 618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 62d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool do_access_check, bool transaction_active> 63c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien HertzJValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 648379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) { 65a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao bool do_assignability_check = do_access_check; 668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); 698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 738379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz bool notified_method_entry_event = false; 74947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz const instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); 758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.. 768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { 77947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), 0); 798379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz notified_method_entry_event = true; 808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* const insns = code_item->insns_; 838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t inst_data; 858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz while (true) { 868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz dex_pc = inst->GetDexPc(insns); 878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetDexPC(dex_pc); 888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz TraceExecution(shadow_frame, inst, dex_pc, mh); 893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz inst_data = inst->Fetch16(0); 903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz switch (inst->Opcode(inst_data)) { 918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOP: 928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE: 968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_FROM16: 1028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(inst_data), 1048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 1058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_16: 1088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 1118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE: 1148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 1178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_FROM16: 1208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data), 1228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 1238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_16: 1268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 1288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 1298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT: 1328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data), 1343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data))); 1358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_FROM16: 1388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data), 1408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 1418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_16: 1448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 1468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 1478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT: 1508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI()); 1528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_WIDE: 1558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ()); 1578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_OBJECT: 1608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL()); 1628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_EXCEPTION: { 1658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1665c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz Throwable* exception = self->GetException(nullptr); 1673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception); 1685c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz self->ClearException(); 1698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_VOID: { 1738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 174043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz if (do_access_check) { 175043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz // If access checks are required then the dex-to-dex compiler and analysis of 176043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz // whether the class has final fields hasn't been performed. Conservatively 177043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz // perform the memory barrier now. 178b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers QuasiAtomic::MembarStoreLoad(); 179043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz } 1801eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 1811eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 1821eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 1838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 184947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 1858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 187e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 188e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 189e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 1908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 1928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_VOID_BARRIER: { 194b122a4bbed34ab22b4c1541ee25e5cf22f12a926Ian Rogers QuasiAtomic::MembarStoreLoad(); 1958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 1961eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 1971eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 1981eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 1998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 200947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 203e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 204e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 205e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 2068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN: { 2108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 2123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data))); 2131eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 2141eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 2151eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 2168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 217947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 220e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 221e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 222e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 2238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_WIDE: { 2278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data))); 2291eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 2301eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 2311eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 2328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 233947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 236e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 237e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 238e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 2398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_OBJECT: { 2438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2441eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 2451eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 2461eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 247e861ebd5d9490cc86200f3859f3d36fadad4588cMathieu Chartier Object* obj_result = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 248e861ebd5d9490cc86200f3859f3d36fadad4588cMathieu Chartier result.SetJ(0); 249e861ebd5d9490cc86200f3859f3d36fadad4588cMathieu Chartier result.SetL(obj_result); 250a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (do_assignability_check && obj_result != NULL) { 251a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao Class* return_type = MethodHelper(shadow_frame.GetMethod()).GetReturnType(); 252a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (return_type == NULL) { 253a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // Return the pending exception. 254a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 255a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 256a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (!obj_result->VerifierInstanceOf(return_type)) { 257a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 258a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao self->ThrowNewExceptionF(self->GetCurrentLocationForThrow(), 259a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Ljava/lang/VirtualMachineError;", 260a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Returning '%s' that is not instance of return type '%s'", 261f832284dd847ff077577bb5712225430bbbb3b67Mathieu Chartier obj_result->GetClass()->GetDescriptor().c_str(), 262f832284dd847ff077577bb5712225430bbbb3b67Mathieu Chartier return_type->GetDescriptor().c_str()); 263a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 264a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 265a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 2668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 267947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 270e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 271e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 272e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 2738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 2778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t dst = inst->VRegA_11n(inst_data); 2793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int4_t val = inst->VRegB_11n(inst_data); 2808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 2818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 2828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 2838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 2888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21s(inst_data); 2908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 2918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 2928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 2938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 2948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 2998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_31i(inst_data); 3018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 3028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 3058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 3108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21h(inst_data); 3128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 3138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 3168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 3218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); 3238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 3268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); 3288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 3318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); 3338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 3348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 3363c5aec1da27d8068e6bb97202d12efad6b4331dfSebastien Hertz PREAMBLE(); 3373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), 3388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 3398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 3428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_21c()); 3448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(s == NULL)) { 3458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s); 3488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 3538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_31c()); 3558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(s == NULL)) { 3568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s); 3598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 3648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 3668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 3678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 3688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c); 3718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 3768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 3788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 379da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 3808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoMonitorEnter(self, obj); 3838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 3848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 3888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 3908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 391da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 3928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoMonitorExit(self, obj); 3958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 3968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 4008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 4028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 4038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 4048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 4078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 4088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 4098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 4178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(), 4198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 4208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 4218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 4243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22c(inst_data), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 4258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 4308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 4328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(array == NULL)) { 433da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 4348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4363b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 4378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 4388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 4428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 443b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier Runtime* runtime = Runtime::Current(); 444cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Object* obj = AllocObjectFromCode<do_access_check, true>( 445cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier inst->VRegB_21c(), shadow_frame.GetMethod(), self, 446b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier runtime->GetHeap()->GetCurrentAllocator()); 4478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 4488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 450b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 451b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 452b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 4532fa98e26ddd71ca147869b84fc117751ae6ca92aIan Rogers AbortTransaction(self, "Allocating finalizable object in transaction: %s", 454b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier PrettyTypeOf(obj).c_str()); 455b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 456b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 457b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 4583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj); 4598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 466cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Object* obj = AllocArrayFromCode<do_access_check, true>( 467cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier inst->VRegC_22c(), shadow_frame.GetMethod(), length, self, 468cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 4698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 4708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj); 4738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 4788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 479d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 480d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 481d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 4828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 4838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 487d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 488d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 489d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 4908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 4918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 4948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 4968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 4978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA"); 4988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Array* array = obj->AsArray(); 5028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 5038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 5048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 5058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 5068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 5078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 5088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz "Ljava/lang/ArrayIndexOutOfBoundsException;", 5098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz "failed FILL_ARRAY_DATA; length=%d, index=%d", 5108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetLength(), payload->element_count); 5118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 514d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 515d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz RecordArrayElementsInTransaction(array, payload->element_count); 516d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 5178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t size_in_bytes = payload->element_count * payload->element_width; 518ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers memcpy(array->GetRawData(payload->element_width, 0), payload->data, size_in_bytes); 5198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 5208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 5238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(exception == NULL)) { 5268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerException(NULL, "throw with null exception"); 527a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 528a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 529a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao self->ThrowNewExceptionF(self->GetCurrentLocationForThrow(), 530a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Ljava/lang/VirtualMachineError;", 531a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 532f832284dd847ff077577bb5712225430bbbb3b67Mathieu Chartier exception->GetClass()->GetDescriptor().c_str()); 5338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->SetException(shadow_frame.GetCurrentLocationForThrow(), exception->AsThrowable()); 5358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 5408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 5421eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5431eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5441eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5451eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5461eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5471eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 5488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 5518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5521eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 5531eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5541eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5551eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5561eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5571eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5581eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 5598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 5628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5631eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 5641eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5651eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5661eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5671eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5681eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5691eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 5708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 5738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 5751eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5761eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5771eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5781eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5791eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 5818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 5848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 5861eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5871eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5881eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5891eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 5928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 5958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 5978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 5988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 5998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 6118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 6278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 6438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 6448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 6608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 6628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 6638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 6768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 6781eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 6791eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 6801eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 6811eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 6821eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6831eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6841eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 6858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 6918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 6931eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 6941eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 6951eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 6961eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 6971eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6981eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6991eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 7068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7081eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 7091eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7101eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7111eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7121eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7131eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7141eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7231eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 7241eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7251eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7261eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7271eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7281eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7291eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 7368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7381eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 7391eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7401eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7411eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7421eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7431eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7441eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 7518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7531eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 7541eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7551eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7561eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7571eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7581eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7591eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 7668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 7681eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 7691eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7701eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7711eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7721eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7731eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7741eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 7818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 7831eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 7841eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7851eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7861eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7871eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7881eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7891eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 7981eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 7991eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8001eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 8011eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 8021eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8031eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8041eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 8118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { 8131eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 8141eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8151eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 8161eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 8171eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8181eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8191eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 8281eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 8291eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8301eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 8311eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 8321eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8331eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8341eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 8418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 8431eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 8441eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8451eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 8461eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 8471eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8481eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8491eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 8568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 859da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 8608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz BooleanArray* array = a->AsBooleanArray(); 865b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 866abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 8678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 8748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 877da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 8788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ByteArray* array = a->AsByteArray(); 883b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 884abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 8858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 8928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 895da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 8968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CharArray* array = a->AsCharArray(); 901b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 902abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 9108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 913da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShortArray* array = a->AsShortArray(); 919b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 920abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 9288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 931da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz IntArray* array = a->AsIntArray(); 937b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 938abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 9468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 949da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LongArray* array = a->AsLongArray(); 955b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 956abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 9648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 967da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 973b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 9743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 9828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 985da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 9908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz BooleanArray* array = a->AsBooleanArray(); 992b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 993d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 9948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1004da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ByteArray* array = a->AsByteArray(); 1011b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1012d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 10208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1023da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CharArray* array = a->AsCharArray(); 1030b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1031d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 10398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1042da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShortArray* array = a->AsShortArray(); 1049b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1050d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 10588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1061da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz IntArray* array = a->AsIntArray(); 1068b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1069d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 10778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1080da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 10858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LongArray* array = a->AsLongArray(); 1087b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1088d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 10968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1099da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 11008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 11043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 11058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 1106b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1107d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 11158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst, inst_data); 11178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst, inst_data); 11238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 11278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst, inst_data); 11298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 11338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst, inst_data); 11358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 11398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst, inst_data); 11418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 11458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst, inst_data); 11478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 11518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst, inst_data); 11538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 11578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 11598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 11638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 11658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 11698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 11718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 11758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst, inst_data); 11778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BYTE: { 11818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst, inst_data); 11838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_CHAR: { 11878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst, inst_data); 11898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 11938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst, inst_data); 11958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 11998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst, inst_data); 12018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst, inst_data); 12078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst, inst_data); 12138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1218d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 12238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1224d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 12298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1230d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 12358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1236d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 12418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1242d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 12478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1248d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 12538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1254d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 12598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1260d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>(shadow_frame, inst, inst_data); 12618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 12658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1266d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>(shadow_frame, inst, inst_data); 12678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 12718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1272d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>(shadow_frame, inst, inst_data); 12738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 12778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1278d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BYTE: { 12838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1284d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_CHAR: { 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1290d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 12958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1296d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 13018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1302d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 13038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 13078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1308d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 13098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1314d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 13198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1320c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 13258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1326c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 13318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1332c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 13378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1338c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 13438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1344c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1350c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 13558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1356c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 13618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1362c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 13678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1368c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 13738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1374c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 13798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1380c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvokeVirtualQuick<false>(self, shadow_frame, inst, inst_data, &result_register); 13818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 13858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1386c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvokeVirtualQuick<true>(self, shadow_frame, inst, inst_data, &result_register); 13878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 13918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 13938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 13968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 13988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 14018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 14068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 14118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 14138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 14168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 14218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1422450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1423450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 14248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 14278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1428450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1429450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 14308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 14338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1434450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1435450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 14368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 14398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1440450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1441450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 14458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1446450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1447450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 14518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1452450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1453450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 14578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1459450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 14603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 14618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 14658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1467450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 14683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 14698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 14738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1474450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1475450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 14798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1481450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 14823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 14838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 14878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1489450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 14903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 14918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1496450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1497450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 14988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 15018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 15033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 15048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 15078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 15093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 15108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 15138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 15153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 15168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT: 15198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) + 15228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 15268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) - 15298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 15338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) * 15368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 15408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 15428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 15438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 15488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 15508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 15518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 15568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15573b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 15608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 15638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 15678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 15708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 15748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 15778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 15878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 15948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 15988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15993b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) + 16018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 16058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) - 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 16128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) * 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 16198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 16248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 16268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 16288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 16298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 16318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 16338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 16368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 16408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 16438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 16478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 16548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 16578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 16588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 16618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 16658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 16688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 16728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 16758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 16778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 16788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 16798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 16828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 16858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 16868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 16898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16903b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 16918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 16928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 16938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 16968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 16988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 16998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 17008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 17038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 17058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 17068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 17078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 17108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 17138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 17148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 17178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 17208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 17218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 17288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 17318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 17348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 17358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 17388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 17428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) + 17493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 17578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) - 17583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 17638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 17668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) * 17673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 17728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 17753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 17778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 17808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 17833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 17858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 17888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 17918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 17923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 17938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 18013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 18068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 18103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 18118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 18158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 18193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 18283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 18298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 18338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 18373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 18428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) + 18463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 18518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) - 18553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) * 18643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 18698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 18723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 18778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 18803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 18858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 18893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 18983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 19038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 19073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 19128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 19163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 19218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 19253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 19268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 19308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 19343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 19358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 19398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 19433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 19448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 19523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 19538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 19613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 19703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 19758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 19793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 19848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 19883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 19898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19943b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 19968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 19973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 20028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 20058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 20063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 20153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 20238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 20243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 20258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) + 20328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT: 20368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s() - 20393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data))); 20408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 20438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) * 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 20508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 20523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), inst->VRegC_22s()); 20538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 20578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 20593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), inst->VRegC_22s()); 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20663b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 20678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 20718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 20748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 20788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ 20818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 20858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 20878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) + 20888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 20898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 20928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 20948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b() - 20958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b())); 20968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 20998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) * 21028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 21038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 21068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 21088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 21098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 21138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 21158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 21168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 21208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 21248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 21308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 21318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 21348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 21378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 21388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 21448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 21458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 21488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 21518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 21528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 21558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21563b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 21588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 21598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 21628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_EB ... Instruction::UNUSED_FF: 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_79: 21648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_7A: 21658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz UnexpectedOpcode(inst, mh); 21668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 21698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 21708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 2171c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertztemplate SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) HOT_ATTR 2172d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien HertzJValue ExecuteSwitchImpl<true, false>(Thread* self, MethodHelper& mh, 2173d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz const DexFile::CodeItem* code_item, 2174d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 2175c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertztemplate SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) HOT_ATTR 2176d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien HertzJValue ExecuteSwitchImpl<false, false>(Thread* self, MethodHelper& mh, 2177d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz const DexFile::CodeItem* code_item, 2178d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 2179d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 2180d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien HertzJValue ExecuteSwitchImpl<true, true>(Thread* self, MethodHelper& mh, 2181d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz const DexFile::CodeItem* code_item, 2182d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 2183d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 2184d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien HertzJValue ExecuteSwitchImpl<false, true>(Thread* self, MethodHelper& mh, 2185d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz const DexFile::CodeItem* code_item, 2186d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 21878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 21888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 21898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2190