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