interpreter.cc revision 5fde12abafdcd3523ffd7d71f86e3b9e28f78065
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 432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersusing namespace art::mirror; 442dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace art { 46167436311a08a65dea28dda079a137893821c9c7Jeff Hao 472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace interpreter { 482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMaxInt = std::numeric_limits<int32_t>::max(); 5087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMinInt = std::numeric_limits<int32_t>::min(); 5187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMaxLong = std::numeric_limits<int64_t>::max(); 5287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMinLong = std::numeric_limits<int64_t>::min(); 5387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao 54790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Haostatic void UnstartedRuntimeInvoke(Thread* self, MethodHelper& mh, 55790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const DexFile::CodeItem* code_item, ShadowFrame* shadow_frame, 56790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao JValue* result, size_t arg_offset) 5764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 5864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // In a runtime that's not started we intercept certain methods to avoid complicated dependency 5964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // problems in core libraries. 60790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao std::string name(PrettyMethod(shadow_frame->GetMethod())); 6164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.Class java.lang.Class.forName(java.lang.String)") { 62167436311a08a65dea28dda079a137893821c9c7Jeff Hao std::string descriptor(DotToDescriptor(shadow_frame->GetVRegReference(arg_offset)->AsString()->ToModifiedUtf8().c_str())); 6364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ClassLoader* class_loader = NULL; // shadow_frame.GetMethod()->GetDeclaringClass()->GetClassLoader(); 6464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* found = Runtime::Current()->GetClassLinker()->FindClass(descriptor.c_str(), 6564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers class_loader); 6664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) << "Class.forName failed in un-started runtime for class: " 6764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << PrettyDescriptor(descriptor); 6864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 6964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Class.newInstance()") { 70167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 7164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers AbstractMethod* c = klass->FindDeclaredDirectMethod("<init>", "()V"); 7264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(c != NULL); 7364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = klass->AllocObject(self); 7464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(obj != NULL); 756474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao EnterInterpreterFromInvoke(self, c, obj, NULL, NULL); 7664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(obj); 7764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String)") { 7864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail 7964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // going the reflective Dex way. 80167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 81167436311a08a65dea28dda079a137893821c9c7Jeff Hao String* name = shadow_frame->GetVRegReference(arg_offset + 1)->AsString(); 8264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* found = NULL; 8364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers FieldHelper fh; 8464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Field>* fields = klass->GetIFields(); 8564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 8664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 8764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 8864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 8964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 9064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 9164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 9264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (found == NULL) { 9364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fields = klass->GetSFields(); 9464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 9564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 9664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 9764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 9864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 9964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) 10364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << "Failed to find field in Class.getDeclaredField in un-started runtime. name=" 10464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << name->ToModifiedUtf8() << " class=" << PrettyDescriptor(klass); 10564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: getDeclaredField calls GetType once the field is found to ensure a 10664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // NoClassDefFoundError is thrown if the field's type cannot be resolved. 10764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 10864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int)") { 10964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special case array copying without initializing System. 110167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* ctype = shadow_frame->GetVRegReference(arg_offset)->GetClass()->GetComponentType(); 111167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint srcPos = shadow_frame->GetVReg(arg_offset + 1); 112167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint dstPos = shadow_frame->GetVReg(arg_offset + 3); 113167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint length = shadow_frame->GetVReg(arg_offset + 4); 11464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!ctype->IsPrimitive()) { 115167436311a08a65dea28dda079a137893821c9c7Jeff Hao ObjectArray<Object>* src = shadow_frame->GetVRegReference(arg_offset)->AsObjectArray<Object>(); 116167436311a08a65dea28dda079a137893821c9c7Jeff Hao ObjectArray<Object>* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsObjectArray<Object>(); 11764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 11864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 11964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 12064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveChar()) { 121167436311a08a65dea28dda079a137893821c9c7Jeff Hao CharArray* src = shadow_frame->GetVRegReference(arg_offset)->AsCharArray(); 122167436311a08a65dea28dda079a137893821c9c7Jeff Hao CharArray* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsCharArray(); 12364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 12464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 12564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 12664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveInt()) { 127167436311a08a65dea28dda079a137893821c9c7Jeff Hao IntArray* src = shadow_frame->GetVRegReference(arg_offset)->AsIntArray(); 128167436311a08a65dea28dda079a137893821c9c7Jeff Hao IntArray* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsIntArray(); 12964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 13064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 13164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 13364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UNIMPLEMENTED(FATAL) << "System.arraycopy of unexpected type: " << PrettyDescriptor(ctype); 13464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 13664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Not special, continue with regular interpreter execution. 1370aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao artInterpreterToInterpreterEntry(self, mh, code_item, shadow_frame, result); 13864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 14064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 14164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers// Hand select a number of methods to be run in a not yet started runtime without using JNI. 14264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeJni(Thread* self, AbstractMethod* method, 1435d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* receiver, uint32_t* args, JValue* result) 14464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 14564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string name(PrettyMethod(method)); 14664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.ClassLoader dalvik.system.VMStack.getCallingClassLoader()") { 14764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(NULL); 14864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Class dalvik.system.VMStack.getStackClass2()") { 1497a22fa657b972e8323692368975bc5a7be1cc0f5Ian Rogers NthCallerVisitor visitor(self, 3); 15064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers visitor.WalkStack(); 15164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(visitor.caller->GetDeclaringClass()); 15264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.log(double)") { 1535d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao JValue value; 1545d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1555d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetD(log(value.GetD())); 15664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.Class.getNameNative()") { 15764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsClass()->ComputeName()); 15864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.Float.floatToRawIntBits(float)") { 1595d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(args[0]); 16064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "float java.lang.Float.intBitsToFloat(int)") { 1615d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(args[0]); 16264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.exp(double)") { 1635d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao JValue value; 1645d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1655d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetD(exp(value.GetD())); 16664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Object.internalClone()") { 16764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->Clone(self)); 16864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.Object.notifyAll()") { 16905f3057d6a4d23d712092ccd36a531590bff323bIan Rogers receiver->NotifyAll(self); 17064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.compareTo(java.lang.String)") { 1715d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao String* rhs = reinterpret_cast<Object*>(args[0])->AsString(); 17264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(rhs != NULL); 17364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(receiver->AsString()->CompareTo(rhs)); 17464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.String.intern()") { 17564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsString()->Intern()); 17664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.fastIndexOf(int, int)") { 1775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(receiver->AsString()->FastIndexOf(args[0], args[1])); 17864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])") { 1795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetL(Array::CreateMultiArray(self, reinterpret_cast<Object*>(args[0])->AsClass(), reinterpret_cast<Object*>(args[1])->AsIntArray())); 18064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") { 18164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 18264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa))); 18364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") { 18464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetJ(JNI_TRUE); 18564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") { 1865d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* obj = reinterpret_cast<Object*>(args[0]); 1875d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1]; 1885d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jint expectedValue = args[3]; 1895d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jint newValue = args[4]; 19064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(obj) + offset; 19164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr); 19264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Note: android_atomic_release_cas() returns 0 on success, not failure. 19364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int r = android_atomic_release_cas(expectedValue, newValue, address); 19464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(r == 0); 19564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") { 1965d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* obj = reinterpret_cast<Object*>(args[0]); 1975d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* newValue = reinterpret_cast<Object*>(args[3]); 1985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao obj->SetFieldObject(MemberOffset((static_cast<uint64_t>(args[2]) << 32) | args[1]), newValue, false); 19964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 20064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Attempt to invoke native method in non-started runtime: " << name; 20164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 20264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 20364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 20464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void InterpreterJni(Thread* self, AbstractMethod* method, StringPiece shorty, 2055d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* receiver, uint32_t* args, JValue* result) 20664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 20764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: The following enters JNI code using a typedef-ed function rather than the JNI compiler, 20864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // it should be removed and JNI compiled stubs used instead. 20964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 21064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (method->IsStatic()) { 21164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 21264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass); 213d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 21464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 21564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 216556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 217556d637764b71563030c479bc35364a75188d559Ian Rogers { 218556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 219556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get()); 220556d637764b71563030c479bc35364a75188d559Ian Rogers } 221556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 22264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "V") { 22364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass); 224d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 22564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 22664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 22764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 22864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get()); 22964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "Z") { 23064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass); 231d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 23264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 23364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 23464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 23564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get())); 23664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "BI") { 23764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jbyte (fnptr)(JNIEnv*, jclass, jint); 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); 2425d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetB(fn(soa.Env(), klass.get(), args[0])); 24364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "II") { 24464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint); 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); 2495d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), args[0])); 25064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 25164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass, jobject); 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 ScopedLocalRef<jobject> arg0(soa.Env(), 2565d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 257556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 258556d637764b71563030c479bc35364a75188d559Ian Rogers { 259556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 260556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get(), arg0.get()); 261556d637764b71563030c479bc35364a75188d559Ian Rogers } 262556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 26364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "IIZ") { 26464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint, jboolean); 265d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 26664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2695d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), args[0], args[1])); 27064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ILI") { 27164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jobject, jint); 272d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 27364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 27464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 27564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 2765d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 27764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), arg0.get(), args[1])); 27964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "SIZ") { 28064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jshort (fnptr)(JNIEnv*, jclass, jint, jboolean); 281d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 28264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetS(fn(soa.Env(), klass.get(), args[0], args[1])); 28664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VIZ") { 28764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jboolean); 288d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 28964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 29064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 29164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), args[0], args[1]); 29364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZLL") { 29464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jobject, jobject); 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 ScopedLocalRef<jobject> arg0(soa.Env(), 2995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 30064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 30264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 30364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get(), arg0.get(), arg1.get())); 30464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZILL") { 30564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jint, jobject, jobject); 306d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 30764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 30864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 30964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 31164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 3125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[2]))); 31364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetZ(fn(soa.Env(), klass.get(), args[0], arg1.get(), arg2.get())); 31564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VILII") { 31664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jobject, jint, jint); 317d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 31864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 31964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 32064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3215d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 32264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3235d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), args[0], arg1.get(), args[2], args[3]); 32464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VLILII") { 32564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jobject, jint, jobject, jint, jint); 326d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 32764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 32864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 32964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3305d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 33164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 3325d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[2]))); 33364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3345d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), arg0.get(), args[1], arg2.get(), args[3], args[4]); 33564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 33664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with static native method: " << PrettyMethod(method) 33764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 33864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 33964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 34064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 34164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject); 342d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 34364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 34464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 345556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 346556d637764b71563030c479bc35364a75188d559Ian Rogers { 347556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 348556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get()); 349556d637764b71563030c479bc35364a75188d559Ian Rogers } 350556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 3513dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao } else if (shorty == "V") { 3523dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao typedef void (fnptr)(JNIEnv*, jobject); 3533dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 3543dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao ScopedLocalRef<jobject> rcvr(soa.Env(), 3553dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao soa.AddLocalReference<jobject>(receiver)); 3563dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao ScopedThreadStateChange tsc(self, kNative); 3573dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao fn(soa.Env(), rcvr.get()); 35864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 35964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject, jobject); 360d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 36164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 36264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 36364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3645d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 365556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 366556d637764b71563030c479bc35364a75188d559Ian Rogers { 367556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 368556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get(), arg0.get()); 369556d637764b71563030c479bc35364a75188d559Ian Rogers } 370556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 37164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 37264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "III") { 37364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jobject, jint, jint); 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 ScopedThreadStateChange tsc(self, kNative); 3785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), rcvr.get(), args[0], args[1])); 37964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 38064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with native method: " << PrettyMethod(method) 38164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 38264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 38364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 38464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 38564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 3862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorEnter(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 3872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorEnter(self); 3882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 3892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 3902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorExit(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 3912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorExit(self); 3922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 3932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 394ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 395ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 396233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<InvokeType type, bool is_range, bool do_access_check> 397ca6ad221d1bd857e26817f6b63d4ad9f3fe7ca40Sebastien Hertzstatic void DoInvoke(Thread* self, ShadowFrame& shadow_frame, 398ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers const Instruction* inst, JValue* result) NO_THREAD_SAFETY_ANALYSIS; 399ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers 400233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<InvokeType type, bool is_range, bool do_access_check> 401ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogersstatic void DoInvoke(Thread* self, ShadowFrame& shadow_frame, 402ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers const Instruction* inst, JValue* result) { 403807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t method_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); 404790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao uint32_t vregC = (is_range) ? inst->VRegC_3rc() : inst->VRegC_35c(); 405790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao Object* receiver = (type == kStatic) ? NULL : shadow_frame.GetVRegReference(vregC); 406790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao AbstractMethod* method = FindMethodFromCode(method_idx, receiver, shadow_frame.GetMethod(), self, 407233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check, type); 408790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(method == NULL)) { 4092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(self->IsExceptionPending()); 4102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result->SetJ(0); 4112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return; 4122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 413167436311a08a65dea28dda079a137893821c9c7Jeff Hao 414790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao MethodHelper mh(method); 415790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const DexFile::CodeItem* code_item = mh.GetCodeItem(); 416167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint16_t num_regs; 417167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint16_t num_ins; 418790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (LIKELY(code_item != NULL)) { 419167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_regs = code_item->registers_size_; 420167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_ins = code_item->ins_size_; 421790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao } else if (method->IsAbstract()) { 42256adf601ed9d1d11a2c462caa262e7de66a9e172Sebastien Hertz ThrowAbstractMethodError(method); 423167436311a08a65dea28dda079a137893821c9c7Jeff Hao return; 4242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 425790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao DCHECK(method->IsNative() || method->IsProxyMethod()); 426790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 427790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (!method->IsStatic()) { 428167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_regs++; 429167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_ins++; 430167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 4312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 432167436311a08a65dea28dda079a137893821c9c7Jeff Hao 4336613519990bdb5616f2858c146f162ef760f03d2Jeff Hao void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 434790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao ShadowFrame* new_shadow_frame(ShadowFrame::Create(num_regs, &shadow_frame, method, 0, memory)); 435167436311a08a65dea28dda079a137893821c9c7Jeff Hao size_t cur_reg = num_regs - num_ins; 436167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (receiver != NULL) { 437167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegReference(cur_reg, receiver); 438167436311a08a65dea28dda079a137893821c9c7Jeff Hao ++cur_reg; 439167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 440167436311a08a65dea28dda079a137893821c9c7Jeff Hao 441167436311a08a65dea28dda079a137893821c9c7Jeff Hao size_t arg_offset = (receiver == NULL) ? 0 : 1; 442790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const char* shorty = mh.GetShorty(); 443807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t arg[5]; 444807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (!is_range) { 445807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->GetArgs(arg); 446807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 447167436311a08a65dea28dda079a137893821c9c7Jeff Hao for (size_t shorty_pos = 0; cur_reg < num_regs; ++shorty_pos, cur_reg++, arg_offset++) { 448790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 449807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz size_t arg_pos = is_range ? vregC + arg_offset : arg[arg_offset]; 450167436311a08a65dea28dda079a137893821c9c7Jeff Hao switch (shorty[shorty_pos + 1]) { 451167436311a08a65dea28dda079a137893821c9c7Jeff Hao case 'L': { 452167436311a08a65dea28dda079a137893821c9c7Jeff Hao Object* o = shadow_frame.GetVRegReference(arg_pos); 453167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegReference(cur_reg, o); 454167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 455167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 456167436311a08a65dea28dda079a137893821c9c7Jeff Hao case 'J': case 'D': { 457167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint64_t wide_value = (static_cast<uint64_t>(shadow_frame.GetVReg(arg_pos + 1)) << 32) | 458167436311a08a65dea28dda079a137893821c9c7Jeff Hao static_cast<uint32_t>(shadow_frame.GetVReg(arg_pos)); 459167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegLong(cur_reg, wide_value); 460167436311a08a65dea28dda079a137893821c9c7Jeff Hao cur_reg++; 461167436311a08a65dea28dda079a137893821c9c7Jeff Hao arg_offset++; 462167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 463167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 464167436311a08a65dea28dda079a137893821c9c7Jeff Hao default: 465167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVReg(cur_reg, shadow_frame.GetVReg(arg_pos)); 466167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 4675d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao } 468167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 469167436311a08a65dea28dda079a137893821c9c7Jeff Hao 4706613519990bdb5616f2858c146f162ef760f03d2Jeff Hao if (LIKELY(Runtime::Current()->IsStarted())) { 471790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); 472167436311a08a65dea28dda079a137893821c9c7Jeff Hao } else { 473790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, num_regs - num_ins); 47464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 4752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 4782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 4792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<bool is_range> 4802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic void DoInvokeVirtualQuick(Thread* self, ShadowFrame& shadow_frame, 4812d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst, JValue* result) 4822d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS; 4832d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 4842d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<bool is_range> 4852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic void DoInvokeVirtualQuick(Thread* self, ShadowFrame& shadow_frame, 4862d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst, JValue* result) { 4872d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t vregC = (is_range) ? inst->VRegC_3rc() : inst->VRegC_35c(); 4882d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* receiver = shadow_frame.GetVRegReference(vregC); 4892d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(receiver == NULL)) { 4902d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the method index so we cannot get a more 4912d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 4922d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 4932d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 4942d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 4952d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t vtable_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); 4962d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz AbstractMethod* method = receiver->GetClass()->GetVTable()->Get(vtable_idx); 4972d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(method == NULL)) { 4982d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz CHECK(self->IsExceptionPending()); 4992d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz result->SetJ(0); 5002d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 5012d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5022d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MethodHelper mh(method); 5032d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5042d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const DexFile::CodeItem* code_item = mh.GetCodeItem(); 5052d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint16_t num_regs; 5062d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint16_t num_ins; 5072d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (code_item != NULL) { 5082d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs = code_item->registers_size_; 5092d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_ins = code_item->ins_size_; 5102d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else if (method->IsAbstract()) { 51156adf601ed9d1d11a2c462caa262e7de66a9e172Sebastien Hertz ThrowAbstractMethodError(method); 5122d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 5132d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else { 5142d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DCHECK(method->IsNative() || method->IsProxyMethod()); 5152d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 5162d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (!method->IsStatic()) { 5172d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs++; 5182d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_ins++; 5192d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5202d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5212d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5222d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 5232d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ShadowFrame* new_shadow_frame(ShadowFrame::Create(num_regs, &shadow_frame, 5242d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz method, 0, memory)); 5252d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t cur_reg = num_regs - num_ins; 5262d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (receiver != NULL) { 5272d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegReference(cur_reg, receiver); 5282d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ++cur_reg; 5292d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5302d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5312d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t arg_offset = (receiver == NULL) ? 0 : 1; 5322d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const char* shorty = mh.GetShorty(); 5332d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t arg[5]; 5342d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (!is_range) { 5352d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz inst->GetArgs(arg); 5362d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5372d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz for (size_t shorty_pos = 0; cur_reg < num_regs; ++shorty_pos, cur_reg++, arg_offset++) { 5382d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 5392d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t arg_pos = is_range ? vregC + arg_offset : arg[arg_offset]; 5402d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (shorty[shorty_pos + 1]) { 5412d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case 'L': { 5422d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* o = shadow_frame.GetVRegReference(arg_pos); 5432d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegReference(cur_reg, o); 5442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case 'J': case 'D': { 5472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint64_t wide_value = (static_cast<uint64_t>(shadow_frame.GetVReg(arg_pos + 1)) << 32) | 5482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(arg_pos)); 5492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegLong(cur_reg, wide_value); 5502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz cur_reg++; 5512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz arg_offset++; 5522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 5552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVReg(cur_reg, shadow_frame.GetVReg(arg_pos)); 5562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (LIKELY(Runtime::Current()->IsStarted())) { 5612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); 5622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else { 5632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, num_regs - num_ins); 5642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 5662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 567c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// We use template functions to optimize compiler inlining process. Otherwise, 568c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// some parts of the code (like a switch statement) which depend on a constant 569c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// parameter would not be inlined while it should be. These constant parameters 570c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// are now part of the template arguments. 571c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// Note these template functions are static and inlined so they should not be 572c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// part of the final object file. 573ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 574ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 575233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 5762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 577c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) 578ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 579fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 580233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 581fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline void DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 582c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) { 5832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectRead) || (find_type == StaticPrimitiveRead); 584807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t field_idx = is_static ? inst->VRegB_21c() : inst->VRegC_22c(); 5852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 586233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz find_type, Primitive::FieldSize(field_type), 587233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check); 588807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(f == NULL)) { 589807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 590807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 591807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 592807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj; 593807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (is_static) { 594807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = f->GetDeclaringClass(); 595807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 596807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 597807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 598807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerExceptionForFieldAccess(shadow_frame.GetCurrentLocationForThrow(), f, true); 599807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 6002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 602807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = is_static ? inst->VRegA_21c() : inst->VRegA_22c(); 603807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (field_type) { 604807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimBoolean: 605807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetBoolean(obj)); 606807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 607807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimByte: 608807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetByte(obj)); 609807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 610807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimChar: 611807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetChar(obj)); 612807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimShort: 614807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetShort(obj)); 615807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 616807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimInt: 617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetInt(obj)); 618807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 619807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimLong: 620807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, f->GetLong(obj)); 621807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimNot: 623807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(vregA, f->GetObject(obj)); 624807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 625807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 627807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 6282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 6292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 630ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 631ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 6322d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 6332d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic void DoIGetQuick(Thread* self, ShadowFrame& shadow_frame, 6342d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) 6352d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 6362d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 6372d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 6382d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic inline void DoIGetQuick(Thread* self, ShadowFrame& shadow_frame, 6392d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) { 6402d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 6412d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(obj == NULL)) { 6422d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the field index so we cannot get a more 6432d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 6442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 6452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 6462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 6472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MemberOffset field_offset(inst->VRegC_22c()); 6482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const bool is_volatile = false; // iget-x-quick only on non volatile fields. 6492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const uint32_t vregA = inst->VRegA_22c(); 6502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (field_type) { 6512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimInt: 6522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetField32(field_offset, is_volatile))); 6532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimLong: 6552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVRegLong(vregA, static_cast<int64_t>(obj->GetField64(field_offset, is_volatile))); 6562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimNot: 6582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVRegReference(vregA, obj->GetFieldObject<mirror::Object*>(field_offset, is_volatile)); 6592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 6612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 6622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 6632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 6642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 6652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 6662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 667233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 668c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertzstatic void DoFieldPut(Thread* self, const ShadowFrame& shadow_frame, 669c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) 670ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 671fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 672233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 673c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertzstatic inline void DoFieldPut(Thread* self, const ShadowFrame& shadow_frame, 674c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) { 6752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectWrite) || (find_type == StaticPrimitiveWrite); 676807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t field_idx = is_static ? inst->VRegB_21c() : inst->VRegC_22c(); 6772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 678233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz find_type, Primitive::FieldSize(field_type), 679233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check); 680807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(f == NULL)) { 681807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 682807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 683807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 684807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj; 685807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (is_static) { 686807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = f->GetDeclaringClass(); 687807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 688807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 689807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 690807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerExceptionForFieldAccess(shadow_frame.GetCurrentLocationForThrow(), 691807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f, false); 692807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 6932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 694807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 695807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = is_static ? inst->VRegA_21c() : inst->VRegA_22c(); 696807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (field_type) { 697807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimBoolean: 698807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetBoolean(obj, shadow_frame.GetVReg(vregA)); 699807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 700807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimByte: 701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetByte(obj, shadow_frame.GetVReg(vregA)); 702807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 703807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimChar: 704807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetChar(obj, shadow_frame.GetVReg(vregA)); 705807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 706807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimShort: 707807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetShort(obj, shadow_frame.GetVReg(vregA)); 708807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 709807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimInt: 710807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetInt(obj, shadow_frame.GetVReg(vregA)); 711807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 712807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimLong: 713807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetLong(obj, shadow_frame.GetVRegLong(vregA)); 714807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 715807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimNot: 716807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetObj(obj, shadow_frame.GetVRegReference(vregA)); 717807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 718807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 720807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 721807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 722807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 7232d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 7242d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 7252d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 7262d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic void DoIPutQuick(Thread* self, ShadowFrame& shadow_frame, 7272d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) 7282d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 7292d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 7302d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 7312d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic inline void DoIPutQuick(Thread* self, ShadowFrame& shadow_frame, 7322d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) { 7332d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 7342d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(obj == NULL)) { 7352d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the field index so we cannot get a more 7362d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 7372d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7382d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 7392d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 7402d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MemberOffset field_offset(inst->VRegC_22c()); 7412d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const bool is_volatile = false; // iput-x-quick only on non volatile fields. 7422d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const uint32_t vregA = inst->VRegA_22c(); 7432d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (field_type) { 7442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimInt: 7452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetField32(field_offset, shadow_frame.GetVReg(vregA), is_volatile); 7462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimLong: 7482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetField64(field_offset, shadow_frame.GetVRegLong(vregA), is_volatile); 7492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimNot: 7512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetFieldObject(field_offset, shadow_frame.GetVRegReference(vregA), is_volatile); 7522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 7542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 7552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 7562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 7572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 75833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic inline String* ResolveString(Thread* self, MethodHelper& mh, uint32_t string_idx) 75933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 760807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* java_lang_string_class = String::GetJavaLangString(); 761807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!java_lang_string_class->IsInitialized())) { 762807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 763807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!class_linker->EnsureInitialized(java_lang_string_class, 764807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz true, true))) { 765807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK(self->IsExceptionPending()); 766807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return NULL; 7672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 769807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return mh.ResolveString(string_idx); 7702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 7712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 7720a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertzstatic inline void DoIntDivide(ShadowFrame& shadow_frame, size_t result_reg, 7730a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int32_t dividend, int32_t divisor) 7740a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 775d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 7760a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 777d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 778d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, kMinInt); 779d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 780d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend / divisor); 781d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 782d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 783d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 7840a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertzstatic inline void DoIntRemainder(ShadowFrame& shadow_frame, size_t result_reg, 7850a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int32_t dividend, int32_t divisor) 7860a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 787d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 7880a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 789d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 790d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, 0); 791d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 792d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend % divisor); 793d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 794d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 795d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 7960a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertzstatic inline void DoLongDivide(ShadowFrame& shadow_frame, size_t result_reg, 7970a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int64_t dividend, int64_t divisor) 7980a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 799d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8000a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 801d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 802d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, kMinLong); 803d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 804d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend / divisor); 805d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 806d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 807d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8080a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertzstatic inline void DoLongRemainder(ShadowFrame& shadow_frame, size_t result_reg, 8090a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int64_t dividend, int64_t divisor) 8100a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 811d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8120a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 813d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 814d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, 0); 815d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 816d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend % divisor); 817d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 818d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 819d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 82024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 82124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// specialization. 82224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// Returns true on success, otherwise throws an exception and returns false. 82324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertztemplate <bool is_range, bool do_access_check> 82424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertzstatic bool DoFilledNewArray(const Instruction* inst, const ShadowFrame& shadow_frame, 82524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Thread* self, JValue* result) 82624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 82724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 82824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertztemplate <bool is_range, bool do_access_check> 82924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertzstatic inline bool DoFilledNewArray(const Instruction* inst, 83024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const ShadowFrame& shadow_frame, 83124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Thread* self, JValue* result) { 83224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(inst->Opcode() == Instruction::FILLED_NEW_ARRAY || 83324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz inst->Opcode() == Instruction::FILLED_NEW_ARRAY_RANGE); 83424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const int32_t length = is_range ? inst->VRegA_3rc() : inst->VRegA_35c(); 83524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (!is_range) { 83624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz // Checks FILLED_NEW_ARRAY's length does not exceed 5 arguments. 83724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz CHECK_LE(length, 5); 83824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 83924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(length < 0)) { 84024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz ThrowNegativeArraySizeException(length); 84124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 84224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 84324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint16_t type_idx = is_range ? inst->VRegB_3rc() : inst->VRegB_35c(); 84424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Class* arrayClass = ResolveVerifyAndClinit(type_idx, shadow_frame.GetMethod(), 84524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, false, do_access_check); 84624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(arrayClass == NULL)) { 84724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(self->IsExceptionPending()); 84824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 84924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 85024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz CHECK(arrayClass->IsArrayClass()); 85124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Class* componentClass = arrayClass->GetComponentType(); 85224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(componentClass->IsPrimitive() && !componentClass->IsPrimitiveInt())) { 85324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (componentClass->IsPrimitiveLong() || componentClass->IsPrimitiveDouble()) { 85424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz ThrowRuntimeException("Bad filled array request for type %s", 85524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz PrettyDescriptor(componentClass).c_str()); 85624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 85724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 85824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz "Ljava/lang/InternalError;", 85924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz "Found type %s; filled-new-array not implemented for anything but \'int\'", 86024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz PrettyDescriptor(componentClass).c_str()); 86124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 86224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 86324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 86424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Object* newArray = Array::Alloc(self, arrayClass, length); 86524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(newArray == NULL)) { 86624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(self->IsExceptionPending()); 86724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 86824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 86924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_range) { 87024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint32_t vregC = inst->VRegC_3rc(); 87124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const bool is_primitive_int_component = componentClass->IsPrimitiveInt(); 87224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz for (int32_t i = 0; i < length; ++i) { 87324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_primitive_int_component) { 87424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(vregC + i)); 87524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 87624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(vregC + i)); 87724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 87824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 87924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 88024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint32_t arg[5]; 88124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz inst->GetArgs(arg); 88224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const bool is_primitive_int_component = componentClass->IsPrimitiveInt(); 88324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz for (int32_t i = 0; i < length; ++i) { 88424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_primitive_int_component) { 88524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(arg[i])); 88624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 88724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(arg[i])); 88824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 88924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 89024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 89124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 89224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz result->SetL(newArray); 89324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return true; 89424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz} 89524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 8962cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertzstatic inline const Instruction* DoSparseSwitch(const Instruction* inst, 8972cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const ShadowFrame& shadow_frame) 8982cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 8992cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(inst->Opcode() == Instruction::SPARSE_SWITCH); 9002cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const uint16_t* switch_data = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 9012cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int32_t test_val = shadow_frame.GetVReg(inst->VRegA_31t()); 9022cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kSparseSwitchSignature)); 9032cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz uint16_t size = switch_data[1]; 9042cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK_GT(size, 0); 9052cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 9062cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(IsAligned<4>(keys)); 9072cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const int32_t* entries = keys + size; 9082cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(IsAligned<4>(entries)); 9092cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int lo = 0; 9102cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int hi = size - 1; 9112cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz while (lo <= hi) { 9122cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int mid = (lo + hi) / 2; 9132cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int32_t foundVal = keys[mid]; 9142cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz if (test_val < foundVal) { 9152cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz hi = mid - 1; 9162cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } else if (test_val > foundVal) { 9172cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz lo = mid + 1; 9182cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } else { 9192cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz return inst->RelativeAt(entries[mid]); 9202cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } 9212cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } 9222cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz return inst->Next_3xx(); 9232cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz} 9242cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz 925fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline const Instruction* FindNextInstructionFollowingException(Thread* self, 926fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, 927fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers uint32_t dex_pc, 928fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers const uint16_t* insns, 929fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers SirtRef<Object>& this_object_ref, 930fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers instrumentation::Instrumentation* instrumentation) 931fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ALWAYS_INLINE; 932fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 933fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline const Instruction* FindNextInstructionFollowingException(Thread* self, 934fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, 935fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers uint32_t dex_pc, 936fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers const uint16_t* insns, 937fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers SirtRef<Object>& this_object_ref, 93833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers instrumentation::Instrumentation* instrumentation) 93933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 9409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao self->VerifyStack(); 9419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ThrowLocation throw_location; 9429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao mirror::Throwable* exception = self->GetException(&throw_location); 9439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao uint32_t found_dex_pc = shadow_frame.GetMethod()->FindCatchBlock(exception->GetClass(), dex_pc); 9449cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (found_dex_pc == DexFile::kDexNoIndex) { 9459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao instrumentation->MethodUnwindEvent(self, this_object_ref.get(), 9469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.GetMethod(), dex_pc); 9479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return NULL; 9489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 9499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao instrumentation->ExceptionCaughtEvent(self, throw_location, 9509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.GetMethod(), 9519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao found_dex_pc, exception); 9529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return Instruction::At(insns + found_dex_pc); 9539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao} 9559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 9569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao#define HANDLE_PENDING_EXCEPTION() \ 9579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CHECK(self->IsExceptionPending()); \ 958d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers inst = FindNextInstructionFollowingException(self, shadow_frame, inst->GetDexPc(insns), insns, \ 9599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao this_object_ref, instrumentation); \ 9609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (inst == NULL) { \ 9619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return JValue(); /* Handled in caller. */ \ 9629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 9649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao#define POSSIBLY_HANDLE_PENDING_EXCEPTION(next_function) \ 9659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (UNLIKELY(self->IsExceptionPending())) { \ 966d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers inst = FindNextInstructionFollowingException(self, shadow_frame, inst->GetDexPc(insns), insns, \ 9679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao this_object_ref, instrumentation); \ 9689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (inst == NULL) { \ 9699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return JValue(); /* Handled in caller. */ \ 9709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } \ 9719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { \ 9729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst-> next_function (); \ 9739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 975fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic void UnexpectedOpcode(const Instruction* inst, MethodHelper& mh) 976fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers __attribute__ ((cold, noreturn, noinline)); 977fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 97833e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic void UnexpectedOpcode(const Instruction* inst, MethodHelper& mh) 97933e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 980fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers LOG(FATAL) << "Unexpected instruction: " << inst->DumpString(&mh.GetDexFile()); 981fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers exit(0); // Unreachable, keep GCC happy. 982fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers} 983fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 984d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers// Code to run before each dex instruction. 985d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers#define PREAMBLE() 986d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers 987233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 988233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz// specialization. 989233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<bool do_access_check> 990233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue ExecuteImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 991306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers ShadowFrame& shadow_frame, JValue result_register) 992233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz NO_THREAD_SAFETY_ANALYSIS __attribute__ ((hot)); 993fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 994233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<bool do_access_check> 995233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue ExecuteImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 996fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, JValue result_register) { 99762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 99862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers LOG(FATAL) << "Invalid shadow frame for interpreter use"; 99962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers return JValue(); 100062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 100162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->VerifyStack(); 10025fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); 1003807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 1004807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // As the 'this' object won't change during the execution of current code, we 1005807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // want to cache it in local variables. Nevertheless, in order to let the 1006807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // garbage collector access it, we store it into sirt references. 1007e701f48eb06fa59871412a11286429111270b211Jeff Hao SirtRef<Object> this_object_ref(self, shadow_frame.GetThisObject(code_item->ins_size_)); 1008807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 10095fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 10105fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.. 101174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { 101274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodEnterEvent(self, this_object_ref.get(), 101374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), 0); 101474109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 101562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 10165fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz const uint16_t* const insns = code_item->insns_; 10175fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 10182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers while (true) { 10195fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz dex_pc = inst->GetDexPc(insns); 10205fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz shadow_frame.SetDexPC(dex_pc); 1021fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (UNLIKELY(self->TestAllFlags())) { 10229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CheckSuspend(self); 10239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 10245fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz if (UNLIKELY(instrumentation->HasDexPcListeners())) { 102574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->DexPcMovedEvent(self, this_object_ref.get(), 102674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), dex_pc); 102774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 102864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const bool kTracing = false; 10292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (kTracing) { 103062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#define TRACE_LOG std::cerr 103162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << PrettyMethod(shadow_frame.GetMethod()) 1032807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz << StringPrintf("\n0x%x: ", dex_pc) 103362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers << inst->DumpString(&mh.GetDexFile()) << "\n"; 1034ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) { 103562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers uint32_t raw_value = shadow_frame.GetVReg(i); 103662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Object* ref_value = shadow_frame.GetVRegReference(i); 103762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << StringPrintf(" vreg%d=0x%08X", i, raw_value); 103862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (ref_value != NULL) { 103962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (ref_value->GetClass()->IsStringClass() && 104062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ref_value->AsString()->GetCharArray() != NULL) { 104162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "/java.lang.String \"" << ref_value->AsString()->ToModifiedUtf8() << "\""; 10422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 104362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "/" << PrettyTypeOf(ref_value); 10442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 104762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "\n"; 104862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#undef TRACE_LOG 10492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1050807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (inst->Opcode()) { 10512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOP: 1052d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 10539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 10542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE: 1056d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1057807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 1058807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 10599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1060807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_FROM16: 1062d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1063807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(), 1064807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 10659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1066807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_16: 1068d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1069807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1070807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 10719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 10722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE: 1074d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1075807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), 1076807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 10779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1078807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_FROM16: 1080d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1081807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(), 1082807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 10839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1084807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_16: 1086d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1087807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 1088807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 10899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 10902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT: 1092d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1093807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(), 1094807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x())); 10959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1096807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_FROM16: 1098d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1099807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(), 1100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 11019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1102807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_16: 1104d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1105807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 1106807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 11079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT: 1110d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1111807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(), result_register.GetI()); 11129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_WIDE: 1115d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1116807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(), result_register.GetJ()); 11179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_OBJECT: 1120d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1121807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), result_register.GetL()); 11229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_EXCEPTION: { 1125d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 112662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Throwable* exception = self->GetException(NULL); 11272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->ClearException(); 1128807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), exception); 11299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_VOID: { 1133d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 113574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 113674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 113774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 113874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 113974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1142cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz case Instruction::RETURN_VOID_BARRIER: { 1143cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz PREAMBLE(); 1144cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz ANDROID_MEMBAR_STORE(); 1145cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz JValue result; 1146cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 1147cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 1148cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1149cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz result); 1150cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz } 1151cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz return result; 1152cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz } 11532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN: { 1154d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 11562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 1157807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x())); 115874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 115974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 116074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 116174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 116274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_WIDE: { 1166d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 1168807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x())); 116974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 117074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 117174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 117274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 117374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_OBJECT: { 1177d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 11792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 1180807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetL(shadow_frame.GetVRegReference(inst->VRegA_11x())); 118174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 118274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 118374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 118474109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 118574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_4: { 1189d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11905fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t dst = inst->VRegA_11n(); 11915fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz int4_t val = inst->VRegB_11n(); 1192807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 11932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1194807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 11952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_16: { 1200d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12015fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_21s(); 12025fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz int16_t val = inst->VRegB_21s(); 1203807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1205807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST: { 1211d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12125fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_31i(); 1213807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t val = inst->VRegB_31i(); 1214807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1216807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12189cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_HIGH16: { 1222d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12235fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_21h(); 122413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 1225807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1227807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 123264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_16: 1233d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 123413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(), inst->VRegB_21s()); 12359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 123764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_32: 1238d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 123913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(), inst->VRegB_31i()); 12409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE: 1243d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1244807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(), inst->VRegB_51l()); 12459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_51l(); 12462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE_HIGH16: 1248807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(), 1249807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 12509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 1252807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CONST_STRING: { 1253d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1254807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_21c()); 1255807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(s == NULL)) { 12569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1257807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1258807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference( inst->VRegA_21c(), s); 12599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1260807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1261807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1262807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 12632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_STRING_JUMBO: { 1264d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1265807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_31c()); 1266807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(s == NULL)) { 12679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1268807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1269807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference( inst->VRegA_31c(), s); 12709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12740a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao case Instruction::CONST_CLASS: { 1275d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1276807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 1277233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 1278807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(c == NULL)) { 12799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1281807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), c); 12829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1283807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 12842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12850a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } 128687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_ENTER: { 1287d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1288807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 128987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 129062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 1291e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 129287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 129387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorEnter(self, obj); 1294e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 129587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 12962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 129787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 129887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_EXIT: { 1299d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1300807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 130187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 130262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 1303e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 130487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 130587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorExit(self, obj); 1306e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 130787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 130987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CHECK_CAST: { 1311d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1312807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 1313233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 131487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 13159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 131687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 1317807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c()); 131887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 131962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowClassCastException(c, obj->GetClass()); 13209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 13219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 13229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 132387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INSTANCE_OF: { 1328d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1329807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(), 1330233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 133187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 13329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 133387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 1334807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 1335807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22c(), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 13369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 133787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ARRAY_LENGTH: { 1341d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1342807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x()); 13432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(array == NULL)) { 134462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 13459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 134613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz } else { 134713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), array->AsArray()->GetLength()); 134813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz inst = inst->Next_1xx(); 13492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_INSTANCE: { 1353d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1354807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = AllocObjectFromCode(inst->VRegB_21c(), shadow_frame.GetMethod(), 1355233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, do_access_check); 1356807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 13579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1358807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1359807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), obj); 13609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1361807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 13622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_ARRAY: { 1365d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1366807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c()); 1367807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = AllocArrayFromCode(inst->VRegC_22c(), shadow_frame.GetMethod(), 1368233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz length, self, do_access_check); 1369807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 13709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1371807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1372807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22c(), obj); 13739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1374807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 13752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1377807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 1378d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 137924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz bool success = DoFilledNewArray<false, do_access_check>(inst, shadow_frame, 138024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, &result_register); 138124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (LIKELY(success)) { 13829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 138324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 138424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 138564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 138764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 1388807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 1389d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 139024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz bool success = DoFilledNewArray<true, do_access_check>(inst, shadow_frame, 139124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, &result_register); 139224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (LIKELY(success)) { 13939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 139424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 139524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 13962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1399807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 1400d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1401807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t()); 1402807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 1403807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA"); 14049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1405807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 14062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1407807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Array* array = obj->AsArray(); 1408807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 140913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 1410807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz const Instruction::ArrayDataPayload* payload = 141113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 1412807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 1413807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 1414807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz "Ljava/lang/ArrayIndexOutOfBoundsException;", 1415807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz "failed FILL_ARRAY_DATA; length=%d, index=%d", 1416807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz array->GetLength(), payload->element_count); 14179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1418807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1419807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1420807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t size_in_bytes = payload->element_count * payload->element_width; 1421807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes); 14229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 14232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 14252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::THROW: { 1426d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1427807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x()); 1428807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(exception == NULL)) { 142962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerException(NULL, "throw with null exception"); 143062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } else { 143162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetException(shadow_frame.GetCurrentLocationForThrow(), exception->AsThrowable()); 143262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 14339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 14342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1436807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::GOTO: { 1437d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 143892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_10t()); 1439807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1440807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1441807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::GOTO_16: { 1442d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 144392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_20t()); 1444807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1445807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 14462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO_32: { 1447d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 144892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_30t()); 14492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1451556d637764b71563030c479bc35364a75188d559Ian Rogers case Instruction::PACKED_SWITCH: { 1452d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 145392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz const uint16_t* switch_data = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 1454807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t test_val = shadow_frame.GetVReg(inst->VRegA_31t()); 1455d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kPackedSwitchSignature)); 1456556d637764b71563030c479bc35364a75188d559Ian Rogers uint16_t size = switch_data[1]; 1457d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK_GT(size, 0); 1458556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 1459443dcc328e9de0b919f823aa14f28f3e2f7d84a2Sebastien Hertz DCHECK(IsAligned<4>(keys)); 1460556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t first_key = keys[0]; 1461556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* targets = reinterpret_cast<const int32_t*>(&switch_data[4]); 1462d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK(IsAligned<4>(targets)); 1463556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t index = test_val - first_key; 1464556d637764b71563030c479bc35364a75188d559Ian Rogers if (index >= 0 && index < size) { 146592c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(targets[index]); 14669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 14679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 1468556d637764b71563030c479bc35364a75188d559Ian Rogers } 14692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 1470556d637764b71563030c479bc35364a75188d559Ian Rogers } 14712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPARSE_SWITCH: { 1472d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 14732cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz inst = DoSparseSwitch(inst, shadow_frame); 14742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1476807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPL_FLOAT: { 1477d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1478807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 1479807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 1480807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1481fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 > val2) { 1482807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1483fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1484fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1485807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1486807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 14872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1488807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 14899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1490807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1491807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1492807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPG_FLOAT: { 1493d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1494807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 1495807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 1496807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1497fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 < val2) { 1498807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1499fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1500fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1501807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1502807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 15032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1504807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1506807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1507807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1508807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPL_DOUBLE: { 1509d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1510807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 1511807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 1512807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1513fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 > val2) { 1514807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1515fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1516fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1517807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1518807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1519807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1520807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1522807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1523807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1524807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 1525807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPG_DOUBLE: { 1526d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1527807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 1528807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 1529807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1530fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 < val2) { 1531807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1532fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1533fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1534807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1535807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1536807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1537807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1539807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1540807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1541807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMP_LONG: { 1542d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1543807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 1544807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 1545807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1546807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (val1 > val2) { 1547807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1548807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else if (val1 == val2) { 1549807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 0; 1550807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1551807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1552807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1553807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQ: { 1558d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1559807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) == shadow_frame.GetVReg(inst->VRegB_22t())) { 156092c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NE: { 1567d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1568807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) != shadow_frame.GetVReg(inst->VRegB_22t())) { 156992c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LT: { 1576d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1577807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) < shadow_frame.GetVReg(inst->VRegB_22t())) { 157892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GE: { 1585d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1586807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) >= shadow_frame.GetVReg(inst->VRegB_22t())) { 158792c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GT: { 1594d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1595807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) > shadow_frame.GetVReg(inst->VRegB_22t())) { 159692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LE: { 1603d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1604807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) <= shadow_frame.GetVReg(inst->VRegB_22t())) { 160592c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQZ: { 1612d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) == 0) { 161492c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NEZ: { 1621d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) != 0) { 162392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LTZ: { 1630d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1631807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) < 0) { 163292c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GEZ: { 1639d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1640807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) >= 0) { 164192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GTZ: { 1648d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1649807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) > 0) { 165092c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LEZ: { 1657d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1658807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) <= 0) { 165992c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BOOLEAN: { 1666d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1667807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 16682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 166962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 16709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 16712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1673807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 16749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao BooleanArray* array = a->AsBooleanArray(); 16759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 16769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 16779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 16809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 16812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BYTE: { 1684d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1685807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 16862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 168762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 16889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 16892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1691807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 16929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ByteArray* array = a->AsByteArray(); 16939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 16949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 16959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 16989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 16992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_CHAR: { 1702d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1703807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 170562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1709807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CharArray* array = a->AsCharArray(); 17119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_SHORT: { 1720d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1721807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 172362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1727807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ShortArray* array = a->AsShortArray(); 17299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET: { 1738d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1739807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 174162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1745807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao IntArray* array = a->AsIntArray(); 17479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_WIDE: { 1756d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1757807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 175962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1763807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao LongArray* array = a->AsLongArray(); 17659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVRegLong(inst->VRegA_23x(), array->GetData()[index]); 17679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_OBJECT: { 1774d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1775807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 177762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1781807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ObjectArray<Object>* array = a->AsObjectArray<Object>(); 17839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVRegReference(inst->VRegA_23x(), array->GetWithoutChecks(index)); 17859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BOOLEAN: { 1792d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1793807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 179562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1799807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1800807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao BooleanArray* array = a->AsBooleanArray(); 18029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BYTE: { 1811d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1812807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 181462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1818807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1819807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ByteArray* array = a->AsByteArray(); 18219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_CHAR: { 1830d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1831807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 183362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1837807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1838807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18399cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CharArray* array = a->AsCharArray(); 18409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18449cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_SHORT: { 1849d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1850807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 185262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1856807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1857807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ShortArray* array = a->AsShortArray(); 18599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT: { 1868d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1869807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 187162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1875807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1876807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao IntArray* array = a->AsIntArray(); 18789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_WIDE: { 1887d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1888807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 189062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1894807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x()); 1895807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao LongArray* array = a->AsLongArray(); 18979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 19009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 19019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 19032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_OBJECT: { 1906d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1907807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 19082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 190962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 19109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1913807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19146bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x()); 19156bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 19166bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz if (LIKELY(array->IsValidIndex(index) && array->CheckAssignable(val))) { 19176bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz array->SetWithoutChecks(index, val); 19186bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz inst = inst->Next_2xx(); 19196bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz } else { 19206bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 19216bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz } 19222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_BOOLEAN: 1925d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1926233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 19279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_BYTE: 1930d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1931233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 19329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_CHAR: 1935d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1936233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 19379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_SHORT: 1940d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1941233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 19429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET: 1945d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1946233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 19479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_WIDE: 1950d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1951233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 19529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_OBJECT: 1955d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1956233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 19579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IGET_QUICK: 19602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIGetQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 19622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 19642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IGET_WIDE_QUICK: 19652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIGetQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 19672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 19692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IGET_OBJECT_QUICK: 19702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIGetQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 19722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 19742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_BOOLEAN: 1975d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1976233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 19779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_BYTE: 1980d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1981233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 19829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_CHAR: 1985d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1986233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 19879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_SHORT: 1990d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1991233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 19929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET: 1995d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1996233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 19979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_WIDE: 2000d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2001233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_OBJECT: 2005d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2006233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_BOOLEAN: 2010d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2011233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 20129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_BYTE: 2015d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2016233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 20179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_CHAR: 2020d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2021233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_SHORT: 2025d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2026233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT: 2030d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2031233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_WIDE: 2035d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2036233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_OBJECT: 2040d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2041233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IPUT_QUICK: 20452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIPutQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 20472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IPUT_WIDE_QUICK: 20502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIPutQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 20522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: 20552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIPutQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 20572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_BOOLEAN: 2060d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2061233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 20629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_BYTE: 2065d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2066233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 20679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_CHAR: 2070d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2071233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_SHORT: 2075d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2076233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT: 2080d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2081233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_WIDE: 2085d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2086233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_OBJECT: 2090d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2091233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_VIRTUAL: 2095d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2096233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, &result_register); 20979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 20982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_VIRTUAL_RANGE: 2100d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2101233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, &result_register); 21029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_SUPER: 2105d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2106233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, &result_register); 21079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_SUPER_RANGE: 2110d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2111233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, &result_register); 21129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_DIRECT: 2115d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2116233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, &result_register); 21179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_DIRECT_RANGE: 2120d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2121233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, &result_register); 21229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_INTERFACE: 2125d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2126233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, &result_register); 21279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_INTERFACE_RANGE: 2130d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2131233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, &result_register); 21329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_STATIC: 2135d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2136233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, &result_register); 21379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_STATIC_RANGE: 2140d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2141233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, &result_register); 21429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: 21452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 21462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoInvokeVirtualQuick<false>(self, shadow_frame, inst, &result_register); 21472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: 21502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 21512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoInvokeVirtualQuick<true>(self, shadow_frame, inst, &result_register); 21522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_INT: 2155d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2156807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), -shadow_frame.GetVReg(inst->VRegB_12x())); 21579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_INT: 2160d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2161807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), ~shadow_frame.GetVReg(inst->VRegB_12x())); 21629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_LONG: 2165d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2166807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), -shadow_frame.GetVRegLong(inst->VRegB_12x())); 21679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_LONG: 2170d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2171807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), ~shadow_frame.GetVRegLong(inst->VRegB_12x())); 21729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_FLOAT: 2175d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2176807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), -shadow_frame.GetVRegFloat(inst->VRegB_12x())); 21779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_DOUBLE: 2180d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2181807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), -shadow_frame.GetVRegDouble(inst->VRegB_12x())); 21829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_LONG: 2185d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2186807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 21879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_FLOAT: 2190d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2191807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 21929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_DOUBLE: 2195d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2196807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 21979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_INT: 2200d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2201807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_FLOAT: 2205d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2206807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_DOUBLE: 2210d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2211807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 221487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_INT: { 2215d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2216807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 221713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t result; 221887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 221913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 222087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxInt)) { 222113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxInt; 222287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinInt)) { 222313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinInt; 222487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 222513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 222687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 222713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 22289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 223087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 223187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_LONG: { 2232d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2233807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 223413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int64_t result; 223587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 223613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 223787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxLong)) { 223813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxLong; 223987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinLong)) { 224013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinLong; 224187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 224213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 224387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 224413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 22459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 224787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 22482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FLOAT_TO_DOUBLE: 2249d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2250807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegFloat(inst->VRegB_12x())); 22519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 225387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_INT: { 2254d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2255807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 225613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t result; 225787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 225813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 225987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxInt)) { 226013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxInt; 226187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinInt)) { 226213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinInt; 226387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 226413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 226587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 226613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 22679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 226987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 227087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_LONG: { 2271d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2272807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 227313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int64_t result; 227487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 227513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 227687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxLong)) { 227713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxLong; 227887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinLong)) { 227913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinLong; 228087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 228113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 228287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 228313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 22849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 228687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 22872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DOUBLE_TO_FLOAT: 2288d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2289807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegDouble(inst->VRegB_12x())); 22909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_BYTE: 2293d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2294807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2295807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 22969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_CHAR: 2299d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2300807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2301807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_SHORT: 2305d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2306807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2307807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT: 2311d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2312807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2313807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) + 2314807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_INT: 2318d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2319807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2320807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) - 2321807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT: 2325d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2326807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2327807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) * 2328807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT: 2332d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 23330a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntDivide(shadow_frame, inst->VRegA_23x(), 2334807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 2335807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 2337807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2338807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_INT: 2339d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 23400a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntRemainder(shadow_frame, inst->VRegA_23x(), 2341807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 2342807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 23442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT: 2346d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2347807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2348807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 2349807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 23509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT: 2353d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2354807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2355807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 2356807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 23579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT: 2360d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2361807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2362807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 2363807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 23649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT: 2367d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2368807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2369807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 2370807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT: 2374d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2375807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2376807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 2377807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT: 2381d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2382807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2383807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 2384807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_LONG: 2388d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2389807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2390807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) + 2391807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 23929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_LONG: 2395d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2396807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2397807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) - 2398807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 23999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_LONG: 2402d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2403807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2404807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) * 2405807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_LONG: 2409d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24100a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(), 2411807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 2412807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 24142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_LONG: 2416d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24170a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(), 2418807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 2419807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 24212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_LONG: 2423d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2424807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2425807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 2426807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_LONG: 2430d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2431807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2432807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 2433807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_LONG: 2437d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2438807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2439807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 2440807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_LONG: 2444d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2445807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2446807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 2447807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 24489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_LONG: 2451d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2452807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2453807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 2454807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 24559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_LONG: 2458d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2459807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2460807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 2461807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 24629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_FLOAT: 2465d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2466807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2467807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 2468807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 24699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_FLOAT: 2472d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2473807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2474807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 2475807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 24769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_FLOAT: 2479d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2480807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2481807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 2482807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 24839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_FLOAT: 2486d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2487807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2488807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 2489807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 24909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_FLOAT: 2493d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2494807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2495807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 2496807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 24979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_DOUBLE: 2500d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2501807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2502807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 2503807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_DOUBLE: 2507d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2508807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2509807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 2510807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_DOUBLE: 2514d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2515807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2516807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 2517807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25189cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_DOUBLE: 2521d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2522807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2523807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 2524807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_DOUBLE: 2528d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2529807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2530807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 2531807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 25329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2533807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2534807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_INT_2ADDR: { 2535d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 25365fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2537807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2538807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) + 2539807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 25409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2541807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2542807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2543807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_INT_2ADDR: { 2544d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 25455fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2546807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2547807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) - 2548807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 25499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2550807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2551807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2552807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_INT_2ADDR: { 2553d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 25545fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2555807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2556807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) * 2557807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 25589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2559807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2560807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 256192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz case Instruction::DIV_INT_2ADDR: { 256292c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz PREAMBLE(); 25635fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 25640a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 256592c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 256692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->Next_1xx(); 256792c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz break; 256892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz } 2569807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_INT_2ADDR: { 2570d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 25715fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 25720a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 2573807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 25749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 25752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 2576807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 25772ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom case Instruction::SHL_INT_2ADDR: { 2578d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 25795fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2580807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2581807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) << 2582807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 25839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2584807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2585807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2586807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHR_INT_2ADDR: { 2587d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 25885fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2589807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2590807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) >> 2591807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 25929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2593807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2594807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2595807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::USHR_INT_2ADDR: { 2596d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 25975fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2598807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2599807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 2600807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2602807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2603807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2604807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_INT_2ADDR: { 2605d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26065fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2607807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2608807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) & 2609807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2611807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2612807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_INT_2ADDR: { 2614d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26155fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2616807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) | 2618807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2620807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2621807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::XOR_INT_2ADDR: { 2623d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26245fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2625807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) ^ 2627807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2629807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2630807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2631807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 2632d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26335fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2634807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2635807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) + 2636807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2638807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2639807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2640807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 2641d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26425fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2643807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2644807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) - 2645807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2647807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2648807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2649807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 2650d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26515fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2652807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2653807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) * 2654807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2656807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2657807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2658807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 2659d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26605fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 26610a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 2662807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 2664807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2665807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2666807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_LONG_2ADDR: { 2667d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26685fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 26690a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 2670807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 2672807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2673807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2674807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_LONG_2ADDR: { 2675d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26765fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2677807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2678807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) & 2679807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2681807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2682807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2683807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_LONG_2ADDR: { 2684d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26855fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2686807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2687807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) | 2688807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2690807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2691807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2692807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 2693d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26945fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2695807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2696807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 2697807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2699807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2700807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 2702d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27035fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2704807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2705807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) << 2706807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2708807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2709807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2710807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 2711d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27125fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2713807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2714807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 2715807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2717807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2718807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 2720d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27215fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2722807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2723807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 2724807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2726807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2727807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2728807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 2729d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27305fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2731807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2732807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 2733807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 27349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2735807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2736807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2737807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 2738d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27395fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2740807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2741807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 2742807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 27439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2744807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2745807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2746807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 2747d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27485fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2749807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2750807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 2751807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 27529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2753807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2754807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2755807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 2756d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27575fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2758807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2759807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 2760807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 27619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2762807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2763807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2764807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 2765d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27665fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2767807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2768807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 2769807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x()))); 27709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2771807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2772807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2773807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 2774d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27755fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2776807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2777807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 2778807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 27799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2780807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2781807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2782807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 2783d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27845fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2785807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2786807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 2787807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 27889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2789807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2790807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2791807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 2792d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27935fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2794807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2795807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 2796807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 27979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2798807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2799807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2800807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 2801d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28025fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2803807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2804807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 2805807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2807807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2808807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2809807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 2810d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28115fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2812807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2813807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 2814807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x()))); 28159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2816807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2817807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 28182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_LIT16: 2819d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2820807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2821807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) + 2822807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RSUB_INT: 2826d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2827807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2828807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s() - 2829807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s())); 28309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_LIT16: 2833d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2834807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2835807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) * 2836807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT_LIT16: 2840d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28410a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntDivide(shadow_frame, inst->VRegA_22s(), 2842807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 28439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 28442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT_LIT16: 2846d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28470a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntRemainder(shadow_frame, inst->VRegA_22s(), 2848807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 28499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 28502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_LIT16: 2852d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2853807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2854807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) & 2855807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_LIT16: 2859d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2860807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2861807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) | 2862807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT16: 2866d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2867807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2868807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) ^ 2869807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2871807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2872807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_INT_LIT8: 2873d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2874807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2875807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) + 2876807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 28779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2878807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2879807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::RSUB_INT_LIT8: 2880d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2881807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2882807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b() - 2883807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b())); 28849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2885807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2886807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_INT_LIT8: 2887d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2888807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2889807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) * 2890807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 28919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2892807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2893807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_INT_LIT8: 2894d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28950a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntDivide(shadow_frame, inst->VRegA_22b(), 2896807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 28979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 2898807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2899807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_INT_LIT8: 2900d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29010a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntRemainder(shadow_frame, inst->VRegA_22b(), 2902807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 29039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 2904807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2905807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_INT_LIT8: 2906d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2907807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2908807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 2909807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2911807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2912807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_INT_LIT8: 2913d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2914807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2915807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 2916807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2918807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT8: 2920d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2921807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2922807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 2923807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT_LIT8: 2927d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2928807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2929807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 2930807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 29319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT_LIT8: 2934d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2935807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2936807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 2937807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 29389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT_LIT8: 2941d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2942807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2943807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 2944807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 29459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 2947fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 29482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::UNUSED_EB ... Instruction::UNUSED_FF: 2949fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_79: 2950fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_7A: 2951d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers UnexpectedOpcode(inst, mh); 29522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 29532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 29542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 29552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 2956233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 2957233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) 2958233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2959233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 2960233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic inline JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 2961233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) { 2962233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz if (shadow_frame.GetMethod()->IsPreverified()) { 2963233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // Enter the "without access check" interpreter. 2964233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz return ExecuteImpl<false>(self, mh, code_item, shadow_frame, result_register); 2965233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } else { 2966233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // Enter the "with access check" interpreter. 2967233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz return ExecuteImpl<true>(self, mh, code_item, shadow_frame, result_register); 2968233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } 2969233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz} 2970233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 29712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersvoid EnterInterpreterFromInvoke(Thread* self, AbstractMethod* method, Object* receiver, 29726474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao uint32_t* args, JValue* result) { 297364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers DCHECK_EQ(self, Thread::Current()); 2974790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 2975d752132c73072084a3def9257cca4fcee76047b6jeffhao ThrowStackOverflowError(self); 2976d752132c73072084a3def9257cca4fcee76047b6jeffhao return; 2977d752132c73072084a3def9257cca4fcee76047b6jeffhao } 2978d752132c73072084a3def9257cca4fcee76047b6jeffhao 29792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers MethodHelper mh(method); 29802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 29812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_regs; 29822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_ins; 29832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (code_item != NULL) { 29842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = code_item->registers_size_; 29852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins = code_item->ins_size_; 29860a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } else if (method->IsAbstract()) { 298756adf601ed9d1d11a2c462caa262e7de66a9e172Sebastien Hertz ThrowAbstractMethodError(method); 29880a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao return; 29892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 29902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK(method->IsNative()); 29912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 29922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 29932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs++; 29942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins++; 29952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 29962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 29972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers // Set up shadow frame with matching number of reference slots to vregs. 29982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame(); 29996613519990bdb5616f2858c146f162ef760f03d2Jeff Hao void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 30006613519990bdb5616f2858c146f162ef760f03d2Jeff Hao ShadowFrame* shadow_frame(ShadowFrame::Create(num_regs, last_shadow_frame, method, 0, memory)); 30016613519990bdb5616f2858c146f162ef760f03d2Jeff Hao self->PushShadowFrame(shadow_frame); 30022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers size_t cur_reg = num_regs - num_ins; 30032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 30042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(receiver != NULL); 3005ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, receiver); 30062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ++cur_reg; 3007807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else if (UNLIKELY(!method->GetDeclaringClass()->IsInitializing())) { 3008807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 3009807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!class_linker->EnsureInitialized(method->GetDeclaringClass(), 3010807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz true, true))) { 3011807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 3012807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz self->PopShadowFrame(); 301394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao return; 301494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao } 30152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(method->GetDeclaringClass()->IsInitializing()); 30162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 301764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const char* shorty = mh.GetShorty(); 30185d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao for (size_t shorty_pos = 0, arg_pos = 0; cur_reg < num_regs; ++shorty_pos, ++arg_pos, cur_reg++) { 30195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 30205d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao switch (shorty[shorty_pos + 1]) { 30212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case 'L': { 30225d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* o = reinterpret_cast<Object*>(args[arg_pos]); 3023ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, o); 30242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao case 'J': case 'D': { 30275d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao uint64_t wide_value = (static_cast<uint64_t>(args[arg_pos + 1]) << 32) | args[arg_pos]; 30285d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao shadow_frame->SetVRegLong(cur_reg, wide_value); 30292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers cur_reg++; 30305d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao arg_pos++; 30312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30325d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao } 30332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 30345d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao shadow_frame->SetVReg(cur_reg, args[arg_pos]); 30352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 303864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (LIKELY(!method->IsNative())) { 30396613519990bdb5616f2858c146f162ef760f03d2Jeff Hao JValue r = Execute(self, mh, code_item, *shadow_frame, JValue()); 30406474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao if (result != NULL) { 30416474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao *result = r; 30422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 304464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 304564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // generated stub) except during testing and image writing. 304664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!Runtime::Current()->IsStarted()) { 30476474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao UnstartedRuntimeJni(self, method, receiver, args, result); 30482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 30496474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao InterpreterJni(self, method, shorty, receiver, args, result); 30502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->PopShadowFrame(); 30532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 30542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 305562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogersvoid EnterInterpreterFromDeoptimize(Thread* self, ShadowFrame* shadow_frame, JValue* ret_val) 305611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 305711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao JValue value; 305862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers value.SetJ(ret_val->GetJ()); // Set value to last known result in case the shadow frame chain is empty. 305962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers MethodHelper mh; 306011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao while (shadow_frame != NULL) { 306162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetTopOfShadowStack(shadow_frame); 306262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers mh.ChangeMethod(shadow_frame->GetMethod()); 306362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 306411ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao value = Execute(self, mh, code_item, *shadow_frame, value); 306511ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ShadowFrame* old_frame = shadow_frame; 306611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao shadow_frame = shadow_frame->GetLink(); 306711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao delete old_frame; 306811ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao } 306911ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ret_val->SetJ(value.GetJ()); 307011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao} 307111ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao 30727db619bb2a4e01e8532a04b613745d4926b205d7Ian RogersJValue EnterInterpreterFromStub(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 30737db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers ShadowFrame& shadow_frame) 30747db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3075f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers DCHECK_EQ(self, Thread::Current()); 3076790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3077f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers ThrowStackOverflowError(self); 3078f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers return JValue(); 3079f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers } 3080f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers 30817db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers return Execute(self, mh, code_item, shadow_frame, JValue()); 30827db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers} 30837db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 30840aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haovoid artInterpreterToInterpreterEntry(Thread* self, MethodHelper& mh, 30850aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const DexFile::CodeItem* code_item, 30860aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao ShadowFrame* shadow_frame, JValue* result) 3087167436311a08a65dea28dda079a137893821c9c7Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3088790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3089167436311a08a65dea28dda079a137893821c9c7Jeff Hao ThrowStackOverflowError(self); 30906951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3091167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3092167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3093167436311a08a65dea28dda079a137893821c9c7Jeff Hao AbstractMethod* method = shadow_frame->GetMethod(); 3094167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (method->IsStatic() && !method->GetDeclaringClass()->IsInitializing()) { 3095167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(), 3096167436311a08a65dea28dda079a137893821c9c7Jeff Hao true, true)) { 3097167436311a08a65dea28dda079a137893821c9c7Jeff Hao DCHECK(Thread::Current()->IsExceptionPending()); 30986951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3099167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3100167436311a08a65dea28dda079a137893821c9c7Jeff Hao CHECK(method->GetDeclaringClass()->IsInitializing()); 3101167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3102167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3103167436311a08a65dea28dda079a137893821c9c7Jeff Hao self->PushShadowFrame(shadow_frame); 3104167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3105167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (LIKELY(!method->IsNative())) { 31066951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao result->SetJ(Execute(self, mh, code_item, *shadow_frame, JValue()).GetJ()); 3107167436311a08a65dea28dda079a137893821c9c7Jeff Hao } else { 3108167436311a08a65dea28dda079a137893821c9c7Jeff Hao // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 3109167436311a08a65dea28dda079a137893821c9c7Jeff Hao // generated stub) except during testing and image writing. 3110167436311a08a65dea28dda079a137893821c9c7Jeff Hao CHECK(!Runtime::Current()->IsStarted()); 3111167436311a08a65dea28dda079a137893821c9c7Jeff Hao Object* receiver = method->IsStatic() ? NULL : shadow_frame->GetVRegReference(0); 3112167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint32_t* args = shadow_frame->GetVRegArgs(method->IsStatic() ? 0 : 1); 31136951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao UnstartedRuntimeJni(self, method, receiver, args, result); 3114167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3115167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3116167436311a08a65dea28dda079a137893821c9c7Jeff Hao self->PopShadowFrame(); 31176951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3118167436311a08a65dea28dda079a137893821c9c7Jeff Hao} 3119167436311a08a65dea28dda079a137893821c9c7Jeff Hao 31202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace interpreter 31212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace art 3122