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