interpreter.cc revision 7655f29fabc0a12765de828914a18314382e5a35
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" 277655f29fabc0a12765de828914a18314382e5a35Ian Rogers#include "entrypoints/entrypoint_utils.h" 281d54e73444e017d3a65234e0f193846f3e27472bIan Rogers#include "gc/accounting/card_table-inl.h" 292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "invoke_arg_array_builder.h" 3064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers#include "nth_caller_visitor.h" 312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class.h" 322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class-inl.h" 332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/field-inl.h" 342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method.h" 352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method-inl.h" 362dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h" 372dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h" 382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object_utils.h" 392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "ScopedLocalRef.h" 402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "scoped_thread_state_change.h" 412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "thread.h" 422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 433e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::AbstractMethod; 443e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Array; 453e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::BooleanArray; 463e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ByteArray; 473e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::CharArray; 483e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Class; 493e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ClassLoader; 503e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Field; 513e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::IntArray; 523e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::LongArray; 533e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Object; 543e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ObjectArray; 553e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::ShortArray; 563e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::String; 573e3d591f781b771de89f3b989830da2b6ac6fac8Brian Carlstromusing ::art::mirror::Throwable; 582dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers 592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace art { 60167436311a08a65dea28dda079a137893821c9c7Jeff Hao 612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace interpreter { 622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 6387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMaxInt = std::numeric_limits<int32_t>::max(); 6487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMinInt = std::numeric_limits<int32_t>::min(); 6587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMaxLong = std::numeric_limits<int64_t>::max(); 6687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMinLong = std::numeric_limits<int64_t>::min(); 6787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao 68790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Haostatic void UnstartedRuntimeInvoke(Thread* self, MethodHelper& mh, 69790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const DexFile::CodeItem* code_item, ShadowFrame* shadow_frame, 70790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao JValue* result, size_t arg_offset) 7164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 7264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // In a runtime that's not started we intercept certain methods to avoid complicated dependency 7364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // problems in core libraries. 74790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao std::string name(PrettyMethod(shadow_frame->GetMethod())); 7564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.Class java.lang.Class.forName(java.lang.String)") { 76167436311a08a65dea28dda079a137893821c9c7Jeff Hao std::string descriptor(DotToDescriptor(shadow_frame->GetVRegReference(arg_offset)->AsString()->ToModifiedUtf8().c_str())); 777934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom ClassLoader* class_loader = NULL; // shadow_frame.GetMethod()->GetDeclaringClass()->GetClassLoader(); 7864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Class* found = Runtime::Current()->GetClassLinker()->FindClass(descriptor.c_str(), 7964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers class_loader); 8064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) << "Class.forName failed in un-started runtime for class: " 8164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << PrettyDescriptor(descriptor); 8264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 8364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Class.newInstance()") { 84167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 8564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers AbstractMethod* c = klass->FindDeclaredDirectMethod("<init>", "()V"); 8664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(c != NULL); 8764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Object* obj = klass->AllocObject(self); 8864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(obj != NULL); 896474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao EnterInterpreterFromInvoke(self, c, obj, NULL, NULL); 9064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(obj); 9164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String)") { 9264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail 9364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // going the reflective Dex way. 94167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* klass = shadow_frame->GetVRegReference(arg_offset)->AsClass(); 95167436311a08a65dea28dda079a137893821c9c7Jeff Hao String* name = shadow_frame->GetVRegReference(arg_offset + 1)->AsString(); 9664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* found = NULL; 9764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers FieldHelper fh; 9864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ObjectArray<Field>* fields = klass->GetIFields(); 9964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 10064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 10164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 10264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 10364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 10464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 10664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (found == NULL) { 10764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fields = klass->GetSFields(); 10864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) { 10964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers Field* f = fields->Get(i); 11064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fh.ChangeField(f); 11164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name->Equals(fh.GetName())) { 11264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers found = f; 11364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 11664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(found != NULL) 11764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << "Failed to find field in Class.getDeclaredField in un-started runtime. name=" 11864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << name->ToModifiedUtf8() << " class=" << PrettyDescriptor(klass); 11964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: getDeclaredField calls GetType once the field is found to ensure a 12064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // NoClassDefFoundError is thrown if the field's type cannot be resolved. 12164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(found); 12264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int)") { 12364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Special case array copying without initializing System. 124167436311a08a65dea28dda079a137893821c9c7Jeff Hao Class* ctype = shadow_frame->GetVRegReference(arg_offset)->GetClass()->GetComponentType(); 125167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint srcPos = shadow_frame->GetVReg(arg_offset + 1); 126167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint dstPos = shadow_frame->GetVReg(arg_offset + 3); 127167436311a08a65dea28dda079a137893821c9c7Jeff Hao jint length = shadow_frame->GetVReg(arg_offset + 4); 12864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!ctype->IsPrimitive()) { 129167436311a08a65dea28dda079a137893821c9c7Jeff Hao ObjectArray<Object>* src = shadow_frame->GetVRegReference(arg_offset)->AsObjectArray<Object>(); 130167436311a08a65dea28dda079a137893821c9c7Jeff Hao ObjectArray<Object>* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsObjectArray<Object>(); 13164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 13264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 13364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 13464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveChar()) { 135167436311a08a65dea28dda079a137893821c9c7Jeff Hao CharArray* src = shadow_frame->GetVRegReference(arg_offset)->AsCharArray(); 136167436311a08a65dea28dda079a137893821c9c7Jeff Hao CharArray* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsCharArray(); 13764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 13864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 13964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (ctype->IsPrimitiveInt()) { 141167436311a08a65dea28dda079a137893821c9c7Jeff Hao IntArray* src = shadow_frame->GetVRegReference(arg_offset)->AsIntArray(); 142167436311a08a65dea28dda079a137893821c9c7Jeff Hao IntArray* dst = shadow_frame->GetVRegReference(arg_offset + 2)->AsIntArray(); 14364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers for (jint i = 0; i < length; ++i) { 14464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers dst->Set(dstPos + i, src->Get(srcPos + i)); 14564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 14764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers UNIMPLEMENTED(FATAL) << "System.arraycopy of unexpected type: " << PrettyDescriptor(ctype); 14864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 14964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 15064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Not special, continue with regular interpreter execution. 1510aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao artInterpreterToInterpreterEntry(self, mh, code_item, shadow_frame, result); 15264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 15364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 15464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 15564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers// Hand select a number of methods to be run in a not yet started runtime without using JNI. 15664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeJni(Thread* self, AbstractMethod* method, 1575d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* receiver, uint32_t* args, JValue* result) 15864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 15964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers std::string name(PrettyMethod(method)); 16064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (name == "java.lang.ClassLoader dalvik.system.VMStack.getCallingClassLoader()") { 16164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(NULL); 16264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Class dalvik.system.VMStack.getStackClass2()") { 1637a22fa657b972e8323692368975bc5a7be1cc0f5Ian Rogers NthCallerVisitor visitor(self, 3); 16464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers visitor.WalkStack(); 16564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(visitor.caller->GetDeclaringClass()); 16664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.log(double)") { 1675d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao JValue value; 1685d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1695d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetD(log(value.GetD())); 17064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.Class.getNameNative()") { 17164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsClass()->ComputeName()); 17264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.Float.floatToRawIntBits(float)") { 1735d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(args[0]); 17464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "float java.lang.Float.intBitsToFloat(int)") { 1755d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(args[0]); 17664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "double java.lang.Math.exp(double)") { 1775d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao JValue value; 1785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao value.SetJ((static_cast<uint64_t>(args[1]) << 32) | args[0]); 1795d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetD(exp(value.GetD())); 18064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Object.internalClone()") { 18164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->Clone(self)); 18264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void java.lang.Object.notifyAll()") { 18305f3057d6a4d23d712092ccd36a531590bff323bIan Rogers receiver->NotifyAll(self); 18464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.compareTo(java.lang.String)") { 1855d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao String* rhs = reinterpret_cast<Object*>(args[0])->AsString(); 18664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers CHECK(rhs != NULL); 18764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetI(receiver->AsString()->CompareTo(rhs)); 18864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.String java.lang.String.intern()") { 18964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(receiver->AsString()->Intern()); 19064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "int java.lang.String.fastIndexOf(int, int)") { 1915d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(receiver->AsString()->FastIndexOf(args[0], args[1])); 19264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])") { 1935d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetL(Array::CreateMultiArray(self, reinterpret_cast<Object*>(args[0])->AsClass(), reinterpret_cast<Object*>(args[1])->AsIntArray())); 19464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") { 19564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 19664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa))); 19764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") { 19864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetJ(JNI_TRUE); 19964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") { 2005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* obj = reinterpret_cast<Object*>(args[0]); 2015d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jlong offset = (static_cast<uint64_t>(args[2]) << 32) | args[1]; 2025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jint expectedValue = args[3]; 2035d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao jint newValue = args[4]; 20464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers byte* raw_addr = reinterpret_cast<byte*>(obj) + offset; 20564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr); 20664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // Note: android_atomic_release_cas() returns 0 on success, not failure. 20764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers int r = android_atomic_release_cas(expectedValue, newValue, address); 20864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(r == 0); 20964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") { 2105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* obj = reinterpret_cast<Object*>(args[0]); 2115d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* newValue = reinterpret_cast<Object*>(args[3]); 2125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao obj->SetFieldObject(MemberOffset((static_cast<uint64_t>(args[2]) << 32) | args[1]), newValue, false); 21364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 21464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Attempt to invoke native method in non-started runtime: " << name; 21564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 21664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 21764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 21864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void InterpreterJni(Thread* self, AbstractMethod* method, StringPiece shorty, 2195d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* receiver, uint32_t* args, JValue* result) 22064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 22164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // TODO: The following enters JNI code using a typedef-ed function rather than the JNI compiler, 22264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // it should be removed and JNI compiled stubs used instead. 22364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedObjectAccessUnchecked soa(self); 22464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (method->IsStatic()) { 22564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 22664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass); 227d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 22864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 22964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 230556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 231556d637764b71563030c479bc35364a75188d559Ian Rogers { 232556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 233556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get()); 234556d637764b71563030c479bc35364a75188d559Ian Rogers } 235556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 23664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "V") { 23764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass); 238d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 23964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 24064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 24164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 24264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers fn(soa.Env(), klass.get()); 24364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "Z") { 24464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass); 245d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 24664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 24764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 24864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 24964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get())); 25064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "BI") { 25164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jbyte (fnptr)(JNIEnv*, jclass, jint); 252d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 25364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 25464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 25564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2565d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetB(fn(soa.Env(), klass.get(), args[0])); 25764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "II") { 25864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint); 259d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 26064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2635d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), args[0])); 26464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 26564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jclass, jobject); 266d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 26764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 26864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 26964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 2705d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 271556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 272556d637764b71563030c479bc35364a75188d559Ian Rogers { 273556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 274556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), klass.get(), arg0.get()); 275556d637764b71563030c479bc35364a75188d559Ian Rogers } 276556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 27764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "IIZ") { 27864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jint, jboolean); 279d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 28064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2835d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), args[0], args[1])); 28464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ILI") { 28564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jclass, jobject, jint); 286d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 28764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 28864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 28964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 2905d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 29164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), klass.get(), arg0.get(), args[1])); 29364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "SIZ") { 29464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jshort (fnptr)(JNIEnv*, jclass, jint, jboolean); 295d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 29664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 29764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 29864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 2995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetS(fn(soa.Env(), klass.get(), args[0], args[1])); 30064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VIZ") { 30164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jboolean); 302d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 30364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 30464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 30564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), args[0], args[1]); 30764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZLL") { 30864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jobject, jobject); 309d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 31064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 31164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 31264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3135d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 31464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3155d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 31664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 31764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers result->SetZ(fn(soa.Env(), klass.get(), arg0.get(), arg1.get())); 31864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "ZILL") { 31964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jboolean (fnptr)(JNIEnv*, jclass, jint, jobject, jobject); 320d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 32164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 32264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 32364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3245d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 32564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 3265d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[2]))); 32764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3285d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetZ(fn(soa.Env(), klass.get(), args[0], arg1.get(), arg2.get())); 32964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VILII") { 33064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jint, jobject, jint, jint); 331d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 33264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 33364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 33464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg1(soa.Env(), 3355d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[1]))); 33664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3375d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), args[0], arg1.get(), args[2], args[3]); 33864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "VLILII") { 33964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef void (fnptr)(JNIEnv*, jclass, jobject, jint, jobject, jint, jint); 340d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 34164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jclass> klass(soa.Env(), 34264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jclass>(method->GetDeclaringClass())); 34364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3445d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 34564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg2(soa.Env(), 3465d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[2]))); 34764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3485d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao fn(soa.Env(), klass.get(), arg0.get(), args[1], arg2.get(), args[3], args[4]); 34964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 35064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with static native method: " << PrettyMethod(method) 35164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 35264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 35364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 35464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (shorty == "L") { 35564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject); 356d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 35764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 35864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 359556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 360556d637764b71563030c479bc35364a75188d559Ian Rogers { 361556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 362556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get()); 363556d637764b71563030c479bc35364a75188d559Ian Rogers } 364556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 3653dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao } else if (shorty == "V") { 3663dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao typedef void (fnptr)(JNIEnv*, jobject); 3673dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 3683dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao ScopedLocalRef<jobject> rcvr(soa.Env(), 3693dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao soa.AddLocalReference<jobject>(receiver)); 3703dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao ScopedThreadStateChange tsc(self, kNative); 3713dd9f76ff8fa99be9ff6b18354528c5def7b26f7Jeff Hao fn(soa.Env(), rcvr.get()); 37264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "LL") { 37364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jobject (fnptr)(JNIEnv*, jobject, jobject); 374d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 37564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 37664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 37764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> arg0(soa.Env(), 3785d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao soa.AddLocalReference<jobject>(reinterpret_cast<Object*>(args[0]))); 379556d637764b71563030c479bc35364a75188d559Ian Rogers jobject jresult; 380556d637764b71563030c479bc35364a75188d559Ian Rogers { 381556d637764b71563030c479bc35364a75188d559Ian Rogers ScopedThreadStateChange tsc(self, kNative); 382556d637764b71563030c479bc35364a75188d559Ian Rogers jresult = fn(soa.Env(), rcvr.get(), arg0.get()); 383556d637764b71563030c479bc35364a75188d559Ian Rogers } 384556d637764b71563030c479bc35364a75188d559Ian Rogers result->SetL(soa.Decode<Object*>(jresult)); 38564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 38664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else if (shorty == "III") { 38764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers typedef jint (fnptr)(JNIEnv*, jobject, jint, jint); 388d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers const fnptr* fn = reinterpret_cast<const fnptr*>(method->GetNativeMethod()); 38964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedLocalRef<jobject> rcvr(soa.Env(), 39064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers soa.AddLocalReference<jobject>(receiver)); 39164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers ScopedThreadStateChange tsc(self, kNative); 3925d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao result->SetI(fn(soa.Env(), rcvr.get(), args[0], args[1])); 39364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } else { 39464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers LOG(FATAL) << "Do something with native method: " << PrettyMethod(method) 39564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers << " shorty: " << shorty; 39664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 39764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 39864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers} 39964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers 4002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorEnter(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 4012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorEnter(self); 4022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorExit(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS { 4052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ref->MonitorExit(self); 4062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 408ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 409ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 410233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<InvokeType type, bool is_range, bool do_access_check> 4111521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoInvoke(Thread* self, ShadowFrame& shadow_frame, 412ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers const Instruction* inst, JValue* result) NO_THREAD_SAFETY_ANALYSIS; 413ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers 414233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<InvokeType type, bool is_range, bool do_access_check> 4151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoInvoke(Thread* self, ShadowFrame& shadow_frame, 416ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers const Instruction* inst, JValue* result) { 417807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t method_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); 418790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao uint32_t vregC = (is_range) ? inst->VRegC_3rc() : inst->VRegC_35c(); 419790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao Object* receiver = (type == kStatic) ? NULL : shadow_frame.GetVRegReference(vregC); 420790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao AbstractMethod* method = FindMethodFromCode(method_idx, receiver, shadow_frame.GetMethod(), self, 421233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check, type); 422790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(method == NULL)) { 4232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(self->IsExceptionPending()); 4242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result->SetJ(0); 4251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 4261521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } else if (UNLIKELY(method->IsAbstract())) { 4271521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz ThrowAbstractMethodError(method); 4281521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz result->SetJ(0); 4291521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 4302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 431167436311a08a65dea28dda079a137893821c9c7Jeff Hao 432790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao MethodHelper mh(method); 433790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const DexFile::CodeItem* code_item = mh.GetCodeItem(); 434167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint16_t num_regs; 435167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint16_t num_ins; 436790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (LIKELY(code_item != NULL)) { 437167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_regs = code_item->registers_size_; 438167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_ins = code_item->ins_size_; 4392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 440790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao DCHECK(method->IsNative() || method->IsProxyMethod()); 441790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 442790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (!method->IsStatic()) { 443167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_regs++; 444167436311a08a65dea28dda079a137893821c9c7Jeff Hao num_ins++; 445167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 4462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 447167436311a08a65dea28dda079a137893821c9c7Jeff Hao 4486613519990bdb5616f2858c146f162ef760f03d2Jeff Hao void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 449790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao ShadowFrame* new_shadow_frame(ShadowFrame::Create(num_regs, &shadow_frame, method, 0, memory)); 450167436311a08a65dea28dda079a137893821c9c7Jeff Hao size_t cur_reg = num_regs - num_ins; 451167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (receiver != NULL) { 452167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegReference(cur_reg, receiver); 453167436311a08a65dea28dda079a137893821c9c7Jeff Hao ++cur_reg; 454167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 455167436311a08a65dea28dda079a137893821c9c7Jeff Hao 456167436311a08a65dea28dda079a137893821c9c7Jeff Hao size_t arg_offset = (receiver == NULL) ? 0 : 1; 457790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao const char* shorty = mh.GetShorty(); 458807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t arg[5]; 459807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (!is_range) { 460807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->GetArgs(arg); 461807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 462167436311a08a65dea28dda079a137893821c9c7Jeff Hao for (size_t shorty_pos = 0; cur_reg < num_regs; ++shorty_pos, cur_reg++, arg_offset++) { 463790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 464807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz size_t arg_pos = is_range ? vregC + arg_offset : arg[arg_offset]; 465167436311a08a65dea28dda079a137893821c9c7Jeff Hao switch (shorty[shorty_pos + 1]) { 466167436311a08a65dea28dda079a137893821c9c7Jeff Hao case 'L': { 467167436311a08a65dea28dda079a137893821c9c7Jeff Hao Object* o = shadow_frame.GetVRegReference(arg_pos); 468167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegReference(cur_reg, o); 469167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 470167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 471167436311a08a65dea28dda079a137893821c9c7Jeff Hao case 'J': case 'D': { 472167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint64_t wide_value = (static_cast<uint64_t>(shadow_frame.GetVReg(arg_pos + 1)) << 32) | 473167436311a08a65dea28dda079a137893821c9c7Jeff Hao static_cast<uint32_t>(shadow_frame.GetVReg(arg_pos)); 474167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVRegLong(cur_reg, wide_value); 475167436311a08a65dea28dda079a137893821c9c7Jeff Hao cur_reg++; 476167436311a08a65dea28dda079a137893821c9c7Jeff Hao arg_offset++; 477167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 478167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 479167436311a08a65dea28dda079a137893821c9c7Jeff Hao default: 480167436311a08a65dea28dda079a137893821c9c7Jeff Hao new_shadow_frame->SetVReg(cur_reg, shadow_frame.GetVReg(arg_pos)); 481167436311a08a65dea28dda079a137893821c9c7Jeff Hao break; 4825d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao } 483167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 484167436311a08a65dea28dda079a137893821c9c7Jeff Hao 4856613519990bdb5616f2858c146f162ef760f03d2Jeff Hao if (LIKELY(Runtime::Current()->IsStarted())) { 486790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); 487167436311a08a65dea28dda079a137893821c9c7Jeff Hao } else { 488790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, num_regs - num_ins); 48964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 4901521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return !self->IsExceptionPending(); 4912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 4922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 4932d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 4942d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 4952d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<bool is_range> 4961521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoInvokeVirtualQuick(Thread* self, ShadowFrame& shadow_frame, 4972d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst, JValue* result) 4982d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS; 4992d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5002d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<bool is_range> 5011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoInvokeVirtualQuick(Thread* self, ShadowFrame& shadow_frame, 5022d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst, JValue* result) { 5032d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t vregC = (is_range) ? inst->VRegC_3rc() : inst->VRegC_35c(); 5042d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* receiver = shadow_frame.GetVRegReference(vregC); 5052d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(receiver == NULL)) { 5062d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the method index so we cannot get a more 5072d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 5082d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 5091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 5102d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5112d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t vtable_idx = (is_range) ? inst->VRegB_3rc() : inst->VRegB_35c(); 5121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz // TODO: use ObjectArray<T>::GetWithoutChecks ? 5132d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz AbstractMethod* method = receiver->GetClass()->GetVTable()->Get(vtable_idx); 5142d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(method == NULL)) { 5152d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz CHECK(self->IsExceptionPending()); 5162d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz result->SetJ(0); 5171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 5181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } else if (UNLIKELY(method->IsAbstract())) { 5191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz ThrowAbstractMethodError(method); 5201521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz result->SetJ(0); 5211521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 5222d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5232d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5241521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz MethodHelper mh(method); 5252d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const DexFile::CodeItem* code_item = mh.GetCodeItem(); 5262d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint16_t num_regs; 5272d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint16_t num_ins; 5282d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (code_item != NULL) { 5292d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs = code_item->registers_size_; 5302d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_ins = code_item->ins_size_; 5312d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else { 5322d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DCHECK(method->IsNative() || method->IsProxyMethod()); 5332d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 5342d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (!method->IsStatic()) { 5352d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_regs++; 5362d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz num_ins++; 5372d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5382d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5392d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5402d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 5412d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ShadowFrame* new_shadow_frame(ShadowFrame::Create(num_regs, &shadow_frame, 5422d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz method, 0, memory)); 5432d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t cur_reg = num_regs - num_ins; 5442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (receiver != NULL) { 5452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegReference(cur_reg, receiver); 5462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ++cur_reg; 5472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5482d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t arg_offset = (receiver == NULL) ? 0 : 1; 5502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const char* shorty = mh.GetShorty(); 5512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint32_t arg[5]; 5522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (!is_range) { 5532d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz inst->GetArgs(arg); 5542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz for (size_t shorty_pos = 0; cur_reg < num_regs; ++shorty_pos, cur_reg++, arg_offset++) { 5562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 5572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz size_t arg_pos = is_range ? vregC + arg_offset : arg[arg_offset]; 5582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (shorty[shorty_pos + 1]) { 5592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case 'L': { 5602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* o = shadow_frame.GetVRegReference(arg_pos); 5612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegReference(cur_reg, o); 5622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case 'J': case 'D': { 5652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz uint64_t wide_value = (static_cast<uint64_t>(shadow_frame.GetVReg(arg_pos + 1)) << 32) | 5662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(arg_pos)); 5672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVRegLong(cur_reg, wide_value); 5682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz cur_reg++; 5692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz arg_offset++; 5702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 5732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz new_shadow_frame->SetVReg(cur_reg, shadow_frame.GetVReg(arg_pos)); 5742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 5752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 5782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (LIKELY(Runtime::Current()->IsStarted())) { 5792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz (method->GetEntryPointFromInterpreter())(self, mh, code_item, new_shadow_frame, result); 5802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } else { 5812d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz UnstartedRuntimeInvoke(self, mh, code_item, new_shadow_frame, result, num_regs - num_ins); 5822d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 5831521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return !self->IsExceptionPending(); 5842d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 5852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 586c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// We use template functions to optimize compiler inlining process. Otherwise, 587c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// some parts of the code (like a switch statement) which depend on a constant 588c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// parameter would not be inlined while it should be. These constant parameters 589c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// are now part of the template arguments. 590c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// Note these template functions are static and inlined so they should not be 591c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz// part of the final object file. 592ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 593ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 594233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 5951521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 596c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) 597ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 598fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 599233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 6001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoFieldGet(Thread* self, ShadowFrame& shadow_frame, 601c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) { 6022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectRead) || (find_type == StaticPrimitiveRead); 603807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t field_idx = is_static ? inst->VRegB_21c() : inst->VRegC_22c(); 6042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 605233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz find_type, Primitive::FieldSize(field_type), 606233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check); 607807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(f == NULL)) { 608807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 6091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 610807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 611807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj; 612807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (is_static) { 613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = f->GetDeclaringClass(); 614807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 615807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 616807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerExceptionForFieldAccess(shadow_frame.GetCurrentLocationForThrow(), f, true); 6181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 6192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 6202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 621807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = is_static ? inst->VRegA_21c() : inst->VRegA_22c(); 622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (field_type) { 623807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimBoolean: 624807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetBoolean(obj)); 625807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimByte: 627807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetByte(obj)); 628807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 629807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimChar: 630807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetChar(obj)); 631807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 632807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimShort: 633807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetShort(obj)); 634807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 635807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimInt: 636807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, f->GetInt(obj)); 637807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 638807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimLong: 639807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, f->GetLong(obj)); 640807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 641807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimNot: 642807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(vregA, f->GetObject(obj)); 643807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 644807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 645807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 646807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 6471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 6482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 6492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 650ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 651ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers// specialization. 6522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 6531521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoIGetQuick(Thread* self, ShadowFrame& shadow_frame, 6542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) 6552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 6562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 6572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 6581521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoIGetQuick(Thread* self, ShadowFrame& shadow_frame, 6592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) { 6602d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 6612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(obj == NULL)) { 6622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the field index so we cannot get a more 6632d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 6642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 6651521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 6662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 6672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MemberOffset field_offset(inst->VRegC_22c()); 6687934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom const bool is_volatile = false; // iget-x-quick only on non volatile fields. 6692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const uint32_t vregA = inst->VRegA_22c(); 6702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (field_type) { 6712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimInt: 6722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVReg(vregA, static_cast<int32_t>(obj->GetField32(field_offset, is_volatile))); 6732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimLong: 6752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVRegLong(vregA, static_cast<int64_t>(obj->GetField64(field_offset, is_volatile))); 6762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimNot: 6782d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz shadow_frame.SetVRegReference(vregA, obj->GetFieldObject<mirror::Object*>(field_offset, is_volatile)); 6792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 6802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 6812d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 6822d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 6831521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 6842d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 6852d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 6862d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 6872d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 688233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 6891521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoFieldPut(Thread* self, const ShadowFrame& shadow_frame, 690c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) 691ba3ce9a51651f3f3de2ecc82673b46762b1f2d9dIan Rogers NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 692fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 693233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<FindFieldType find_type, Primitive::Type field_type, bool do_access_check> 6941521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoFieldPut(Thread* self, const ShadowFrame& shadow_frame, 695c8a3ff8b6cfa0e3d38a4cd4aff1c28d231635783Sebastien Hertz const Instruction* inst) { 6962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers bool is_static = (find_type == StaticObjectWrite) || (find_type == StaticPrimitiveWrite); 697807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t field_idx = is_static ? inst->VRegB_21c() : inst->VRegC_22c(); 6982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self, 699233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz find_type, Primitive::FieldSize(field_type), 700233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz do_access_check); 701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(f == NULL)) { 702807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 7031521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 704807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 705807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj; 706807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (is_static) { 707807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = f->GetDeclaringClass(); 708807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 709807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 710807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 711807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerExceptionForFieldAccess(shadow_frame.GetCurrentLocationForThrow(), 712807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f, false); 7131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 7142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 715807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 716807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t vregA = is_static ? inst->VRegA_21c() : inst->VRegA_22c(); 717807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (field_type) { 718807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimBoolean: 719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetBoolean(obj, shadow_frame.GetVReg(vregA)); 720807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 721807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimByte: 722807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetByte(obj, shadow_frame.GetVReg(vregA)); 723807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 724807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimChar: 725807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetChar(obj, shadow_frame.GetVReg(vregA)); 726807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 727807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimShort: 728807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetShort(obj, shadow_frame.GetVReg(vregA)); 729807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 730807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimInt: 731807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetInt(obj, shadow_frame.GetVReg(vregA)); 732807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 733807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimLong: 734807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetLong(obj, shadow_frame.GetVRegLong(vregA)); 735807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 736807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Primitive::kPrimNot: 737807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz f->SetObj(obj, shadow_frame.GetVRegReference(vregA)); 738807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 739807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz default: 740807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 741807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 7421521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 743807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz} 744807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 7452d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 7462d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz// specialization. 7472d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 7481521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic bool DoIPutQuick(Thread* self, ShadowFrame& shadow_frame, 7492d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) 7502d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 7512d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 7522d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertztemplate<Primitive::Type field_type> 7531521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoIPutQuick(Thread* self, ShadowFrame& shadow_frame, 7542d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const Instruction* inst) { 7552d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 7562d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz if (UNLIKELY(obj == NULL)) { 7572d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // We lost the reference to the field index so we cannot get a more 7582d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz // precised exception message. 7592d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 7601521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 7612d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 7622d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz MemberOffset field_offset(inst->VRegC_22c()); 7637934ac288acfb2552bb0b06ec1f61e5820d924a4Brian Carlstrom const bool is_volatile = false; // iput-x-quick only on non volatile fields. 7642d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz const uint32_t vregA = inst->VRegA_22c(); 7652d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz switch (field_type) { 7662d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimInt: 7672d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetField32(field_offset, shadow_frame.GetVReg(vregA), is_volatile); 7682d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7692d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimLong: 7702d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetField64(field_offset, shadow_frame.GetVRegLong(vregA), is_volatile); 7712d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7722d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Primitive::kPrimNot: 7732d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz obj->SetFieldObject(field_offset, shadow_frame.GetVRegReference(vregA), is_volatile); 7742d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 7752d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz default: 7762d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz LOG(FATAL) << "Unreachable: " << field_type; 7772d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz } 7781521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 7792d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz} 7802d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz 78133e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic inline String* ResolveString(Thread* self, MethodHelper& mh, uint32_t string_idx) 78233e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 783807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* java_lang_string_class = String::GetJavaLangString(); 784807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!java_lang_string_class->IsInitialized())) { 785807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 786807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!class_linker->EnsureInitialized(java_lang_string_class, 787807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz true, true))) { 788807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK(self->IsExceptionPending()); 789807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return NULL; 7902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 7912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 792807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz return mh.ResolveString(string_idx); 7932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 7942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 7951521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoIntDivide(ShadowFrame& shadow_frame, size_t result_reg, 7960a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int32_t dividend, int32_t divisor) 7970a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 798d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 7990a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 8001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 8011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 8021521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 803d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, kMinInt); 804d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 805d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend / divisor); 806d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 8071521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 808d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 809d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoIntRemainder(ShadowFrame& shadow_frame, size_t result_reg, 8110a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int32_t dividend, int32_t divisor) 8120a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 813d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8140a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 8151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 8161521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 8171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(dividend == kMinInt && divisor == -1)) { 818d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, 0); 819d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 820d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVReg(result_reg, dividend % divisor); 821d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 8221521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 823d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 824d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoLongDivide(ShadowFrame& shadow_frame, size_t result_reg, 8260a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int64_t dividend, int64_t divisor) 8270a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 828d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8290a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 8301521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 8311521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 8321521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 833d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, kMinLong); 834d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 835d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend / divisor); 836d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 8371521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 838d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 839d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 8401521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertzstatic inline bool DoLongRemainder(ShadowFrame& shadow_frame, size_t result_reg, 8410a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz int64_t dividend, int64_t divisor) 8420a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 843d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao if (UNLIKELY(divisor == 0)) { 8440a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz ThrowArithmeticExceptionDivideByZero(); 8451521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return false; 8461521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 8471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(dividend == kMinLong && divisor == -1)) { 848d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, 0); 849d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } else { 850d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao shadow_frame.SetVRegLong(result_reg, dividend % divisor); 851d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao } 8521521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz return true; 853d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao} 854d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao 85524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 85624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// specialization. 85724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz// Returns true on success, otherwise throws an exception and returns false. 85824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertztemplate <bool is_range, bool do_access_check> 85924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertzstatic bool DoFilledNewArray(const Instruction* inst, const ShadowFrame& shadow_frame, 86024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Thread* self, JValue* result) 86124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz NO_THREAD_SAFETY_ANALYSIS ALWAYS_INLINE; 86224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 86324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertztemplate <bool is_range, bool do_access_check> 86424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertzstatic inline bool DoFilledNewArray(const Instruction* inst, 86524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const ShadowFrame& shadow_frame, 86624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Thread* self, JValue* result) { 86724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(inst->Opcode() == Instruction::FILLED_NEW_ARRAY || 86824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz inst->Opcode() == Instruction::FILLED_NEW_ARRAY_RANGE); 86924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const int32_t length = is_range ? inst->VRegA_3rc() : inst->VRegA_35c(); 87024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (!is_range) { 87124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz // Checks FILLED_NEW_ARRAY's length does not exceed 5 arguments. 87224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz CHECK_LE(length, 5); 87324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 87424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(length < 0)) { 87524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz ThrowNegativeArraySizeException(length); 87624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 87724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 87824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint16_t type_idx = is_range ? inst->VRegB_3rc() : inst->VRegB_35c(); 87924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Class* arrayClass = ResolveVerifyAndClinit(type_idx, shadow_frame.GetMethod(), 88024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, false, do_access_check); 88124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(arrayClass == NULL)) { 88224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(self->IsExceptionPending()); 88324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 88424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 88524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz CHECK(arrayClass->IsArrayClass()); 88624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Class* componentClass = arrayClass->GetComponentType(); 88724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(componentClass->IsPrimitive() && !componentClass->IsPrimitiveInt())) { 88824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (componentClass->IsPrimitiveLong() || componentClass->IsPrimitiveDouble()) { 88924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz ThrowRuntimeException("Bad filled array request for type %s", 89024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz PrettyDescriptor(componentClass).c_str()); 89124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 89224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 89324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz "Ljava/lang/InternalError;", 89424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz "Found type %s; filled-new-array not implemented for anything but \'int\'", 89524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz PrettyDescriptor(componentClass).c_str()); 89624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 89724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 89824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 89924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz Object* newArray = Array::Alloc(self, arrayClass, length); 90024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (UNLIKELY(newArray == NULL)) { 90124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz DCHECK(self->IsExceptionPending()); 90224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return false; 90324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 90424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_range) { 90524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint32_t vregC = inst->VRegC_3rc(); 90624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const bool is_primitive_int_component = componentClass->IsPrimitiveInt(); 90724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz for (int32_t i = 0; i < length; ++i) { 90824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_primitive_int_component) { 90924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(vregC + i)); 91024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 91124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(vregC + i)); 91224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 91324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 91424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 91524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz uint32_t arg[5]; 91624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz inst->GetArgs(arg); 91724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz const bool is_primitive_int_component = componentClass->IsPrimitiveInt(); 91824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz for (int32_t i = 0; i < length; ++i) { 91924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz if (is_primitive_int_component) { 92024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(arg[i])); 92124bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } else { 92224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(arg[i])); 92324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 92424bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 92524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz } 92624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 92724bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz result->SetL(newArray); 92824bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz return true; 92924bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz} 93024bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz 9312cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertzstatic inline const Instruction* DoSparseSwitch(const Instruction* inst, 9322cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const ShadowFrame& shadow_frame) 9332cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 9342cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(inst->Opcode() == Instruction::SPARSE_SWITCH); 9352cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const uint16_t* switch_data = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 9362cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int32_t test_val = shadow_frame.GetVReg(inst->VRegA_31t()); 9372cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kSparseSwitchSignature)); 9382cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz uint16_t size = switch_data[1]; 9392cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK_GT(size, 0); 9402cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 9412cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(IsAligned<4>(keys)); 9422cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz const int32_t* entries = keys + size; 9432cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz DCHECK(IsAligned<4>(entries)); 9442cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int lo = 0; 9452cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int hi = size - 1; 9462cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz while (lo <= hi) { 9472cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int mid = (lo + hi) / 2; 9482cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz int32_t foundVal = keys[mid]; 9492cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz if (test_val < foundVal) { 9502cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz hi = mid - 1; 9512cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } else if (test_val > foundVal) { 9522cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz lo = mid + 1; 9532cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } else { 9542cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz return inst->RelativeAt(entries[mid]); 9552cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } 9562cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz } 9572cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz return inst->Next_3xx(); 9582cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz} 9592cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz 960fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline const Instruction* FindNextInstructionFollowingException(Thread* self, 961fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, 962fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers uint32_t dex_pc, 963fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers const uint16_t* insns, 964fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers SirtRef<Object>& this_object_ref, 965fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers instrumentation::Instrumentation* instrumentation) 966fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ALWAYS_INLINE; 967fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 968fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic inline const Instruction* FindNextInstructionFollowingException(Thread* self, 969fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, 970fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers uint32_t dex_pc, 971fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers const uint16_t* insns, 972fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers SirtRef<Object>& this_object_ref, 97333e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers instrumentation::Instrumentation* instrumentation) 97433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 9759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao self->VerifyStack(); 9769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ThrowLocation throw_location; 9779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao mirror::Throwable* exception = self->GetException(&throw_location); 978c449aa8151bf81d93d22ff24677ccf09a6da218eIan Rogers bool clear_exception; 979c449aa8151bf81d93d22ff24677ccf09a6da218eIan Rogers uint32_t found_dex_pc = shadow_frame.GetMethod()->FindCatchBlock(exception->GetClass(), dex_pc, 980c449aa8151bf81d93d22ff24677ccf09a6da218eIan Rogers &clear_exception); 9819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (found_dex_pc == DexFile::kDexNoIndex) { 9829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao instrumentation->MethodUnwindEvent(self, this_object_ref.get(), 9839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.GetMethod(), dex_pc); 9849cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return NULL; 9859cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 9869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao instrumentation->ExceptionCaughtEvent(self, throw_location, 9879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.GetMethod(), 9889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao found_dex_pc, exception); 989c449aa8151bf81d93d22ff24677ccf09a6da218eIan Rogers if (clear_exception) { 990c449aa8151bf81d93d22ff24677ccf09a6da218eIan Rogers self->ClearException(); 991c449aa8151bf81d93d22ff24677ccf09a6da218eIan Rogers } 9929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return Instruction::At(insns + found_dex_pc); 9939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 9949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao} 9959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 9969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao#define HANDLE_PENDING_EXCEPTION() \ 9979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CHECK(self->IsExceptionPending()); \ 998d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers inst = FindNextInstructionFollowingException(self, shadow_frame, inst->GetDexPc(insns), insns, \ 9999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao this_object_ref, instrumentation); \ 10009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (inst == NULL) { \ 10019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao return JValue(); /* Handled in caller. */ \ 10029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 10039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 10041521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz#define POSSIBLY_HANDLE_PENDING_EXCEPTION(is_exception_pending, next_function) \ 10051521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz if (UNLIKELY(is_exception_pending)) { \ 10061521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz HANDLE_PENDING_EXCEPTION(); \ 10079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { \ 1008df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom inst = inst->next_function(); \ 10099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 10109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao 1011fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogersstatic void UnexpectedOpcode(const Instruction* inst, MethodHelper& mh) 1012df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom __attribute__((cold, noreturn, noinline)); 1013fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 101433e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogersstatic void UnexpectedOpcode(const Instruction* inst, MethodHelper& mh) 101533e9566255c426e7a2c8fca5b8a1b6a94a5d352cIan Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 1016fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers LOG(FATAL) << "Unexpected instruction: " << inst->DumpString(&mh.GetDexFile()); 1017fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers exit(0); // Unreachable, keep GCC happy. 1018fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers} 1019fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 1020d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers// Code to run before each dex instruction. 1021d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers#define PREAMBLE() 1022d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers 1023233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz// TODO: should be SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) which is failing due to template 1024233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz// specialization. 1025233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<bool do_access_check> 1026233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue ExecuteImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 1027306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers ShadowFrame& shadow_frame, JValue result_register) 1028df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom NO_THREAD_SAFETY_ANALYSIS __attribute__((hot)); 1029fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers 1030233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertztemplate<bool do_access_check> 1031233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue ExecuteImpl(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 1032fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers ShadowFrame& shadow_frame, JValue result_register) { 103362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (UNLIKELY(!shadow_frame.HasReferenceArray())) { 103462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers LOG(FATAL) << "Invalid shadow frame for interpreter use"; 103562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers return JValue(); 103662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 103762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->VerifyStack(); 10385fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz instrumentation::Instrumentation* const instrumentation = Runtime::Current()->GetInstrumentation(); 1039807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 1040807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // As the 'this' object won't change during the execution of current code, we 1041807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // want to cache it in local variables. Nevertheless, in order to let the 1042807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz // garbage collector access it, we store it into sirt references. 1043e701f48eb06fa59871412a11286429111270b211Jeff Hao SirtRef<Object> this_object_ref(self, shadow_frame.GetThisObject(code_item->ins_size_)); 1044807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 10455fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint32_t dex_pc = shadow_frame.GetDexPC(); 10465fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz if (LIKELY(dex_pc == 0)) { // We are entering the method as opposed to deoptimizing.. 104774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodEntryListeners())) { 104874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodEnterEvent(self, this_object_ref.get(), 104974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), 0); 105074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 105162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 10525fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz const uint16_t* const insns = code_item->insns_; 10535fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz const Instruction* inst = Instruction::At(insns + dex_pc); 10542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers while (true) { 10555fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz dex_pc = inst->GetDexPc(insns); 10565fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz shadow_frame.SetDexPC(dex_pc); 1057fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (UNLIKELY(self->TestAllFlags())) { 10589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CheckSuspend(self); 10599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 10605fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz if (UNLIKELY(instrumentation->HasDexPcListeners())) { 106174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->DexPcMovedEvent(self, this_object_ref.get(), 106274109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), dex_pc); 106374109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 106464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const bool kTracing = false; 10652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (kTracing) { 106662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#define TRACE_LOG std::cerr 106762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << PrettyMethod(shadow_frame.GetMethod()) 1068807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz << StringPrintf("\n0x%x: ", dex_pc) 106962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers << inst->DumpString(&mh.GetDexFile()) << "\n"; 1070ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) { 107162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers uint32_t raw_value = shadow_frame.GetVReg(i); 107262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Object* ref_value = shadow_frame.GetVRegReference(i); 107362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << StringPrintf(" vreg%d=0x%08X", i, raw_value); 107462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (ref_value != NULL) { 107562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers if (ref_value->GetClass()->IsStringClass() && 107662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ref_value->AsString()->GetCharArray() != NULL) { 107762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "/java.lang.String \"" << ref_value->AsString()->ToModifiedUtf8() << "\""; 10782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 107962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "/" << PrettyTypeOf(ref_value); 10802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 10822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 108362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers TRACE_LOG << "\n"; 108462d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#undef TRACE_LOG 10852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1086807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz switch (inst->Opcode()) { 10872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOP: 1088d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 10899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 10902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 10912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE: 1092d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1093807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 1094807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 10959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1096807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 10972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_FROM16: 1098d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1099807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22x(), 1100807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22x())); 11019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1102807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_16: 1104d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1105807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_32x(), 1106807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_32x())); 11079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE: 1110d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1111807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), 1112807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 11139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1114807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_FROM16: 1116d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1117807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_22x(), 1118807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_22x())); 11199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1120807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_WIDE_16: 1122d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1123807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_32x(), 1124807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_32x())); 11259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT: 1128d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1129807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_12x(), 1130807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_12x())); 11319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 1132807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_FROM16: 1134d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1135807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22x(), 1136807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_22x())); 11379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1138807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 11392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_OBJECT_16: 1140d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1141807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_32x(), 1142807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegReference(inst->VRegB_32x())); 11439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 11442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT: 1146d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1147807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_11x(), result_register.GetI()); 11489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_WIDE: 1151d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1152807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_11x(), result_register.GetJ()); 11539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_RESULT_OBJECT: 1156d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1157807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), result_register.GetL()); 11589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MOVE_EXCEPTION: { 1161d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 116262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers Throwable* exception = self->GetException(NULL); 11632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->ClearException(); 1164807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_11x(), exception); 11659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 11662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 11672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 11682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_VOID: { 1169d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 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 } 1178cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz case Instruction::RETURN_VOID_BARRIER: { 1179cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz PREAMBLE(); 1180cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz ANDROID_MEMBAR_STORE(); 1181cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz JValue result; 1182cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 1183cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 1184cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 1185cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz result); 1186cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz } 1187cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz return result; 1188cc10e0eca724a005faa2d0d5a9445df7fe6ef1c6Sebastien Hertz } 11892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN: { 1190d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 11912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 11922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 1193807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetI(shadow_frame.GetVReg(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::RETURN_WIDE: { 1202d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 1204807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetJ(shadow_frame.GetVRegLong(inst->VRegA_11x())); 120574109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 120674109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 120774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 120874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 120974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 12102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 12112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RETURN_OBJECT: { 1213d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers JValue result; 12152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers result.SetJ(0); 1216807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result.SetL(shadow_frame.GetVRegReference(inst->VRegA_11x())); 121774109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz if (UNLIKELY(instrumentation->HasMethodExitListeners())) { 121874109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz instrumentation->MethodExitEvent(self, this_object_ref.get(), 121974109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz shadow_frame.GetMethod(), inst->GetDexPc(insns), 122074109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz result); 122174109f6683096de494b1457fa6d5b0ac33b4c98cSebastien Hertz } 12222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers return result; 12232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_4: { 1225d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12265fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t dst = inst->VRegA_11n(); 12275fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz int4_t val = inst->VRegB_11n(); 1228807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1230807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 12332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_16: { 1236d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12375fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_21s(); 12385fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz int16_t val = inst->VRegB_21s(); 1239807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1241807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST: { 1247d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12485fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_31i(); 1249807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t val = inst->VRegB_31i(); 1250807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1252807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_HIGH16: { 1258d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 12595fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint8_t dst = inst->VRegA_21h(); 126013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t val = static_cast<int32_t>(inst->VRegB_21h() << 16); 1261807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(dst, val); 12622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (val == 0) { 1263807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(dst, NULL); 12642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 12659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 126864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_16: 1269d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 127013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21s(), inst->VRegB_21s()); 12719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 127364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers case Instruction::CONST_WIDE_32: 1274d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 127513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_31i(), inst->VRegB_31i()); 12769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 12772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE: 1279d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_51l(), inst->VRegB_51l()); 12819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_51l(); 12822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 12832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_WIDE_HIGH16: 1284807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_21h(), 1285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(inst->VRegB_21h()) << 48); 12869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 12872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 1288807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CONST_STRING: { 1289d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1290807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_21c()); 1291807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(s == NULL)) { 12929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1293807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1294df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom shadow_frame.SetVRegReference(inst->VRegA_21c(), s); 12959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1296807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1297807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1298807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 12992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CONST_STRING_JUMBO: { 1300d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1301807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz String* s = ResolveString(self, mh, inst->VRegB_31c()); 1302807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(s == NULL)) { 13039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1304807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1305df62950e7a32031b82360c407d46a37b94188fbbBrian Carlstrom shadow_frame.SetVRegReference(inst->VRegA_31c(), s); 13069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 13072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13100a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao case Instruction::CONST_CLASS: { 1311d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1312807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 1313233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 1314807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(c == NULL)) { 13159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1316807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1317807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), c); 13189cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1319807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 13202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13210a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } 132287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_ENTER: { 1323d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1324807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 132587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 132662d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 1327e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 132887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 132987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorEnter(self, obj); 13301521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 133187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 133387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 133487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::MONITOR_EXIT: { 1335d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1336807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_11x()); 133787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj == NULL)) { 133862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 1339e15e7faff3deb937c8617428e70ffb6b79ad77e0Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 134087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 134187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao DoMonitorExit(self, obj); 13421521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 134387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 134587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::CHECK_CAST: { 1347d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1348807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegB_21c(), shadow_frame.GetMethod(), 1349233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 135087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 13519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 135287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 1353807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_21c()); 135487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) { 135562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowClassCastException(c, obj->GetClass()); 13569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 13579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 13589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 135987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INSTANCE_OF: { 1364d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1365807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Class* c = ResolveVerifyAndClinit(inst->VRegC_22c(), shadow_frame.GetMethod(), 1366233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, false, do_access_check); 136787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (UNLIKELY(c == NULL)) { 13689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 136987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 1370807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegB_22c()); 1371807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22c(), (obj != NULL && obj->InstanceOf(c)) ? 1 : 0); 13729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 137387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 13742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ARRAY_LENGTH: { 1377d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1378807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* array = shadow_frame.GetVRegReference(inst->VRegB_12x()); 13792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(array == NULL)) { 138062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 13819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 138213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz } else { 138313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), array->AsArray()->GetLength()); 138413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz inst = inst->Next_1xx(); 13852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 13882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_INSTANCE: { 1389d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1390807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = AllocObjectFromCode(inst->VRegB_21c(), shadow_frame.GetMethod(), 1391233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz self, do_access_check); 1392807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 13939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1394807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1395807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_21c(), obj); 13969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1397807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 13982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 13992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 14002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEW_ARRAY: { 1401d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1402807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t length = shadow_frame.GetVReg(inst->VRegB_22c()); 1403807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = AllocArrayFromCode(inst->VRegC_22c(), shadow_frame.GetMethod(), 1404233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz length, self, do_access_check); 1405807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 14069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1407807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1408807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegReference(inst->VRegA_22c(), obj); 14099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1410807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 14112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1413807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILLED_NEW_ARRAY: { 1414d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 141524bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz bool success = DoFilledNewArray<false, do_access_check>(inst, shadow_frame, 141624bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, &result_register); 14171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 141964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers } 1420807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILLED_NEW_ARRAY_RANGE: { 1421d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 142224bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz bool success = DoFilledNewArray<true, do_access_check>(inst, shadow_frame, 142324bbb10403cb7659ff39d7682a94fdc86c19d1f9Sebastien Hertz self, &result_register); 14241521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 14252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1427807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::FILL_ARRAY_DATA: { 1428d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1429807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* obj = shadow_frame.GetVRegReference(inst->VRegA_31t()); 1430807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(obj == NULL)) { 1431807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ThrowNullPointerException(NULL, "null array in FILL_ARRAY_DATA"); 14329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1433807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 14342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1435807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Array* array = obj->AsArray(); 1436807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz DCHECK(array->IsArrayInstance() && !array->IsObjectArray()); 143713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz const uint16_t* payload_addr = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 1438807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz const Instruction::ArrayDataPayload* payload = 143913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz reinterpret_cast<const Instruction::ArrayDataPayload*>(payload_addr); 1440807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) { 1441807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz self->ThrowNewExceptionF(shadow_frame.GetCurrentLocationForThrow(), 1442807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz "Ljava/lang/ArrayIndexOutOfBoundsException;", 1443807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz "failed FILL_ARRAY_DATA; length=%d, index=%d", 1444807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz array->GetLength(), payload->element_count); 14459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 1446807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1447807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1448807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint32_t size_in_bytes = payload->element_count * payload->element_width; 1449807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes); 14509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 14512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 14532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::THROW: { 1454d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1455807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* exception = shadow_frame.GetVRegReference(inst->VRegA_11x()); 1456807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(exception == NULL)) { 145762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerException(NULL, "throw with null exception"); 145862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } else { 145962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetException(shadow_frame.GetCurrentLocationForThrow(), exception->AsThrowable()); 146062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers } 14619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 14622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1464807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::GOTO: { 1465d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 146692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_10t()); 1467807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1468807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1469807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::GOTO_16: { 1470d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 147192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_20t()); 1472807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1473807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 14742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::GOTO_32: { 1475d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 147692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegA_30t()); 14772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 14782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1479556d637764b71563030c479bc35364a75188d559Ian Rogers case Instruction::PACKED_SWITCH: { 1480d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 148192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz const uint16_t* switch_data = reinterpret_cast<const uint16_t*>(inst) + inst->VRegB_31t(); 1482807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t test_val = shadow_frame.GetVReg(inst->VRegA_31t()); 1483d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kPackedSwitchSignature)); 1484556d637764b71563030c479bc35364a75188d559Ian Rogers uint16_t size = switch_data[1]; 1485d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK_GT(size, 0); 1486556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]); 1487443dcc328e9de0b919f823aa14f28f3e2f7d84a2Sebastien Hertz DCHECK(IsAligned<4>(keys)); 1488556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t first_key = keys[0]; 1489556d637764b71563030c479bc35364a75188d559Ian Rogers const int32_t* targets = reinterpret_cast<const int32_t*>(&switch_data[4]); 1490d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers DCHECK(IsAligned<4>(targets)); 1491556d637764b71563030c479bc35364a75188d559Ian Rogers int32_t index = test_val - first_key; 1492556d637764b71563030c479bc35364a75188d559Ian Rogers if (index >= 0 && index < size) { 149392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(targets[index]); 14949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 14959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_3xx(); 1496556d637764b71563030c479bc35364a75188d559Ian Rogers } 14972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 1498556d637764b71563030c479bc35364a75188d559Ian Rogers } 14992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SPARSE_SWITCH: { 1500d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 15012cb33b8f7377f532cebed755be89bb351c150a22Sebastien Hertz inst = DoSparseSwitch(inst, shadow_frame); 15022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1504807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPL_FLOAT: { 1505d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1506807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 1507807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 1508807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1509fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 > val2) { 1510807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1511fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1512fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1513807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1514807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 15152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1516807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1518807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1519807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1520807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPG_FLOAT: { 1521d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1522807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val1 = shadow_frame.GetVRegFloat(inst->VRegB_23x()); 1523807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val2 = shadow_frame.GetVRegFloat(inst->VRegC_23x()); 1524807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1525fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 < val2) { 1526807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1527fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1528fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1529807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1530807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 15312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1532807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1534807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1535807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1536807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPL_DOUBLE: { 1537d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1538807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 1539807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 1540807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1541fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 > val2) { 1542807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1543fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1544fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1545807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1546807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1547807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1548807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1550807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1551807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1552807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz 1553807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMPG_DOUBLE: { 1554d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1555807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val1 = shadow_frame.GetVRegDouble(inst->VRegB_23x()); 1556807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val2 = shadow_frame.GetVRegDouble(inst->VRegC_23x()); 1557807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1558fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers if (val1 < val2) { 1559807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1560fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers } else if (val1 == val2) { 1561fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers result = 0; 1562807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1563807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1564807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1565807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 1567807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 1568807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1569807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::CMP_LONG: { 1570d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1571807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val1 = shadow_frame.GetVRegLong(inst->VRegB_23x()); 1572807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val2 = shadow_frame.GetVRegLong(inst->VRegC_23x()); 1573807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t result; 1574807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (val1 > val2) { 1575807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 1; 1576807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else if (val1 == val2) { 1577807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = 0; 1578807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else { 1579807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz result = -1; 1580807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 1581807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), result); 15829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQ: { 1586d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1587807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) == shadow_frame.GetVReg(inst->VRegB_22t())) { 158892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 15912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 15932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 15942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NE: { 1595d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1596807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) != shadow_frame.GetVReg(inst->VRegB_22t())) { 159792c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 15989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 15999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LT: { 1604d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1605807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) < shadow_frame.GetVReg(inst->VRegB_22t())) { 160692c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GE: { 1613d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1614807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) >= shadow_frame.GetVReg(inst->VRegB_22t())) { 161592c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GT: { 1622d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1623807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) > shadow_frame.GetVReg(inst->VRegB_22t())) { 162492c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LE: { 1631d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1632807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_22t()) <= shadow_frame.GetVReg(inst->VRegB_22t())) { 163392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegC_22t()); 16349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_EQZ: { 1640d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1641807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) == 0) { 164292c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16449cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_NEZ: { 1649d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1650807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) != 0) { 165192c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LTZ: { 1658d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1659807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) < 0) { 166092c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GEZ: { 1667d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1668807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) >= 0) { 166992c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_GTZ: { 1676d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1677807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) > 0) { 167892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::IF_LEZ: { 1685d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1686807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (shadow_frame.GetVReg(inst->VRegA_21t()) <= 0) { 168792c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz inst = inst->RelativeAt(inst->VRegB_21t()); 16889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 16899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 16902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 16922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 16932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BOOLEAN: { 1694d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1695807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 16962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 169762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 16989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 16992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao BooleanArray* array = a->AsBooleanArray(); 17039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_BYTE: { 1712d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1713807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 171562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17209cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ByteArray* array = a->AsByteArray(); 17219cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17239cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_CHAR: { 1730d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1731807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 173362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1737807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CharArray* array = a->AsCharArray(); 17399cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17429cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17449cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_SHORT: { 1748d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1749807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 175162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1755807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ShortArray* array = a->AsShortArray(); 17579cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17609cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET: { 1766d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1767807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 176962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1773807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao IntArray* array = a->AsIntArray(); 17759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVReg(inst->VRegA_23x(), array->GetData()[index]); 17779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17789cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17799cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 17832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_WIDE: { 1784d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1785807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 17862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 178762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 17889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 17902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1791807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 17929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao LongArray* array = a->AsLongArray(); 17939cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 17949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVRegLong(inst->VRegA_23x(), array->GetData()[index]); 17959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 17969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 17979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 17989cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 17992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AGET_OBJECT: { 1802d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1803807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 180562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1809807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ObjectArray<Object>* array = a->AsObjectArray<Object>(); 18119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18129cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao shadow_frame.SetVRegReference(inst->VRegA_23x(), array->GetWithoutChecks(index)); 18139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18149cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18159cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BOOLEAN: { 1820d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1821807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 182362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1827807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1828807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao BooleanArray* array = a->AsBooleanArray(); 18309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18329cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18359cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_BYTE: { 1839d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1840807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 184262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18439cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1846807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int8_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1847807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ByteArray* array = a->AsByteArray(); 18499cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18509cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18539cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_CHAR: { 1858d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1859807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 186162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1865807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz uint16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1866807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18679cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao CharArray* array = a->AsCharArray(); 18689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18729cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_SHORT: { 1877d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1878807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 188062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 18819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1884807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int16_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1885807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 18869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao ShortArray* array = a->AsShortArray(); 18879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 18889cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 18899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 18909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 18919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 18929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 18932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 18942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 18952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT: { 1896d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1897807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 18982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 189962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 19009cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1903807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t val = shadow_frame.GetVReg(inst->VRegA_23x()); 1904807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19059cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao IntArray* array = a->AsIntArray(); 19069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 19079cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 19089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 19099cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 19109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 19122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_WIDE: { 1915d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1916807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 19172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 191862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 19199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1922807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int64_t val = shadow_frame.GetVRegLong(inst->VRegA_23x()); 1923807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao LongArray* array = a->AsLongArray(); 19259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao if (LIKELY(array->IsValidIndex(index))) { 19269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao array->GetData()[index] = val; 19279cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 19289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } else { 19299cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19309cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao } 19312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::APUT_OBJECT: { 1934d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 1935807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz Object* a = shadow_frame.GetVRegReference(inst->VRegB_23x()); 19362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (UNLIKELY(a == NULL)) { 193762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNullPointerExceptionFromDexPC(shadow_frame.GetCurrentLocationForThrow()); 19389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao HANDLE_PENDING_EXCEPTION(); 19392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 1941807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz int32_t index = shadow_frame.GetVReg(inst->VRegC_23x()); 19426bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz Object* val = shadow_frame.GetVRegReference(inst->VRegA_23x()); 19436bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz ObjectArray<Object>* array = a->AsObjectArray<Object>(); 19446bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz if (LIKELY(array->IsValidIndex(index) && array->CheckAssignable(val))) { 19456bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz array->SetWithoutChecks(index, val); 19466bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz inst = inst->Next_2xx(); 19476bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz } else { 19486bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz HANDLE_PENDING_EXCEPTION(); 19496bdd8f4bf372d703dd6304fe03a6b1a119502c65Sebastien Hertz } 19502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 19521521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_BOOLEAN: { 1953d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19541521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 19551521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19571521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19581521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_BYTE: { 1959d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19601521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 19611521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19631521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19641521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_CHAR: { 1965d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19661521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 19671521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19691521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19701521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_SHORT: { 1971d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19721521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 19731521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19751521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19761521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET: { 1977d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19781521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 19791521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19811521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19821521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_WIDE: { 1983d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19841521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstancePrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 19851521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19871521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19881521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_OBJECT: { 1989d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 19901521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<InstanceObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 19911521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 19931521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 19941521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_QUICK: { 19952d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 19961521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 19971521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 19982d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 19991521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_WIDE_QUICK: { 20012d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20021521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 20031521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20042d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20051521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20061521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IGET_OBJECT_QUICK: { 20072d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20081521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIGetQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 20091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20102d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 20111521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_BOOLEAN: { 2013d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20141521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 20151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_BYTE: { 2019d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20201521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 20211521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20231521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20241521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_CHAR: { 2025d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20261521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20271521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20291521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20301521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_SHORT: { 2031d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20321521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20331521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20351521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20361521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET: { 2037d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20381521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20391521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20411521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20421521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_WIDE: { 2043d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20441521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticPrimitiveRead, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20451521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20481521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SGET_OBJECT: { 2049d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20501521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldGet<StaticObjectRead, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20511521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20531521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20541521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_BOOLEAN: { 2055d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20561521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 20571521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20591521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20601521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_BYTE: { 2061d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20621521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 20631521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20651521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20661521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_CHAR: { 2067d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20681521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 20691521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20711521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20721521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_SHORT: { 2073d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20741521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 20751521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20771521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20781521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT: { 2079d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20801521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 20811521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20831521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20841521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_WIDE: { 2085d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20861521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstancePrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 20871521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20891521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20901521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_OBJECT: { 2091d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 20921521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<InstanceObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 20931521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 20942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 20951521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 20961521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_QUICK: { 20972d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 20981521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimInt>(self, shadow_frame, inst); 20991521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21002d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21021521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_WIDE_QUICK: { 21032d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 21041521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimLong>(self, shadow_frame, inst); 21051521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21062d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21071521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21081521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::IPUT_OBJECT_QUICK: { 21092d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 21101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIPutQuick<Primitive::kPrimNot>(self, shadow_frame, inst); 21111521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21122d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 21131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21141521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_BOOLEAN: { 2115d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21161521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimBoolean, do_access_check>(self, shadow_frame, inst); 21171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21201521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_BYTE: { 2121d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21221521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimByte, do_access_check>(self, shadow_frame, inst); 21231521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21261521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_CHAR: { 2127d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21281521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimChar, do_access_check>(self, shadow_frame, inst); 21291521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21311521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21321521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_SHORT: { 2133d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21341521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimShort, do_access_check>(self, shadow_frame, inst); 21351521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21371521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21381521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT: { 2139d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21401521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimInt, do_access_check>(self, shadow_frame, inst); 21411521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21431521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21441521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_WIDE: { 2145d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21461521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticPrimitiveWrite, Primitive::kPrimLong, do_access_check>(self, shadow_frame, inst); 21471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21491521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21501521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::SPUT_OBJECT: { 2151d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21521521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoFieldPut<StaticObjectWrite, Primitive::kPrimNot, do_access_check>(self, shadow_frame, inst); 21531521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 21542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21551521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21561521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_VIRTUAL: { 2157d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21581521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kVirtual, false, do_access_check>(self, shadow_frame, inst, &result_register); 21591521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21611521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21621521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE: { 2163d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21641521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kVirtual, true, do_access_check>(self, shadow_frame, inst, &result_register); 21651521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21671521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21681521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_SUPER: { 2169d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21701521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kSuper, false, do_access_check>(self, shadow_frame, inst, &result_register); 21711521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21731521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21741521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_SUPER_RANGE: { 2175d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21761521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kSuper, true, do_access_check>(self, shadow_frame, inst, &result_register); 21771521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21791521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21801521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_DIRECT: { 2181d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21821521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kDirect, false, do_access_check>(self, shadow_frame, inst, &result_register); 21831521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21851521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21861521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_DIRECT_RANGE: { 2187d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21881521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kDirect, true, do_access_check>(self, shadow_frame, inst, &result_register); 21891521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21911521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21921521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_INTERFACE: { 2193d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 21941521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kInterface, false, do_access_check>(self, shadow_frame, inst, &result_register); 21951521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 21962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 21971521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 21981521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_INTERFACE_RANGE: { 2199d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 22001521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kInterface, true, do_access_check>(self, shadow_frame, inst, &result_register); 22011521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22031521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22041521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_STATIC: { 2205d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 22061521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kStatic, false, do_access_check>(self, shadow_frame, inst, &result_register); 22071521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_STATIC_RANGE: { 2211d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 22121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvoke<kStatic, true, do_access_check>(self, shadow_frame, inst, &result_register); 22131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22161521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_VIRTUAL_QUICK: { 22172d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 22181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvokeVirtualQuick<false>(self, shadow_frame, inst, &result_register); 22191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22202d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 22211521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22221521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::INVOKE_VIRTUAL_RANGE_QUICK: { 22232d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz PREAMBLE(); 22241521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoInvokeVirtualQuick<true>(self, shadow_frame, inst, &result_register); 22251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_3xx); 22262d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz break; 22271521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 22282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_INT: 2229d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2230807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), -shadow_frame.GetVReg(inst->VRegB_12x())); 22319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_INT: 2234d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2235807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), ~shadow_frame.GetVReg(inst->VRegB_12x())); 22369cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_LONG: 2239d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2240807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), -shadow_frame.GetVRegLong(inst->VRegB_12x())); 22419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NOT_LONG: 2244d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2245807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), ~shadow_frame.GetVRegLong(inst->VRegB_12x())); 22469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_FLOAT: 2249d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2250807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), -shadow_frame.GetVRegFloat(inst->VRegB_12x())); 22519cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::NEG_DOUBLE: 2254d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2255807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), -shadow_frame.GetVRegDouble(inst->VRegB_12x())); 22569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_LONG: 2259d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2260807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_FLOAT: 2264d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2265807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_DOUBLE: 2269d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2270807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVReg(inst->VRegB_12x())); 22719cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_INT: 2274d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2275807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_FLOAT: 2279d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2280807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22819cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 22832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::LONG_TO_DOUBLE: 2284d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2285807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegLong(inst->VRegB_12x())); 22869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 22872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 228887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_INT: { 2289d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2290807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 229113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t result; 229287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 229313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 229487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxInt)) { 229513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxInt; 229687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinInt)) { 229713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinInt; 229887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 229913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 230087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 230113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 23029cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 230487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 230587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::FLOAT_TO_LONG: { 2306d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2307807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz float val = shadow_frame.GetVRegFloat(inst->VRegB_12x()); 230813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int64_t result; 230987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 231013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 231187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<float>(kMaxLong)) { 231213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxLong; 231387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<float>(kMinLong)) { 231413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinLong; 231587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 231613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 231787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 231813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 23199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 232187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 23222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::FLOAT_TO_DOUBLE: 2323d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2324807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_12x(), shadow_frame.GetVRegFloat(inst->VRegB_12x())); 23259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 232787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_INT: { 2328d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2329807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 233013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int32_t result; 233187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 233213e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 233387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxInt)) { 233413e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxInt; 233587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinInt)) { 233613e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinInt; 233787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 233813e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 233987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 234013e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), result); 23419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 234387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 234487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao case Instruction::DOUBLE_TO_LONG: { 2345d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2346807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz double val = shadow_frame.GetVRegDouble(inst->VRegB_12x()); 234713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz int64_t result; 234887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao if (val != val) { 234913e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = 0; 235087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val > static_cast<double>(kMaxLong)) { 235113e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMaxLong; 235287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else if (val < static_cast<double>(kMinLong)) { 235313e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = kMinLong; 235487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } else { 235513e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz result = val; 235687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 235713e2d1f9c737f9f30ce251a48fc8a6d905f7ba35Sebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_12x(), result); 23589cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 236087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao } 23612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DOUBLE_TO_FLOAT: 2362d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2363807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_12x(), shadow_frame.GetVRegDouble(inst->VRegB_12x())); 23649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_BYTE: 2367d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2368807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2369807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<int8_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23709cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_CHAR: 2373d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2374807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2375807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23769cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::INT_TO_SHORT: 2379d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2380807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_12x(), 2381807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<int16_t>(shadow_frame.GetVReg(inst->VRegB_12x()))); 23829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 23832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT: 2385d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2386807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2387807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) + 2388807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23899cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_INT: 2392d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2393807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2394807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) - 2395807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 23969cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 23972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 23982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT: 2399d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2400807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2401807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) * 2402807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24051521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::DIV_INT: { 2406d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24071521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_23x(), 24081521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 24091521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24101521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 2411807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 24121521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 24131521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::REM_INT: { 2414d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_23x(), 24161521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()), 24171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 24192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24201521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 24212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT: 2422d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2423807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2424807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) << 2425807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 24269cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT: 2429d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2430807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2431807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) >> 2432807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 24339cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT: 2436d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2437807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2438807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_23x())) >> 2439807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x1f)); 24409cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT: 2443d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2444807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2445807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) & 2446807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24479cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT: 2450d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2451807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2452807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) | 2453807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24549cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT: 2457d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2458807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_23x(), 2459807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_23x()) ^ 2460807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegC_23x())); 24619cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_LONG: 2464d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2465807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2466807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) + 2467807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_LONG: 2471d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2472807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2473807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) - 2474807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24759cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_LONG: 2478d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2479807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2480807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) * 2481807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 24832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_LONG: 2485d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24860a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongDivide(shadow_frame, inst->VRegA_23x(), 2487807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 2488807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24891521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 24902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_LONG: 2492d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 24930a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongRemainder(shadow_frame, inst->VRegA_23x(), 2494807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()), 2495807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 24961521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_2xx); 24972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 24982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_LONG: 2499d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2500807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2501807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) & 2502807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 25039cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_LONG: 2506d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2507807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2508807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) | 2509807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 25109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_LONG: 2513d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2514807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2515807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) ^ 2516807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegC_23x())); 25179cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_LONG: 2520d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2521807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2522807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) << 2523807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 25249cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_LONG: 2527d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2528807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2529807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_23x()) >> 2530807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 25319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_LONG: 2534d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2535807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(inst->VRegA_23x(), 2536807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(inst->VRegB_23x())) >> 2537807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegC_23x()) & 0x3f)); 25389cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_FLOAT: 2541d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2542807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2543807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) + 2544807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25459cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_FLOAT: 2548d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2549807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2550807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) - 2551807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25529cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_FLOAT: 2555d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2556807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2557807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) * 2558807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_FLOAT: 2562d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2563807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2564807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_23x()) / 2565807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x())); 25669cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_FLOAT: 2569d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2570807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(inst->VRegA_23x(), 2571807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmodf(shadow_frame.GetVRegFloat(inst->VRegB_23x()), 2572807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegC_23x()))); 25739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_DOUBLE: 2576d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2577807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2578807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) + 2579807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25809cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SUB_DOUBLE: 2583d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2584807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2585807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) - 2586807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25879cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_DOUBLE: 2590d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2591807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2592807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) * 2593807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 25949cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 25952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 25962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::DIV_DOUBLE: 2597d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2598807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2599807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_23x()) / 2600807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x())); 26019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 26022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 26032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::REM_DOUBLE: 2604d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2605807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(inst->VRegA_23x(), 2606807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmod(shadow_frame.GetVRegDouble(inst->VRegB_23x()), 2607807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegC_23x()))); 26089cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2609807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2610807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_INT_2ADDR: { 2611d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26125fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2613807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2614807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) + 2615807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26169cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2617807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2618807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2619807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_INT_2ADDR: { 2620d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26215fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2622807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2623807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) - 2624807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2626807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2627807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2628807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_INT_2ADDR: { 2629d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26305fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2631807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2632807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) * 2633807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2635807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2636807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 263792c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz case Instruction::DIV_INT_2ADDR: { 263892c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz PREAMBLE(); 26395fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 26401521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntDivide(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 26411521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26421521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 264392c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz break; 264492c607f614484ed091cfb1f73fab5c736eed78deSebastien Hertz } 2645807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_INT_2ADDR: { 2646d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26475fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 26481521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntRemainder(shadow_frame, vregA, shadow_frame.GetVReg(vregA), 26491521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26501521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_1xx); 26512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 2652807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 26532ce745c06271d5223d57dbf08117b20d5b60694aBrian Carlstrom case Instruction::SHL_INT_2ADDR: { 2654d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26555fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2656807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2657807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) << 2658807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26599cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2660807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2661807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2662807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHR_INT_2ADDR: { 2663d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26645fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2665807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2666807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) >> 2667807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26689cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2669807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2670807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2671807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::USHR_INT_2ADDR: { 2672d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26735fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2674807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2675807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(vregA)) >> 2676807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x1f)); 26779cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2678807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2679807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2680807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_INT_2ADDR: { 2681d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26825fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2683807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2684807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) & 2685807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26869cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2687807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2688807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2689807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_INT_2ADDR: { 2690d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 26915fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2692807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2693807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) | 2694807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 26959cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2696807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2697807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2698807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::XOR_INT_2ADDR: { 2699d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27005fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2701807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(vregA, 2702807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(vregA) ^ 2703807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_12x())); 27049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2705807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2706807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2707807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_LONG_2ADDR: { 2708d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27095fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2710807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2711807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) + 2712807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2714807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2715807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2716807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_LONG_2ADDR: { 2717d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27185fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2719807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2720807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) - 2721807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27229cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2723807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2724807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2725807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_LONG_2ADDR: { 2726d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27275fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2728807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2729807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) * 2730807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27319cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2732807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2733807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2734807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_LONG_2ADDR: { 2735d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27365fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 27370a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongDivide(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 2738807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27391521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 2740807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2741807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2742807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_LONG_2ADDR: { 2743d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27445fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 27450a3b863fb1acae912b54f4be2c1928d3afa5e936Sebastien Hertz DoLongRemainder(shadow_frame, vregA, shadow_frame.GetVRegLong(vregA), 2746807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27471521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(self->IsExceptionPending(), Next_1xx); 2748807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2749807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2750807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_LONG_2ADDR: { 2751d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27525fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2753807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2754807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) & 2755807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27569cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2757807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2758807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2759807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_LONG_2ADDR: { 2760d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27615fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2762807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2763807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) | 2764807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27659cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2766807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2767807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2768807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::XOR_LONG_2ADDR: { 2769d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27705fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2771807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2772807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) ^ 2773807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(inst->VRegB_12x())); 27749cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2775807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2776807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2777807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHL_LONG_2ADDR: { 2778d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27795fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2780807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2781807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) << 2782807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27839cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2784807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2785807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2786807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SHR_LONG_2ADDR: { 2787d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27885fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2789807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2790807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegLong(vregA) >> 2791807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 27929cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2793807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2794807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2795807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::USHR_LONG_2ADDR: { 2796d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 27975fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2798807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegLong(vregA, 2799807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint64_t>(shadow_frame.GetVRegLong(vregA)) >> 2800807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (shadow_frame.GetVReg(inst->VRegB_12x()) & 0x3f)); 28019cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2802807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2803807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2804807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_FLOAT_2ADDR: { 2805d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28065fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2807807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2808807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) + 2809807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 28109cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2811807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2812807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2813807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_FLOAT_2ADDR: { 2814d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28155fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2816807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2817807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) - 2818807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 28199cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2820807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2821807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2822807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_FLOAT_2ADDR: { 2823d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28245fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2825807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2826807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) * 2827807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 28289cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2829807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2830807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2831807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_FLOAT_2ADDR: { 2832d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28335fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2834807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2835807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(vregA) / 2836807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x())); 28379cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2838807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2839807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2840807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_FLOAT_2ADDR: { 2841d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28425fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2843807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegFloat(vregA, 2844807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmodf(shadow_frame.GetVRegFloat(vregA), 2845807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegFloat(inst->VRegB_12x()))); 28469cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2847807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2848807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2849807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_DOUBLE_2ADDR: { 2850d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28515fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2852807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2853807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) + 2854807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2856807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2857807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2858807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::SUB_DOUBLE_2ADDR: { 2859d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28605fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2861807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2862807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) - 2863807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28649cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2865807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2866807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2867807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_DOUBLE_2ADDR: { 2868d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28695fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2870807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2871807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) * 2872807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28739cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2874807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2875807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2876807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::DIV_DOUBLE_2ADDR: { 2877d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28785fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2879807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2880807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(vregA) / 2881807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x())); 28829cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2883807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2884807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 2885807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::REM_DOUBLE_2ADDR: { 2886d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 28875fde12abafdcd3523ffd7d71f86e3b9e28f78065Sebastien Hertz uint4_t vregA = inst->VRegA_12x(); 2888807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVRegDouble(vregA, 2889807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz fmod(shadow_frame.GetVRegDouble(vregA), 2890807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVRegDouble(inst->VRegB_12x()))); 28919cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_1xx(); 2892807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2893807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } 28942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::ADD_INT_LIT16: 2895d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2896807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2897807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) + 2898807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 28999cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::RSUB_INT: 2902d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2903807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2904807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s() - 2905807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s())); 29069cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::MUL_INT_LIT16: 2909d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2910807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2911807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) * 2912807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 29139cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29151521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::DIV_INT_LIT16: { 2916d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29171521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22s(), 29181521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 29191521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 29202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29211521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 29221521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::REM_INT_LIT16: { 2923d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29241521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22s(), 29251521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()), inst->VRegC_22s()); 29261521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 29272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29281521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 29292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::AND_INT_LIT16: 2930d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2931807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2932807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) & 2933807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 29349cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::OR_INT_LIT16: 2937d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2938807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2939807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) | 2940807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 29419cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 29422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 29432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT16: 2944d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2945807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22s(), 2946807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22s()) ^ 2947807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22s()); 29489cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2949807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2950807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::ADD_INT_LIT8: 2951d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2952807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2953807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) + 2954807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29559cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2956807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2957807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::RSUB_INT_LIT8: 2958d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2959807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2960807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b() - 2961807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b())); 29629cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2963807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2964807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::MUL_INT_LIT8: 2965d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2966807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2967807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) * 2968807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29699cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2970807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29711521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::DIV_INT_LIT8: { 2972d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29731521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntDivide(shadow_frame, inst->VRegA_22b(), 29741521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 29751521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 2976807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29771521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 29781521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz case Instruction::REM_INT_LIT8: { 2979d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 29801521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz bool success = DoIntRemainder(shadow_frame, inst->VRegA_22b(), 29811521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()), inst->VRegC_22b()); 29821521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); 2983807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29841521e95729c202f6b4a65656f62dfc8ba4dc818dSebastien Hertz } 2985807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::AND_INT_LIT8: 2986d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2987807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2988807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) & 2989807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29909cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2991807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 2992807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz case Instruction::OR_INT_LIT8: 2993d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 2994807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 2995807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) | 2996807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 29979cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 2998807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz break; 29992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::XOR_INT_LIT8: 3000d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 3001807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 3002807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) ^ 3003807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz inst->VRegC_22b()); 30049cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 30052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHL_INT_LIT8: 3007d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 3008807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 3009807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) << 3010807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 30119cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 30122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::SHR_INT_LIT8: 3014d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 3015807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 3016807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.GetVReg(inst->VRegB_22b()) >> 3017807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 30189cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 30192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 30202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case Instruction::USHR_INT_LIT8: 3021d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers PREAMBLE(); 3022807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz shadow_frame.SetVReg(inst->VRegA_22b(), 3023807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz static_cast<uint32_t>(shadow_frame.GetVReg(inst->VRegB_22b())) >> 3024807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz (inst->VRegC_22b() & 0x1f)); 30259cec247849c248f6c45a14eae5414b69eb8fc67dJeff Hao inst = inst->Next_2xx(); 30262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 3027fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_3E ... Instruction::UNUSED_43: 30282d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz case Instruction::UNUSED_EB ... Instruction::UNUSED_FF: 3029fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_79: 3030fa46d3ee8cba2985c5c8bdfe47d15daf0613ebdcIan Rogers case Instruction::UNUSED_7A: 3031d8274bcbc565fff1254574b3cbf46dc4e7b52812Ian Rogers UnexpectedOpcode(inst, mh); 30322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30341895ea386ca78573302483f589ebabd8ce1480e7Brian Carlstrom} // NOLINT(readability/fn_size) 30352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 3036233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 3037233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) 3038233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); 3039233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 3040233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertzstatic inline JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 3041233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz ShadowFrame& shadow_frame, JValue result_register) { 3042233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz if (shadow_frame.GetMethod()->IsPreverified()) { 3043233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // Enter the "without access check" interpreter. 3044233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz return ExecuteImpl<false>(self, mh, code_item, shadow_frame, result_register); 3045233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } else { 3046233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz // Enter the "with access check" interpreter. 3047233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz return ExecuteImpl<true>(self, mh, code_item, shadow_frame, result_register); 3048233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz } 3049233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz} 3050233ea8e084a95ad2a3af746dddbadb155db6a814Sebastien Hertz 30512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersvoid EnterInterpreterFromInvoke(Thread* self, AbstractMethod* method, Object* receiver, 30526474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao uint32_t* args, JValue* result) { 305364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers DCHECK_EQ(self, Thread::Current()); 3054790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3055d752132c73072084a3def9257cca4fcee76047b6jeffhao ThrowStackOverflowError(self); 3056d752132c73072084a3def9257cca4fcee76047b6jeffhao return; 3057d752132c73072084a3def9257cca4fcee76047b6jeffhao } 3058d752132c73072084a3def9257cca4fcee76047b6jeffhao 30592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers MethodHelper mh(method); 30602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 30612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_regs; 30622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers uint16_t num_ins; 30632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (code_item != NULL) { 30642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = code_item->registers_size_; 30652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins = code_item->ins_size_; 30660a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao } else if (method->IsAbstract()) { 306756adf601ed9d1d11a2c462caa262e7de66a9e172Sebastien Hertz ThrowAbstractMethodError(method); 30680a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao return; 30692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 30702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers DCHECK(method->IsNative()); 30712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty()); 30722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 30732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_regs++; 30742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers num_ins++; 30752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 30772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers // Set up shadow frame with matching number of reference slots to vregs. 30782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame(); 30796613519990bdb5616f2858c146f162ef760f03d2Jeff Hao void* memory = alloca(ShadowFrame::ComputeSize(num_regs)); 30806613519990bdb5616f2858c146f162ef760f03d2Jeff Hao ShadowFrame* shadow_frame(ShadowFrame::Create(num_regs, last_shadow_frame, method, 0, memory)); 30816613519990bdb5616f2858c146f162ef760f03d2Jeff Hao self->PushShadowFrame(shadow_frame); 30822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers size_t cur_reg = num_regs - num_ins; 30832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers if (!method->IsStatic()) { 30842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(receiver != NULL); 3085ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, receiver); 30862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers ++cur_reg; 3087807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz } else if (UNLIKELY(!method->GetDeclaringClass()->IsInitializing())) { 3088807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz ClassLinker* class_linker = Runtime::Current()->GetClassLinker(); 3089807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz if (UNLIKELY(!class_linker->EnsureInitialized(method->GetDeclaringClass(), 3090807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz true, true))) { 3091807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz CHECK(self->IsExceptionPending()); 3092807a25640d4f4de8143b160b3bb8f552ffbf6f4aSebastien Hertz self->PopShadowFrame(); 309394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao return; 309494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao } 30952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers CHECK(method->GetDeclaringClass()->IsInitializing()); 30962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 309764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers const char* shorty = mh.GetShorty(); 30985d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao for (size_t shorty_pos = 0, arg_pos = 0; cur_reg < num_regs; ++shorty_pos, ++arg_pos, cur_reg++) { 30995d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao DCHECK_LT(shorty_pos + 1, mh.GetShortyLength()); 31005d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao switch (shorty[shorty_pos + 1]) { 31012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers case 'L': { 31025d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao Object* o = reinterpret_cast<Object*>(args[arg_pos]); 3103ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa shadow_frame->SetVRegReference(cur_reg, o); 31042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 31052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31065d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao case 'J': case 'D': { 31075d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao uint64_t wide_value = (static_cast<uint64_t>(args[arg_pos + 1]) << 32) | args[arg_pos]; 31085d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao shadow_frame->SetVRegLong(cur_reg, wide_value); 31092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers cur_reg++; 31105d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao arg_pos++; 31112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 31125d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao } 31132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers default: 31145d9173014c1ca09f7249a6b07629aa37778b5f8fJeff Hao shadow_frame->SetVReg(cur_reg, args[arg_pos]); 31152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers break; 31162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 311864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (LIKELY(!method->IsNative())) { 31196613519990bdb5616f2858c146f162ef760f03d2Jeff Hao JValue r = Execute(self, mh, code_item, *shadow_frame, JValue()); 31206474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao if (result != NULL) { 31216474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao *result = r; 31222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 312464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 312564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers // generated stub) except during testing and image writing. 312664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (!Runtime::Current()->IsStarted()) { 31276474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao UnstartedRuntimeJni(self, method, receiver, args, result); 31282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } else { 31296474d190d5604898354ebf767f1944b6e3e9b445Jeff Hao InterpreterJni(self, method, shorty, receiver, args, result); 31302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers } 31322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers self->PopShadowFrame(); 31332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} 31342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers 313562d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogersvoid EnterInterpreterFromDeoptimize(Thread* self, ShadowFrame* shadow_frame, JValue* ret_val) 313611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 313711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao JValue value; 313862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers value.SetJ(ret_val->GetJ()); // Set value to last known result in case the shadow frame chain is empty. 313962d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers MethodHelper mh; 314011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao while (shadow_frame != NULL) { 314162d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers self->SetTopOfShadowStack(shadow_frame); 314262d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers mh.ChangeMethod(shadow_frame->GetMethod()); 314362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers const DexFile::CodeItem* code_item = mh.GetCodeItem(); 314411ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao value = Execute(self, mh, code_item, *shadow_frame, value); 314511ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ShadowFrame* old_frame = shadow_frame; 314611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao shadow_frame = shadow_frame->GetLink(); 314711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao delete old_frame; 314811ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao } 314911ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao ret_val->SetJ(value.GetJ()); 315011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao} 315111ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao 31527db619bb2a4e01e8532a04b613745d4926b205d7Ian RogersJValue EnterInterpreterFromStub(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item, 31537db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers ShadowFrame& shadow_frame) 31547db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3155f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers DCHECK_EQ(self, Thread::Current()); 3156790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3157f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers ThrowStackOverflowError(self); 3158f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers return JValue(); 3159f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers } 3160f3e9855ee2000106b54fd479f7a46da2dc2ad079Ian Rogers 31617db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers return Execute(self, mh, code_item, shadow_frame, JValue()); 31627db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers} 31637db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers 31640aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haovoid artInterpreterToInterpreterEntry(Thread* self, MethodHelper& mh, 31650aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao const DexFile::CodeItem* code_item, 31660aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao ShadowFrame* shadow_frame, JValue* result) 3167167436311a08a65dea28dda079a137893821c9c7Jeff Hao SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { 3168790ad90ccd2f3e297e2cf0a47adbf4f9ffb10149Jeff Hao if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) { 3169167436311a08a65dea28dda079a137893821c9c7Jeff Hao ThrowStackOverflowError(self); 31706951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3171167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3172167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3173167436311a08a65dea28dda079a137893821c9c7Jeff Hao AbstractMethod* method = shadow_frame->GetMethod(); 3174167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (method->IsStatic() && !method->GetDeclaringClass()->IsInitializing()) { 3175167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(), 3176167436311a08a65dea28dda079a137893821c9c7Jeff Hao true, true)) { 3177167436311a08a65dea28dda079a137893821c9c7Jeff Hao DCHECK(Thread::Current()->IsExceptionPending()); 31786951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3179167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3180167436311a08a65dea28dda079a137893821c9c7Jeff Hao CHECK(method->GetDeclaringClass()->IsInitializing()); 3181167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3182167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3183167436311a08a65dea28dda079a137893821c9c7Jeff Hao self->PushShadowFrame(shadow_frame); 3184167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3185167436311a08a65dea28dda079a137893821c9c7Jeff Hao if (LIKELY(!method->IsNative())) { 31866951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao result->SetJ(Execute(self, mh, code_item, *shadow_frame, JValue()).GetJ()); 3187167436311a08a65dea28dda079a137893821c9c7Jeff Hao } else { 3188167436311a08a65dea28dda079a137893821c9c7Jeff Hao // We don't expect to be asked to interpret native code (which is entered via a JNI compiler 3189167436311a08a65dea28dda079a137893821c9c7Jeff Hao // generated stub) except during testing and image writing. 3190167436311a08a65dea28dda079a137893821c9c7Jeff Hao CHECK(!Runtime::Current()->IsStarted()); 3191167436311a08a65dea28dda079a137893821c9c7Jeff Hao Object* receiver = method->IsStatic() ? NULL : shadow_frame->GetVRegReference(0); 3192167436311a08a65dea28dda079a137893821c9c7Jeff Hao uint32_t* args = shadow_frame->GetVRegArgs(method->IsStatic() ? 0 : 1); 31936951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao UnstartedRuntimeJni(self, method, receiver, args, result); 3194167436311a08a65dea28dda079a137893821c9c7Jeff Hao } 3195167436311a08a65dea28dda079a137893821c9c7Jeff Hao 3196167436311a08a65dea28dda079a137893821c9c7Jeff Hao self->PopShadowFrame(); 31976951067ee14754454e17221fdef0d3d5ed7c4f7eJeff Hao return; 3198167436311a08a65dea28dda079a137893821c9c7Jeff Hao} 3199167436311a08a65dea28dda079a137893821c9c7Jeff Hao 32002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace interpreter 32012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers} // namespace art 3202