interpreter_switch_impl.cc revision 4e99b3d8955131f3fc71aa113f0fa71f0092cb6f
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 } \ 288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t found_dex_pc = FindNextInstructionFollowingException(self, shadow_frame, \ 298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->GetDexPc(insns), \ 308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz instrumentation); \ 318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (found_dex_pc == DexFile::kDexNoIndex) { \ 328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); /* Handled in caller. */ \ 338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t displacement = static_cast<int32_t>(found_dex_pc) - static_cast<int32_t>(dex_pc); \ 358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(displacement); \ 368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(_is_exception_pending, _next_function) \ 408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz do { \ 418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(_is_exception_pending)) { \ 428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { \ 448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->_next_function(); \ 458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } \ 468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } while (false) 478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Code to run before each dex instruction. 498379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz#define PREAMBLE() \ 508379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz do { \ 518379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz DCHECK(!inst->IsReturn()); \ 528379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz if (UNLIKELY(notified_method_entry_event)) { \ 538379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz notified_method_entry_event = false; \ 548379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { \ 558379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), \ 568379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz shadow_frame.GetMethod(), dex_pc); \ 578379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } \ 588379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz } while (false) 598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 60d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate<bool do_access_check, bool transaction_active> 61c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien HertzJValue ExecuteSwitchImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 628379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) { 63a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao bool do_assignability_check = do_access_check; 648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LOG(FATAL) << "Invalid shadow frame for interpreter use"; 668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return JValue(); 678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->VerifyStack(); 698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 718379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz bool notified_method_entry_event = false; 72947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz const instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); 738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.. 748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { 75947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodEnterEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), 0); 778379b2256be5d2be4ad083a76e9f8ec403c4d405Sebastien Hertz notified_method_entry_event = true; 788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* const insns = code_item->insns_; 818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t inst_data; 838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz while (true) { 848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz dex_pc = inst->GetDexPc(insns); 858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetDexPC(dex_pc); 868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz TraceExecution(shadow_frame, inst, dex_pc, mh); 873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz inst_data = inst->Fetch16(0); 883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz switch (inst->Opcode(inst_data)) { 898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOP: 908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE: 948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_FROM16: 1008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(inst_data), 1028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 1038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_16: 1068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 1098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE: 1128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 1158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_FROM16: 1188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(inst_data), 1208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 1218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_WIDE_16: 1248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 1268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 1278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT: 1308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(inst_data), 1323b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data))); 1338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_FROM16: 1368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(inst_data), 1388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 1398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 1408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_OBJECT_16: 1428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 1448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 1458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 1468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT: 1488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(inst_data), result_register.GetI()); 1508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_WIDE: 1538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(inst_data), result_register.GetJ()); 1558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_RESULT_OBJECT: 1588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), result_register.GetL()); 1608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MOVE_EXCEPTION: { 1638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1645c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz Throwable* exception = self->GetException(nullptr); 1653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(inst_data), exception); 1665c0049067a953d7a2383d3064a84a32d1efa3a24Sebastien Hertz self->ClearException(); 1678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 1688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 1698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_VOID: { 1718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 172043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz if (do_access_check) { 173043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz // If access checks are required then the dex-to-dex compiler and analysis of 174043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz // whether the class has final fields hasn't been performed. Conservatively 175043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz // perform the memory barrier now. 1763035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceForConstructor(); 177043036f67fa37b3cfa3b05c41e5a824058730378Sebastien Hertz } 1781eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 1791eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 1801eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 1818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 182947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 1838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 185e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 186e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 187e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 1888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 1908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 1918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_VOID_BARRIER: { 1923035961cb41865b80b927546be0c708b6389cec6Hans Boehm QuasiAtomic::ThreadFenceForConstructor(); 1938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 1941eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 1951eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 1961eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 1978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 198947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 1998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 201e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 202e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 203e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 2048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN: { 2088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result.SetJ(0); 2103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x(inst_data))); 2111eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 2121eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 2131eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 2148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 215947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 218e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 219e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 220e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 2218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_WIDE: { 2258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x(inst_data))); 2271eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 2281eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 2291eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 2308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 231947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 234e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 235e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 236e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 2378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RETURN_OBJECT: { 2418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz JValue result; 2421eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 2431eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 2441eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 245bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier const size_t ref_idx = inst->VRegA_11x(inst_data); 246bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier Object* obj_result = shadow_frame.GetVRegReference(ref_idx); 247a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (do_assignability_check && obj_result != NULL) { 248bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier StackHandleScope<1> hs(self); 249bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier MethodHelper mhs(hs.NewHandle(shadow_frame.GetMethod())); 250bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier Class* return_type = mhs.GetReturnType(); 251bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier // Re-load since it might have moved. 252bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier obj_result = shadow_frame.GetVRegReference(ref_idx); 253a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (return_type == NULL) { 254a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // Return the pending exception. 255a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 256a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 257a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao if (!obj_result->VerifierInstanceOf(return_type)) { 258a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 259a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao self->ThrowNewExceptionF(self->GetCurrentLocationForThrow(), 260a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Ljava/lang/VirtualMachineError;", 261a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Returning '%s' that is not instance of return type '%s'", 262f832284dd847ff077577bb5712225430bbbb3b67Mathieu Chartier obj_result->GetClass()->GetDescriptor().c_str(), 263f832284dd847ff077577bb5712225430bbbb3b67Mathieu Chartier return_type->GetDescriptor().c_str()); 264a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao HANDLE_PENDING_EXCEPTION(); 265a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 266a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } 267bfd9a4378eacaf2dc2bbe05ad48c5164fc93c9feMathieu Chartier result.SetL(obj_result); 2688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 269947ff080753c786a74f1cd7aeb09f717bb7074bdSebastien Hertz instrumentation->MethodExitEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 2708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 2718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result); 272e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz } else if (UNLIKELY(instrumentation->HasDexPcListeners())) { 273e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz instrumentation->DexPcMovedEvent(self, shadow_frame.GetThisObject(code_item->ins_size_), 274e713d9338ad122d6b8c7997387d0c9fc464eea3eSebastien Hertz shadow_frame.GetMethod(), dex_pc); 2758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz return result; 2778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_4: { 2798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t dst = inst->VRegA_11n(inst_data); 2813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int4_t val = inst->VRegB_11n(inst_data); 2828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 2838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 2848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 2858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 2878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_16: { 2908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 2913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21s(inst_data); 2928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int16_t val = inst->VRegB_21s(); 2938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 2948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 2958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 2968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 2978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 2988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 2998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST: { 3018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_31i(inst_data); 3038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = inst->VRegB_31i(); 3048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 3078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_HIGH16: { 3128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t dst = inst->VRegA_21h(inst_data); 3148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 3158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(dst, val); 3168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val == 0) { 3178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 3188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_16: 3238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(inst_data), inst->VRegB_21s()); 3258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_32: 3288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3293b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(inst_data), inst->VRegB_31i()); 3308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE: 3338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(inst_data), inst->VRegB_51l()); 3358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_51l(); 3368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_WIDE_HIGH16: 3383c5aec1da27d8068e6bb97202d12efad6b4331dfSebastien Hertz PREAMBLE(); 3393b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(inst_data), 3408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 3418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING: { 3448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_21c()); 3468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(s == NULL)) { 3478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), s); 3508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_STRING_JUMBO: { 3558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_31c()); 3578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(s == NULL)) { 3588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_31c(inst_data), s); 3618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 3628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CONST_CLASS: { 3668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 3688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 3698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 3708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), c); 3738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 3748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_ENTER: { 3788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 3808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 381da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 3828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoMonitorEnter(self, obj); 3858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 3868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 3888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MONITOR_EXIT: { 3908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 3913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 3928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 393da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 3948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 3958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 3968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoMonitorExit(self, obj); 3978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 3988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 3998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CHECK_CAST: { 4028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 4048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 4058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 4068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4083b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c(inst_data)); 4098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 4108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowClassCastException(c, obj->GetClass()); 4118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INSTANCE_OF: { 4198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(), 4218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self, false, do_access_check); 4228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(c == NULL)) { 4238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c(inst_data)); 4263b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22c(inst_data), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 4278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ARRAY_LENGTH: { 4328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x(inst_data)); 4348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(array == NULL)) { 435da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 4368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), array->AsArray()->GetLength()); 4398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 4408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_INSTANCE: { 4448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 445b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier Runtime* runtime = Runtime::Current(); 446cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Object* obj = AllocObjectFromCode<do_access_check, true>( 447cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier inst->VRegB_21c(), shadow_frame.GetMethod(), self, 448b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier runtime->GetHeap()->GetCurrentAllocator()); 4498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 4508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4524e99b3d8955131f3fc71aa113f0fa71f0092cb6fSebastien Hertz obj->GetClass()->AssertInitializedOrInitializingInThread(self); 453b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // Don't allow finalizable objects to be allocated during a transaction since these can't 454b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier // be finalized without a started runtime. 455b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier if (transaction_active && obj->GetClass()->IsFinalizable()) { 4562fa98e26ddd71ca147869b84fc117751ae6ca92aIan Rogers AbortTransaction(self, "Allocating finalizable object in transaction: %s", 457b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier PrettyTypeOf(obj).c_str()); 458b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier HANDLE_PENDING_EXCEPTION(); 459b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier break; 460b2c7ead6bb5c98282cdfbc89db8984a004bea030Mathieu Chartier } 4613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(inst_data), obj); 4628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEW_ARRAY: { 4678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c(inst_data)); 469cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Object* obj = AllocArrayFromCode<do_access_check, true>( 470cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier inst->VRegC_22c(), shadow_frame.GetMethod(), length, self, 471cbb2d20bea2861f244da2e2318d8c088300a3710Mathieu Chartier Runtime::Current()->GetHeap()->GetCurrentAllocator()); 4728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 4738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 4748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 4753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22c(inst_data), obj); 4768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 4778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 4818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 482d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 483d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<false, do_access_check, transaction_active>(inst, shadow_frame, self, 484d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz &result_register); 4858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 4868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 4898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 490d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = 491d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz DoFilledNewArray<true, do_access_check, transaction_active>(inst, shadow_frame, 492d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz self, &result_register); 4938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 4948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 4958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 4968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 4978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 4983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t(inst_data)); 4998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(obj == NULL)) { 5008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA"); 5018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Array* array = obj->AsArray(); 5058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 5068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 5078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz const Instruction::ArrayDataPayload* payload = 5088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 5098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 5108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 5118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz "Ljava/lang/ArrayIndexOutOfBoundsException;", 5128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz "failed FILL_ARRAY_DATA; length=%d, index=%d", 5138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz array->GetLength(), payload->element_count); 5148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 517d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz if (transaction_active) { 518d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz RecordArrayElementsInTransaction(array, payload->element_count); 519d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz } 5208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz uint32_t size_in_bytes = payload->element_count * payload->element_width; 521ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers memcpy(array->GetRawData(payload->element_width, 0), payload->data, size_in_bytes); 5228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_3xx(); 5238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::THROW: { 5268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x(inst_data)); 5288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(exception == NULL)) { 5298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ThrowNullPointerException(NULL, "throw with null exception"); 530a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao } else if (do_assignability_check && !exception->GetClass()->IsThrowableClass()) { 531a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao // This should never happen. 532a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao self->ThrowNewExceptionF(self->GetCurrentLocationForThrow(), 533a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Ljava/lang/VirtualMachineError;", 534a3faaf4bece7f42529c013fe87bd41de59798656Jeff Hao "Throwing '%s' that is not instance of Throwable", 535f832284dd847ff077577bb5712225430bbbb3b67Mathieu Chartier exception->GetClass()->GetDescriptor().c_str()); 5368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 5378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz self->SetException(shadow_frame.GetCurrentLocationForThrow(), exception->AsThrowable()); 5388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 5408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO: { 5438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t offset = inst->VRegA_10t(inst_data); 5451eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5461eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5471eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5481eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5491eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5501eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 5518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_16: { 5548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5551eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegA_20t(); 5561eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5571eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5581eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5591eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5601eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5611eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 5628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::GOTO_32: { 5658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5661eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int32_t offset = inst->VRegA_30t(); 5671eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5681eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5691eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5701eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5711eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5721eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 5738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::PACKED_SWITCH: { 5768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoPackedSwitch(inst, shadow_frame, inst_data); 5781eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5791eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5801eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5811eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5821eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 5848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPARSE_SWITCH: { 5878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t offset = DoSparseSwitch(inst, shadow_frame, inst_data); 5891eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 5901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 5911eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 5921eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5931eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 5948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->RelativeAt(offset); 5958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 5968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 5978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_FLOAT: { 5988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 5998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_FLOAT: { 6148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 6168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 6178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPL_DOUBLE: { 6308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6413b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 6468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMPG_DOUBLE: { 6478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 6498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 6508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 < val2) { 6528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::CMP_LONG: { 6638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 6658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 6668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t result; 6678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (val1 > val2) { 6688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 1; 6698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else if (val1 == val2) { 6708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = 0; 6718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz result = -1; 6738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), result); 6758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQ: { 6798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6803b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) == shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 6811eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 6821eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 6831eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 6841eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 6851eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6861eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 6871eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 6888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 6898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 6908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 6928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 6938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NE: { 6948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 6953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) != shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 6961eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 6971eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 6981eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 6991eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7001eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7011eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7021eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LT: { 7098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) < shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7111eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 7121eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7131eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7141eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7151eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7161eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7171eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GE: { 7248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) >= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7261eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 7271eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7281eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7291eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7301eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7311eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7321eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GT: { 7398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) > shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7411eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 7421eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7431eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7441eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7451eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7461eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7471eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LE: { 7548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t(inst_data)) <= shadow_frame.GetVReg(inst->VRegB_22t(inst_data))) { 7561eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegC_22t(); 7571eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7581eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7591eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7601eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7611eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7621eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_EQZ: { 7698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) == 0) { 7711eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 7721eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7731eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7741eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7751eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7761eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7771eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_NEZ: { 7848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 7853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) != 0) { 7861eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 7871eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 7881eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 7891eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 7901eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7911eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 7921eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 7938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 7948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 7958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 7978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 7988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LTZ: { 7998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) < 0) { 8011eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 8021eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8031eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 8041eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 8051eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8061eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8071eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GEZ: { 8148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) >= 0) { 8161eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 8171eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8181eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 8191eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 8201eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8211eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8221eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_GTZ: { 8298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) > 0) { 8311eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 8321eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8331eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 8341eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 8351eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8361eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8371eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IF_LEZ: { 8448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t(inst_data)) <= 0) { 8461eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz int16_t offset = inst->VRegB_21t(); 8471eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (IsBackwardBranch(offset)) { 8481eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz if (UNLIKELY(self->TestAllFlags())) { 8491eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz CheckSuspend(self); 8501eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8511eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz } 8521eda2268e84d384256814cb6c2ba2440a848f9edSebastien Hertz inst = inst->RelativeAt(offset); 8538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BOOLEAN: { 8598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 862da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 8638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz BooleanArray* array = a->AsBooleanArray(); 868b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 869abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 8708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_BYTE: { 8778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 880da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 8818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 8858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ByteArray* array = a->AsByteArray(); 886b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 887abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 8888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 8898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 8908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 8918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 8938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 8948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_CHAR: { 8958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 8968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 8978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 898da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 8998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CharArray* array = a->AsCharArray(); 904b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 905abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_SHORT: { 9138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 916da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShortArray* array = a->AsShortArray(); 922b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 923abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET: { 9318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 934da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz IntArray* array = a->AsIntArray(); 940b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 941abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_WIDE: { 9498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 952da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LongArray* array = a->AsLongArray(); 958b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 959abff6439db28fbbed95490bfff7e24d1fdf5b771Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AGET_OBJECT: { 9678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 970da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 976b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 9773b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_23x(inst_data), array->GetWithoutChecks(index)); 9788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BOOLEAN: { 9858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 9868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 9878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 988da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 9898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 9908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 9918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 9923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 9938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 9948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz BooleanArray* array = a->AsBooleanArray(); 995b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 996d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 9978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 9988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 9998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_BYTE: { 10048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1007da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ByteArray* array = a->AsByteArray(); 1014b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1015d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_CHAR: { 10238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1026da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz CharArray* array = a->AsCharArray(); 1033b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1034d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_SHORT: { 10428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1045da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ShortArray* array = a->AsShortArray(); 1052b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1053d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT: { 10618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1064da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x(inst_data)); 10698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz IntArray* array = a->AsIntArray(); 1071b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1072d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_WIDE: { 10808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 10818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 10828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1083da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 10848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10873b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x(inst_data)); 10888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 10898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz LongArray* array = a->AsLongArray(); 1090b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index)) { 1091d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 10928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 10938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 10948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 10958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 10978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 10988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::APUT_OBJECT: { 10998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 11018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz if (UNLIKELY(a == NULL)) { 1102da843e11bd5f2177a776c37de033228a7ea230afSebastien Hertz ThrowNullPointerExceptionFromInterpreter(shadow_frame); 11038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 11073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x(inst_data)); 11088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 1109b0fa5dc7769c1e054032f39de0a3f6d6dd06f8cfIan Rogers if (array->CheckIsValidIndex(index) && array->CheckAssignable(val)) { 1110d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz array->SetWithoutChecks<transaction_active>(index, val); 11118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 11128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } else { 11138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz HANDLE_PENDING_EXCEPTION(); 11148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BOOLEAN: { 11188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst, inst_data); 11208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_BYTE: { 11248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst, inst_data); 11268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_CHAR: { 11308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst, inst_data); 11328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_SHORT: { 11368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst, inst_data); 11388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET: { 11428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst, inst_data); 11448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE: { 11488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst, inst_data); 11508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT: { 11548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst, inst_data); 11568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_QUICK: { 11608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(shadow_frame, inst, inst_data); 11628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 11668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(shadow_frame, inst, inst_data); 11688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 11728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(shadow_frame, inst, inst_data); 11748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BOOLEAN: { 11788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst, inst_data); 11808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_BYTE: { 11848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst, inst_data); 11868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_CHAR: { 11908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst, inst_data); 11928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 11948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 11958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_SHORT: { 11968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 11973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst, inst_data); 11988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 11998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET: { 12028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst, inst_data); 12048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_WIDE: { 12088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst, inst_data); 12108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SGET_OBJECT: { 12148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 12153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst, inst_data); 12168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BOOLEAN: { 12208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1221d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_BYTE: { 12268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1227d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_CHAR: { 12328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1233d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_SHORT: { 12388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1239d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT: { 12448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1245d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE: { 12508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1251d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT: { 12568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1257d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_QUICK: { 12628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1263d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoIPutQuick<Primitive::kPrimInt, transaction_active>(shadow_frame, inst, inst_data); 12648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 12688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1269d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoIPutQuick<Primitive::kPrimLong, transaction_active>(shadow_frame, inst, inst_data); 12708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 12748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1275d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoIPutQuick<Primitive::kPrimNot, transaction_active>(shadow_frame, inst, inst_data); 12768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BOOLEAN: { 12808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1281d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_BYTE: { 12868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1287d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_CHAR: { 12928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1293d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 12948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 12958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 12968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 12978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_SHORT: { 12988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1299d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 13008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT: { 13048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1305d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 13068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_WIDE: { 13108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1311d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 13128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SPUT_OBJECT: { 13168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1317d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check, transaction_active>(self, shadow_frame, inst, inst_data); 13188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 13198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 13228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1323c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 13288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1329c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER: { 13348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1335c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 13408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1341c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT: { 13468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1347c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 13528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1353c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE: { 13588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1359c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 13648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1365c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC: { 13708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1371c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 13768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1377c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, inst_data, &result_register); 13788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 13828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1383c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvokeVirtualQuick<false>(self, shadow_frame, inst, inst_data, &result_register); 13848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 13888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1389c61124bdeaae94f977ffc36ac69535e792c226f2Sebastien Hertz bool success = DoInvokeVirtualQuick<true>(self, shadow_frame, inst, inst_data, &result_register); 13908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 13918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 13938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_INT: 13948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 13953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), -shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 13968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 13978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 13988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_INT: 13998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), ~shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 14018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_LONG: 14048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NOT_LONG: 14098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), ~shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_FLOAT: 14148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 14168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::NEG_DOUBLE: 14198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14203b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), -shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 14218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_LONG: 14248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1425450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), 1426450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 14278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_FLOAT: 14308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1431450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1432450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 14338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_DOUBLE: 14368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1437450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1438450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 14398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_INT: 14428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1443450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 1444450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_FLOAT: 14488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1449450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1450450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::LONG_TO_DOUBLE: 14548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1455450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1456450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 14578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_INT: { 14608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1462450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, float>(val); 14633b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 14648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_LONG: { 14688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)); 1470450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, float>(val); 14713b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 14728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::FLOAT_TO_DOUBLE: 14768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1477450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegDouble(inst->VRegA_12x(inst_data), 1478450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 14798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_INT: { 14828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1484450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int32_t result = art_float_to_integral<int32_t, double>(val); 14853b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), result); 14868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_LONG: { 14908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 14913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)); 1492450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers int64_t result = art_float_to_integral<int64_t, double>(val); 14933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(inst_data), result); 14948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 14958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 14968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 14978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DOUBLE_TO_FLOAT: 14988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 1499450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.SetVRegFloat(inst->VRegA_12x(inst_data), 1500450dcb56ecbf6f729401e753f0a27e4170177dddIan Rogers shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 15018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_BYTE: 15048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15053b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 15063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 15078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_CHAR: 15108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15113b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 15123b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 15138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::INT_TO_SHORT: 15168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(inst_data), 15183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x(inst_data)))); 15198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 15208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT: 15228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) + 15258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT: 15298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) - 15328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT: 15368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) * 15398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT: { 15438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(inst_data), 15458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 15468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT: { 15518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(inst_data), 15538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 15548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 15568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 15588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT: 15598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15603b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 15628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 15638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT: 15668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 15698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 15708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT: 15738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15743b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 15768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 15778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT: 15808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 15838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT: 15878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 15908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 15938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT: 15948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 15953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(inst_data), 15968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 15978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 15988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 15998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG: 16018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16023b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) + 16048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG: 16088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) - 16118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG: 16158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) * 16188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG: 16228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16233b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(inst_data), 16248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 16258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 16278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG: 16298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16303b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(inst_data), 16318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 16328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 16348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG: 16368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 16398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG: 16438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16443b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 16468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG: 16508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16513b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 16538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 16548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG: 16578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 16608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 16618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG: 16648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16653b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 16678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 16688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG: 16718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16723b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(inst_data), 16738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 16748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 16758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT: 16788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 16808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 16818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 16828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT: 16858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 16878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 16888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 16898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT: 16928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 16933b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 16948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 16958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 16968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 16978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 16988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT: 16998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 17018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 17028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 17038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT: 17068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(inst_data), 17088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 17098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 17108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE: 17138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17143b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 17168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 17178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE: 17208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17213b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 17238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 17248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE: 17278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 17308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 17318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE: 17348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17353b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 17378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 17388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE: 17418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(inst_data), 17438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 17448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 17458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 17468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_2ADDR: { 17488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 17518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) + 17523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_INT_2ADDR: { 17578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 17608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) - 17613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_2ADDR: { 17668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 17698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) * 17703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_2ADDR: { 17758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 17783b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 17808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_2ADDR: { 17838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17843b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 17863b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 17878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 17888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_2ADDR: { 17918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 17923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 17938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 17948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) << 17953b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 17968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 17978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 17988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 17998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_2ADDR: { 18008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) >> 18043b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 18058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_2ADDR: { 18098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 18133b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x1f)); 18148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_2ADDR: { 18188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) & 18223b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 18238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_2ADDR: { 18278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) | 18313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 18328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_2ADDR: { 18368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVReg(vregA, 18398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(vregA) ^ 18403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x(inst_data))); 18418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 18458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) + 18493b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 18548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) - 18583b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 18638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) * 18673b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 18728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 18753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 18778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_LONG_2ADDR: { 18808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18813b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18828ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 18833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 18858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_LONG_2ADDR: { 18888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 18918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) & 18923b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 18938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 18948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 18958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 18968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_LONG_2ADDR: { 18978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 18983b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 18998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) | 19013b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 19028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 19068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19073b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 19103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x(inst_data))); 19118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 19158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19163b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) << 19193b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 19208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 19248ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19253b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 19283b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 19298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 19338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegLong(vregA, 19368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 19373b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x(inst_data)) & 0x3f)); 19388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 19428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19433b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 19463b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 19478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 19518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 19553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 19568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 19608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 19643b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 19658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 19698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19703b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 19733b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data))); 19748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19758ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19768ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 19788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19793b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegFloat(vregA, 19818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 19823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x(inst_data)))); 19838ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 19878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19883b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19898ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 19908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 19913b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 19928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 19938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 19948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 19958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 19968ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 19973b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 19988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 19998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 20003b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 20018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20038ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 20058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20063b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 20088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 20093b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 20108ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 20148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20153b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 20178ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 20183b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data))); 20198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 20238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz uint4_t vregA = inst->VRegA_12x(inst_data); 20258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.SetVRegDouble(vregA, 20268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 20273b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x(inst_data)))); 20288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_1xx(); 20298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20318ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT16: 20328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20333b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20343b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) + 20358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20388ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT: 20398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20403b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s() - 20423b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data))); 20438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20458ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT16: 20468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20473b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20483b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) * 20498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20528ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT16: { 20538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20543b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(inst_data), 20553b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), inst->VRegC_22s()); 20568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20598ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT16: { 20608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20613b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(inst_data), 20623b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)), inst->VRegC_22s()); 20638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 20668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT16: 20678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20683b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20693b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) & 20708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT16: 20748ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20753b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20763b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) | 20778ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20788ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20798ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20808ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT16: 20818ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20823b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(inst_data), 20833b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s(inst_data)) ^ 20848ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22s()); 20858ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20868ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20878ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::ADD_INT_LIT8: 20888ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20893b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 20908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) + 20918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 20928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 20938ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 20948ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::RSUB_INT_LIT8: 20958ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 20963b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 20978ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b() - 20988ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b())); 20998ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21008ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21018ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::MUL_INT_LIT8: 21028ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21033b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21048ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) * 21058ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 21068ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21078ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21088ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::DIV_INT_LIT8: { 21098ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21103b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(inst_data), 21118ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 21128ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21138ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21148ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21158ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::REM_INT_LIT8: { 21168ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21173b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(inst_data), 21188ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 21198ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21208ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21218ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21228ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::AND_INT_LIT8: 21238ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21243b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21258ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 21268ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 21278ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21288ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21298ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::OR_INT_LIT8: 21308ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21313b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21328ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 21338ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 21348ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21358ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21368ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::XOR_INT_LIT8: 21378ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21383b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21398ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 21408ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst->VRegC_22b()); 21418ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21428ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21438ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHL_INT_LIT8: 21448ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21453b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21468ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 21478ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 21488ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21498ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21508ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::SHR_INT_LIT8: 21518ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21523b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21538ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 21548ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 21558ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21568ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21578ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::USHR_INT_LIT8: 21588ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz PREAMBLE(); 21593b588e09eac6fb2aff64595e2232e479703850fcSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(inst_data), 21608ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 21618ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz (inst->VRegC_22b() & 0x1f)); 21628ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz inst = inst->Next_2xx(); 21638ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz break; 21648ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 21658ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_EB ... Instruction::UNUSED_FF: 21668ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_79: 21678ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz case Instruction::UNUSED_7A: 21688ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz UnexpectedOpcode(inst, mh); 21698ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21708ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz } 21718ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // NOLINT(readability/fn_size) 21728ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 21738ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz// Explicit definitions of ExecuteSwitchImpl. 2174c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertztemplate SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) HOT_ATTR 2175d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien HertzJValue ExecuteSwitchImpl<true, false>(Thread* self, MethodHelper& mh, 2176d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz const DexFile::CodeItem* code_item, 2177d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 2178c67148594b1580c278ae71e3ce5c6fd59bfa6bd3Sebastien Hertztemplate SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) HOT_ATTR 2179d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien HertzJValue ExecuteSwitchImpl<false, false>(Thread* self, MethodHelper& mh, 2180d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz const DexFile::CodeItem* code_item, 2181d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 2182d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 2183d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien HertzJValue ExecuteSwitchImpl<true, true>(Thread* self, MethodHelper& mh, 2184d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz const DexFile::CodeItem* code_item, 2185d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 2186d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertztemplate SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) 2187d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien HertzJValue ExecuteSwitchImpl<false, true>(Thread* self, MethodHelper& mh, 2188d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz const DexFile::CodeItem* code_item, 2189d2fe10a3a34af171bf1631219cd2d6ff6b7778b5Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register); 21908ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz 21918ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace interpreter 21928ece050d85fc244c72610244e440b0e00aa618faSebastien Hertz} // namespace art 2193