interpreter.cc revision 1521e95729c202f6b4a65656f62dfc8ba4dc818d
12fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers/* 22fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Copyright (C) 2012 The Android Open Source Project 32fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 42fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 52fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * you may not use this file except in compliance with the License. 62fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * You may obtain a copy of the License at 72fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 82fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 92fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Unless required by applicable law or agreed to in writing, software 112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * See the License for the specific language governing permissions and 142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * limitations under the License. 152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers */ 162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "interpreter.h" 182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include <math.h> 202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 2107ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h" 222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class_linker-inl.h" 232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "common_throws.h" 244f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h" 25807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#include "dex_instruction-inl.h" 261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "dex_instruction.h" 271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/accounting/card_table-inl.h" 282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "invoke_arg_array_builder.h" 2964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers#include "nth_caller_visitor.h" 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class.h" 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class-inl.h" 322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/field-inl.h" 332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method.h" 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method-inl.h" 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h" 362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h" 372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object_utils.h" 382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "runtime_support.h" 392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "ScopedLocalRef.h" 402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "scoped_thread_state_change.h" 412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "thread.h" 422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 433e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::AbstractMethod; 443e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Array; 453e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::BooleanArray; 463e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ByteArray; 473e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::CharArray; 483e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Class; 493e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ClassLoader; 503e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Field; 513e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::IntArray; 523e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::LongArray; 533e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Object; 543e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ObjectArray; 553e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ShortArray; 563e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::String; 573e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Throwable; 582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace art { 60167436311a08a65dea28dda079a137893821c9c7Jeff Hao 612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace interpreter { 622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 6387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMaxInt = std::numeric_limits<int32_t>::max(); 6487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMinInt = std::numeric_limits<int32_t>::min(); 6587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMaxLong = std::numeric_limits<int64_t>::max(); 6687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMinLong = std::numeric_limits<int64_t>::min(); 6787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao 68790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Haostatic void UnstartedRuntimeInvoke(Thread* self, MethodHelper& mh, 69790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const DexFile::CodeItem* code_item, ShadowFrame* shadow_frame, 70790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao JValue* result, size_t arg_offset) 7164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 7264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // In a runtime that's not started we intercept certain methods to avoid complicated dependency 7364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // problems in core libraries. 74790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao std::string name(PrettyMethod(shadow_frame->GetMethod())); 7564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.Class java.lang.Class.forName(java.lang.String)") { 76167436311a08a65dea28dda079a137893821c9c7Jeff Hao std::string descriptor(DotToDescriptor(shadow_frame->GetVRegReference(arg_offset)->AsString()->ToModifiedUtf8().c_str())); 777934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom ClassLoader* class_loader = NULL; // shadow_frame.GetMethod()->GetDeclaringClass()->GetClassLoader(); 7864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* found = Runtime::Current()->GetClassLinker()->FindClass(descriptor.c_str(), 7964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers class_loader); 8064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) << "Class.forName failed in un-started runtime for class: " 8164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << PrettyDescriptor(descriptor); 8264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 8364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Class.newInstance()") { 84167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 8564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers AbstractMethod* c = klass->FindDeclaredDirectMethod("<init>", "()V"); 8664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(c != NULL); 8764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = klass->AllocObject(self); 8864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(obj != NULL); 896474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao EnterInterpreterFromInvoke(self, c, obj, NULL, NULL); 9064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(obj); 9164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String)") { 9264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail 9364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // going the reflective Dex way. 94167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 95167436311a08a65dea28dda079a137893821c9c7Jeff Hao String* name = shadow_frame->GetVRegReference(arg_offset + 1)->AsString(); 9664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* found = NULL; 9764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers FieldHelper fh; 9864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Field>* fields = klass->GetIFields(); 9964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 10064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 10164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 10264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 10364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 10464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (found == NULL) { 10764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fields = klass->GetSFields(); 10864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 10964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 11064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 11164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 11264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 11364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) 11764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << "Failed to find field in Class.getDeclaredField in un-started runtime. name=" 11864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << name->ToModifiedUtf8() << " class=" << PrettyDescriptor(klass); 11964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: getDeclaredField calls GetType once the field is found to ensure a 12064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // NoClassDefFoundError is thrown if the field's type cannot be resolved. 12164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 12264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int)") { 12364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special case array copying without initializing System. 124167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* ctype = shadow_frame->GetVRegReference(arg_offset)->GetClass()->GetComponentType(); 125167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint srcPos = shadow_frame->GetVReg(arg_offset + 1); 126167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint dstPos = shadow_frame->GetVReg(arg_offset + 3); 127167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint length = shadow_frame->GetVReg(arg_offset + 4); 12864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!ctype->IsPrimitive()) { 129167436311a08a65dea28dda079a137893821c9c7Jeff Hao ObjectArray<Object>* src = shadow_frame->GetVRegReference(arg_offset)->AsObjectArray<Object>(); 130167436311a08a65dea28dda079a137893821c9c7Jeff Hao ObjectArray<Object>* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsObjectArray<Object>(); 13164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 13264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 13364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveChar()) { 135167436311a08a65dea28dda079a137893821c9c7Jeff Hao CharArray* src = shadow_frame->GetVRegReference(arg_offset)->AsCharArray(); 136167436311a08a65dea28dda079a137893821c9c7Jeff Hao CharArray* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsCharArray(); 13764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 13864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 13964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveInt()) { 141167436311a08a65dea28dda079a137893821c9c7Jeff Hao IntArray* src = shadow_frame->GetVRegReference(arg_offset)->AsIntArray(); 142167436311a08a65dea28dda079a137893821c9c7Jeff Hao IntArray* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsIntArray(); 14364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 14464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 14564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 14764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UNIMPLEMENTED(FATAL) << "System.arraycopy of unexpected type: " << PrettyDescriptor(ctype); 14864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 15064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Not special, continue with regular interpreter execution. 1510aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao artInterpreterToInterpreterEntry(self, mh, code_item, shadow_frame, result); 15264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 15364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 15464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 15564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers// Hand select a number of methods to be run in a not yet started runtime without using JNI. 15664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeJni(Thread* self, AbstractMethod* method, 1575d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* receiver, uint32_t* args, JValue* result) 15864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 15964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string name(PrettyMethod(method)); 16064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.ClassLoader dalvik.system.VMStack.getCallingClassLoader()") { 16164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(NULL); 16264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Class dalvik.system.VMStack.getStackClass2()") { 1637a22fa657b972e8323692368975bc5a7be1cc0f5Ian Rogers NthCallerVisitor visitor(self, 3); 16464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers visitor.WalkStack(); 16564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(visitor.caller->GetDeclaringClass()); 16664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.log(double)") { 1675d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao JValue value; 1685d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1695d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetD(log(value.GetD())); 17064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.Class.getNameNative()") { 17164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsClass()->ComputeName()); 17264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.Float.floatToRawIntBits(float)") { 1735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(args[0]); 17464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "float java.lang.Float.intBitsToFloat(int)") { 1755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(args[0]); 17664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.exp(double)") { 1775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao JValue value; 1785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetD(exp(value.GetD())); 18064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Object.internalClone()") { 18164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->Clone(self)); 18264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.Object.notifyAll()") { 18305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers receiver->NotifyAll(self); 18464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.compareTo(java.lang.String)") { 1855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao String* rhs = reinterpret_cast<Object*>(args[0])->AsString(); 18664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(rhs != NULL); 18764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(receiver->AsString()->CompareTo(rhs)); 18864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.String.intern()") { 18964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsString()->Intern()); 19064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.fastIndexOf(int, int)") { 1915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(receiver->AsString()->FastIndexOf(args[0], args[1])); 19264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])") { 1935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetL(Array::CreateMultiArray(self, reinterpret_cast<Object*>(args[0])->AsClass(), reinterpret_cast<Object*>(args[1])->AsIntArray())); 19464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") { 19564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 19664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa))); 19764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") { 19864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetJ(JNI_TRUE); 19964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") { 2005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* obj = reinterpret_cast<Object*>(args[0]); 2015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1]; 2025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jint expectedValue = args[3]; 2035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jint newValue = args[4]; 20464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(obj) + offset; 20564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr); 20664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Note: android_atomic_release_cas() returns 0 on success, not failure. 20764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int r = android_atomic_release_cas(expectedValue, newValue, address); 20864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(r == 0); 20964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") { 2105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* obj = reinterpret_cast<Object*>(args[0]); 2115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* newValue = reinterpret_cast<Object*>(args[3]); 2125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao obj->SetFieldObject(MemberOffset((static_cast<uint64_t>(args[2]) << 32) | args[1]), newValue, false); 21364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 21464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Attempt to invoke native method in non-started runtime: " << name; 21564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 21664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 21764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 21864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void InterpreterJni(Thread* self, AbstractMethod* method, StringPiece shorty, 2195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* receiver, uint32_t* args, JValue* result) 22064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 22164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: The following enters JNI code using a typedef-ed function rather than the JNI compiler, 22264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // it should be removed and JNI compiled stubs used instead. 22364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 22464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (method->IsStatic()) { 22564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 22664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass); 227d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 22864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 22964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 230556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 231556d637764b71563030c479bc35364a75188d559Ian Rogers { 232556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 233556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get()); 234556d637764b71563030c479bc35364a75188d559Ian Rogers } 235556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 23664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "V") { 23764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass); 238d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 23964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 24064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 24164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 24264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get()); 24364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "Z") { 24464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass); 245d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 24664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 24764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 24864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 24964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get())); 25064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "BI") { 25164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jbyte (fnptr)(JNIEnv*, jclass, jint); 252d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 25364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 25464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 25564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2565d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetB(fn(soa.Env(), klass.get(), args[0])); 25764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "II") { 25864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint); 259d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 26064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2635d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), args[0])); 26464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 26564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass, jobject); 266d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 26764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 2705d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 271556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 272556d637764b71563030c479bc35364a75188d559Ian Rogers { 273556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 274556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get(), arg0.get()); 275556d637764b71563030c479bc35364a75188d559Ian Rogers } 276556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 27764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "IIZ") { 27864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint, jboolean); 279d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 28064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), args[0], args[1])); 28464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ILI") { 28564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jobject, jint); 286d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 28764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 2905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 29164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), arg0.get(), args[1])); 29364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "SIZ") { 29464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jshort (fnptr)(JNIEnv*, jclass, jint, jboolean); 295d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 29664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 29764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 29864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetS(fn(soa.Env(), klass.get(), args[0], args[1])); 30064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VIZ") { 30164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jboolean); 302d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 30364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 30464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 30564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), args[0], args[1]); 30764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZLL") { 30864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jobject, jobject); 309d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 31064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 31164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 31264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 31464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 31664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 31764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get(), arg0.get(), arg1.get())); 31864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZILL") { 31964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jint, jobject, jobject); 320d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 32164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 32264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 32364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 32564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 3265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[2]))); 32764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3285d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetZ(fn(soa.Env(), klass.get(), args[0], arg1.get(), arg2.get())); 32964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VILII") { 33064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jobject, jint, jint); 331d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 33264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 33364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 33464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 33664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3375d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), args[0], arg1.get(), args[2], args[3]); 33864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VLILII") { 33964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jobject, jint, jobject, jint, jint); 340d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 34164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 34264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 34364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3445d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 34564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 3465d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[2]))); 34764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3485d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), arg0.get(), args[1], arg2.get(), args[3], args[4]); 34964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 35064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with static native method: " << PrettyMethod(method) 35164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 35264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 35364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 35464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 35564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject); 356d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 35764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 35864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 359556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 360556d637764b71563030c479bc35364a75188d559Ian Rogers { 361556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 362556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get()); 363556d637764b71563030c479bc35364a75188d559Ian Rogers } 364556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 3653dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao } else if (shorty == "V") { 3663dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao typedef void (fnptr)(JNIEnv*, jobject); 3673dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 3683dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao ScopedLocalRef<jobject> rcvr(soa.Env(), 3693dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao soa.AddLocalReference<jobject>(receiver)); 3703dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao ScopedThreadStateChange tsc(self, kNative); 3713dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao fn(soa.Env(), rcvr.get()); 37264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 37364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject, jobject); 374d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 37564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 37664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 37764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 379556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 380556d637764b71563030c479bc35364a75188d559Ian Rogers { 381556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 382556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get(), arg0.get()); 383556d637764b71563030c479bc35364a75188d559Ian Rogers } 384556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 38564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 38664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "III") { 38764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jobject, jint, jint); 388d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 38964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 39064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 39164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), rcvr.get(), args[0], args[1])); 39364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 39464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with native method: " << PrettyMethod(method) 39564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 39664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 39764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 39864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 39964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 4002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorEnter(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 4012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorEnter(self); 4022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorExit(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 4052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorExit(self); 4062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 408ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 409ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 410233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<InvokeType type, bool is_range, bool do_access_check> 4111521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoInvoke(Thread* self, ShadowFrame& shadow_frame, 412ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers const Instruction* inst, JValue* result) NO_THREAD_SAFETY_ANALYSIS; 413ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers 414233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<InvokeType type, bool is_range, bool do_access_check> 4151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoInvoke(Thread* self, ShadowFrame& shadow_frame, 416ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers const Instruction* inst, JValue* result) { 417807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t method_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); 418790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao uint32_t vregC = (is_range) ? inst->VRegC_3rc() : inst->VRegC_35c(); 419790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao Object* receiver = (type == kStatic) ? NULL : shadow_frame.GetVRegReference(vregC); 420790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao AbstractMethod* method = FindMethodFromCode(method_idx, receiver, shadow_frame.GetMethod(), self, 421233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check, type); 422790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(method == NULL)) { 4232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(self->IsExceptionPending()); 4242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result->SetJ(0); 4251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 4261521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } else if (UNLIKELY(method->IsAbstract())) { 4271521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz ThrowAbstractMethodError(method); 4281521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz result->SetJ(0); 4291521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 4302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 431167436311a08a65dea28dda079a137893821c9c7Jeff Hao 432790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao MethodHelper mh(method); 433790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const DexFile::CodeItem* code_item = mh.GetCodeItem(); 434167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint16_t num_regs; 435167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint16_t num_ins; 436790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (LIKELY(code_item != NULL)) { 437167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_regs = code_item->registers_size_; 438167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_ins = code_item->ins_size_; 4392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 440790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao DCHECK(method->IsNative() || method->IsProxyMethod()); 441790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 442790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (!method->IsStatic()) { 443167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_regs++; 444167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_ins++; 445167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 4462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 447167436311a08a65dea28dda079a137893821c9c7Jeff Hao 4486613519990bdb5616f2858c146f162ef760f03d2Jeff Hao void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 449790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao ShadowFrame* new_shadow_frame(ShadowFrame::Create(num_regs, &shadow_frame, method, 0, memory)); 450167436311a08a65dea28dda079a137893821c9c7Jeff Hao size_t cur_reg = num_regs - num_ins; 451167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (receiver != NULL) { 452167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegReference(cur_reg, receiver); 453167436311a08a65dea28dda079a137893821c9c7Jeff Hao ++cur_reg; 454167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 455167436311a08a65dea28dda079a137893821c9c7Jeff Hao 456167436311a08a65dea28dda079a137893821c9c7Jeff Hao size_t arg_offset = (receiver == NULL) ? 0 : 1; 457790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const char* shorty = mh.GetShorty(); 458807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t arg[5]; 459807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (!is_range) { 460807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->GetArgs(arg); 461807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 462167436311a08a65dea28dda079a137893821c9c7Jeff Hao for (size_t shorty_pos = 0; cur_reg < num_regs; ++shorty_pos, cur_reg++, arg_offset++) { 463790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 464807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz size_t arg_pos = is_range ? vregC + arg_offset : arg[arg_offset]; 465167436311a08a65dea28dda079a137893821c9c7Jeff Hao switch (shorty[shorty_pos + 1]) { 466167436311a08a65dea28dda079a137893821c9c7Jeff Hao case 'L': { 467167436311a08a65dea28dda079a137893821c9c7Jeff Hao Object* o = shadow_frame.GetVRegReference(arg_pos); 468167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegReference(cur_reg, o); 469167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 470167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 471167436311a08a65dea28dda079a137893821c9c7Jeff Hao case 'J': case 'D': { 472167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint64_t wide_value = (static_cast<uint64_t>(shadow_frame.GetVReg(arg_pos + 1)) << 32) | 473167436311a08a65dea28dda079a137893821c9c7Jeff Hao static_cast<uint32_t>(shadow_frame.GetVReg(arg_pos)); 474167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegLong(cur_reg, wide_value); 475167436311a08a65dea28dda079a137893821c9c7Jeff Hao cur_reg++; 476167436311a08a65dea28dda079a137893821c9c7Jeff Hao arg_offset++; 477167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 478167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 479167436311a08a65dea28dda079a137893821c9c7Jeff Hao default: 480167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVReg(cur_reg, shadow_frame.GetVReg(arg_pos)); 481167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao } 483167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 484167436311a08a65dea28dda079a137893821c9c7Jeff Hao 4856613519990bdb5616f2858c146f162ef760f03d2Jeff Hao if (LIKELY(Runtime::Current()->IsStarted())) { 486790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); 487167436311a08a65dea28dda079a137893821c9c7Jeff Hao } else { 488790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, num_regs - num_ins); 48964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 4901521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return !self->IsExceptionPending(); 4912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4932d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 4942d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 4952d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<bool is_range> 4961521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoInvokeVirtualQuick(Thread* self, ShadowFrame& shadow_frame, 4972d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst, JValue* result) 4982d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS; 4992d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5002d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<bool is_range> 5011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoInvokeVirtualQuick(Thread* self, ShadowFrame& shadow_frame, 5022d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst, JValue* result) { 5032d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t vregC = (is_range) ? inst->VRegC_3rc() : inst->VRegC_35c(); 5042d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* receiver = shadow_frame.GetVRegReference(vregC); 5052d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(receiver == NULL)) { 5062d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the method index so we cannot get a more 5072d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 5082d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 5091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 5102d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5112d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t vtable_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); 5121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz // TODO: use ObjectArray<T>::GetWithoutChecks ? 5132d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz AbstractMethod* method = receiver->GetClass()->GetVTable()->Get(vtable_idx); 5142d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(method == NULL)) { 5152d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz CHECK(self->IsExceptionPending()); 5162d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz result->SetJ(0); 5171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 5181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } else if (UNLIKELY(method->IsAbstract())) { 5191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz ThrowAbstractMethodError(method); 5201521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz result->SetJ(0); 5211521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 5222d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5232d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5241521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz MethodHelper mh(method); 5252d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const DexFile::CodeItem* code_item = mh.GetCodeItem(); 5262d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint16_t num_regs; 5272d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint16_t num_ins; 5282d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (code_item != NULL) { 5292d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs = code_item->registers_size_; 5302d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_ins = code_item->ins_size_; 5312d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else { 5322d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DCHECK(method->IsNative() || method->IsProxyMethod()); 5332d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 5342d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (!method->IsStatic()) { 5352d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs++; 5362d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_ins++; 5372d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5382d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5392d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5402d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 5412d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ShadowFrame* new_shadow_frame(ShadowFrame::Create(num_regs, &shadow_frame, 5422d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz method, 0, memory)); 5432d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t cur_reg = num_regs - num_ins; 5442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (receiver != NULL) { 5452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegReference(cur_reg, receiver); 5462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ++cur_reg; 5472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t arg_offset = (receiver == NULL) ? 0 : 1; 5502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const char* shorty = mh.GetShorty(); 5512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t arg[5]; 5522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (!is_range) { 5532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz inst->GetArgs(arg); 5542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz for (size_t shorty_pos = 0; cur_reg < num_regs; ++shorty_pos, cur_reg++, arg_offset++) { 5562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 5572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t arg_pos = is_range ? vregC + arg_offset : arg[arg_offset]; 5582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (shorty[shorty_pos + 1]) { 5592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case 'L': { 5602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* o = shadow_frame.GetVRegReference(arg_pos); 5612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegReference(cur_reg, o); 5622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case 'J': case 'D': { 5652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint64_t wide_value = (static_cast<uint64_t>(shadow_frame.GetVReg(arg_pos + 1)) << 32) | 5662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(arg_pos)); 5672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegLong(cur_reg, wide_value); 5682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz cur_reg++; 5692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz arg_offset++; 5702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 5732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVReg(cur_reg, shadow_frame.GetVReg(arg_pos)); 5742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (LIKELY(Runtime::Current()->IsStarted())) { 5792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); 5802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else { 5812d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, num_regs - num_ins); 5822d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5831521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return !self->IsExceptionPending(); 5842d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 5852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 586c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// We use template functions to optimize compiler inlining process. Otherwise, 587c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// some parts of the code (like a switch statement) which depend on a constant 588c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// parameter would not be inlined while it should be. These constant parameters 589c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// are now part of the template arguments. 590c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// Note these template functions are static and inlined so they should not be 591c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// part of the final object file. 592ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 593ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 594233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 5951521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 596c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) 597ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 598fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 599233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 6001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 601c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) { 6022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectRead) || (find_type == StaticPrimitiveRead); 603807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t field_idx = is_static ? inst->VRegB_21c() : inst->VRegC_22c(); 6042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 605233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz find_type, Primitive::FieldSize(field_type), 606233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check); 607807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(f == NULL)) { 608807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 6091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 610807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 611807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj; 612807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (is_static) { 613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = f->GetDeclaringClass(); 614807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 615807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 616807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerExceptionForFieldAccess(shadow_frame.GetCurrentLocationForThrow(), f, true); 6181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 6192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 621807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = is_static ? inst->VRegA_21c() : inst->VRegA_22c(); 622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (field_type) { 623807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimBoolean: 624807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetBoolean(obj)); 625807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimByte: 627807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetByte(obj)); 628807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 629807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimChar: 630807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetChar(obj)); 631807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 632807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimShort: 633807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetShort(obj)); 634807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 635807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimInt: 636807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetInt(obj)); 637807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 638807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimLong: 639807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, f->GetLong(obj)); 640807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 641807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimNot: 642807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(vregA, f->GetObject(obj)); 643807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 644807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 645807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 646807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 6471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 6482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 6492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 650ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 651ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 6522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 6531521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoIGetQuick(Thread* self, ShadowFrame& shadow_frame, 6542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) 6552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 6562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 6572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 6581521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoIGetQuick(Thread* self, ShadowFrame& shadow_frame, 6592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) { 6602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 6612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(obj == NULL)) { 6622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the field index so we cannot get a more 6632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 6642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 6651521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 6662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 6672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MemberOffset field_offset(inst->VRegC_22c()); 6687934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom const bool is_volatile = false; // iget-x-quick only on non volatile fields. 6692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const uint32_t vregA = inst->VRegA_22c(); 6702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (field_type) { 6712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimInt: 6722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetField32(field_offset, is_volatile))); 6732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimLong: 6752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVRegLong(vregA, static_cast<int64_t>(obj->GetField64(field_offset, is_volatile))); 6762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimNot: 6782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVRegReference(vregA, obj->GetFieldObject<mirror::Object*>(field_offset, is_volatile)); 6792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 6812d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 6822d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 6831521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 6842d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 6852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 6862d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 6872d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 688233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 6891521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoFieldPut(Thread* self, const ShadowFrame& shadow_frame, 690c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) 691ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 692fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 693233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 6941521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoFieldPut(Thread* self, const ShadowFrame& shadow_frame, 695c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) { 6962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectWrite) || (find_type == StaticPrimitiveWrite); 697807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t field_idx = is_static ? inst->VRegB_21c() : inst->VRegC_22c(); 6982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 699233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz find_type, Primitive::FieldSize(field_type), 700233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check); 701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(f == NULL)) { 702807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 7031521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 704807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 705807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj; 706807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (is_static) { 707807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = f->GetDeclaringClass(); 708807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 709807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 710807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 711807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerExceptionForFieldAccess(shadow_frame.GetCurrentLocationForThrow(), 712807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f, false); 7131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 7142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 715807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 716807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = is_static ? inst->VRegA_21c() : inst->VRegA_22c(); 717807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (field_type) { 718807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimBoolean: 719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetBoolean(obj, shadow_frame.GetVReg(vregA)); 720807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 721807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimByte: 722807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetByte(obj, shadow_frame.GetVReg(vregA)); 723807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 724807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimChar: 725807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetChar(obj, shadow_frame.GetVReg(vregA)); 726807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 727807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimShort: 728807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetShort(obj, shadow_frame.GetVReg(vregA)); 729807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 730807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimInt: 731807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetInt(obj, shadow_frame.GetVReg(vregA)); 732807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 733807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimLong: 734807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetLong(obj, shadow_frame.GetVRegLong(vregA)); 735807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 736807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimNot: 737807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetObj(obj, shadow_frame.GetVRegReference(vregA)); 738807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 739807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 740807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 741807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 7421521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 743807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 744807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 7452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 7462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 7472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 7481521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoIPutQuick(Thread* self, ShadowFrame& shadow_frame, 7492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) 7502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 7512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 7522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 7531521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoIPutQuick(Thread* self, ShadowFrame& shadow_frame, 7542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) { 7552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 7562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(obj == NULL)) { 7572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the field index so we cannot get a more 7582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 7592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7601521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 7612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 7622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MemberOffset field_offset(inst->VRegC_22c()); 7637934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom const bool is_volatile = false; // iput-x-quick only on non volatile fields. 7642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const uint32_t vregA = inst->VRegA_22c(); 7652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (field_type) { 7662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimInt: 7672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetField32(field_offset, shadow_frame.GetVReg(vregA), is_volatile); 7682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimLong: 7702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetField64(field_offset, shadow_frame.GetVRegLong(vregA), is_volatile); 7712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimNot: 7732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetFieldObject(field_offset, shadow_frame.GetVRegReference(vregA), is_volatile); 7742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 7762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 7772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 7781521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 7792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 7802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 78133e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic inline String* ResolveString(Thread* self, MethodHelper& mh, uint32_t string_idx) 78233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 783807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* java_lang_string_class = String::GetJavaLangString(); 784807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!java_lang_string_class->IsInitialized())) { 785807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 786807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!class_linker->EnsureInitialized(java_lang_string_class, 787807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz true, true))) { 788807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK(self->IsExceptionPending()); 789807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return NULL; 7902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 792807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return mh.ResolveString(string_idx); 7932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 7942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 7951521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoIntDivide(ShadowFrame& shadow_frame, size_t result_reg, 7960a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int32_t dividend, int32_t divisor) 7970a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 798d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 7990a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 8001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 8011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 8021521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 803d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, kMinInt); 804d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 805d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend / divisor); 806d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 8071521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 808d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 809d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoIntRemainder(ShadowFrame& shadow_frame, size_t result_reg, 8110a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int32_t dividend, int32_t divisor) 8120a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 813d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8140a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 8151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 8161521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 8171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 818d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, 0); 819d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 820d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend % divisor); 821d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 8221521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 823d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 824d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoLongDivide(ShadowFrame& shadow_frame, size_t result_reg, 8260a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int64_t dividend, int64_t divisor) 8270a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 828d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8290a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 8301521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 8311521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 8321521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 833d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, kMinLong); 834d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 835d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend / divisor); 836d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 8371521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 838d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 839d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8401521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoLongRemainder(ShadowFrame& shadow_frame, size_t result_reg, 8410a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int64_t dividend, int64_t divisor) 8420a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 843d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8440a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 8451521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 8461521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 8471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 848d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, 0); 849d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 850d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend % divisor); 851d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 8521521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 853d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 854d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 85524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 85624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// specialization. 85724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// Returns true on success, otherwise throws an exception and returns false. 85824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertztemplate <bool is_range, bool do_access_check> 85924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertzstatic bool DoFilledNewArray(const Instruction* inst, const ShadowFrame& shadow_frame, 86024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Thread* self, JValue* result) 86124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 86224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 86324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertztemplate <bool is_range, bool do_access_check> 86424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertzstatic inline bool DoFilledNewArray(const Instruction* inst, 86524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const ShadowFrame& shadow_frame, 86624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Thread* self, JValue* result) { 86724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(inst->Opcode() == Instruction::FILLED_NEW_ARRAY || 86824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz inst->Opcode() == Instruction::FILLED_NEW_ARRAY_RANGE); 86924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const int32_t length = is_range ? inst->VRegA_3rc() : inst->VRegA_35c(); 87024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (!is_range) { 87124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz // Checks FILLED_NEW_ARRAY's length does not exceed 5 arguments. 87224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz CHECK_LE(length, 5); 87324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 87424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(length < 0)) { 87524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz ThrowNegativeArraySizeException(length); 87624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 87724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 87824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint16_t type_idx = is_range ? inst->VRegB_3rc() : inst->VRegB_35c(); 87924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Class* arrayClass = ResolveVerifyAndClinit(type_idx, shadow_frame.GetMethod(), 88024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, false, do_access_check); 88124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(arrayClass == NULL)) { 88224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(self->IsExceptionPending()); 88324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 88424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 88524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz CHECK(arrayClass->IsArrayClass()); 88624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Class* componentClass = arrayClass->GetComponentType(); 88724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(componentClass->IsPrimitive() && !componentClass->IsPrimitiveInt())) { 88824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (componentClass->IsPrimitiveLong() || componentClass->IsPrimitiveDouble()) { 88924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz ThrowRuntimeException("Bad filled array request for type %s", 89024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz PrettyDescriptor(componentClass).c_str()); 89124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 89224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 89324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz "Ljava/lang/InternalError;", 89424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz "Found type %s; filled-new-array not implemented for anything but \'int\'", 89524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz PrettyDescriptor(componentClass).c_str()); 89624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 89724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 89824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 89924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Object* newArray = Array::Alloc(self, arrayClass, length); 90024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(newArray == NULL)) { 90124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(self->IsExceptionPending()); 90224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 90324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 90424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_range) { 90524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint32_t vregC = inst->VRegC_3rc(); 90624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const bool is_primitive_int_component = componentClass->IsPrimitiveInt(); 90724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz for (int32_t i = 0; i < length; ++i) { 90824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_primitive_int_component) { 90924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(vregC + i)); 91024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 91124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(vregC + i)); 91224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 91324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 91424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 91524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint32_t arg[5]; 91624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz inst->GetArgs(arg); 91724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const bool is_primitive_int_component = componentClass->IsPrimitiveInt(); 91824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz for (int32_t i = 0; i < length; ++i) { 91924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_primitive_int_component) { 92024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(arg[i])); 92124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 92224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(arg[i])); 92324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 92424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 92524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 92624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 92724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz result->SetL(newArray); 92824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return true; 92924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz} 93024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 9312cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertzstatic inline const Instruction* DoSparseSwitch(const Instruction* inst, 9322cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const ShadowFrame& shadow_frame) 9332cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 9342cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(inst->Opcode() == Instruction::SPARSE_SWITCH); 9352cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const uint16_t* switch_data = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 9362cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int32_t test_val = shadow_frame.GetVReg(inst->VRegA_31t()); 9372cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kSparseSwitchSignature)); 9382cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz uint16_t size = switch_data[1]; 9392cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK_GT(size, 0); 9402cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 9412cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(IsAligned<4>(keys)); 9422cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const int32_t* entries = keys + size; 9432cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(IsAligned<4>(entries)); 9442cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int lo = 0; 9452cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int hi = size - 1; 9462cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz while (lo <= hi) { 9472cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int mid = (lo + hi) / 2; 9482cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int32_t foundVal = keys[mid]; 9492cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz if (test_val < foundVal) { 9502cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz hi = mid - 1; 9512cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } else if (test_val > foundVal) { 9522cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz lo = mid + 1; 9532cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } else { 9542cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz return inst->RelativeAt(entries[mid]); 9552cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } 9562cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } 9572cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz return inst->Next_3xx(); 9582cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz} 9592cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz 960fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline const Instruction* FindNextInstructionFollowingException(Thread* self, 961fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, 962fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers uint32_t dex_pc, 963fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers const uint16_t* insns, 964fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers SirtRef<Object>& this_object_ref, 965fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers instrumentation::Instrumentation* instrumentation) 966fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ALWAYS_INLINE; 967fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 968fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline const Instruction* FindNextInstructionFollowingException(Thread* self, 969fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, 970fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers uint32_t dex_pc, 971fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers const uint16_t* insns, 972fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers SirtRef<Object>& this_object_ref, 97333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers instrumentation::Instrumentation* instrumentation) 97433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 9759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao self->VerifyStack(); 9769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ThrowLocation throw_location; 9779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao mirror::Throwable* exception = self->GetException(&throw_location); 9789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao uint32_t found_dex_pc = shadow_frame.GetMethod()->FindCatchBlock(exception->GetClass(), dex_pc); 9799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (found_dex_pc == DexFile::kDexNoIndex) { 9809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao instrumentation->MethodUnwindEvent(self, this_object_ref.get(), 9819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.GetMethod(), dex_pc); 9829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return NULL; 9839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 9849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao instrumentation->ExceptionCaughtEvent(self, throw_location, 9859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.GetMethod(), 9869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao found_dex_pc, exception); 9879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return Instruction::At(insns + found_dex_pc); 9889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao} 9909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 9919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao#define HANDLE_PENDING_EXCEPTION() \ 9929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CHECK(self->IsExceptionPending()); \ 993d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers inst = FindNextInstructionFollowingException(self, shadow_frame, inst->GetDexPc(insns), insns, \ 9949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao this_object_ref, instrumentation); \ 9959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (inst == NULL) { \ 9969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return JValue(); /* Handled in caller. */ \ 9979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 9991521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(is_exception_pending, next_function) \ 10001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(is_exception_pending)) { \ 10011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 10029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { \ 1003df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom inst = inst->next_function(); \ 10049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 10059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 1006fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic void UnexpectedOpcode(const Instruction* inst, MethodHelper& mh) 1007df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom __attribute__((cold, noreturn, noinline)); 1008fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 100933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic void UnexpectedOpcode(const Instruction* inst, MethodHelper& mh) 101033e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 1011fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers LOG(FATAL) << "Unexpected instruction: " << inst->DumpString(&mh.GetDexFile()); 1012fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers exit(0); // Unreachable, keep GCC happy. 1013fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers} 1014fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 1015d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers// Code to run before each dex instruction. 1016d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers#define PREAMBLE() 1017d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers 1018233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 1019233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz// specialization. 1020233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<bool do_access_check> 1021233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue ExecuteImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 1022306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers ShadowFrame& shadow_frame, JValue result_register) 1023df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom NO_THREAD_SAFETY_ANALYSIS __attribute__((hot)); 1024fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 1025233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<bool do_access_check> 1026233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue ExecuteImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 1027fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, JValue result_register) { 102862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 102962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers LOG(FATAL) << "Invalid shadow frame for interpreter use"; 103062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers return JValue(); 103162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 103262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->VerifyStack(); 10335fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); 1034807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 1035807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // As the 'this' object won't change during the execution of current code, we 1036807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // want to cache it in local variables. Nevertheless, in order to let the 1037807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // garbage collector access it, we store it into sirt references. 1038e701f48eb06fa59871412a11286429111270b211Jeff Hao SirtRef<Object> this_object_ref(self, shadow_frame.GetThisObject(code_item->ins_size_)); 1039807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 10405fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 10415fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.. 104274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { 104374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodEnterEvent(self, this_object_ref.get(), 104474109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), 0); 104574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 104662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 10475fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz const uint16_t* const insns = code_item->insns_; 10485fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 10492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers while (true) { 10505fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz dex_pc = inst->GetDexPc(insns); 10515fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz shadow_frame.SetDexPC(dex_pc); 1052fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (UNLIKELY(self->TestAllFlags())) { 10539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CheckSuspend(self); 10549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 10555fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz if (UNLIKELY(instrumentation->HasDexPcListeners())) { 105674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->DexPcMovedEvent(self, this_object_ref.get(), 105774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), dex_pc); 105874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 105964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const bool kTracing = false; 10602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (kTracing) { 106162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#define TRACE_LOG std::cerr 106262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << PrettyMethod(shadow_frame.GetMethod()) 1063807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz << StringPrintf("\n0x%x: ", dex_pc) 106462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers << inst->DumpString(&mh.GetDexFile()) << "\n"; 1065ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) { 106662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers uint32_t raw_value = shadow_frame.GetVReg(i); 106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Object* ref_value = shadow_frame.GetVRegReference(i); 106862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << StringPrintf(" vreg%d=0x%08X", i, raw_value); 106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (ref_value != NULL) { 107062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (ref_value->GetClass()->IsStringClass() && 107162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ref_value->AsString()->GetCharArray() != NULL) { 107262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "/java.lang.String \"" << ref_value->AsString()->ToModifiedUtf8() << "\""; 10732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 107462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "/" << PrettyTypeOf(ref_value); 10752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 107862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "\n"; 107962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#undef TRACE_LOG 10802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1081807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (inst->Opcode()) { 10822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOP: 1083d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 10849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 10852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE: 1087d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1088807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 1089807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 10909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1091807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_FROM16: 1093d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1094807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(), 1095807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 10969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1097807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_16: 1099d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1101807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 11029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE: 1105d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1106807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), 1107807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 11089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1109807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_FROM16: 1111d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1112807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(), 1113807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 11149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1115807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_16: 1117d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 1119807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 11209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT: 1123d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1124807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(), 1125807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x())); 11269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1127807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_FROM16: 1129d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1130807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(), 1131807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 11329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1133807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_16: 1135d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1136807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 1137807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 11389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT: 1141d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1142807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(), result_register.GetI()); 11439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_WIDE: 1146d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1147807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(), result_register.GetJ()); 11489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_OBJECT: 1151d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1152807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), result_register.GetL()); 11539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_EXCEPTION: { 1156d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 115762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Throwable* exception = self->GetException(NULL); 11582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->ClearException(); 1159807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), exception); 11609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_VOID: { 1164d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 116674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 116774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 116874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 116974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 117074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1173cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz case Instruction::RETURN_VOID_BARRIER: { 1174cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz PREAMBLE(); 1175cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz ANDROID_MEMBAR_STORE(); 1176cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz JValue result; 1177cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 1178cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 1179cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1180cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz result); 1181cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz } 1182cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz return result; 1183cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz } 11842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN: { 1185d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 11872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 1188807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x())); 118974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 119074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 119174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 119274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 119374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_WIDE: { 1197d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 1199807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x())); 120074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 120174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 120274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 120374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 120474109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 12052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 12062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_OBJECT: { 1208d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 12102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 1211807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetL(shadow_frame.GetVRegReference(inst->VRegA_11x())); 121274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 121374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 121474109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 121574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 121674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 12172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 12182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_4: { 1220d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12215fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t dst = inst->VRegA_11n(); 12225fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz int4_t val = inst->VRegB_11n(); 1223807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1225807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 12282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_16: { 1231d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12325fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_21s(); 12335fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz int16_t val = inst->VRegB_21s(); 1234807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1236807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST: { 1242d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12435fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_31i(); 1244807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t val = inst->VRegB_31i(); 1245807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1247807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_HIGH16: { 1253d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12545fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_21h(); 125513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 1256807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1258807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 126364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_16: 1264d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 126513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(), inst->VRegB_21s()); 12669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 126864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_32: 1269d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 127013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(), inst->VRegB_31i()); 12719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE: 1274d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(), inst->VRegB_51l()); 12769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_51l(); 12772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE_HIGH16: 1279807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(), 1280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 12819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 1283807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CONST_STRING: { 1284d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_21c()); 1286807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(s == NULL)) { 12879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1288807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1289df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom shadow_frame.SetVRegReference(inst->VRegA_21c(), s); 12909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1292807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1293807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 12942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_STRING_JUMBO: { 1295d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1296807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_31c()); 1297807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(s == NULL)) { 12989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1299807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1300df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom shadow_frame.SetVRegReference(inst->VRegA_31c(), s); 13019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 13022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13050a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao case Instruction::CONST_CLASS: { 1306d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1307807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 1308233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 1309807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(c == NULL)) { 13109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1311807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1312807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), c); 13139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1314807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 13152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13160a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } 131787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_ENTER: { 1318d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1319807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 132087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 132162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 1322e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 132387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 132487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorEnter(self, obj); 13251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 132687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 132887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 132987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_EXIT: { 1330d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1331807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 133287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 133362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 1334e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 133587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 133687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorExit(self, obj); 13371521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 133887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 134087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CHECK_CAST: { 1342d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1343807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 1344233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 134587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 13469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 134787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 1348807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c()); 134987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 135062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowClassCastException(c, obj->GetClass()); 13519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 13529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 13539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 135487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INSTANCE_OF: { 1359d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1360807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(), 1361233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 136287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 13639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 136487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 1365807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 1366807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22c(), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 13679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 136887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ARRAY_LENGTH: { 1372d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1373807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x()); 13742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(array == NULL)) { 137562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 13769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 137713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz } else { 137813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), array->AsArray()->GetLength()); 137913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz inst = inst->Next_1xx(); 13802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_INSTANCE: { 1384d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1385807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = AllocObjectFromCode(inst->VRegB_21c(), shadow_frame.GetMethod(), 1386233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, do_access_check); 1387807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 13889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1389807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1390807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), obj); 13919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1392807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 13932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_ARRAY: { 1396d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1397807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c()); 1398807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = AllocArrayFromCode(inst->VRegC_22c(), shadow_frame.GetMethod(), 1399233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz length, self, do_access_check); 1400807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 14019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1402807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1403807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22c(), obj); 14049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1405807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 14062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1408807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 1409d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 141024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz bool success = DoFilledNewArray<false, do_access_check>(inst, shadow_frame, 141124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, &result_register); 14121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 141464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 1415807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 1416d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 141724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz bool success = DoFilledNewArray<true, do_access_check>(inst, shadow_frame, 141824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, &result_register); 14191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1422807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 1423d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1424807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t()); 1425807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 1426807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA"); 14279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1428807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 14292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1430807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Array* array = obj->AsArray(); 1431807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 143213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 1433807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz const Instruction::ArrayDataPayload* payload = 143413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 1435807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 1436807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 1437807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz "Ljava/lang/ArrayIndexOutOfBoundsException;", 1438807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz "failed FILL_ARRAY_DATA; length=%d, index=%d", 1439807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz array->GetLength(), payload->element_count); 14409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1441807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1442807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1443807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t size_in_bytes = payload->element_count * payload->element_width; 1444807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes); 14459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 14462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 14482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::THROW: { 1449d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1450807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x()); 1451807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(exception == NULL)) { 145262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerException(NULL, "throw with null exception"); 145362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } else { 145462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetException(shadow_frame.GetCurrentLocationForThrow(), exception->AsThrowable()); 145562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 14569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 14572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1459807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::GOTO: { 1460d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 146192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_10t()); 1462807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1463807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1464807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::GOTO_16: { 1465d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 146692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_20t()); 1467807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1468807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 14692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO_32: { 1470d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 147192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_30t()); 14722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1474556d637764b71563030c479bc35364a75188d559Ian Rogers case Instruction::PACKED_SWITCH: { 1475d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 147692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz const uint16_t* switch_data = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 1477807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t test_val = shadow_frame.GetVReg(inst->VRegA_31t()); 1478d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kPackedSwitchSignature)); 1479556d637764b71563030c479bc35364a75188d559Ian Rogers uint16_t size = switch_data[1]; 1480d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK_GT(size, 0); 1481556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 1482443dcc328e9de0b919f823aa14f28f3e2f7d84a2Sebastien Hertz DCHECK(IsAligned<4>(keys)); 1483556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t first_key = keys[0]; 1484556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* targets = reinterpret_cast<const int32_t*>(&switch_data[4]); 1485d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK(IsAligned<4>(targets)); 1486556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t index = test_val - first_key; 1487556d637764b71563030c479bc35364a75188d559Ian Rogers if (index >= 0 && index < size) { 148892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(targets[index]); 14899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 14909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 1491556d637764b71563030c479bc35364a75188d559Ian Rogers } 14922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 1493556d637764b71563030c479bc35364a75188d559Ian Rogers } 14942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPARSE_SWITCH: { 1495d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 14962cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz inst = DoSparseSwitch(inst, shadow_frame); 14972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1499807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPL_FLOAT: { 1500d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1501807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 1502807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 1503807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1504fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 > val2) { 1505807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1506fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1507fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1508807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1509807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 15102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1511807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1513807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1514807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1515807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPG_FLOAT: { 1516d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1517807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 1518807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 1519807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1520fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 < val2) { 1521807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1522fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1523fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1524807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1525807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 15262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1527807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1529807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1530807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1531807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPL_DOUBLE: { 1532d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1533807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 1534807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 1535807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1536fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 > val2) { 1537807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1538fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1539fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1540807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1541807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1542807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1543807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15449cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1545807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1546807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1547807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 1548807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPG_DOUBLE: { 1549d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1550807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 1551807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 1552807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1553fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 < val2) { 1554807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1555fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1556fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1557807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1558807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1559807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1560807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1562807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1563807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1564807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMP_LONG: { 1565d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1566807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 1567807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 1568807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1569807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (val1 > val2) { 1570807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1571807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else if (val1 == val2) { 1572807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 0; 1573807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1574807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1575807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1576807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQ: { 1581d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1582807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) == shadow_frame.GetVReg(inst->VRegB_22t())) { 158392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NE: { 1590d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1591807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) != shadow_frame.GetVReg(inst->VRegB_22t())) { 159292c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LT: { 1599d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1600807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) < shadow_frame.GetVReg(inst->VRegB_22t())) { 160192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GE: { 1608d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1609807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) >= shadow_frame.GetVReg(inst->VRegB_22t())) { 161092c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GT: { 1617d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1618807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) > shadow_frame.GetVReg(inst->VRegB_22t())) { 161992c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LE: { 1626d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1627807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) <= shadow_frame.GetVReg(inst->VRegB_22t())) { 162892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQZ: { 1635d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1636807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) == 0) { 163792c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16399cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NEZ: { 1644d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1645807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) != 0) { 164692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LTZ: { 1653d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1654807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) < 0) { 165592c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GEZ: { 1662d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1663807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) >= 0) { 166492c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GTZ: { 1671d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1672807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) > 0) { 167392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LEZ: { 1680d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1681807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) <= 0) { 168292c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BOOLEAN: { 1689d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1690807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 16912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 169262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 16939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 16942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1696807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 16979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao BooleanArray* array = a->AsBooleanArray(); 16989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 16999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BYTE: { 1707d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1708807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 171062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1714807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ByteArray* array = a->AsByteArray(); 17169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17189cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_CHAR: { 1725d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1726807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 172862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1732807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CharArray* array = a->AsCharArray(); 17349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17399cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_SHORT: { 1743d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1744807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 174662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1750807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ShortArray* array = a->AsShortArray(); 17529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET: { 1761d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1762807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 176462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1768807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao IntArray* array = a->AsIntArray(); 17709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_WIDE: { 1779d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1780807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 178262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1786807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao LongArray* array = a->AsLongArray(); 17889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVRegLong(inst->VRegA_23x(), array->GetData()[index]); 17909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_OBJECT: { 1797d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1798807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 180062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1804807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ObjectArray<Object>* array = a->AsObjectArray<Object>(); 18069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVRegReference(inst->VRegA_23x(), array->GetWithoutChecks(index)); 18089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BOOLEAN: { 1815d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1816807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 181862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1822807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1823807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao BooleanArray* array = a->AsBooleanArray(); 18259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BYTE: { 1834d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1835807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 183762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1841807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1842807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ByteArray* array = a->AsByteArray(); 18449cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_CHAR: { 1853d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1854807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 185662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1860807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1861807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CharArray* array = a->AsCharArray(); 18639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_SHORT: { 1872d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1873807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 187562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1879807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1880807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ShortArray* array = a->AsShortArray(); 18829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT: { 1891d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1892807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 189462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1898807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1899807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao IntArray* array = a->AsIntArray(); 19019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 19029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 19039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 19049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 19059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 19072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_WIDE: { 1910d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1911807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 19122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 191362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 19149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1917807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x()); 1918807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao LongArray* array = a->AsLongArray(); 19209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 19219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 19229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 19239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 19249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 19262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_OBJECT: { 1929d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1930807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 19312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 193262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 19339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1936807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19376bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x()); 19386bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 19396bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz if (LIKELY(array->IsValidIndex(index) && array->CheckAssignable(val))) { 19406bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz array->SetWithoutChecks(index, val); 19416bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz inst = inst->Next_2xx(); 19426bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz } else { 19436bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 19446bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz } 19452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_BOOLEAN: { 1948d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19491521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 19501521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19521521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19531521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_BYTE: { 1954d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19551521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 19561521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19581521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19591521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_CHAR: { 1960d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19611521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 19621521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19641521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19651521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_SHORT: { 1966d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19671521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 19681521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19701521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19711521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET: { 1972d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19731521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 19741521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19761521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19771521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_WIDE: { 1978d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19791521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 19801521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19821521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19831521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_OBJECT: { 1984d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19851521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 19861521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19881521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19891521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_QUICK: { 19902d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19911521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 19921521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19932d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 19941521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19951521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 19962d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19971521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 19981521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19992d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 20022d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20031521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 20041521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20052d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20061521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20071521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_BOOLEAN: { 2008d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 20101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_BYTE: { 2014d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 20161521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_CHAR: { 2020d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20211521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20221521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20241521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_SHORT: { 2026d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20271521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20281521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20301521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20311521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET: { 2032d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20331521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20341521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20361521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20371521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_WIDE: { 2038d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20391521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20401521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20421521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20431521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_OBJECT: { 2044d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20451521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20461521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20481521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20491521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_BOOLEAN: { 2050d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20511521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 20521521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20541521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20551521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_BYTE: { 2056d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20571521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 20581521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20601521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20611521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_CHAR: { 2062d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20631521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20641521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20661521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20671521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_SHORT: { 2068d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20691521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20701521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20721521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20731521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT: { 2074d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20751521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20761521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20781521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20791521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_WIDE: { 2080d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20811521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20821521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20841521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20851521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_OBJECT: { 2086d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20871521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20881521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20901521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20911521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_QUICK: { 20922d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20931521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 20941521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20952d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20961521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20971521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 20982d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20991521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 21001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21012d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21021521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21031521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 21042d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 21051521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 21061521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21072d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21081521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_BOOLEAN: { 2110d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21111521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 21121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21141521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_BYTE: { 2116d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 21181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21201521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21211521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_CHAR: { 2122d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21231521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 21241521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21261521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21271521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_SHORT: { 2128d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21291521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 21301521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21321521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21331521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT: { 2134d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21351521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 21361521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21381521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21391521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_WIDE: { 2140d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21411521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 21421521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21441521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21451521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_OBJECT: { 2146d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 21481521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21501521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21511521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 2152d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21531521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, &result_register); 21541521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21561521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21571521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 2158d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21591521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, &result_register); 21601521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21621521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21631521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_SUPER: { 2164d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21651521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, &result_register); 21661521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21681521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21691521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 2170d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21711521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, &result_register); 21721521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21741521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21751521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_DIRECT: { 2176d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21771521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, &result_register); 21781521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21801521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21811521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 2182d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21831521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, &result_register); 21841521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21861521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21871521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_INTERFACE: { 2188d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21891521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, &result_register); 21901521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21921521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21931521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 2194d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21951521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, &result_register); 21961521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21981521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21991521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_STATIC: { 2200d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 22011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, &result_register); 22021521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22041521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22051521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 2206d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 22071521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, &result_register); 22081521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22111521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 22122d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 22131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvokeVirtualQuick<false>(self, shadow_frame, inst, &result_register); 22141521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22152d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 22161521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 22182d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 22191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvokeVirtualQuick<true>(self, shadow_frame, inst, &result_register); 22201521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22212d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 22221521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_INT: 2224d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2225807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), -shadow_frame.GetVReg(inst->VRegB_12x())); 22269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_INT: 2229d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2230807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), ~shadow_frame.GetVReg(inst->VRegB_12x())); 22319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_LONG: 2234d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2235807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), -shadow_frame.GetVRegLong(inst->VRegB_12x())); 22369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_LONG: 2239d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2240807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), ~shadow_frame.GetVRegLong(inst->VRegB_12x())); 22419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_FLOAT: 2244d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2245807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), -shadow_frame.GetVRegFloat(inst->VRegB_12x())); 22469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_DOUBLE: 2249d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2250807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), -shadow_frame.GetVRegDouble(inst->VRegB_12x())); 22519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_LONG: 2254d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2255807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_FLOAT: 2259d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2260807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_DOUBLE: 2264d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2265807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_INT: 2269d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2270807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_FLOAT: 2274d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_DOUBLE: 2279d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 228387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_INT: { 2284d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 228613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t result; 228787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 228813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 228987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxInt)) { 229013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxInt; 229187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinInt)) { 229213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinInt; 229387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 229413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 229587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 229613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 22979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 229987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 230087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_LONG: { 2301d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2302807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 230313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int64_t result; 230487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 230513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 230687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxLong)) { 230713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxLong; 230887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinLong)) { 230913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinLong; 231087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 231113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 231287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 231313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 23149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 231687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 23172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FLOAT_TO_DOUBLE: 2318d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2319807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegFloat(inst->VRegB_12x())); 23209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 232287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_INT: { 2323d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2324807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 232513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t result; 232687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 232713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 232887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxInt)) { 232913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxInt; 233087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinInt)) { 233113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinInt; 233287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 233313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 233487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 233513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 23369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 233887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 233987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_LONG: { 2340d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2341807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 234213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int64_t result; 234387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 234413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 234587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxLong)) { 234613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxLong; 234787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinLong)) { 234813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinLong; 234987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 235013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 235187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 235213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 23539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 235587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 23562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DOUBLE_TO_FLOAT: 2357d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2358807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegDouble(inst->VRegB_12x())); 23599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_BYTE: 2362d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2363807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2364807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_CHAR: 2368d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2369807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2370807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_SHORT: 2374d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2375807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2376807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT: 2380d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2381807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2382807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) + 2383807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_INT: 2387d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2388807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2389807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) - 2390807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT: 2394d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2395807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2396807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) * 2397807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::DIV_INT: { 2401d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24021521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(), 24031521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 24041521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24051521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 2406807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 24071521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 24081521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::REM_INT: { 2409d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(), 24111521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 24121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 24142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 24162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT: 2417d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2418807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2419807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 2420807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 24219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT: 2424d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2425807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2426807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 2427807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 24289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT: 2431d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2432807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2433807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 2434807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 24359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT: 2438d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2439807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2440807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 2441807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT: 2445d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2446807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2447807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 2448807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT: 2452d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2453807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2454807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 2455807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_LONG: 2459d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2460807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2461807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) + 2462807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_LONG: 2466d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2467807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2468807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) - 2469807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_LONG: 2473d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2474807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2475807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) * 2476807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_LONG: 2480d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24810a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(), 2482807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 2483807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24841521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 24852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_LONG: 2487d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24880a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(), 2489807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 2490807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24911521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 24922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_LONG: 2494d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2495807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2496807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 2497807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_LONG: 2501d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2502807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2503807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 2504807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 25059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_LONG: 2508d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2509807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2510807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 2511807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 25129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_LONG: 2515d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2516807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2517807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 2518807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 25199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_LONG: 2522d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2523807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2524807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 2525807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 25269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_LONG: 2529d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2530807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2531807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 2532807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 25339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_FLOAT: 2536d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2537807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2538807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 2539807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_FLOAT: 2543d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2544807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2545807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 2546807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_FLOAT: 2550d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2551807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2552807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 2553807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_FLOAT: 2557d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2558807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2559807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 2560807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_FLOAT: 2564d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2565807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2566807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 2567807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 25689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_DOUBLE: 2571d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2572807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2573807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 2574807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_DOUBLE: 2578d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2579807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2580807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 2581807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_DOUBLE: 2585d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2586807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2587807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 2588807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_DOUBLE: 2592d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2593807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2594807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 2595807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_DOUBLE: 2599d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2600807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2601807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 2602807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 26039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2604807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2605807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_INT_2ADDR: { 2606d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26075fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2608807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2609807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) + 2610807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2612807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2614807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_INT_2ADDR: { 2615d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26165fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2618807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) - 2619807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2621807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2623807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_INT_2ADDR: { 2624d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26255fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2627807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) * 2628807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2630807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2631807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 263292c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz case Instruction::DIV_INT_2ADDR: { 263392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz PREAMBLE(); 26345fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 26351521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 26361521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26371521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 263892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz break; 263992c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz } 2640807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_INT_2ADDR: { 2641d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26425fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 26431521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 26441521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26451521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 26462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 2647807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 26482ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom case Instruction::SHL_INT_2ADDR: { 2649d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26505fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2651807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2652807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) << 2653807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2655807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2656807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2657807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHR_INT_2ADDR: { 2658d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26595fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2660807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2661807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) >> 2662807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2664807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2665807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2666807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::USHR_INT_2ADDR: { 2667d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26685fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2669807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2670807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 2671807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2673807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2674807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2675807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_INT_2ADDR: { 2676d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26775fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2678807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2679807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) & 2680807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2682807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2683807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2684807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_INT_2ADDR: { 2685d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26865fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2687807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2688807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) | 2689807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2691807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2692807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2693807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::XOR_INT_2ADDR: { 2694d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26955fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2696807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2697807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) ^ 2698807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2700807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2702807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 2703d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27045fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2705807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2706807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) + 2707807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2709807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2710807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2711807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 2712d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27135fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2714807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2715807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) - 2716807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2718807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2720807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 2721d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27225fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2723807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2724807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) * 2725807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2727807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2728807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2729807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 2730d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27315fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 27320a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 2733807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27341521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 2735807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2736807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2737807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_LONG_2ADDR: { 2738d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27395fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 27400a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 2741807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27421521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 2743807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2744807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2745807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_LONG_2ADDR: { 2746d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27475fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2748807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2749807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) & 2750807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2752807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2753807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2754807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_LONG_2ADDR: { 2755d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27565fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2757807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2758807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) | 2759807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2761807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2762807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2763807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 2764d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27655fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2766807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2767807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 2768807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2770807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2771807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2772807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 2773d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27745fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2775807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2776807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) << 2777807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2779807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2780807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2781807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 2782d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27835fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2784807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2785807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 2786807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2788807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2789807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2790807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 2791d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27925fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2793807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2794807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 2795807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2797807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2798807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2799807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 2800d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28015fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2802807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2803807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 2804807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 28059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2806807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2807807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2808807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 2809d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28105fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2811807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2812807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 2813807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 28149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2815807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2816807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2817807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 2818d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28195fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2820807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2821807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 2822807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 28239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2824807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2825807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2826807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 2827d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28285fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2829807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2830807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 2831807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 28329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2833807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2834807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2835807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 2836d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28375fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2838807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2839807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 2840807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x()))); 28419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2842807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2843807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2844807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 2845d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28465fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2847807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2848807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 2849807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2851807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2852807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2853807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 2854d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28555fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2856807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2857807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 2858807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2860807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2861807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2862807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 2863d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28645fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2865807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2866807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 2867807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2869807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2870807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2871807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 2872d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28735fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2874807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2875807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 2876807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2878807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2879807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2880807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 2881d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28825fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2883807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2884807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 2885807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x()))); 28869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2887807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2888807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 28892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_LIT16: 2890d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2891807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2892807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) + 2893807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RSUB_INT: 2897d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2898807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2899807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s() - 2900807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s())); 29019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_LIT16: 2904d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2905807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2906807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) * 2907807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 29089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::DIV_INT_LIT16: { 2911d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(), 29131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 29141521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 29152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29161521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 29171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::REM_INT_LIT16: { 2918d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(), 29201521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 29211521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 29222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29231521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 29242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_LIT16: 2925d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2926807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2927807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) & 2928807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 29299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_LIT16: 2932d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2933807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2934807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) | 2935807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 29369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT16: 2939d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2940807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2941807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) ^ 2942807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 29439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2944807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2945807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_INT_LIT8: 2946d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2947807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2948807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) + 2949807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2951807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2952807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::RSUB_INT_LIT8: 2953d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2954807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2955807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b() - 2956807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b())); 29579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2958807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2959807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_INT_LIT8: 2960d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2961807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2962807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) * 2963807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2965807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29661521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::DIV_INT_LIT8: { 2967d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29681521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(), 29691521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 29701521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 2971807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29721521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 29731521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::REM_INT_LIT8: { 2974d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29751521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(), 29761521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 29771521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 2978807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29791521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 2980807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_INT_LIT8: 2981d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2982807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2983807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 2984807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2986807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2987807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_INT_LIT8: 2988d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2989807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2990807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 2991807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2993807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT8: 2995d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2996807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2997807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 2998807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 30002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT_LIT8: 3002d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 3003807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 3004807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 3005807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 30069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 30072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT_LIT8: 3009d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 3010807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 3011807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 3012807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 30139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 30142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT_LIT8: 3016d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 3017807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 3018807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 3019807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 30209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 30212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 3022fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 30232d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::UNUSED_EB ... Instruction::UNUSED_FF: 3024fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_79: 3025fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_7A: 3026d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers UnexpectedOpcode(inst, mh); 30272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30291895ea386ca78573302483f589ebabd8ce1480e7Brian Carlstrom} // NOLINT(readability/fn_size) 30302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 3031233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 3032233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) 3033233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3034233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 3035233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic inline JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 3036233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) { 3037233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz if (shadow_frame.GetMethod()->IsPreverified()) { 3038233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // Enter the "without access check" interpreter. 3039233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz return ExecuteImpl<false>(self, mh, code_item, shadow_frame, result_register); 3040233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } else { 3041233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // Enter the "with access check" interpreter. 3042233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz return ExecuteImpl<true>(self, mh, code_item, shadow_frame, result_register); 3043233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } 3044233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz} 3045233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 30462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersvoid EnterInterpreterFromInvoke(Thread* self, AbstractMethod* method, Object* receiver, 30476474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao uint32_t* args, JValue* result) { 304864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers DCHECK_EQ(self, Thread::Current()); 3049790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3050d752132c73072084a3def9257cca4fcee76047b6jeffhao ThrowStackOverflowError(self); 3051d752132c73072084a3def9257cca4fcee76047b6jeffhao return; 3052d752132c73072084a3def9257cca4fcee76047b6jeffhao } 3053d752132c73072084a3def9257cca4fcee76047b6jeffhao 30542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers MethodHelper mh(method); 30552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 30562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_regs; 30572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_ins; 30582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (code_item != NULL) { 30592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = code_item->registers_size_; 30602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins = code_item->ins_size_; 30610a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } else if (method->IsAbstract()) { 306256adf601ed9d1d11a2c462caa262e7de66a9e172Sebastien Hertz ThrowAbstractMethodError(method); 30630a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao return; 30642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 30652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK(method->IsNative()); 30662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 30672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 30682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs++; 30692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins++; 30702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers // Set up shadow frame with matching number of reference slots to vregs. 30732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame(); 30746613519990bdb5616f2858c146f162ef760f03d2Jeff Hao void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 30756613519990bdb5616f2858c146f162ef760f03d2Jeff Hao ShadowFrame* shadow_frame(ShadowFrame::Create(num_regs, last_shadow_frame, method, 0, memory)); 30766613519990bdb5616f2858c146f162ef760f03d2Jeff Hao self->PushShadowFrame(shadow_frame); 30772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers size_t cur_reg = num_regs - num_ins; 30782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 30792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(receiver != NULL); 3080ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, receiver); 30812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ++cur_reg; 3082807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else if (UNLIKELY(!method->GetDeclaringClass()->IsInitializing())) { 3083807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 3084807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!class_linker->EnsureInitialized(method->GetDeclaringClass(), 3085807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz true, true))) { 3086807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 3087807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz self->PopShadowFrame(); 308894d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao return; 308994d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao } 30902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(method->GetDeclaringClass()->IsInitializing()); 30912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 309264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const char* shorty = mh.GetShorty(); 30935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao for (size_t shorty_pos = 0, arg_pos = 0; cur_reg < num_regs; ++shorty_pos, ++arg_pos, cur_reg++) { 30945d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 30955d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao switch (shorty[shorty_pos + 1]) { 30962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case 'L': { 30975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* o = reinterpret_cast<Object*>(args[arg_pos]); 3098ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, o); 30992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 31002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao case 'J': case 'D': { 31025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao uint64_t wide_value = (static_cast<uint64_t>(args[arg_pos + 1]) << 32) | args[arg_pos]; 31035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao shadow_frame->SetVRegLong(cur_reg, wide_value); 31042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers cur_reg++; 31055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao arg_pos++; 31062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 31075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao } 31082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 31095d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao shadow_frame->SetVReg(cur_reg, args[arg_pos]); 31102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 31112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 311364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (LIKELY(!method->IsNative())) { 31146613519990bdb5616f2858c146f162ef760f03d2Jeff Hao JValue r = Execute(self, mh, code_item, *shadow_frame, JValue()); 31156474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao if (result != NULL) { 31166474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao *result = r; 31172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 311964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 312064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // generated stub) except during testing and image writing. 312164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!Runtime::Current()->IsStarted()) { 31226474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao UnstartedRuntimeJni(self, method, receiver, args, result); 31232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 31246474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao InterpreterJni(self, method, shorty, receiver, args, result); 31252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->PopShadowFrame(); 31282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 31292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 313062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogersvoid EnterInterpreterFromDeoptimize(Thread* self, ShadowFrame* shadow_frame, JValue* ret_val) 313111ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 313211ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao JValue value; 313362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers value.SetJ(ret_val->GetJ()); // Set value to last known result in case the shadow frame chain is empty. 313462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers MethodHelper mh; 313511ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao while (shadow_frame != NULL) { 313662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetTopOfShadowStack(shadow_frame); 313762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers mh.ChangeMethod(shadow_frame->GetMethod()); 313862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 313911ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao value = Execute(self, mh, code_item, *shadow_frame, value); 314011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ShadowFrame* old_frame = shadow_frame; 314111ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao shadow_frame = shadow_frame->GetLink(); 314211ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao delete old_frame; 314311ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao } 314411ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ret_val->SetJ(value.GetJ()); 314511ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao} 314611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao 31477db619bb2a4e01e8532a04b613745d4926b205d7Ian RogersJValue EnterInterpreterFromStub(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 31487db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers ShadowFrame& shadow_frame) 31497db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3150f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers DCHECK_EQ(self, Thread::Current()); 3151790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3152f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers ThrowStackOverflowError(self); 3153f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers return JValue(); 3154f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers } 3155f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers 31567db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers return Execute(self, mh, code_item, shadow_frame, JValue()); 31577db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers} 31587db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 31590aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haovoid artInterpreterToInterpreterEntry(Thread* self, MethodHelper& mh, 31600aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const DexFile::CodeItem* code_item, 31610aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao ShadowFrame* shadow_frame, JValue* result) 3162167436311a08a65dea28dda079a137893821c9c7Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3163790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3164167436311a08a65dea28dda079a137893821c9c7Jeff Hao ThrowStackOverflowError(self); 31656951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3166167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3167167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3168167436311a08a65dea28dda079a137893821c9c7Jeff Hao AbstractMethod* method = shadow_frame->GetMethod(); 3169167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (method->IsStatic() && !method->GetDeclaringClass()->IsInitializing()) { 3170167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(), 3171167436311a08a65dea28dda079a137893821c9c7Jeff Hao true, true)) { 3172167436311a08a65dea28dda079a137893821c9c7Jeff Hao DCHECK(Thread::Current()->IsExceptionPending()); 31736951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3174167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3175167436311a08a65dea28dda079a137893821c9c7Jeff Hao CHECK(method->GetDeclaringClass()->IsInitializing()); 3176167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3177167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3178167436311a08a65dea28dda079a137893821c9c7Jeff Hao self->PushShadowFrame(shadow_frame); 3179167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3180167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (LIKELY(!method->IsNative())) { 31816951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao result->SetJ(Execute(self, mh, code_item, *shadow_frame, JValue()).GetJ()); 3182167436311a08a65dea28dda079a137893821c9c7Jeff Hao } else { 3183167436311a08a65dea28dda079a137893821c9c7Jeff Hao // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 3184167436311a08a65dea28dda079a137893821c9c7Jeff Hao // generated stub) except during testing and image writing. 3185167436311a08a65dea28dda079a137893821c9c7Jeff Hao CHECK(!Runtime::Current()->IsStarted()); 3186167436311a08a65dea28dda079a137893821c9c7Jeff Hao Object* receiver = method->IsStatic() ? NULL : shadow_frame->GetVRegReference(0); 3187167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint32_t* args = shadow_frame->GetVRegArgs(method->IsStatic() ? 0 : 1); 31886951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao UnstartedRuntimeJni(self, method, receiver, args, result); 3189167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3190167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3191167436311a08a65dea28dda079a137893821c9c7Jeff Hao self->PopShadowFrame(); 31926951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3193167436311a08a65dea28dda079a137893821c9c7Jeff Hao} 3194167436311a08a65dea28dda079a137893821c9c7Jeff Hao 31952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace interpreter 31962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace art 3197