interpreter.cc revision 3e3d591f781b771de89f3b989830da2b6ac6fac8
12fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers/* 22fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Copyright (C) 2012 The Android Open Source Project 32fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 42fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 52fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * you may not use this file except in compliance with the License. 62fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * You may obtain a copy of the License at 72fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 82fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * http://www.apache.org/licenses/LICENSE-2.0 92fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * 102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Unless required by applicable law or agreed to in writing, software 112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * distributed under the License is distributed on an "AS IS" BASIS, 122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * See the License for the specific language governing permissions and 142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * limitations under the License. 152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers */ 162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "interpreter.h" 182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include <math.h> 202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 2107ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h" 222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class_linker-inl.h" 232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "common_throws.h" 244f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h" 25807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz#include "dex_instruction-inl.h" 261d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "dex_instruction.h" 271d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/accounting/card_table-inl.h" 282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "invoke_arg_array_builder.h" 2964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers#include "nth_caller_visitor.h" 302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class.h" 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class-inl.h" 322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/field-inl.h" 332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method.h" 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method-inl.h" 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h" 362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h" 372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object_utils.h" 382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "runtime_support.h" 392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "ScopedLocalRef.h" 402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "scoped_thread_state_change.h" 412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "thread.h" 422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 433e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::AbstractMethod; 443e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Array; 453e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::BooleanArray; 463e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ByteArray; 473e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::CharArray; 483e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Class; 493e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ClassLoader; 503e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Field; 513e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::IntArray; 523e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::LongArray; 533e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Object; 543e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ObjectArray; 553e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ShortArray; 563e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::String; 573e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Throwable; 582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace art { 60167436311a08a65dea28dda079a137893821c9c7Jeff Hao 612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace interpreter { 622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 6387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMaxInt = std::numeric_limits<int32_t>::max(); 6487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMinInt = std::numeric_limits<int32_t>::min(); 6587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMaxLong = std::numeric_limits<int64_t>::max(); 6687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMinLong = std::numeric_limits<int64_t>::min(); 6787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao 68790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Haostatic void UnstartedRuntimeInvoke(Thread* self, MethodHelper& mh, 69790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const DexFile::CodeItem* code_item, ShadowFrame* shadow_frame, 70790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao JValue* result, size_t arg_offset) 7164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 7264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // In a runtime that's not started we intercept certain methods to avoid complicated dependency 7364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // problems in core libraries. 74790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao std::string name(PrettyMethod(shadow_frame->GetMethod())); 7564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.Class java.lang.Class.forName(java.lang.String)") { 76167436311a08a65dea28dda079a137893821c9c7Jeff Hao std::string descriptor(DotToDescriptor(shadow_frame->GetVRegReference(arg_offset)->AsString()->ToModifiedUtf8().c_str())); 7764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ClassLoader* class_loader = NULL; // shadow_frame.GetMethod()->GetDeclaringClass()->GetClassLoader(); 7864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* found = Runtime::Current()->GetClassLinker()->FindClass(descriptor.c_str(), 7964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers class_loader); 8064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) << "Class.forName failed in un-started runtime for class: " 8164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << PrettyDescriptor(descriptor); 8264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 8364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Class.newInstance()") { 84167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 8564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers AbstractMethod* c = klass->FindDeclaredDirectMethod("<init>", "()V"); 8664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(c != NULL); 8764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = klass->AllocObject(self); 8864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(obj != NULL); 896474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao EnterInterpreterFromInvoke(self, c, obj, NULL, NULL); 9064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(obj); 9164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String)") { 9264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail 9364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // going the reflective Dex way. 94167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 95167436311a08a65dea28dda079a137893821c9c7Jeff Hao String* name = shadow_frame->GetVRegReference(arg_offset + 1)->AsString(); 9664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* found = NULL; 9764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers FieldHelper fh; 9864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Field>* fields = klass->GetIFields(); 9964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 10064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 10164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 10264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 10364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 10464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (found == NULL) { 10764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fields = klass->GetSFields(); 10864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 10964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 11064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 11164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 11264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 11364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) 11764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << "Failed to find field in Class.getDeclaredField in un-started runtime. name=" 11864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << name->ToModifiedUtf8() << " class=" << PrettyDescriptor(klass); 11964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: getDeclaredField calls GetType once the field is found to ensure a 12064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // NoClassDefFoundError is thrown if the field's type cannot be resolved. 12164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 12264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int)") { 12364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special case array copying without initializing System. 124167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* ctype = shadow_frame->GetVRegReference(arg_offset)->GetClass()->GetComponentType(); 125167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint srcPos = shadow_frame->GetVReg(arg_offset + 1); 126167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint dstPos = shadow_frame->GetVReg(arg_offset + 3); 127167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint length = shadow_frame->GetVReg(arg_offset + 4); 12864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!ctype->IsPrimitive()) { 129167436311a08a65dea28dda079a137893821c9c7Jeff Hao ObjectArray<Object>* src = shadow_frame->GetVRegReference(arg_offset)->AsObjectArray<Object>(); 130167436311a08a65dea28dda079a137893821c9c7Jeff Hao ObjectArray<Object>* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsObjectArray<Object>(); 13164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 13264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 13364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveChar()) { 135167436311a08a65dea28dda079a137893821c9c7Jeff Hao CharArray* src = shadow_frame->GetVRegReference(arg_offset)->AsCharArray(); 136167436311a08a65dea28dda079a137893821c9c7Jeff Hao CharArray* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsCharArray(); 13764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 13864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 13964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveInt()) { 141167436311a08a65dea28dda079a137893821c9c7Jeff Hao IntArray* src = shadow_frame->GetVRegReference(arg_offset)->AsIntArray(); 142167436311a08a65dea28dda079a137893821c9c7Jeff Hao IntArray* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsIntArray(); 14364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 14464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 14564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 14764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UNIMPLEMENTED(FATAL) << "System.arraycopy of unexpected type: " << PrettyDescriptor(ctype); 14864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 15064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Not special, continue with regular interpreter execution. 1510aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao artInterpreterToInterpreterEntry(self, mh, code_item, shadow_frame, result); 15264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 15364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 15464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 15564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers// Hand select a number of methods to be run in a not yet started runtime without using JNI. 15664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeJni(Thread* self, AbstractMethod* method, 1575d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* receiver, uint32_t* args, JValue* result) 15864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 15964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string name(PrettyMethod(method)); 16064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.ClassLoader dalvik.system.VMStack.getCallingClassLoader()") { 16164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(NULL); 16264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Class dalvik.system.VMStack.getStackClass2()") { 1637a22fa657b972e8323692368975bc5a7be1cc0f5Ian Rogers NthCallerVisitor visitor(self, 3); 16464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers visitor.WalkStack(); 16564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(visitor.caller->GetDeclaringClass()); 16664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.log(double)") { 1675d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao JValue value; 1685d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1695d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetD(log(value.GetD())); 17064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.Class.getNameNative()") { 17164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsClass()->ComputeName()); 17264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.Float.floatToRawIntBits(float)") { 1735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(args[0]); 17464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "float java.lang.Float.intBitsToFloat(int)") { 1755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(args[0]); 17664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.exp(double)") { 1775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao JValue value; 1785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetD(exp(value.GetD())); 18064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Object.internalClone()") { 18164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->Clone(self)); 18264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.Object.notifyAll()") { 18305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers receiver->NotifyAll(self); 18464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.compareTo(java.lang.String)") { 1855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao String* rhs = reinterpret_cast<Object*>(args[0])->AsString(); 18664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(rhs != NULL); 18764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(receiver->AsString()->CompareTo(rhs)); 18864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.String.intern()") { 18964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsString()->Intern()); 19064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.fastIndexOf(int, int)") { 1915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(receiver->AsString()->FastIndexOf(args[0], args[1])); 19264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])") { 1935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetL(Array::CreateMultiArray(self, reinterpret_cast<Object*>(args[0])->AsClass(), reinterpret_cast<Object*>(args[1])->AsIntArray())); 19464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") { 19564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 19664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa))); 19764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") { 19864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetJ(JNI_TRUE); 19964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") { 2005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* obj = reinterpret_cast<Object*>(args[0]); 2015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1]; 2025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jint expectedValue = args[3]; 2035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jint newValue = args[4]; 20464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(obj) + offset; 20564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr); 20664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Note: android_atomic_release_cas() returns 0 on success, not failure. 20764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int r = android_atomic_release_cas(expectedValue, newValue, address); 20864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(r == 0); 20964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") { 2105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* obj = reinterpret_cast<Object*>(args[0]); 2115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* newValue = reinterpret_cast<Object*>(args[3]); 2125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao obj->SetFieldObject(MemberOffset((static_cast<uint64_t>(args[2]) << 32) | args[1]), newValue, false); 21364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 21464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Attempt to invoke native method in non-started runtime: " << name; 21564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 21664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 21764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 21864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void InterpreterJni(Thread* self, AbstractMethod* method, StringPiece shorty, 2195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* receiver, uint32_t* args, JValue* result) 22064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 22164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: The following enters JNI code using a typedef-ed function rather than the JNI compiler, 22264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // it should be removed and JNI compiled stubs used instead. 22364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 22464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (method->IsStatic()) { 22564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 22664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass); 227d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 22864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 22964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 230556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 231556d637764b71563030c479bc35364a75188d559Ian Rogers { 232556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 233556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get()); 234556d637764b71563030c479bc35364a75188d559Ian Rogers } 235556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 23664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "V") { 23764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass); 238d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 23964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 24064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 24164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 24264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get()); 24364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "Z") { 24464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass); 245d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 24664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 24764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 24864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 24964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get())); 25064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "BI") { 25164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jbyte (fnptr)(JNIEnv*, jclass, jint); 252d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 25364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 25464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 25564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2565d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetB(fn(soa.Env(), klass.get(), args[0])); 25764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "II") { 25864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint); 259d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 26064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2635d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), args[0])); 26464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 26564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass, jobject); 266d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 26764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 2705d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 271556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 272556d637764b71563030c479bc35364a75188d559Ian Rogers { 273556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 274556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get(), arg0.get()); 275556d637764b71563030c479bc35364a75188d559Ian Rogers } 276556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 27764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "IIZ") { 27864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint, jboolean); 279d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 28064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), args[0], args[1])); 28464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ILI") { 28564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jobject, jint); 286d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 28764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 2905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 29164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), arg0.get(), args[1])); 29364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "SIZ") { 29464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jshort (fnptr)(JNIEnv*, jclass, jint, jboolean); 295d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 29664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 29764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 29864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetS(fn(soa.Env(), klass.get(), args[0], args[1])); 30064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VIZ") { 30164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jboolean); 302d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 30364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 30464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 30564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), args[0], args[1]); 30764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZLL") { 30864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jobject, jobject); 309d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 31064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 31164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 31264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 31464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 31664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 31764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get(), arg0.get(), arg1.get())); 31864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZILL") { 31964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jint, jobject, jobject); 320d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 32164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 32264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 32364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 32564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 3265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[2]))); 32764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3285d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetZ(fn(soa.Env(), klass.get(), args[0], arg1.get(), arg2.get())); 32964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VILII") { 33064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jobject, jint, jint); 331d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 33264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 33364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 33464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 33664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3375d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), args[0], arg1.get(), args[2], args[3]); 33864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VLILII") { 33964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jobject, jint, jobject, jint, jint); 340d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 34164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 34264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 34364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3445d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 34564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 3465d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[2]))); 34764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3485d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), arg0.get(), args[1], arg2.get(), args[3], args[4]); 34964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 35064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with static native method: " << PrettyMethod(method) 35164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 35264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 35364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 35464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 35564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject); 356d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 35764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 35864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 359556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 360556d637764b71563030c479bc35364a75188d559Ian Rogers { 361556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 362556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get()); 363556d637764b71563030c479bc35364a75188d559Ian Rogers } 364556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 3653dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao } else if (shorty == "V") { 3663dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao typedef void (fnptr)(JNIEnv*, jobject); 3673dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 3683dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao ScopedLocalRef<jobject> rcvr(soa.Env(), 3693dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao soa.AddLocalReference<jobject>(receiver)); 3703dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao ScopedThreadStateChange tsc(self, kNative); 3713dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao fn(soa.Env(), rcvr.get()); 37264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 37364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject, jobject); 374d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 37564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 37664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 37764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 379556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 380556d637764b71563030c479bc35364a75188d559Ian Rogers { 381556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 382556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get(), arg0.get()); 383556d637764b71563030c479bc35364a75188d559Ian Rogers } 384556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 38564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 38664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "III") { 38764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jobject, jint, jint); 388d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 38964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 39064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 39164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), rcvr.get(), args[0], args[1])); 39364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 39464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with native method: " << PrettyMethod(method) 39564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 39664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 39764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 39864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 39964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 4002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorEnter(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 4012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorEnter(self); 4022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorExit(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 4052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorExit(self); 4062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 408ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 409ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 410233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<InvokeType type, bool is_range, bool do_access_check> 411ca6ad221d1bd857e26817f6b63d4ad9f3fe7ca40Sebastien Hertzstatic void DoInvoke(Thread* self, ShadowFrame& shadow_frame, 412ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers const Instruction* inst, JValue* result) NO_THREAD_SAFETY_ANALYSIS; 413ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers 414233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<InvokeType type, bool is_range, bool do_access_check> 415ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogersstatic void DoInvoke(Thread* self, ShadowFrame& shadow_frame, 416ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers const Instruction* inst, JValue* result) { 417807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t method_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); 418790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao uint32_t vregC = (is_range) ? inst->VRegC_3rc() : inst->VRegC_35c(); 419790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao Object* receiver = (type == kStatic) ? NULL : shadow_frame.GetVRegReference(vregC); 420790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao AbstractMethod* method = FindMethodFromCode(method_idx, receiver, shadow_frame.GetMethod(), self, 421233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check, type); 422790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(method == NULL)) { 4232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(self->IsExceptionPending()); 4242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result->SetJ(0); 4252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return; 4262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 427167436311a08a65dea28dda079a137893821c9c7Jeff Hao 428790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao MethodHelper mh(method); 429790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const DexFile::CodeItem* code_item = mh.GetCodeItem(); 430167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint16_t num_regs; 431167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint16_t num_ins; 432790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (LIKELY(code_item != NULL)) { 433167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_regs = code_item->registers_size_; 434167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_ins = code_item->ins_size_; 435790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao } else if (method->IsAbstract()) { 43656adf601ed9d1d11a2c462caa262e7de66a9e172Sebastien Hertz ThrowAbstractMethodError(method); 437167436311a08a65dea28dda079a137893821c9c7Jeff Hao return; 4382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 439790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao DCHECK(method->IsNative() || method->IsProxyMethod()); 440790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 441790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (!method->IsStatic()) { 442167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_regs++; 443167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_ins++; 444167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 4452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 446167436311a08a65dea28dda079a137893821c9c7Jeff Hao 4476613519990bdb5616f2858c146f162ef760f03d2Jeff Hao void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 448790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao ShadowFrame* new_shadow_frame(ShadowFrame::Create(num_regs, &shadow_frame, method, 0, memory)); 449167436311a08a65dea28dda079a137893821c9c7Jeff Hao size_t cur_reg = num_regs - num_ins; 450167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (receiver != NULL) { 451167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegReference(cur_reg, receiver); 452167436311a08a65dea28dda079a137893821c9c7Jeff Hao ++cur_reg; 453167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 454167436311a08a65dea28dda079a137893821c9c7Jeff Hao 455167436311a08a65dea28dda079a137893821c9c7Jeff Hao size_t arg_offset = (receiver == NULL) ? 0 : 1; 456790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const char* shorty = mh.GetShorty(); 457807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t arg[5]; 458807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (!is_range) { 459807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->GetArgs(arg); 460807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 461167436311a08a65dea28dda079a137893821c9c7Jeff Hao for (size_t shorty_pos = 0; cur_reg < num_regs; ++shorty_pos, cur_reg++, arg_offset++) { 462790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 463807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz size_t arg_pos = is_range ? vregC + arg_offset : arg[arg_offset]; 464167436311a08a65dea28dda079a137893821c9c7Jeff Hao switch (shorty[shorty_pos + 1]) { 465167436311a08a65dea28dda079a137893821c9c7Jeff Hao case 'L': { 466167436311a08a65dea28dda079a137893821c9c7Jeff Hao Object* o = shadow_frame.GetVRegReference(arg_pos); 467167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegReference(cur_reg, o); 468167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 469167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 470167436311a08a65dea28dda079a137893821c9c7Jeff Hao case 'J': case 'D': { 471167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint64_t wide_value = (static_cast<uint64_t>(shadow_frame.GetVReg(arg_pos + 1)) << 32) | 472167436311a08a65dea28dda079a137893821c9c7Jeff Hao static_cast<uint32_t>(shadow_frame.GetVReg(arg_pos)); 473167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegLong(cur_reg, wide_value); 474167436311a08a65dea28dda079a137893821c9c7Jeff Hao cur_reg++; 475167436311a08a65dea28dda079a137893821c9c7Jeff Hao arg_offset++; 476167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 477167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 478167436311a08a65dea28dda079a137893821c9c7Jeff Hao default: 479167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVReg(cur_reg, shadow_frame.GetVReg(arg_pos)); 480167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 4815d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao } 482167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 483167436311a08a65dea28dda079a137893821c9c7Jeff Hao 4846613519990bdb5616f2858c146f162ef760f03d2Jeff Hao if (LIKELY(Runtime::Current()->IsStarted())) { 485790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); 486167436311a08a65dea28dda079a137893821c9c7Jeff Hao } else { 487790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, num_regs - num_ins); 48864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 4892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4912d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 4922d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 4932d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<bool is_range> 4942d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic void DoInvokeVirtualQuick(Thread* self, ShadowFrame& shadow_frame, 4952d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst, JValue* result) 4962d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS; 4972d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 4982d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<bool is_range> 4992d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic void DoInvokeVirtualQuick(Thread* self, ShadowFrame& shadow_frame, 5002d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst, JValue* result) { 5012d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t vregC = (is_range) ? inst->VRegC_3rc() : inst->VRegC_35c(); 5022d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* receiver = shadow_frame.GetVRegReference(vregC); 5032d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(receiver == NULL)) { 5042d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the method index so we cannot get a more 5052d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 5062d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 5072d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 5082d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5092d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t vtable_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); 5102d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz AbstractMethod* method = receiver->GetClass()->GetVTable()->Get(vtable_idx); 5112d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(method == NULL)) { 5122d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz CHECK(self->IsExceptionPending()); 5132d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz result->SetJ(0); 5142d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 5152d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5162d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MethodHelper mh(method); 5172d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5182d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const DexFile::CodeItem* code_item = mh.GetCodeItem(); 5192d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint16_t num_regs; 5202d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint16_t num_ins; 5212d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (code_item != NULL) { 5222d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs = code_item->registers_size_; 5232d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_ins = code_item->ins_size_; 5242d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else if (method->IsAbstract()) { 52556adf601ed9d1d11a2c462caa262e7de66a9e172Sebastien Hertz ThrowAbstractMethodError(method); 5262d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 5272d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else { 5282d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DCHECK(method->IsNative() || method->IsProxyMethod()); 5292d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 5302d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (!method->IsStatic()) { 5312d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs++; 5322d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_ins++; 5332d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5342d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5352d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5362d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 5372d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ShadowFrame* new_shadow_frame(ShadowFrame::Create(num_regs, &shadow_frame, 5382d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz method, 0, memory)); 5392d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t cur_reg = num_regs - num_ins; 5402d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (receiver != NULL) { 5412d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegReference(cur_reg, receiver); 5422d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ++cur_reg; 5432d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t arg_offset = (receiver == NULL) ? 0 : 1; 5462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const char* shorty = mh.GetShorty(); 5472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t arg[5]; 5482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (!is_range) { 5492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz inst->GetArgs(arg); 5502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz for (size_t shorty_pos = 0; cur_reg < num_regs; ++shorty_pos, cur_reg++, arg_offset++) { 5522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 5532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t arg_pos = is_range ? vregC + arg_offset : arg[arg_offset]; 5542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (shorty[shorty_pos + 1]) { 5552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case 'L': { 5562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* o = shadow_frame.GetVRegReference(arg_pos); 5572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegReference(cur_reg, o); 5582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case 'J': case 'D': { 5612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint64_t wide_value = (static_cast<uint64_t>(shadow_frame.GetVReg(arg_pos + 1)) << 32) | 5622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(arg_pos)); 5632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegLong(cur_reg, wide_value); 5642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz cur_reg++; 5652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz arg_offset++; 5662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 5692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVReg(cur_reg, shadow_frame.GetVReg(arg_pos)); 5702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (LIKELY(Runtime::Current()->IsStarted())) { 5752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); 5762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else { 5772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, num_regs - num_ins); 5782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 5802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 581c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// We use template functions to optimize compiler inlining process. Otherwise, 582c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// some parts of the code (like a switch statement) which depend on a constant 583c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// parameter would not be inlined while it should be. These constant parameters 584c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// are now part of the template arguments. 585c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// Note these template functions are static and inlined so they should not be 586c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// part of the final object file. 587ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 588ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 589233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 5902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 591c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) 592ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 593fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 594233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 595fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline void DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 596c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) { 5972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectRead) || (find_type == StaticPrimitiveRead); 598807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t field_idx = is_static ? inst->VRegB_21c() : inst->VRegC_22c(); 5992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 600233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz find_type, Primitive::FieldSize(field_type), 601233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check); 602807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(f == NULL)) { 603807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 604807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 605807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 606807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj; 607807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (is_static) { 608807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = f->GetDeclaringClass(); 609807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 610807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 611807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 612807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerExceptionForFieldAccess(shadow_frame.GetCurrentLocationForThrow(), f, true); 613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 6142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 616807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = is_static ? inst->VRegA_21c() : inst->VRegA_22c(); 617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (field_type) { 618807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimBoolean: 619807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetBoolean(obj)); 620807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 621807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimByte: 622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetByte(obj)); 623807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 624807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimChar: 625807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetChar(obj)); 626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 627807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimShort: 628807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetShort(obj)); 629807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 630807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimInt: 631807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetInt(obj)); 632807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 633807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimLong: 634807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, f->GetLong(obj)); 635807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 636807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimNot: 637807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(vregA, f->GetObject(obj)); 638807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 639807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 640807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 641807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 6422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 6432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 644ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 645ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 6462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 6472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic void DoIGetQuick(Thread* self, ShadowFrame& shadow_frame, 6482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) 6492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 6502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 6512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 6522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic inline void DoIGetQuick(Thread* self, ShadowFrame& shadow_frame, 6532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) { 6542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 6552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(obj == NULL)) { 6562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the field index so we cannot get a more 6572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 6582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 6592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 6602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 6612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MemberOffset field_offset(inst->VRegC_22c()); 6622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const bool is_volatile = false; // iget-x-quick only on non volatile fields. 6632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const uint32_t vregA = inst->VRegA_22c(); 6642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (field_type) { 6652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimInt: 6662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetField32(field_offset, is_volatile))); 6672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimLong: 6692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVRegLong(vregA, static_cast<int64_t>(obj->GetField64(field_offset, is_volatile))); 6702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimNot: 6722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVRegReference(vregA, obj->GetFieldObject<mirror::Object*>(field_offset, is_volatile)); 6732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 6752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 6762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 6772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 6782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 6792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 6802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 681233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 682c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertzstatic void DoFieldPut(Thread* self, const ShadowFrame& shadow_frame, 683c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) 684ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 685fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 686233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 687c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertzstatic inline void DoFieldPut(Thread* self, const ShadowFrame& shadow_frame, 688c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) { 6892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectWrite) || (find_type == StaticPrimitiveWrite); 690807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t field_idx = is_static ? inst->VRegB_21c() : inst->VRegC_22c(); 6912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 692233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz find_type, Primitive::FieldSize(field_type), 693233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check); 694807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(f == NULL)) { 695807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 696807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 697807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 698807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj; 699807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (is_static) { 700807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = f->GetDeclaringClass(); 701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 702807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 703807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 704807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerExceptionForFieldAccess(shadow_frame.GetCurrentLocationForThrow(), 705807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f, false); 706807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return; 7072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 708807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 709807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = is_static ? inst->VRegA_21c() : inst->VRegA_22c(); 710807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (field_type) { 711807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimBoolean: 712807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetBoolean(obj, shadow_frame.GetVReg(vregA)); 713807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 714807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimByte: 715807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetByte(obj, shadow_frame.GetVReg(vregA)); 716807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 717807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimChar: 718807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetChar(obj, shadow_frame.GetVReg(vregA)); 719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 720807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimShort: 721807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetShort(obj, shadow_frame.GetVReg(vregA)); 722807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 723807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimInt: 724807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetInt(obj, shadow_frame.GetVReg(vregA)); 725807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 726807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimLong: 727807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetLong(obj, shadow_frame.GetVRegLong(vregA)); 728807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 729807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimNot: 730807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetObj(obj, shadow_frame.GetVRegReference(vregA)); 731807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 732807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 733807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 734807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 735807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 736807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 7372d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 7382d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 7392d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 7402d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic void DoIPutQuick(Thread* self, ShadowFrame& shadow_frame, 7412d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) 7422d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 7432d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 7442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 7452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertzstatic inline void DoIPutQuick(Thread* self, ShadowFrame& shadow_frame, 7462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) { 7472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 7482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(obj == NULL)) { 7492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the field index so we cannot get a more 7502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 7512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz return; 7532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 7542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MemberOffset field_offset(inst->VRegC_22c()); 7552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const bool is_volatile = false; // iput-x-quick only on non volatile fields. 7562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const uint32_t vregA = inst->VRegA_22c(); 7572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (field_type) { 7582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimInt: 7592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetField32(field_offset, shadow_frame.GetVReg(vregA), is_volatile); 7602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimLong: 7622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetField64(field_offset, shadow_frame.GetVRegLong(vregA), is_volatile); 7632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimNot: 7652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetFieldObject(field_offset, shadow_frame.GetVRegReference(vregA), is_volatile); 7662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 7682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 7692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 7702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 7712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 77233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic inline String* ResolveString(Thread* self, MethodHelper& mh, uint32_t string_idx) 77333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 774807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* java_lang_string_class = String::GetJavaLangString(); 775807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!java_lang_string_class->IsInitialized())) { 776807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 777807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!class_linker->EnsureInitialized(java_lang_string_class, 778807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz true, true))) { 779807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK(self->IsExceptionPending()); 780807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return NULL; 7812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 783807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return mh.ResolveString(string_idx); 7842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 7852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 7860a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertzstatic inline void DoIntDivide(ShadowFrame& shadow_frame, size_t result_reg, 7870a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int32_t dividend, int32_t divisor) 7880a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 789d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 7900a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 791d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 792d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, kMinInt); 793d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 794d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend / divisor); 795d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 796d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 797d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 7980a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertzstatic inline void DoIntRemainder(ShadowFrame& shadow_frame, size_t result_reg, 7990a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int32_t dividend, int32_t divisor) 8000a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 801d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8020a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 803d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 804d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, 0); 805d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 806d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend % divisor); 807d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 808d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 809d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8100a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertzstatic inline void DoLongDivide(ShadowFrame& shadow_frame, size_t result_reg, 8110a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int64_t dividend, int64_t divisor) 8120a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 813d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8140a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 815d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 816d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, kMinLong); 817d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 818d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend / divisor); 819d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 820d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 821d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8220a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertzstatic inline void DoLongRemainder(ShadowFrame& shadow_frame, size_t result_reg, 8230a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int64_t dividend, int64_t divisor) 8240a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 825d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8260a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 827d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 828d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, 0); 829d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 830d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend % divisor); 831d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 832d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 833d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 83424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 83524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// specialization. 83624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// Returns true on success, otherwise throws an exception and returns false. 83724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertztemplate <bool is_range, bool do_access_check> 83824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertzstatic bool DoFilledNewArray(const Instruction* inst, const ShadowFrame& shadow_frame, 83924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Thread* self, JValue* result) 84024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 84124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 84224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertztemplate <bool is_range, bool do_access_check> 84324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertzstatic inline bool DoFilledNewArray(const Instruction* inst, 84424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const ShadowFrame& shadow_frame, 84524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Thread* self, JValue* result) { 84624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(inst->Opcode() == Instruction::FILLED_NEW_ARRAY || 84724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz inst->Opcode() == Instruction::FILLED_NEW_ARRAY_RANGE); 84824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const int32_t length = is_range ? inst->VRegA_3rc() : inst->VRegA_35c(); 84924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (!is_range) { 85024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz // Checks FILLED_NEW_ARRAY's length does not exceed 5 arguments. 85124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz CHECK_LE(length, 5); 85224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 85324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(length < 0)) { 85424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz ThrowNegativeArraySizeException(length); 85524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 85624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 85724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint16_t type_idx = is_range ? inst->VRegB_3rc() : inst->VRegB_35c(); 85824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Class* arrayClass = ResolveVerifyAndClinit(type_idx, shadow_frame.GetMethod(), 85924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, false, do_access_check); 86024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(arrayClass == NULL)) { 86124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(self->IsExceptionPending()); 86224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 86324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 86424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz CHECK(arrayClass->IsArrayClass()); 86524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Class* componentClass = arrayClass->GetComponentType(); 86624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(componentClass->IsPrimitive() && !componentClass->IsPrimitiveInt())) { 86724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (componentClass->IsPrimitiveLong() || componentClass->IsPrimitiveDouble()) { 86824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz ThrowRuntimeException("Bad filled array request for type %s", 86924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz PrettyDescriptor(componentClass).c_str()); 87024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 87124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 87224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz "Ljava/lang/InternalError;", 87324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz "Found type %s; filled-new-array not implemented for anything but \'int\'", 87424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz PrettyDescriptor(componentClass).c_str()); 87524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 87624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 87724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 87824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Object* newArray = Array::Alloc(self, arrayClass, length); 87924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(newArray == NULL)) { 88024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(self->IsExceptionPending()); 88124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 88224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 88324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_range) { 88424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint32_t vregC = inst->VRegC_3rc(); 88524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const bool is_primitive_int_component = componentClass->IsPrimitiveInt(); 88624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz for (int32_t i = 0; i < length; ++i) { 88724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_primitive_int_component) { 88824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(vregC + i)); 88924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 89024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(vregC + i)); 89124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 89224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 89324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 89424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint32_t arg[5]; 89524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz inst->GetArgs(arg); 89624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const bool is_primitive_int_component = componentClass->IsPrimitiveInt(); 89724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz for (int32_t i = 0; i < length; ++i) { 89824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_primitive_int_component) { 89924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(arg[i])); 90024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 90124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(arg[i])); 90224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 90324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 90424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 90524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 90624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz result->SetL(newArray); 90724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return true; 90824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz} 90924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 9102cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertzstatic inline const Instruction* DoSparseSwitch(const Instruction* inst, 9112cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const ShadowFrame& shadow_frame) 9122cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 9132cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(inst->Opcode() == Instruction::SPARSE_SWITCH); 9142cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const uint16_t* switch_data = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 9152cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int32_t test_val = shadow_frame.GetVReg(inst->VRegA_31t()); 9162cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kSparseSwitchSignature)); 9172cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz uint16_t size = switch_data[1]; 9182cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK_GT(size, 0); 9192cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 9202cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(IsAligned<4>(keys)); 9212cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const int32_t* entries = keys + size; 9222cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(IsAligned<4>(entries)); 9232cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int lo = 0; 9242cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int hi = size - 1; 9252cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz while (lo <= hi) { 9262cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int mid = (lo + hi) / 2; 9272cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int32_t foundVal = keys[mid]; 9282cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz if (test_val < foundVal) { 9292cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz hi = mid - 1; 9302cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } else if (test_val > foundVal) { 9312cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz lo = mid + 1; 9322cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } else { 9332cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz return inst->RelativeAt(entries[mid]); 9342cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } 9352cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } 9362cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz return inst->Next_3xx(); 9372cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz} 9382cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz 939fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline const Instruction* FindNextInstructionFollowingException(Thread* self, 940fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, 941fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers uint32_t dex_pc, 942fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers const uint16_t* insns, 943fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers SirtRef<Object>& this_object_ref, 944fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers instrumentation::Instrumentation* instrumentation) 945fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ALWAYS_INLINE; 946fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 947fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline const Instruction* FindNextInstructionFollowingException(Thread* self, 948fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, 949fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers uint32_t dex_pc, 950fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers const uint16_t* insns, 951fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers SirtRef<Object>& this_object_ref, 95233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers instrumentation::Instrumentation* instrumentation) 95333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 9549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao self->VerifyStack(); 9559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ThrowLocation throw_location; 9569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao mirror::Throwable* exception = self->GetException(&throw_location); 9579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao uint32_t found_dex_pc = shadow_frame.GetMethod()->FindCatchBlock(exception->GetClass(), dex_pc); 9589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (found_dex_pc == DexFile::kDexNoIndex) { 9599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao instrumentation->MethodUnwindEvent(self, this_object_ref.get(), 9609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.GetMethod(), dex_pc); 9619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return NULL; 9629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 9639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao instrumentation->ExceptionCaughtEvent(self, throw_location, 9649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.GetMethod(), 9659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao found_dex_pc, exception); 9669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return Instruction::At(insns + found_dex_pc); 9679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao} 9699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 9709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao#define HANDLE_PENDING_EXCEPTION() \ 9719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CHECK(self->IsExceptionPending()); \ 972d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers inst = FindNextInstructionFollowingException(self, shadow_frame, inst->GetDexPc(insns), insns, \ 9739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao this_object_ref, instrumentation); \ 9749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (inst == NULL) { \ 9759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return JValue(); /* Handled in caller. */ \ 9769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 9789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao#define POSSIBLY_HANDLE_PENDING_EXCEPTION(next_function) \ 9799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (UNLIKELY(self->IsExceptionPending())) { \ 980d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers inst = FindNextInstructionFollowingException(self, shadow_frame, inst->GetDexPc(insns), insns, \ 9819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao this_object_ref, instrumentation); \ 9829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (inst == NULL) { \ 9839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return JValue(); /* Handled in caller. */ \ 9849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } \ 9859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { \ 986df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom inst = inst->next_function(); \ 9879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 989fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic void UnexpectedOpcode(const Instruction* inst, MethodHelper& mh) 990df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom __attribute__((cold, noreturn, noinline)); 991fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 99233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic void UnexpectedOpcode(const Instruction* inst, MethodHelper& mh) 99333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 994fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers LOG(FATAL) << "Unexpected instruction: " << inst->DumpString(&mh.GetDexFile()); 995fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers exit(0); // Unreachable, keep GCC happy. 996fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers} 997fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 998d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers// Code to run before each dex instruction. 999d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers#define PREAMBLE() 1000d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers 1001233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 1002233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz// specialization. 1003233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<bool do_access_check> 1004233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue ExecuteImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 1005306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers ShadowFrame& shadow_frame, JValue result_register) 1006df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom NO_THREAD_SAFETY_ANALYSIS __attribute__((hot)); 1007fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 1008233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<bool do_access_check> 1009233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue ExecuteImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 1010fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, JValue result_register) { 101162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 101262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers LOG(FATAL) << "Invalid shadow frame for interpreter use"; 101362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers return JValue(); 101462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 101562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->VerifyStack(); 101662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers instrumentation::Instrumentation* instrumentation = Runtime::Current()->GetInstrumentation(); 1017807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz const uint16_t* const insns = code_item->insns_; 1018807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 1019807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // As the 'this' object won't change during the execution of current code, we 1020807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // want to cache it in local variables. Nevertheless, in order to let the 1021807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // garbage collector access it, we store it into sirt references. 1022e701f48eb06fa59871412a11286429111270b211Jeff Hao SirtRef<Object> this_object_ref(self, shadow_frame.GetThisObject(code_item->ins_size_)); 1023807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 10242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const Instruction* inst = Instruction::At(insns + shadow_frame.GetDexPC()); 102562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (inst->GetDexPc(insns) == 0) { // We are entering the method as opposed to deoptimizing.. 102674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { 102774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodEnterEvent(self, this_object_ref.get(), 102874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), 0); 102974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 103062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 10312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers while (true) { 1032fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (UNLIKELY(self->TestAllFlags())) { 10339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CheckSuspend(self); 10349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 1035807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz const uint32_t dex_pc = inst->GetDexPc(insns); 1036373c52fd70336531010268a2de4f7d3b0f236924jeffhao shadow_frame.SetDexPC(dex_pc); 103774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (instrumentation->HasDexPcListeners()) { 103874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->DexPcMovedEvent(self, this_object_ref.get(), 103974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), dex_pc); 104074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 104164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const bool kTracing = false; 10422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (kTracing) { 104362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#define TRACE_LOG std::cerr 104462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << PrettyMethod(shadow_frame.GetMethod()) 1045807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz << StringPrintf("\n0x%x: ", dex_pc) 104662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers << inst->DumpString(&mh.GetDexFile()) << "\n"; 1047ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) { 104862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers uint32_t raw_value = shadow_frame.GetVReg(i); 104962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Object* ref_value = shadow_frame.GetVRegReference(i); 105062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << StringPrintf(" vreg%d=0x%08X", i, raw_value); 105162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (ref_value != NULL) { 105262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (ref_value->GetClass()->IsStringClass() && 105362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ref_value->AsString()->GetCharArray() != NULL) { 105462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "/java.lang.String \"" << ref_value->AsString()->ToModifiedUtf8() << "\""; 10552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 105662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "/" << PrettyTypeOf(ref_value); 10572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 106062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "\n"; 106162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#undef TRACE_LOG 10622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1063807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (inst->Opcode()) { 10642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOP: 1065d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 10669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 10672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE: 1069d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1070807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 1071807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 10729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1073807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_FROM16: 1075d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1076807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(), 1077807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 10789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1079807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_16: 1081d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1082807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1083807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 10849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 10852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE: 1087d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1088807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), 1089807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 10909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1091807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_FROM16: 1093d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1094807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(), 1095807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 10969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1097807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_16: 1099d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 1101807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 11029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT: 1105d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1106807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(), 1107807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x())); 11089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1109807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_FROM16: 1111d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1112807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(), 1113807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 11149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1115807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_16: 1117d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 1119807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 11209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT: 1123d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1124807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(), result_register.GetI()); 11259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_WIDE: 1128d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1129807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(), result_register.GetJ()); 11309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_OBJECT: 1133d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1134807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), result_register.GetL()); 11359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_EXCEPTION: { 1138d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 113962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Throwable* exception = self->GetException(NULL); 11402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->ClearException(); 1141807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), exception); 11429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_VOID: { 1146d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 114874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 114974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 115074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 115174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 115274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1155cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz case Instruction::RETURN_VOID_BARRIER: { 1156cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz PREAMBLE(); 1157cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz ANDROID_MEMBAR_STORE(); 1158cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz JValue result; 1159cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 1160cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 1161cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1162cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz result); 1163cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz } 1164cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz return result; 1165cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz } 11662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN: { 1167d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 11692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 1170807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetI(shadow_frame.GetVReg(inst->VRegA_11x())); 117174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 117274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 117374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 117474109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 117574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_WIDE: { 1179d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 1181807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x())); 118274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 118374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 118474109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 118574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 118674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 11882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_OBJECT: { 1190d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 11922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 1193807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetL(shadow_frame.GetVRegReference(inst->VRegA_11x())); 119474109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 119574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 119674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 119774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 119874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 11992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 12002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_4: { 1202d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1203807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t dst = inst->VRegA_11n(); 120413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t val = inst->VRegB_11n(); 1205807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1207807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 12102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_16: { 1213d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1214807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t dst = inst->VRegA_21s(); 121513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t val = inst->VRegB_21s(); 1216807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1218807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST: { 1224d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1225807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t dst = inst->VRegA_31i(); 1226807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t val = inst->VRegB_31i(); 1227807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1229807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_HIGH16: { 1235d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1236807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t dst = inst->VRegA_21h(); 123713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 1238807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1240807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 124564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_16: 1246d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 124713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(), inst->VRegB_21s()); 12489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 125064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_32: 1251d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 125213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(), inst->VRegB_31i()); 12539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE: 1256d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1257807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(), inst->VRegB_51l()); 12589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_51l(); 12592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE_HIGH16: 1261807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(), 1262807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 12639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 1265807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CONST_STRING: { 1266d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1267807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_21c()); 1268807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(s == NULL)) { 12699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1270807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1271df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom shadow_frame.SetVRegReference(inst->VRegA_21c(), s); 12729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1273807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1274807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 12762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_STRING_JUMBO: { 1277d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1278807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_31c()); 1279807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(s == NULL)) { 12809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1281807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1282df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom shadow_frame.SetVRegReference(inst->VRegA_31c(), s); 12839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12870a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao case Instruction::CONST_CLASS: { 1288d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1289807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 1290233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 1291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(c == NULL)) { 12929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1293807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1294807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), c); 12959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1296807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 12972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12980a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } 129987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_ENTER: { 1300d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1301807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 130287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 130362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 1304e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 130587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 130687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorEnter(self, obj); 1307e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 130887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 131087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 131187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_EXIT: { 1312d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1313807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 131487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 131562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 1316e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 131787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 131887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorExit(self, obj); 1319e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 132087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 132287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CHECK_CAST: { 1324d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1325807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 1326233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 132787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 13289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 132987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 1330807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c()); 133187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 133262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowClassCastException(c, obj->GetClass()); 13339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 13349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 13359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 133687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INSTANCE_OF: { 1341d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1342807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(), 1343233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 134487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 13459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 134687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 1347807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 1348807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22c(), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 13499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 135087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ARRAY_LENGTH: { 1354d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1355807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x()); 13562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(array == NULL)) { 135762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 13589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 135913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz } else { 136013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), array->AsArray()->GetLength()); 136113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz inst = inst->Next_1xx(); 13622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_INSTANCE: { 1366d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1367807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = AllocObjectFromCode(inst->VRegB_21c(), shadow_frame.GetMethod(), 1368233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 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_21c(), obj); 13739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1374807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 13752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_ARRAY: { 1378d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1379807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c()); 1380807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = AllocArrayFromCode(inst->VRegC_22c(), shadow_frame.GetMethod(), 1381233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz length, self, do_access_check); 1382807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 13839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1384807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1385807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22c(), obj); 13869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1387807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 13882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1390807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 1391d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 139224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz bool success = DoFilledNewArray<false, do_access_check>(inst, shadow_frame, 139324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, &result_register); 139424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (LIKELY(success)) { 13959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 139624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 139724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 139864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 140064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 1401807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 1402d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 140324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz bool success = DoFilledNewArray<true, do_access_check>(inst, shadow_frame, 140424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, &result_register); 140524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (LIKELY(success)) { 14069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 140724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 140824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 14092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 14102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1412807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 1413d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1414807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t()); 1415807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 1416807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA"); 14179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1418807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 14192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1420807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Array* array = obj->AsArray(); 1421807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 142213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 1423807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz const Instruction::ArrayDataPayload* payload = 142413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 1425807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 1426807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 1427807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz "Ljava/lang/ArrayIndexOutOfBoundsException;", 1428807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz "failed FILL_ARRAY_DATA; length=%d, index=%d", 1429807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz array->GetLength(), payload->element_count); 14309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1431807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1432807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1433807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t size_in_bytes = payload->element_count * payload->element_width; 1434807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes); 14359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 14362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 14382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::THROW: { 1439d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1440807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x()); 1441807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(exception == NULL)) { 144262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerException(NULL, "throw with null exception"); 144362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } else { 144462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetException(shadow_frame.GetCurrentLocationForThrow(), exception->AsThrowable()); 144562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 14469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 14472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1449807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::GOTO: { 1450d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 145192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_10t()); 1452807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1453807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1454807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::GOTO_16: { 1455d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 145692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_20t()); 1457807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1458807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 14592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO_32: { 1460d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 146192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_30t()); 14622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1464556d637764b71563030c479bc35364a75188d559Ian Rogers case Instruction::PACKED_SWITCH: { 1465d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 146692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz const uint16_t* switch_data = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 1467807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t test_val = shadow_frame.GetVReg(inst->VRegA_31t()); 1468d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kPackedSwitchSignature)); 1469556d637764b71563030c479bc35364a75188d559Ian Rogers uint16_t size = switch_data[1]; 1470d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK_GT(size, 0); 1471556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 1472443dcc328e9de0b919f823aa14f28f3e2f7d84a2Sebastien Hertz DCHECK(IsAligned<4>(keys)); 1473556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t first_key = keys[0]; 1474556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* targets = reinterpret_cast<const int32_t*>(&switch_data[4]); 1475d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK(IsAligned<4>(targets)); 1476556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t index = test_val - first_key; 1477556d637764b71563030c479bc35364a75188d559Ian Rogers if (index >= 0 && index < size) { 147892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(targets[index]); 14799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 14809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 1481556d637764b71563030c479bc35364a75188d559Ian Rogers } 14822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 1483556d637764b71563030c479bc35364a75188d559Ian Rogers } 14842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPARSE_SWITCH: { 1485d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 14862cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz inst = DoSparseSwitch(inst, shadow_frame); 14872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1489807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPL_FLOAT: { 1490d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1491807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 1492807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 1493807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1494fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 > val2) { 1495807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1496fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1497fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1498807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1499807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 15002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1501807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1503807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1504807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1505807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPG_FLOAT: { 1506d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1507807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 1508807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 1509807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1510fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 < val2) { 1511807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1512fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1513fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1514807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1515807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 15162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1517807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15189cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1519807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1520807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1521807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPL_DOUBLE: { 1522d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1523807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 1524807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 1525807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1526fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 > val2) { 1527807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1528fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1529fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1530807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1531807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1532807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1533807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1535807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1536807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1537807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 1538807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPG_DOUBLE: { 1539d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1540807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 1541807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 1542807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1543fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 < val2) { 1544807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1545fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1546fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1547807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1548807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1549807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1550807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1552807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1553807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1554807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMP_LONG: { 1555d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1556807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 1557807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 1558807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1559807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (val1 > val2) { 1560807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1561807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else if (val1 == val2) { 1562807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 0; 1563807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1564807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1565807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1566807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQ: { 1571d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1572807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) == shadow_frame.GetVReg(inst->VRegB_22t())) { 157392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NE: { 1580d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1581807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) != shadow_frame.GetVReg(inst->VRegB_22t())) { 158292c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LT: { 1589d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1590807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) < shadow_frame.GetVReg(inst->VRegB_22t())) { 159192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GE: { 1598d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1599807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) >= shadow_frame.GetVReg(inst->VRegB_22t())) { 160092c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GT: { 1607d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1608807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) > shadow_frame.GetVReg(inst->VRegB_22t())) { 160992c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LE: { 1616d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) <= shadow_frame.GetVReg(inst->VRegB_22t())) { 161892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQZ: { 1625d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) == 0) { 162792c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NEZ: { 1634d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1635807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) != 0) { 163692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LTZ: { 1643d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1644807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) < 0) { 164592c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GEZ: { 1652d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1653807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) >= 0) { 165492c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GTZ: { 1661d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1662807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) > 0) { 166392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LEZ: { 1670d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1671807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) <= 0) { 167292c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BOOLEAN: { 1679d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1680807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 16812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 168262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 16839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 16842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1686807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 16879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao BooleanArray* array = a->AsBooleanArray(); 16889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 16899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 16909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 16939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 16942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BYTE: { 1697d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1698807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 16992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 170062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1704807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ByteArray* array = a->AsByteArray(); 17069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_CHAR: { 1715d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1716807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 171862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1722807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CharArray* array = a->AsCharArray(); 17249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_SHORT: { 1733d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1734807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 173662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1740807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ShortArray* array = a->AsShortArray(); 17429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17449cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET: { 1751d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1752807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 175462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1758807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao IntArray* array = a->AsIntArray(); 17609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_WIDE: { 1769d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1770807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 177262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1776807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao LongArray* array = a->AsLongArray(); 17789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVRegLong(inst->VRegA_23x(), array->GetData()[index]); 17809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_OBJECT: { 1787d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1788807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 179062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1794807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ObjectArray<Object>* array = a->AsObjectArray<Object>(); 17969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVRegReference(inst->VRegA_23x(), array->GetWithoutChecks(index)); 17989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BOOLEAN: { 1805d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1806807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 180862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1812807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1813807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao BooleanArray* array = a->AsBooleanArray(); 18159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18189cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BYTE: { 1824d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1825807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 182762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1831807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1832807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ByteArray* array = a->AsByteArray(); 18349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18399cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_CHAR: { 1843d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1844807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 184662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1850807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1851807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CharArray* array = a->AsCharArray(); 18539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_SHORT: { 1862d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1863807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 186562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1869807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1870807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ShortArray* array = a->AsShortArray(); 18729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT: { 1881d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1882807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 188462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1888807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1889807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao IntArray* array = a->AsIntArray(); 18919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_WIDE: { 1900d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1901807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 19022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 190362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 19049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1907807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x()); 1908807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao LongArray* array = a->AsLongArray(); 19109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 19119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 19129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 19139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 19149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 19162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_OBJECT: { 1919d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1920807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 19212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 192262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 19239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1926807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19276bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x()); 19286bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 19296bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz if (LIKELY(array->IsValidIndex(index) && array->CheckAssignable(val))) { 19306bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz array->SetWithoutChecks(index, val); 19316bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz inst = inst->Next_2xx(); 19326bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz } else { 19336bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 19346bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz } 19352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_BOOLEAN: 1938d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1939233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 19409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_BYTE: 1943d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1944233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 19459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_CHAR: 1948d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1949233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 19509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_SHORT: 1953d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1954233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 19559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET: 1958d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1959233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 19609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_WIDE: 1963d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1964233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 19659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IGET_OBJECT: 1968d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1969233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 19709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IGET_QUICK: 19732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIGetQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 19752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 19772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IGET_WIDE_QUICK: 19782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIGetQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 19802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19812d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 19822d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IGET_OBJECT_QUICK: 19832d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19842d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIGetQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 19852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19862d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 19872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_BOOLEAN: 1988d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1989233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 19909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_BYTE: 1993d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1994233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 19959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 19962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_CHAR: 1998d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1999233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_SHORT: 2003d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2004233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET: 2008d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2009233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_WIDE: 2013d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2014233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SGET_OBJECT: 2018d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2019233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_BOOLEAN: 2023d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2024233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 20259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_BYTE: 2028d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2029233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 20309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_CHAR: 2033d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2034233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_SHORT: 2038d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2039233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT: 2043d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2044233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_WIDE: 2048d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2049233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IPUT_OBJECT: 2053d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2054233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IPUT_QUICK: 20582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIPutQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 20602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IPUT_WIDE_QUICK: 20632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIPutQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 20652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: 20682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoIPutQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 20702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_BOOLEAN: 2073d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2074233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 20759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_BYTE: 2078d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2079233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 20809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_CHAR: 2083d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2084233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_SHORT: 2088d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2089233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT: 2093d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2094233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 20962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_WIDE: 2098d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2099233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 21009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 21012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPUT_OBJECT: 2103d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2104233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 21059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 21062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_VIRTUAL: 2108d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2109233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, &result_register); 21109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_VIRTUAL_RANGE: 2113d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2114233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, &result_register); 21159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_SUPER: 2118d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2119233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, &result_register); 21209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_SUPER_RANGE: 2123d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2124233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, &result_register); 21259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_DIRECT: 2128d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2129233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, &result_register); 21309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_DIRECT_RANGE: 2133d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2134233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, &result_register); 21359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_INTERFACE: 2138d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2139233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, &result_register); 21409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_INTERFACE_RANGE: 2143d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2144233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, &result_register); 21459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_STATIC: 2148d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2149233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, &result_register); 21509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INVOKE_STATIC_RANGE: 2153d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2154233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, &result_register); 21559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: 21582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 21592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoInvokeVirtualQuick<false>(self, shadow_frame, inst, &result_register); 21602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: 21632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 21642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DoInvokeVirtualQuick<true>(self, shadow_frame, inst, &result_register); 21652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_3xx); 21662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_INT: 2168d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2169807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), -shadow_frame.GetVReg(inst->VRegB_12x())); 21709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_INT: 2173d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2174807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), ~shadow_frame.GetVReg(inst->VRegB_12x())); 21759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_LONG: 2178d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2179807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), -shadow_frame.GetVRegLong(inst->VRegB_12x())); 21809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_LONG: 2183d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2184807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), ~shadow_frame.GetVRegLong(inst->VRegB_12x())); 21859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_FLOAT: 2188d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2189807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), -shadow_frame.GetVRegFloat(inst->VRegB_12x())); 21909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_DOUBLE: 2193d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2194807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), -shadow_frame.GetVRegDouble(inst->VRegB_12x())); 21959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 21962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_LONG: 2198d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2199807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_FLOAT: 2203d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2204807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_DOUBLE: 2208d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2209807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_INT: 2213d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2214807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_FLOAT: 2218d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2219807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_DOUBLE: 2223d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2224807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 222787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_INT: { 2228d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2229807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 223013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t result; 223187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 223213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 223387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxInt)) { 223413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxInt; 223587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinInt)) { 223613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinInt; 223787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 223813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 223987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 224013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 22419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 224387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 224487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_LONG: { 2245d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2246807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 224713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int64_t result; 224887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 224913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 225087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxLong)) { 225113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxLong; 225287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinLong)) { 225313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinLong; 225487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 225513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 225687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 225713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 22589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 226087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 22612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FLOAT_TO_DOUBLE: 2262d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2263807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegFloat(inst->VRegB_12x())); 22649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 226687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_INT: { 2267d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2268807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 226913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t result; 227087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 227113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 227287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxInt)) { 227313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxInt; 227487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinInt)) { 227513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinInt; 227687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 227713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 227887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 227913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 22809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 228287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 228387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_LONG: { 2284d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 228613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int64_t result; 228787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 228813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 228987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxLong)) { 229013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxLong; 229187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinLong)) { 229213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinLong; 229387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 229413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 229587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 229613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 22979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 229987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 23002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DOUBLE_TO_FLOAT: 2301d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2302807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegDouble(inst->VRegB_12x())); 23039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_BYTE: 2306d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2307807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2308807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_CHAR: 2312d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2313807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2314807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_SHORT: 2318d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2319807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2320807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT: 2324d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2325807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2326807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) + 2327807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_INT: 2331d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2332807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2333807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) - 2334807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT: 2338d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2339807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2340807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) * 2341807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT: 2345d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 23460a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntDivide(shadow_frame, inst->VRegA_23x(), 2347807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 2348807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 2350807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2351807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_INT: 2352d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 23530a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntRemainder(shadow_frame, inst->VRegA_23x(), 2354807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 2355807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 23572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT: 2359d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2360807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2361807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 2362807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 23639cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT: 2366d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2367807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2368807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 2369807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 23709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT: 2373d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2374807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2375807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 2376807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 23779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT: 2380d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2381807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2382807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 2383807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT: 2387d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2388807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2389807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 2390807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT: 2394d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2395807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2396807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 2397807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_LONG: 2401d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2402807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2403807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) + 2404807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_LONG: 2408d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2409807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2410807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) - 2411807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_LONG: 2415d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2416807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2417807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) * 2418807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_LONG: 2422d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24230a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(), 2424807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 2425807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 24272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_LONG: 2429d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24300a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(), 2431807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 2432807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 24342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_LONG: 2436d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2437807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2438807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 2439807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_LONG: 2443d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2444807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2445807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 2446807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_LONG: 2450d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2451807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2452807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 2453807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_LONG: 2457d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2458807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2459807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 2460807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 24619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_LONG: 2464d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2465807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2466807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 2467807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 24689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_LONG: 2471d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2472807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2473807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 2474807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 24759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_FLOAT: 2478d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2479807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2480807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 2481807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 24829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_FLOAT: 2485d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2486807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2487807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 2488807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 24899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_FLOAT: 2492d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2493807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2494807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 2495807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 24969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_FLOAT: 2499d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2500807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2501807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 2502807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_FLOAT: 2506d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2507807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2508807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 2509807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 25109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_DOUBLE: 2513d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2514807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2515807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 2516807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_DOUBLE: 2520d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2521807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2522807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 2523807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_DOUBLE: 2527d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2528807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2529807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 2530807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_DOUBLE: 2534d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2535807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2536807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 2537807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_DOUBLE: 2541d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2542807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2543807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 2544807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 25459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2546807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2547807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_INT_2ADDR: { 2548d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2549807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2550807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2551807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) + 2552807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 25539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2554807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2555807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2556807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_INT_2ADDR: { 2557d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2558807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2559807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2560807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) - 2561807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 25629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2563807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2564807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2565807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_INT_2ADDR: { 2566d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2567807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2568807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2569807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) * 2570807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 25719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2572807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2573807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 257492c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz case Instruction::DIV_INT_2ADDR: { 257592c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz PREAMBLE(); 257692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 25770a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 257892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 257992c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->Next_1xx(); 258092c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz break; 258192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz } 2582807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_INT_2ADDR: { 2583d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2584807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 25850a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 2586807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 25879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 25882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 2589807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 25902ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom case Instruction::SHL_INT_2ADDR: { 2591d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2592807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2593807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2594807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) << 2595807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 25969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2597807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2598807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2599807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHR_INT_2ADDR: { 2600d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2601807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2602807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2603807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) >> 2604807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2606807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2607807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2608807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::USHR_INT_2ADDR: { 2609d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2610807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2611807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2612807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 2613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2615807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2616807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_INT_2ADDR: { 2618d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2619807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2620807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2621807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) & 2622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2624807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2625807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_INT_2ADDR: { 2627d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2628807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2629807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2630807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) | 2631807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2633807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2634807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2635807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::XOR_INT_2ADDR: { 2636d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2637807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2638807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2639807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) ^ 2640807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2642807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2643807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2644807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 2645d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2646807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2647807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2648807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) + 2649807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2651807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2652807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2653807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 2654d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2655807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2656807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2657807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) - 2658807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2660807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2661807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2662807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 2663d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2664807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2665807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2666807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) * 2667807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2669807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2670807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2671807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 2672d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2673807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 26740a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 2675807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 2677807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2678807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2679807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_LONG_2ADDR: { 2680d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2681807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 26820a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 2683807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_1xx); 2685807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2686807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2687807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_LONG_2ADDR: { 2688d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2689807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2690807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2691807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) & 2692807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 26939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2694807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2695807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2696807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_LONG_2ADDR: { 2697d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2698807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2699807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2700807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) | 2701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2703807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2704807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2705807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 2706d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2707807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2708807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2709807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 2710807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2712807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2713807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2714807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 2715d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2716807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2717807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2718807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) << 2719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2721807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2722807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2723807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 2724d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2725807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2726807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2727807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 2728807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2730807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2731807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2732807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 2733d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2734807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2735807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2736807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 2737807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2739807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2740807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2741807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 2742d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2743807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2744807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2745807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 2746807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 27479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2748807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2749807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2750807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 2751d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2752807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2753807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2754807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 2755807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 27569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2757807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2758807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2759807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 2760d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2761807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2762807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2763807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 2764807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 27659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2766807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2767807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2768807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 2769d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2770807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2771807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2772807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 2773807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 27749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2775807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2776807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2777807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 2778d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2779807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2780807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2781807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 2782807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x()))); 27839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2784807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2785807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2786807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 2787d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2788807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2789807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2790807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 2791807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 27929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2793807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2794807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2795807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 2796d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2797807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2798807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2799807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 2800807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2802807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2803807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2804807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 2805d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2806807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2807807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2808807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 2809807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2811807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2812807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2813807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 2814d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2815807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2816807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2817807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 2818807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2820807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2821807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2822807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 2823d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2824807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = inst->VRegA_12x(); 2825807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2826807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 2827807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x()))); 28289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2829807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2830807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 28312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_LIT16: 2832d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2833807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2834807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) + 2835807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RSUB_INT: 2839d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2840807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2841807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s() - 2842807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s())); 28439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_LIT16: 2846d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2847807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2848807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) * 2849807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_INT_LIT16: 2853d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28540a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntDivide(shadow_frame, inst->VRegA_22s(), 2855807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 28569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 28572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_INT_LIT16: 2859d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28600a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntRemainder(shadow_frame, inst->VRegA_22s(), 2861807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 28629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 28632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_LIT16: 2865d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2866807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2867807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) & 2868807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_LIT16: 2872d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2873807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2874807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) | 2875807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 28772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 28782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT16: 2879d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2880807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2881807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) ^ 2882807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2884807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2885807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_INT_LIT8: 2886d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2887807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2888807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) + 2889807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 28909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2891807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2892807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::RSUB_INT_LIT8: 2893d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2894807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2895807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b() - 2896807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b())); 28979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2898807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2899807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_INT_LIT8: 2900d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2901807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2902807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) * 2903807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2905807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2906807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_INT_LIT8: 2907d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29080a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntDivide(shadow_frame, inst->VRegA_22b(), 2909807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 29109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 2911807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2912807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_INT_LIT8: 2913d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29140a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoIntRemainder(shadow_frame, inst->VRegA_22b(), 2915807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 29169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao POSSIBLY_HANDLE_PENDING_EXCEPTION(Next_2xx); 2917807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2918807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_INT_LIT8: 2919d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2920807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2921807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 2922807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2924807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2925807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_INT_LIT8: 2926d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2927807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2928807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 2929807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2931807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT8: 2933d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2934807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2935807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 2936807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT_LIT8: 2940d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2941807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2942807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 2943807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 29449cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT_LIT8: 2947d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2948807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2949807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 2950807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 29519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT_LIT8: 2954d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2955807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2956807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 2957807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 29589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 2960fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 29612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::UNUSED_EB ... Instruction::UNUSED_FF: 2962fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_79: 2963fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_7A: 2964d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers UnexpectedOpcode(inst, mh); 29652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 29662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 29672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 29682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 2969233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 2970233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) 2971233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 2972233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 2973233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic inline JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 2974233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) { 2975233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz if (shadow_frame.GetMethod()->IsPreverified()) { 2976233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // Enter the "without access check" interpreter. 2977233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz return ExecuteImpl<false>(self, mh, code_item, shadow_frame, result_register); 2978233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } else { 2979233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // Enter the "with access check" interpreter. 2980233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz return ExecuteImpl<true>(self, mh, code_item, shadow_frame, result_register); 2981233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } 2982233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz} 2983233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 29842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersvoid EnterInterpreterFromInvoke(Thread* self, AbstractMethod* method, Object* receiver, 29856474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao uint32_t* args, JValue* result) { 298664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers DCHECK_EQ(self, Thread::Current()); 2987790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 2988d752132c73072084a3def9257cca4fcee76047b6jeffhao ThrowStackOverflowError(self); 2989d752132c73072084a3def9257cca4fcee76047b6jeffhao return; 2990d752132c73072084a3def9257cca4fcee76047b6jeffhao } 2991d752132c73072084a3def9257cca4fcee76047b6jeffhao 29922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers MethodHelper mh(method); 29932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 29942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_regs; 29952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_ins; 29962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (code_item != NULL) { 29972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = code_item->registers_size_; 29982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins = code_item->ins_size_; 29990a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } else if (method->IsAbstract()) { 300056adf601ed9d1d11a2c462caa262e7de66a9e172Sebastien Hertz ThrowAbstractMethodError(method); 30010a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao return; 30022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 30032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK(method->IsNative()); 30042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 30052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 30062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs++; 30072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins++; 30082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers // Set up shadow frame with matching number of reference slots to vregs. 30112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame(); 30126613519990bdb5616f2858c146f162ef760f03d2Jeff Hao void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 30136613519990bdb5616f2858c146f162ef760f03d2Jeff Hao ShadowFrame* shadow_frame(ShadowFrame::Create(num_regs, last_shadow_frame, method, 0, memory)); 30146613519990bdb5616f2858c146f162ef760f03d2Jeff Hao self->PushShadowFrame(shadow_frame); 30152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers size_t cur_reg = num_regs - num_ins; 30162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 30172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(receiver != NULL); 3018ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, receiver); 30192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ++cur_reg; 3020807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else if (UNLIKELY(!method->GetDeclaringClass()->IsInitializing())) { 3021807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 3022807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!class_linker->EnsureInitialized(method->GetDeclaringClass(), 3023807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz true, true))) { 3024807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 3025807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz self->PopShadowFrame(); 302694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao return; 302794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao } 30282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(method->GetDeclaringClass()->IsInitializing()); 30292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 303064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const char* shorty = mh.GetShorty(); 30315d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao for (size_t shorty_pos = 0, arg_pos = 0; cur_reg < num_regs; ++shorty_pos, ++arg_pos, cur_reg++) { 30325d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 30335d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao switch (shorty[shorty_pos + 1]) { 30342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case 'L': { 30355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* o = reinterpret_cast<Object*>(args[arg_pos]); 3036ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, o); 30372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30395d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao case 'J': case 'D': { 30405d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao uint64_t wide_value = (static_cast<uint64_t>(args[arg_pos + 1]) << 32) | args[arg_pos]; 30415d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao shadow_frame->SetVRegLong(cur_reg, wide_value); 30422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers cur_reg++; 30435d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao arg_pos++; 30442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30455d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao } 30462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 30475d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao shadow_frame->SetVReg(cur_reg, args[arg_pos]); 30482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 305164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (LIKELY(!method->IsNative())) { 30526613519990bdb5616f2858c146f162ef760f03d2Jeff Hao JValue r = Execute(self, mh, code_item, *shadow_frame, JValue()); 30536474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao if (result != NULL) { 30546474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao *result = r; 30552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 305764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 305864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // generated stub) except during testing and image writing. 305964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!Runtime::Current()->IsStarted()) { 30606474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao UnstartedRuntimeJni(self, method, receiver, args, result); 30612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 30626474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao InterpreterJni(self, method, shorty, receiver, args, result); 30632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->PopShadowFrame(); 30662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 30672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 306862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogersvoid EnterInterpreterFromDeoptimize(Thread* self, ShadowFrame* shadow_frame, JValue* ret_val) 306911ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 307011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao JValue value; 307162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers value.SetJ(ret_val->GetJ()); // Set value to last known result in case the shadow frame chain is empty. 307262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers MethodHelper mh; 307311ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao while (shadow_frame != NULL) { 307462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetTopOfShadowStack(shadow_frame); 307562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers mh.ChangeMethod(shadow_frame->GetMethod()); 307662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 307711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao value = Execute(self, mh, code_item, *shadow_frame, value); 307811ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ShadowFrame* old_frame = shadow_frame; 307911ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao shadow_frame = shadow_frame->GetLink(); 308011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao delete old_frame; 308111ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao } 308211ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ret_val->SetJ(value.GetJ()); 308311ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao} 308411ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao 30857db619bb2a4e01e8532a04b613745d4926b205d7Ian RogersJValue EnterInterpreterFromStub(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 30867db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers ShadowFrame& shadow_frame) 30877db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3088f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers DCHECK_EQ(self, Thread::Current()); 3089790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3090f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers ThrowStackOverflowError(self); 3091f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers return JValue(); 3092f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers } 3093f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers 30947db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers return Execute(self, mh, code_item, shadow_frame, JValue()); 30957db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers} 30967db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 30970aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haovoid artInterpreterToInterpreterEntry(Thread* self, MethodHelper& mh, 30980aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const DexFile::CodeItem* code_item, 30990aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao ShadowFrame* shadow_frame, JValue* result) 3100167436311a08a65dea28dda079a137893821c9c7Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3101790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3102167436311a08a65dea28dda079a137893821c9c7Jeff Hao ThrowStackOverflowError(self); 31036951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3104167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3105167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3106167436311a08a65dea28dda079a137893821c9c7Jeff Hao AbstractMethod* method = shadow_frame->GetMethod(); 3107167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (method->IsStatic() && !method->GetDeclaringClass()->IsInitializing()) { 3108167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(), 3109167436311a08a65dea28dda079a137893821c9c7Jeff Hao true, true)) { 3110167436311a08a65dea28dda079a137893821c9c7Jeff Hao DCHECK(Thread::Current()->IsExceptionPending()); 31116951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3112167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3113167436311a08a65dea28dda079a137893821c9c7Jeff Hao CHECK(method->GetDeclaringClass()->IsInitializing()); 3114167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3115167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3116167436311a08a65dea28dda079a137893821c9c7Jeff Hao self->PushShadowFrame(shadow_frame); 3117167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3118167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (LIKELY(!method->IsNative())) { 31196951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao result->SetJ(Execute(self, mh, code_item, *shadow_frame, JValue()).GetJ()); 3120167436311a08a65dea28dda079a137893821c9c7Jeff Hao } else { 3121167436311a08a65dea28dda079a137893821c9c7Jeff Hao // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 3122167436311a08a65dea28dda079a137893821c9c7Jeff Hao // generated stub) except during testing and image writing. 3123167436311a08a65dea28dda079a137893821c9c7Jeff Hao CHECK(!Runtime::Current()->IsStarted()); 3124167436311a08a65dea28dda079a137893821c9c7Jeff Hao Object* receiver = method->IsStatic() ? NULL : shadow_frame->GetVRegReference(0); 3125167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint32_t* args = shadow_frame->GetVRegArgs(method->IsStatic() ? 0 : 1); 31266951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao UnstartedRuntimeJni(self, method, receiver, args, result); 3127167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3128167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3129167436311a08a65dea28dda079a137893821c9c7Jeff Hao self->PopShadowFrame(); 31306951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3131167436311a08a65dea28dda079a137893821c9c7Jeff Hao} 3132167436311a08a65dea28dda079a137893821c9c7Jeff Hao 31332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace interpreter 31342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace art 3135