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