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