interpreter.cc revision 94d6df471a406a03bb1afba8ca3ae9c0fbf366b5
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
212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "common_throws.h"
22373c52fd70336531010268a2de4f7d3b0f236924jeffhao#include "debugger.h"
232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "dex_instruction.h"
242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "invoke_arg_array_builder.h"
252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "logging.h"
2664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers#include "nth_caller_visitor.h"
272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object.h"
282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object_utils.h"
292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "runtime_support.h"
302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "ScopedLocalRef.h"
312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "scoped_thread_state_change.h"
322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "thread.h"
332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace art {
352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace interpreter {
362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
3787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMaxInt = std::numeric_limits<int32_t>::max();
3887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMinInt = std::numeric_limits<int32_t>::min();
3987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMaxLong = std::numeric_limits<int64_t>::max();
4087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMinLong = std::numeric_limits<int64_t>::min();
4187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao
4264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeInvoke(Thread* self, AbstractMethod* target_method,
4364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   Object* receiver, JValue* args, JValue* result)
4464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
4564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  // In a runtime that's not started we intercept certain methods to avoid complicated dependency
4664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  // problems in core libraries.
4764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  std::string name(PrettyMethod(target_method));
4864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (name == "java.lang.Class java.lang.Class.forName(java.lang.String)") {
4964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    std::string descriptor(DotToDescriptor(args[0].GetL()->AsString()->ToModifiedUtf8().c_str()));
5064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    ClassLoader* class_loader = NULL; // shadow_frame.GetMethod()->GetDeclaringClass()->GetClassLoader();
5164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Class* found = Runtime::Current()->GetClassLinker()->FindClass(descriptor.c_str(),
5264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                                                   class_loader);
5364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(found != NULL) << "Class.forName failed in un-started runtime for class: "
5464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        << PrettyDescriptor(descriptor);
5564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(found);
5664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Object java.lang.Class.newInstance()") {
5764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Class* klass = receiver->AsClass();
5864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    AbstractMethod* c = klass->FindDeclaredDirectMethod("<init>", "()V");
5964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(c != NULL);
6064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Object* obj = klass->AllocObject(self);
6164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(obj != NULL);
6264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    EnterInterpreterFromInvoke(self, c, obj, NULL, NULL);
6364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(obj);
6464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String)") {
6564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail
6664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // going the reflective Dex way.
6764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Class* klass = receiver->AsClass();
6864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    String* name = args[0].GetL()->AsString();
6964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Field* found = NULL;
7064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    FieldHelper fh;
7164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    ObjectArray<Field>* fields = klass->GetIFields();
7264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) {
7364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      Field* f = fields->Get(i);
7464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fh.ChangeField(f);
7564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      if (name->Equals(fh.GetName())) {
7664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        found = f;
7764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
7864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
7964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (found == NULL) {
8064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fields = klass->GetSFields();
8164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) {
8264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        Field* f = fields->Get(i);
8364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        fh.ChangeField(f);
8464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        if (name->Equals(fh.GetName())) {
8564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          found = f;
8664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        }
8764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
8864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
8964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(found != NULL)
9064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      << "Failed to find field in Class.getDeclaredField in un-started runtime. name="
9164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      << name->ToModifiedUtf8() << " class=" << PrettyDescriptor(klass);
9264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // TODO: getDeclaredField calls GetType once the field is found to ensure a
9364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    //       NoClassDefFoundError is thrown if the field's type cannot be resolved.
9464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(found);
9564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "void java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int)") {
9664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // Special case array copying without initializing System.
9764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Class* ctype = args[0].GetL()->GetClass()->GetComponentType();
9864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint srcPos = args[1].GetI();
9964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint dstPos = args[3].GetI();
10064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint length = args[4].GetI();
10164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (!ctype->IsPrimitive()) {
10264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ObjectArray<Object>* src = args[0].GetL()->AsObjectArray<Object>();
10364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ObjectArray<Object>* dst = args[2].GetL()->AsObjectArray<Object>();
10464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      for (jint i = 0; i < length; ++i) {
10564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        dst->Set(dstPos + i, src->Get(srcPos + i));
10664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
10764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (ctype->IsPrimitiveChar()) {
10864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      CharArray* src = args[0].GetL()->AsCharArray();
10964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      CharArray* dst = args[2].GetL()->AsCharArray();
11064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      for (jint i = 0; i < length; ++i) {
11164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        dst->Set(dstPos + i, src->Get(srcPos + i));
11264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
11364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (ctype->IsPrimitiveInt()) {
11464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      IntArray* src = args[0].GetL()->AsIntArray();
11564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      IntArray* dst = args[2].GetL()->AsIntArray();
11664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      for (jint i = 0; i < length; ++i) {
11764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        dst->Set(dstPos + i, src->Get(srcPos + i));
11864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
11964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else {
12064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      UNIMPLEMENTED(FATAL) << "System.arraycopy of unexpected type: " << PrettyDescriptor(ctype);
12164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
12264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else {
12364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // Not special, continue with regular interpreter execution.
12464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    EnterInterpreterFromInvoke(self, target_method, receiver, args, result);
12564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  }
12664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers}
12764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers
12864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers// Hand select a number of methods to be run in a not yet started runtime without using JNI.
12964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeJni(Thread* self, AbstractMethod* method,
13064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                Object* receiver, JValue* args, JValue* result)
13164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
13264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  std::string name(PrettyMethod(method));
13364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (name == "java.lang.ClassLoader dalvik.system.VMStack.getCallingClassLoader()") {
13464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(NULL);
13564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Class dalvik.system.VMStack.getStackClass2()") {
13664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    NthCallerVisitor visitor(self->GetManagedStack(), NULL, 3);
13764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    visitor.WalkStack();
13864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(visitor.caller->GetDeclaringClass());
13964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "double java.lang.Math.log(double)") {
14064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetD(log(args[0].GetD()));
14164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.String java.lang.Class.getNameNative()") {
14264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(receiver->AsClass()->ComputeName());
14364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "int java.lang.Float.floatToRawIntBits(float)") {
14464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetI(args[0].GetI());
14564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "float java.lang.Float.intBitsToFloat(int)") {
14664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetF(args[0].GetF());
14764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "double java.lang.Math.exp(double)") {
14864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetD(exp(args[0].GetD()));
14964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Object java.lang.Object.internalClone()") {
15064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(receiver->Clone(self));
15164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "void java.lang.Object.notifyAll()") {
15264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    receiver->NotifyAll();
15364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "int java.lang.String.compareTo(java.lang.String)") {
15464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    String* rhs = args[0].GetL()->AsString();
15564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(rhs != NULL);
15664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetI(receiver->AsString()->CompareTo(rhs));
15764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.String java.lang.String.intern()") {
15864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(receiver->AsString()->Intern());
15964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "int java.lang.String.fastIndexOf(int, int)") {
16064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetI(receiver->AsString()->FastIndexOf(args[0].GetI(), args[1].GetI()));
16164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])") {
16264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(Array::CreateMultiArray(self, args[0].GetL()->AsClass(), args[1].GetL()->AsIntArray()));
16364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") {
16464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    ScopedObjectAccessUnchecked soa(self);
16564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa)));
16664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") {
16764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetJ(JNI_TRUE);
16864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") {
16964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Object* obj = args[0].GetL();
17064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jlong offset = args[1].GetJ();
17164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint expectedValue = args[2].GetI();
17264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint newValue = args[3].GetI();
17364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    byte* raw_addr = reinterpret_cast<byte*>(obj) + offset;
17464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr);
17564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // Note: android_atomic_release_cas() returns 0 on success, not failure.
17664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    int r = android_atomic_release_cas(expectedValue, newValue, address);
17764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetZ(r == 0);
17864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") {
17964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Object* obj = args[0].GetL();
18064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Object* newValue = args[2].GetL();
18164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    obj->SetFieldObject(MemberOffset(args[1].GetJ()), newValue, false);
18264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else {
18364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    LOG(FATAL) << "Attempt to invoke native method in non-started runtime: " << name;
18464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  }
18564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers}
18664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers
18764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void InterpreterJni(Thread* self, AbstractMethod* method, StringPiece shorty,
18864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                           Object* receiver, JValue* args, JValue* result)
18964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
19064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  // TODO: The following enters JNI code using a typedef-ed function rather than the JNI compiler,
19164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  //       it should be removed and JNI compiled stubs used instead.
19264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  ScopedObjectAccessUnchecked soa(self);
19364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (method->IsStatic()) {
19464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (shorty == "L") {
19564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jobject (fnptr)(JNIEnv*, jclass);
19664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
19764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
19864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
199556d637764b71563030c479bc35364a75188d559Ian Rogers      jobject jresult;
200556d637764b71563030c479bc35364a75188d559Ian Rogers      {
201556d637764b71563030c479bc35364a75188d559Ian Rogers        ScopedThreadStateChange tsc(self, kNative);
202556d637764b71563030c479bc35364a75188d559Ian Rogers        jresult = fn(soa.Env(), klass.get());
203556d637764b71563030c479bc35364a75188d559Ian Rogers      }
204556d637764b71563030c479bc35364a75188d559Ian Rogers      result->SetL(soa.Decode<Object*>(jresult));
20564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "V") {
20664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef void (fnptr)(JNIEnv*, jclass);
20764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
20864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
20964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
21064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
21164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fn(soa.Env(), klass.get());
21264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "Z") {
21364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jboolean (fnptr)(JNIEnv*, jclass);
21464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
21564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
21664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
21764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
21864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetZ(fn(soa.Env(), klass.get()));
21964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "BI") {
22064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jbyte (fnptr)(JNIEnv*, jclass, jint);
22164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
22264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
22364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
22464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
22564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetB(fn(soa.Env(), klass.get(), args[0].GetI()));
22664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "II") {
22764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jint (fnptr)(JNIEnv*, jclass, jint);
22864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
22964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
23064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
23164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
23264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetI(fn(soa.Env(), klass.get(), args[0].GetI()));
23364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "LL") {
23464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jobject (fnptr)(JNIEnv*, jclass, jobject);
23564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
23664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
23764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
23864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
23964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
240556d637764b71563030c479bc35364a75188d559Ian Rogers      jobject jresult;
241556d637764b71563030c479bc35364a75188d559Ian Rogers      {
242556d637764b71563030c479bc35364a75188d559Ian Rogers        ScopedThreadStateChange tsc(self, kNative);
243556d637764b71563030c479bc35364a75188d559Ian Rogers        jresult = fn(soa.Env(), klass.get(), arg0.get());
244556d637764b71563030c479bc35364a75188d559Ian Rogers      }
245556d637764b71563030c479bc35364a75188d559Ian Rogers      result->SetL(soa.Decode<Object*>(jresult));
24664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "IIZ") {
24764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jint (fnptr)(JNIEnv*, jclass, jint, jboolean);
24864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
24964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
25064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
25164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
25264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetI(fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ()));
25364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "ILI") {
25464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jint (fnptr)(JNIEnv*, jclass, jobject, jint);
25564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
25664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
25764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
25864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
25964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
26064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
26164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetI(fn(soa.Env(), klass.get(), arg0.get(), args[1].GetI()));
26264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "SIZ") {
26364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jshort (fnptr)(JNIEnv*, jclass, jint, jboolean);
26464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
26564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
26664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
26764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
26864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetS(fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ()));
26964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "VIZ") {
27064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef void (fnptr)(JNIEnv*, jclass, jint, jboolean);
27164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
27264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
27364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
27464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
27564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ());
27664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "ZLL") {
27764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jboolean (fnptr)(JNIEnv*, jclass, jobject, jobject);
27864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
27964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
28064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
28164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
28264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
28364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg1(soa.Env(),
28464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[1].GetL()));
28564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
28664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetZ(fn(soa.Env(), klass.get(), arg0.get(), arg1.get()));
28764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "ZILL") {
28864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jboolean (fnptr)(JNIEnv*, jclass, jint, jobject, jobject);
28964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
29064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
29164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
29264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg1(soa.Env(),
29364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[1].GetL()));
29464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg2(soa.Env(),
29564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[2].GetL()));
29664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
29764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetZ(fn(soa.Env(), klass.get(), args[0].GetI(), arg1.get(), arg2.get()));
29864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "VILII") {
29964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef void (fnptr)(JNIEnv*, jclass, jint, jobject, jint, jint);
30064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
30164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
30264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
30364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg1(soa.Env(),
30464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[1].GetL()));
30564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
30664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fn(soa.Env(), klass.get(), args[0].GetI(), arg1.get(), args[2].GetI(), args[3].GetI());
30764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "VLILII") {
30864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef void (fnptr)(JNIEnv*, jclass, jobject, jint, jobject, jint, jint);
30964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
31064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
31164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
31264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
31364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
31464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg2(soa.Env(),
31564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[2].GetL()));
31664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
31764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fn(soa.Env(), klass.get(), arg0.get(), args[1].GetI(), arg2.get(), args[3].GetI(),
31864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers         args[4].GetI());
31964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else {
32064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      LOG(FATAL) << "Do something with static native method: " << PrettyMethod(method)
32164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          << " shorty: " << shorty;
32264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
32364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else {
32464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (shorty == "L") {
32564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jobject (fnptr)(JNIEnv*, jobject);
32664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
32764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> rcvr(soa.Env(),
32864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(receiver));
329556d637764b71563030c479bc35364a75188d559Ian Rogers      jobject jresult;
330556d637764b71563030c479bc35364a75188d559Ian Rogers      {
331556d637764b71563030c479bc35364a75188d559Ian Rogers        ScopedThreadStateChange tsc(self, kNative);
332556d637764b71563030c479bc35364a75188d559Ian Rogers        jresult = fn(soa.Env(), rcvr.get());
333556d637764b71563030c479bc35364a75188d559Ian Rogers      }
334556d637764b71563030c479bc35364a75188d559Ian Rogers      result->SetL(soa.Decode<Object*>(jresult));
33564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "LL") {
33664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jobject (fnptr)(JNIEnv*, jobject, jobject);
33764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
33864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> rcvr(soa.Env(),
33964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(receiver));
34064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
34164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
342556d637764b71563030c479bc35364a75188d559Ian Rogers      jobject jresult;
343556d637764b71563030c479bc35364a75188d559Ian Rogers      {
344556d637764b71563030c479bc35364a75188d559Ian Rogers        ScopedThreadStateChange tsc(self, kNative);
345556d637764b71563030c479bc35364a75188d559Ian Rogers        jresult = fn(soa.Env(), rcvr.get(), arg0.get());
346556d637764b71563030c479bc35364a75188d559Ian Rogers
347556d637764b71563030c479bc35364a75188d559Ian Rogers      }
348556d637764b71563030c479bc35364a75188d559Ian Rogers      result->SetL(soa.Decode<Object*>(jresult));
34964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
35064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "III") {
35164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jint (fnptr)(JNIEnv*, jobject, jint, jint);
35264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
35364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> rcvr(soa.Env(),
35464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(receiver));
35564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
35664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetI(fn(soa.Env(), rcvr.get(), args[0].GetI(), args[1].GetI()));
35764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else {
35864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      LOG(FATAL) << "Do something with native method: " << PrettyMethod(method)
35964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          << " shorty: " << shorty;
36064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
36164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  }
36264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers}
36364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers
3642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorEnter(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS {
3652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  ref->MonitorEnter(self);
3662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
3672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
3682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorExit(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS {
3692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  ref->MonitorExit(self);
3702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
3712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
3722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoInvoke(Thread* self, MethodHelper& mh, ShadowFrame& shadow_frame,
3732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                     const DecodedInstruction& dec_insn, InvokeType type, bool is_range,
3742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                     JValue* result)
3752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
3762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  Object* receiver;
3772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (type == kStatic) {
3782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    receiver = NULL;
3792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else {
3802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    receiver = shadow_frame.GetReference(dec_insn.vC);
3812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (UNLIKELY(receiver == NULL)) {
3822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      ThrowNullPointerExceptionForMethodAccess(shadow_frame.GetMethod(), dec_insn.vB, type);
3832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      result->SetJ(0);
3842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      return;
3852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
3862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
3872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint32_t method_idx = dec_insn.vB;
3882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  AbstractMethod* target_method = FindMethodFromCode(method_idx, receiver,
3892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                     shadow_frame.GetMethod(), self, true,
3902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                     type);
3912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (UNLIKELY(target_method == NULL)) {
3922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    CHECK(self->IsExceptionPending());
3932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    result->SetJ(0);
3942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return;
3952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
3962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  mh.ChangeMethod(target_method);
3972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  ArgArray arg_array(mh.GetShorty(), mh.GetShortyLength());
3982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (is_range) {
3992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    arg_array.BuildArgArray(shadow_frame, dec_insn.vC + (type != kStatic ? 1 : 0));
4002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else {
4012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    arg_array.BuildArgArray(shadow_frame, dec_insn.arg + (type != kStatic ? 1 : 0));
4022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
40364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (LIKELY(Runtime::Current()->IsStarted())) {
40464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    target_method->Invoke(self, receiver, arg_array.get(), result);
40564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else {
40664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    UnstartedRuntimeInvoke(self, target_method, receiver, arg_array.get(), result);
40764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  }
408d752132c73072084a3def9257cca4fcee76047b6jeffhao  // Check the return type if the result is non-null. We do the GetReturnType
409d752132c73072084a3def9257cca4fcee76047b6jeffhao  // after the null check to avoid resolution when there's an exception pending.
410d752132c73072084a3def9257cca4fcee76047b6jeffhao  if (result->GetL() != NULL && !mh.GetReturnType()->IsPrimitive()) {
4112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    CHECK(mh.GetReturnType()->IsAssignableFrom(result->GetL()->GetClass()));
4122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
4132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  mh.ChangeMethod(shadow_frame.GetMethod());
4142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
4152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
4162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldGet(Thread* self, ShadowFrame& shadow_frame,
4172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                       const DecodedInstruction& dec_insn, FindFieldType find_type,
4182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                       Primitive::Type field_type)
4192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
4202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  bool is_static = (find_type == StaticObjectRead) || (find_type == StaticPrimitiveRead);
4212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint32_t field_idx = is_static ? dec_insn.vB : dec_insn.vC;
4222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self,
4232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                               find_type, Primitive::FieldSize(field_type));
4242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (LIKELY(f != NULL)) {
4252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    Object* obj;
4262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (is_static) {
4272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      obj = f->GetDeclaringClass();
4282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    } else {
4292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      obj = shadow_frame.GetReference(dec_insn.vB);
4302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      if (UNLIKELY(obj == NULL)) {
4312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        ThrowNullPointerExceptionForFieldAccess(f, true);
432689d9f0cee08a3baaa85a85fb365c7b99f503617Ian Rogers        return;
4332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
4342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
4352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    switch (field_type) {
4362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimBoolean:
4372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetBoolean(obj));
4382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimByte:
4402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetByte(obj));
4412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimChar:
4432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetChar(obj));
4442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimShort:
4462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetShort(obj));
4472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimInt:
4492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetInt(obj));
4502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimLong:
4522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, f->GetLong(obj));
4532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimNot:
4552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetReferenceAndVReg(dec_insn.vA, f->GetObject(obj));
4562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      default:
4582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        LOG(FATAL) << "Unreachable: " << field_type;
4592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
4602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
4612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
4622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
4632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldPut(Thread* self, ShadowFrame& shadow_frame,
4642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                       const DecodedInstruction& dec_insn, FindFieldType find_type,
4652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                       Primitive::Type field_type)
4662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
4672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  bool is_static = (find_type == StaticObjectWrite) || (find_type == StaticPrimitiveWrite);
4682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint32_t field_idx = is_static ? dec_insn.vB : dec_insn.vC;
4692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self,
4702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                               find_type, Primitive::FieldSize(field_type));
4712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (LIKELY(f != NULL)) {
4722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    Object* obj;
4732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (is_static) {
4742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      obj = f->GetDeclaringClass();
4752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    } else {
4762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      obj = shadow_frame.GetReference(dec_insn.vB);
4772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      if (UNLIKELY(obj == NULL)) {
4782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        ThrowNullPointerExceptionForFieldAccess(f, false);
479689d9f0cee08a3baaa85a85fb365c7b99f503617Ian Rogers        return;
4802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
4812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
4822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    switch (field_type) {
4832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimBoolean:
4842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetBoolean(obj, shadow_frame.GetVReg(dec_insn.vA));
4852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimByte:
4872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetByte(obj, shadow_frame.GetVReg(dec_insn.vA));
4882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimChar:
4902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetChar(obj, shadow_frame.GetVReg(dec_insn.vA));
4912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimShort:
4932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetShort(obj, shadow_frame.GetVReg(dec_insn.vA));
4942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimInt:
4962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetInt(obj, shadow_frame.GetVReg(dec_insn.vA));
4972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimLong:
4992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetLong(obj, shadow_frame.GetVRegLong(dec_insn.vA));
5002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
5012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimNot:
5022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetObj(obj, shadow_frame.GetReference(dec_insn.vA));
5032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
5042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      default:
5052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        LOG(FATAL) << "Unreachable: " << field_type;
5062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
5072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
5082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
5092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
510d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoIntDivide(Thread* self, ShadowFrame& shadow_frame, size_t result_reg,
511d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    int32_t dividend, int32_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
512d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  if (UNLIKELY(divisor == 0)) {
513d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero");
514d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) {
515d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVReg(result_reg, kMinInt);
516d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else {
517d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVReg(result_reg, dividend / divisor);
518d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  }
519d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao}
520d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao
521d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoIntRemainder(Thread* self, ShadowFrame& shadow_frame, size_t result_reg,
522d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    int32_t dividend, int32_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
523d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  if (UNLIKELY(divisor == 0)) {
524d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero");
525d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) {
526d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVReg(result_reg, 0);
527d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else {
528d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVReg(result_reg, dividend % divisor);
529d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  }
530d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao}
531d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao
532d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoLongDivide(Thread* self, ShadowFrame& shadow_frame, size_t result_reg,
533d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    int64_t dividend, int64_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
534d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  if (UNLIKELY(divisor == 0)) {
535d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero");
536d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) {
537d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVRegLong(result_reg, kMinLong);
538d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else {
539d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVRegLong(result_reg, dividend / divisor);
540d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  }
541d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao}
542d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao
543d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoLongRemainder(Thread* self, ShadowFrame& shadow_frame, size_t result_reg,
544d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    int64_t dividend, int64_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
545d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  if (UNLIKELY(divisor == 0)) {
546d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero");
547d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) {
548d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVRegLong(result_reg, 0);
549d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else {
550d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVRegLong(result_reg, dividend % divisor);
551d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  }
552d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao}
553d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao
5542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item,
5552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                      ShadowFrame& shadow_frame) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
5562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  const uint16_t* insns = code_item->insns_;
5572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  const Instruction* inst = Instruction::At(insns + shadow_frame.GetDexPC());
5582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  JValue result_register;
5592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  while (true) {
560373c52fd70336531010268a2de4f7d3b0f236924jeffhao    CheckSuspend(self);
561373c52fd70336531010268a2de4f7d3b0f236924jeffhao    uint32_t dex_pc = inst->GetDexPc(insns);
562373c52fd70336531010268a2de4f7d3b0f236924jeffhao    shadow_frame.SetDexPC(dex_pc);
563373c52fd70336531010268a2de4f7d3b0f236924jeffhao    Dbg::UpdateDebugger(dex_pc, self);
5642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    DecodedInstruction dec_insn(inst);
56564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    const bool kTracing = false;
5662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (kTracing) {
5672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      LOG(INFO) << PrettyMethod(shadow_frame.GetMethod())
5682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                << StringPrintf("\n0x%x: %s\nReferences:",
5692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                inst->GetDexPc(insns), inst->DumpString(&mh.GetDexFile()).c_str());
5702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      for (size_t i = 0; i < shadow_frame.NumberOfReferences(); ++i) {
5712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Object* o = shadow_frame.GetReference(i);
5722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (o != NULL) {
5732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          if (o->GetClass()->IsStringClass() && o->AsString()->GetCharArray() != NULL) {
5742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            LOG(INFO) << i << ": java.lang.String " << static_cast<void*>(o)
5752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                  << " \"" << o->AsString()->ToModifiedUtf8() << "\"";
5762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          } else {
5772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            LOG(INFO) << i << ": " << PrettyTypeOf(o) << " " << static_cast<void*>(o);
5782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          }
5792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
5802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          LOG(INFO) << i << ": null";
5812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
5822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
5832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      LOG(INFO) << "vregs:";
5842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      for (size_t i = 0; i < shadow_frame.NumberOfReferences(); ++i) {
5852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        LOG(INFO) << StringPrintf("%d: %08x", i, shadow_frame.GetVReg(i));
5862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
5872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
5882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    const Instruction* next_inst = inst->Next();
5892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    switch (dec_insn.opcode) {
5902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NOP:
5912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
5922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE:
5932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_FROM16:
5942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_16:
5952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
5962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
5972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_WIDE:
5982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_WIDE_FROM16:
5992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_WIDE_16:
6002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB));
6012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_OBJECT:
6032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_OBJECT_FROM16:
6042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_OBJECT_16:
6052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
6062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetReference(dec_insn.vA, shadow_frame.GetReference(dec_insn.vB));
6072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_RESULT:
6092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result_register.GetI());
6102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_RESULT_WIDE:
6122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, result_register.GetJ());
6132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_RESULT_OBJECT:
6152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetReferenceAndVReg(dec_insn.vA, result_register.GetL());
6162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_EXCEPTION: {
6182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Throwable* exception = self->GetException();
6192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        self->ClearException();
6202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetReferenceAndVReg(dec_insn.vA, exception);
6212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RETURN_VOID: {
6242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
6252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(0);
6262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;
6272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RETURN: {
6292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
6302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(0);
6312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetI(shadow_frame.GetVReg(dec_insn.vA));
6322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;
6332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RETURN_WIDE: {
6352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
6362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(shadow_frame.GetVRegLong(dec_insn.vA));
6372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;
6382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RETURN_OBJECT: {
6402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
6412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(0);
6422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetL(shadow_frame.GetReference(dec_insn.vA));
6432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;
6442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_4: {
64664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        int32_t val = static_cast<int32_t>(dec_insn.vB << 28) >> 28;
6472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, val);
6482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val == 0) {
6492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          shadow_frame.SetReference(dec_insn.vA, NULL);
6502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_16: {
6542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t val = static_cast<int16_t>(dec_insn.vB);
6552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, val);
6562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val == 0) {
6572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          shadow_frame.SetReference(dec_insn.vA, NULL);
6582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST: {
6622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t val = dec_insn.vB;
6632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, val);
6642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val == 0) {
6652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          shadow_frame.SetReference(dec_insn.vA, NULL);
6662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_HIGH16: {
6702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t val = dec_insn.vB << 16;
6712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, val);
6722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val == 0) {
6732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          shadow_frame.SetReference(dec_insn.vA, NULL);
6742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
67764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      case Instruction::CONST_WIDE_16:
67864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, static_cast<int16_t>(dec_insn.vB));
6792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
68064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      case Instruction::CONST_WIDE_32:
68164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, static_cast<int32_t>(dec_insn.vB));
6822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_WIDE:
68464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, dec_insn.vB_wide);
6852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_WIDE_HIGH16:
68764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, static_cast<uint64_t>(dec_insn.vB) << 48);
6882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_STRING:
6902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_STRING_JUMBO: {
6912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(!String::GetJavaLangString()->IsInitialized())) {
6922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          Runtime::Current()->GetClassLinker()->EnsureInitialized(String::GetJavaLangString(),
6932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                                  true, true);
6942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        String* s = mh.ResolveString(dec_insn.vB);
6962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetReferenceAndVReg(dec_insn.vA, s);
6972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6990a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao      case Instruction::CONST_CLASS: {
7000a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true);
7010a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        shadow_frame.SetReferenceAndVReg(dec_insn.vA, c);
7022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7030a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao      }
70487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::MONITOR_ENTER: {
70587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        Object* obj = shadow_frame.GetReference(dec_insn.vA);
70687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (UNLIKELY(obj == NULL)) {
70787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
70887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
70987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          DoMonitorEnter(self, obj);
71087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
7112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
71287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
71387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::MONITOR_EXIT: {
71487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        Object* obj = shadow_frame.GetReference(dec_insn.vA);
71587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (UNLIKELY(obj == NULL)) {
71687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
71787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
71887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          DoMonitorExit(self, obj);
71987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
7202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
72187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
7222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CHECK_CAST: {
7230a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true);
72487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (UNLIKELY(c == NULL)) {
72587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          CHECK(self->IsExceptionPending());
72687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
72787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          Object* obj = shadow_frame.GetReference(dec_insn.vA);
72887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) {
72987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao            self->ThrowNewExceptionF("Ljava/lang/ClassCastException;",
73087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao                "%s cannot be cast to %s",
73187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao                PrettyDescriptor(obj->GetClass()).c_str(),
73287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao                PrettyDescriptor(c).c_str());
73387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          }
7342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
7352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INSTANCE_OF: {
7380a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        Class* c = ResolveVerifyAndClinit(dec_insn.vC, shadow_frame.GetMethod(), self, false, true);
73987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (UNLIKELY(c == NULL)) {
74087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          CHECK(self->IsExceptionPending());
74187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
74287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          Object* obj = shadow_frame.GetReference(dec_insn.vB);
74387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, (obj != NULL && obj->InstanceOf(c)) ? 1 : 0);
74487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
7452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ARRAY_LENGTH:  {
74864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        Object* array = shadow_frame.GetReference(dec_insn.vB);
7492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(array == NULL)) {
7502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
7512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
7522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
75364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVReg(dec_insn.vA, array->AsArray()->GetLength());
7542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEW_INSTANCE: {
7572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Object* obj = AllocObjectFromCode(dec_insn.vB, shadow_frame.GetMethod(), self, true);
7582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetReferenceAndVReg(dec_insn.vA, obj);
7592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEW_ARRAY: {
7622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t length = shadow_frame.GetVReg(dec_insn.vB);
7632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Object* obj = AllocArrayFromCode(dec_insn.vC, shadow_frame.GetMethod(), length, self, true);
7642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetReferenceAndVReg(dec_insn.vA, obj);
7652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::FILLED_NEW_ARRAY:
76864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      case Instruction::FILLED_NEW_ARRAY_RANGE: {
76964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        bool is_range = (dec_insn.opcode == Instruction::FILLED_NEW_ARRAY_RANGE);
77064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        int32_t length = dec_insn.vA;
77164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        CHECK(is_range || length <= 5);
7720a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        Class* arrayClass = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true);
77364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        CHECK(arrayClass->IsArrayClass());
77464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        if (arrayClass->GetComponentType()->IsPrimitiveInt()) {
77564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          IntArray* newArray = IntArray::Alloc(self, length);
77664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          if (newArray != NULL) {
77764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers            for (int32_t i = 0; i < length; ++i) {
77864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers              if (is_range) {
77964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                newArray->Set(i, shadow_frame.GetVReg(dec_insn.vC + i));
78064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers              } else {
78164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                newArray->Set(i, shadow_frame.GetVReg(dec_insn.arg[i]));
78264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers              }
78364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers            }
78464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          }
78564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          result_register.SetL(newArray);
78664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        } else {
78764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          UNIMPLEMENTED(FATAL) << inst->DumpString(&mh.GetDexFile())
78864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers              << " for array type: " << PrettyDescriptor(arrayClass);
78964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        }
7902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
79164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
7922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMPL_FLOAT: {
7932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        float val1 = shadow_frame.GetVRegFloat(dec_insn.vB);
7942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        float val2 = shadow_frame.GetVRegFloat(dec_insn.vC);
7952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
7962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val1 == val2) {
7972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
7982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else if (val1 > val2) {
7992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 1;
8002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
8012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = -1;
8022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMPG_FLOAT: {
8072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        float val1 = shadow_frame.GetVRegFloat(dec_insn.vB);
8082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        float val2 = shadow_frame.GetVRegFloat(dec_insn.vC);
8092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
8102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val1 == val2) {
8112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
8122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else if (val1 < val2) {
8132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = -1;
8142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
8152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 1;
8162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMPL_DOUBLE: {
8212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        double val1 = shadow_frame.GetVRegDouble(dec_insn.vB);
8222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        double val2 = shadow_frame.GetVRegDouble(dec_insn.vC);
8232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
8242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val1 == val2) {
8252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
82658bf0c6d756ff59d3b50d3e90bcdada92b2c933fIan Rogers        } else if (val1 > val2) {
8272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 1;
8282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
8292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = -1;
8302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
8352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMPG_DOUBLE: {
8362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        double val1 = shadow_frame.GetVRegDouble(dec_insn.vB);
8372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        double val2 = shadow_frame.GetVRegDouble(dec_insn.vC);
8382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
8392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val1 == val2) {
8402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
84158bf0c6d756ff59d3b50d3e90bcdada92b2c933fIan Rogers        } else if (val1 < val2) {
8422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = -1;
8432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
8442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 1;
8452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMP_LONG: {
8502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int64_t val1 = shadow_frame.GetVRegLong(dec_insn.vB);
8512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int64_t val2 = shadow_frame.GetVRegLong(dec_insn.vC);
8522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
85387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val1 > val2) {
85464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          result = 1;
8552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else if (val1 == val2) {
8562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
8572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
85864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          result = -1;
8592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::THROW: {
8642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Throwable* t = shadow_frame.GetReference(dec_insn.vA)->AsThrowable();
86594d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        self->DeliverException(t);
8662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::GOTO:
8692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::GOTO_16:
8702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::GOTO_32: {
8712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint32_t dex_pc = inst->GetDexPc(insns);
8722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        next_inst = Instruction::At(insns + dex_pc + dec_insn.vA);
8732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
875556d637764b71563030c479bc35364a75188d559Ian Rogers      case Instruction::PACKED_SWITCH: {
876556d637764b71563030c479bc35364a75188d559Ian Rogers        uint32_t dex_pc = inst->GetDexPc(insns);
877556d637764b71563030c479bc35364a75188d559Ian Rogers        const uint16_t* switch_data = insns + dex_pc + dec_insn.vB;
878556d637764b71563030c479bc35364a75188d559Ian Rogers        int32_t test_val = shadow_frame.GetVReg(dec_insn.vA);
879556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kPackedSwitchSignature));
880556d637764b71563030c479bc35364a75188d559Ian Rogers        uint16_t size = switch_data[1];
881556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK_GT(size, 0);
882556d637764b71563030c479bc35364a75188d559Ian Rogers        const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]);
883556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK(IsAligned<4>(keys));
884556d637764b71563030c479bc35364a75188d559Ian Rogers        int32_t first_key = keys[0];
885556d637764b71563030c479bc35364a75188d559Ian Rogers        const int32_t* targets = reinterpret_cast<const int32_t*>(&switch_data[4]);
886556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK(IsAligned<4>(targets));
887556d637764b71563030c479bc35364a75188d559Ian Rogers        int32_t index = test_val - first_key;
888556d637764b71563030c479bc35364a75188d559Ian Rogers        if (index >= 0 && index < size) {
889556d637764b71563030c479bc35364a75188d559Ian Rogers          next_inst = Instruction::At(insns + dex_pc + targets[index]);
890556d637764b71563030c479bc35364a75188d559Ian Rogers        }
8912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
892556d637764b71563030c479bc35364a75188d559Ian Rogers      }
8932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPARSE_SWITCH: {
8942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint32_t dex_pc = inst->GetDexPc(insns);
895556d637764b71563030c479bc35364a75188d559Ian Rogers        const uint16_t* switch_data = insns + dex_pc + dec_insn.vB;
896556d637764b71563030c479bc35364a75188d559Ian Rogers        int32_t test_val = shadow_frame.GetVReg(dec_insn.vA);
897556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kSparseSwitchSignature));
898556d637764b71563030c479bc35364a75188d559Ian Rogers        uint16_t size = switch_data[1];
8992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        CHECK_GT(size, 0);
900556d637764b71563030c479bc35364a75188d559Ian Rogers        const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]);
9012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        CHECK(IsAligned<4>(keys));
9022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        const int32_t* entries = keys + size;
9032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        CHECK(IsAligned<4>(entries));
9042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int lo = 0;
9052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int hi = size - 1;
9062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        while (lo <= hi) {
9072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          int mid = (lo + hi) / 2;
9082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          int32_t foundVal = keys[mid];
909556d637764b71563030c479bc35364a75188d559Ian Rogers          if (test_val < foundVal) {
9102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            hi = mid - 1;
911556d637764b71563030c479bc35364a75188d559Ian Rogers          } else if (test_val > foundVal) {
9122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            lo = mid + 1;
9132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          } else {
9142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            next_inst = Instruction::At(insns + dex_pc + entries[mid]);
9152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            break;
9162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          }
9172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::FILL_ARRAY_DATA: {
92194d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* obj = shadow_frame.GetReference(dec_insn.vA);
92294d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        if (UNLIKELY(obj == NULL)) {
9232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          Thread::Current()->ThrowNewExceptionF("Ljava/lang/NullPointerException;",
9242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers              "null array in FILL_ARRAY_DATA");
9252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
9262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
92794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Array* array = obj->AsArray();
9282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DCHECK(array->IsArrayInstance() && !array->IsObjectArray());
9292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint32_t dex_pc = inst->GetDexPc(insns);
9302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        const Instruction::ArrayDataPayload* payload =
9312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            reinterpret_cast<const Instruction::ArrayDataPayload*>(insns + dex_pc + dec_insn.vB);
9322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) {
9332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          Thread::Current()->ThrowNewExceptionF("Ljava/lang/ArrayIndexOutOfBoundsException;",
9342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                "failed FILL_ARRAY_DATA; length=%d, index=%d",
9352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                array->GetLength(), payload->element_count);
9362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
9372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint32_t size_in_bytes = payload->element_count * payload->element_width;
9392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes);
9402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_EQ: {
9432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) == shadow_frame.GetVReg(dec_insn.vB)) {
9442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_NE: {
9502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) != shadow_frame.GetVReg(dec_insn.vB)) {
9512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_LT: {
9572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) < shadow_frame.GetVReg(dec_insn.vB)) {
9582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_GE: {
9642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) >= shadow_frame.GetVReg(dec_insn.vB)) {
9652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_GT: {
9712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) > shadow_frame.GetVReg(dec_insn.vB)) {
9722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_LE: {
9782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) <= shadow_frame.GetVReg(dec_insn.vB)) {
9792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_EQZ: {
9852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) == 0) {
9862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
9882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_NEZ: {
9922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) != 0) {
9932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
9952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_LTZ: {
9992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) < 0) {
10002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_GEZ: {
10062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) >= 0) {
10072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_GTZ: {
10132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) > 0) {
10142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_LEZ:  {
10202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) <= 0) {
10212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_BOOLEAN: {
102794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
10282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
103394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsBooleanArray()->Get(index));
10342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_BYTE: {
103794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
10382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
104394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsByteArray()->Get(index));
10442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_CHAR: {
104794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
10482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
105394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsCharArray()->Get(index));
10542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_SHORT: {
105794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
10582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
106394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsShortArray()->Get(index));
10642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET: {
106794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
10682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
107394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsIntArray()->Get(index));
10742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_WIDE:  {
107794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
10782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
108394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVRegLong(dec_insn.vA, a->AsLongArray()->Get(index));
10842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_OBJECT: {
108794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
10882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
109394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetReferenceAndVReg(dec_insn.vA, a->AsObjectArray<Object>()->Get(index));
10942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_BOOLEAN: {
10972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint8_t val = shadow_frame.GetVReg(dec_insn.vA);
109894d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
10992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
110494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsBooleanArray()->Set(index, val);
11052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_BYTE: {
11082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int8_t val = shadow_frame.GetVReg(dec_insn.vA);
110994d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
11102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
111594d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsByteArray()->Set(index, val);
11162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_CHAR: {
11192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint16_t val = shadow_frame.GetVReg(dec_insn.vA);
112094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
11212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
112694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsCharArray()->Set(index, val);
11272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_SHORT: {
11302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int16_t val = shadow_frame.GetVReg(dec_insn.vA);
113194d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
11322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
113794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsShortArray()->Set(index, val);
11382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT: {
11412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t val = shadow_frame.GetVReg(dec_insn.vA);
114294d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
11432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
114894d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsIntArray()->Set(index, val);
11492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_WIDE: {
11522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int64_t val = shadow_frame.GetVRegLong(dec_insn.vA);
115394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
11542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
115994d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsLongArray()->Set(index, val);
11602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_OBJECT: {
11632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Object* val = shadow_frame.GetReference(dec_insn.vA);
116494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Object* a = shadow_frame.GetReference(dec_insn.vB);
11652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
117094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsObjectArray<Object>()->Set(index, val);
11712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_BOOLEAN:
11742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimBoolean);
11752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_BYTE:
11772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimByte);
11782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_CHAR:
11802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimChar);
11812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_SHORT:
11832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimShort);
11842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET:
11862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimInt);
11872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_WIDE:
11892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimLong);
11902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_OBJECT:
11922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstanceObjectRead, Primitive::kPrimNot);
11932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_BOOLEAN:
11952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimBoolean);
11962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_BYTE:
11982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimByte);
11992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_CHAR:
12012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimChar);
12022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_SHORT:
12042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimShort);
12052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET:
12072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimInt);
12082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_WIDE:
12102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimLong);
12112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_OBJECT:
12132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticObjectRead, Primitive::kPrimNot);
12142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_BOOLEAN:
12162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimBoolean);
12172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_BYTE:
12192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimByte);
12202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_CHAR:
12222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimChar);
12232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_SHORT:
12252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimShort);
12262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT:
12282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimInt);
12292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_WIDE:
12312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimLong);
12322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_OBJECT:
12342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstanceObjectWrite, Primitive::kPrimNot);
12352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_BOOLEAN:
12372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimBoolean);
12382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_BYTE:
12402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimByte);
12412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_CHAR:
12432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimChar);
12442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_SHORT:
12462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimShort);
12472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT:
12492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimInt);
12502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_WIDE:
12522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimLong);
12532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_OBJECT:
12552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticObjectWrite, Primitive::kPrimNot);
12562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_VIRTUAL:
12582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kVirtual, false, &result_register);
12592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_VIRTUAL_RANGE:
12612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kVirtual, true, &result_register);
12622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_SUPER:
12642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kSuper, false, &result_register);
12652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_SUPER_RANGE:
12672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kSuper, true, &result_register);
12682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_DIRECT:
12702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kDirect, false, &result_register);
12712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_DIRECT_RANGE:
12732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kDirect, true, &result_register);
12742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_INTERFACE:
12762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kInterface, false, &result_register);
12772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_INTERFACE_RANGE:
12792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kInterface, true, &result_register);
12802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_STATIC:
12822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kStatic, false, &result_register);
12832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_STATIC_RANGE:
12852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kStatic, true, &result_register);
12862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEG_INT:
12882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, -shadow_frame.GetVReg(dec_insn.vB));
12892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NOT_INT:
12912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, 0 ^ shadow_frame.GetVReg(dec_insn.vB));
12922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEG_LONG:
12942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, -shadow_frame.GetVRegLong(dec_insn.vB));
12952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NOT_LONG:
12972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, 0 ^ shadow_frame.GetVRegLong(dec_insn.vB));
12982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEG_FLOAT:
13002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA, -shadow_frame.GetVRegFloat(dec_insn.vB));
13012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEG_DOUBLE:
13032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA, -shadow_frame.GetVRegDouble(dec_insn.vB));
13042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_LONG:
13062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
13072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_FLOAT:
13092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
13102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_DOUBLE:
13122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
13132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::LONG_TO_INT:
13152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB));
13162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::LONG_TO_FLOAT:
13182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB));
13192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::LONG_TO_DOUBLE:
13212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB));
13222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
132387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::FLOAT_TO_INT: {
132487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        float val = shadow_frame.GetVRegFloat(dec_insn.vB);
132587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val != val) {
132687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, 0);
132787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val > static_cast<float>(kMaxInt)) {
132887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, kMaxInt);
132987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val < static_cast<float>(kMinInt)) {
133087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, kMinInt);
133187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
133287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, val);
133387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
13342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
133587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
133687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::FLOAT_TO_LONG: {
133787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        float val = shadow_frame.GetVRegFloat(dec_insn.vB);
133887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val != val) {
133987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, 0);
134087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val > static_cast<float>(kMaxLong)) {
134187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, kMaxLong);
134287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val < static_cast<float>(kMinLong)) {
134387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, kMinLong);
134487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
134587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, val);
134687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
13472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
134887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
13492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::FLOAT_TO_DOUBLE:
13502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVRegFloat(dec_insn.vB));
13512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
135287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::DOUBLE_TO_INT: {
135387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        double val = shadow_frame.GetVRegDouble(dec_insn.vB);
135487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val != val) {
135587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, 0);
135687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val > static_cast<double>(kMaxInt)) {
135787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, kMaxInt);
135887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val < static_cast<double>(kMinInt)) {
135987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, kMinInt);
136087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
136187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, val);
136287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
13632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
136487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
136587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::DOUBLE_TO_LONG: {
136687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        double val = shadow_frame.GetVRegDouble(dec_insn.vB);
136787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val != val) {
136887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, 0);
136987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val > static_cast<double>(kMaxLong)) {
137087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, kMaxLong);
137187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val < static_cast<double>(kMinLong)) {
137287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, kMinLong);
137387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
137487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, val);
137587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
13762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
137787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
13782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DOUBLE_TO_FLOAT:
13792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVRegDouble(dec_insn.vB));
13802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_BYTE:
13822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, static_cast<int8_t>(shadow_frame.GetVReg(dec_insn.vB)));
13832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_CHAR:
13852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, static_cast<uint16_t>(shadow_frame.GetVReg(dec_insn.vB)));
13862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_SHORT:
13882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, static_cast<int16_t>(shadow_frame.GetVReg(dec_insn.vB)));
13892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_INT:
13912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
13922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) + shadow_frame.GetVReg(dec_insn.vC));
13932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_INT:
13952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
13962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) - shadow_frame.GetVReg(dec_insn.vC));
13972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_INT:
13992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) * shadow_frame.GetVReg(dec_insn.vC));
14012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_INT:
1403d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB),
1404d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                       shadow_frame.GetVReg(dec_insn.vC));
14052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_INT:
1407d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB),
1408d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    shadow_frame.GetVReg(dec_insn.vC));
14092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_INT:
14112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) << shadow_frame.GetVReg(dec_insn.vC));
14132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_INT:
14152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) >> shadow_frame.GetVReg(dec_insn.vC));
14172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_INT:
14192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vB)) >>
14212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vC));
14222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_INT:
14242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) & shadow_frame.GetVReg(dec_insn.vC));
14262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_INT:
14282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) | shadow_frame.GetVReg(dec_insn.vC));
14302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_INT:
14322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) ^ shadow_frame.GetVReg(dec_insn.vC));
14342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_LONG:
14362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) +
14382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_LONG:
14412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) -
14432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_LONG:
14462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) *
14482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_LONG:
1451d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoLongDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB),
1452d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    shadow_frame.GetVRegLong(dec_insn.vC));
14532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_LONG:
1455d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoLongRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB),
1456d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                        shadow_frame.GetVRegLong(dec_insn.vC));
14572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_LONG:
14592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) &
14612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_LONG:
14642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) |
14662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_LONG:
14692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) ^
14712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_LONG:
14742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) <<
14762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVReg(dec_insn.vC));
14772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_LONG:
14792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) >>
14812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVReg(dec_insn.vC));
14822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_LONG:
14842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 static_cast<uint64_t>(shadow_frame.GetVRegLong(dec_insn.vB)) >>
14862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVReg(dec_insn.vC));
14872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_FLOAT:
14892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
14902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB) +
14912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vC));
14922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_FLOAT:
14942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
14952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB) -
14962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vC));
14972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_FLOAT:
14992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
15002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB) *
15012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vC));
15022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_FLOAT:
15042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
15052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB) /
15062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vC));
15072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_FLOAT:
15092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
15102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  fmodf(shadow_frame.GetVRegFloat(dec_insn.vB),
15112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                        shadow_frame.GetVRegFloat(dec_insn.vC)));
15122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_DOUBLE:
15142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB) +
15162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vC));
15172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_DOUBLE:
15192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB) -
15212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vC));
15222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_DOUBLE:
15242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB) *
15262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vC));
15272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_DOUBLE:
15292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB) /
15312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vC));
15322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_DOUBLE:
15342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   fmod(shadow_frame.GetVRegDouble(dec_insn.vB),
15362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                        shadow_frame.GetVRegDouble(dec_insn.vC)));
15372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_INT_2ADDR:
15392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) + shadow_frame.GetVReg(dec_insn.vB));
15412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_INT_2ADDR:
15432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) - shadow_frame.GetVReg(dec_insn.vB));
15452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_INT_2ADDR:
15472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) * shadow_frame.GetVReg(dec_insn.vB));
15492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_INT_2ADDR:
1551d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA),
1552d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                       shadow_frame.GetVReg(dec_insn.vB));
15532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_INT_2ADDR:
15552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) << shadow_frame.GetVReg(dec_insn.vB));
15572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_INT_2ADDR:
15592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) >> shadow_frame.GetVReg(dec_insn.vB));
15612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_INT_2ADDR:
15632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vA)) >>
15652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB));
15662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_INT_2ADDR:
15682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) & shadow_frame.GetVReg(dec_insn.vB));
15702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_INT_2ADDR:
15722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) | shadow_frame.GetVReg(dec_insn.vB));
15742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_INT_2ADDR:
15762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) ^ shadow_frame.GetVReg(dec_insn.vB));
15782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_INT_2ADDR:
1580d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA),
1581d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    shadow_frame.GetVReg(dec_insn.vB));
15822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_LONG_2ADDR:
15842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
15852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) +
15862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
15872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_LONG_2ADDR:
15892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
15902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) -
15912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
15922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_LONG_2ADDR:
15942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
159564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) *
15962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
15972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_LONG_2ADDR:
1599d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoLongDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vA),
1600d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    shadow_frame.GetVRegLong(dec_insn.vB));
16012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_LONG_2ADDR:
1603d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoLongRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vA),
1604d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                        shadow_frame.GetVRegLong(dec_insn.vB));
16052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_LONG_2ADDR:
16072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) &
16092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
16102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_LONG_2ADDR:
16122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) |
16142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
16152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_LONG_2ADDR:
16172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) ^
16192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
16202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_LONG_2ADDR:
16222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) <<
16242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVReg(dec_insn.vB));
16252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_LONG_2ADDR:
16272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) >>
16292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVReg(dec_insn.vB));
16302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_LONG_2ADDR:
16322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 static_cast<uint64_t>(shadow_frame.GetVRegLong(dec_insn.vA)) >>
16342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVReg(dec_insn.vB));
16352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_FLOAT_2ADDR:
16372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vA) +
16392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB));
16402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_FLOAT_2ADDR:
16422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vA) -
16442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB));
16452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_FLOAT_2ADDR:
16472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vA) *
16492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB));
16502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_FLOAT_2ADDR:
16522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vA) /
16542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB));
16552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_FLOAT_2ADDR:
16572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  fmodf(shadow_frame.GetVRegFloat(dec_insn.vA),
16592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                        shadow_frame.GetVRegFloat(dec_insn.vB)));
16602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_DOUBLE_2ADDR:
16622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
16632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vA) +
16642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB));
16652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_DOUBLE_2ADDR:
16672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
16682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vA) -
16692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB));
16702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_DOUBLE_2ADDR:
16722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
16732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vA) *
16742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB));
16752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_DOUBLE_2ADDR:
16772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
16782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vA) /
16792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB));
16802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_DOUBLE_2ADDR:
16822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
16832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   fmod(shadow_frame.GetVRegDouble(dec_insn.vA),
16842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                        shadow_frame.GetVRegDouble(dec_insn.vB)));
16852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_INT_LIT16:
16872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_INT_LIT8:
16882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) + dec_insn.vC);
16892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RSUB_INT:
16912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RSUB_INT_LIT8:
16922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, dec_insn.vC - shadow_frame.GetVReg(dec_insn.vB));
16932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_INT_LIT16:
16952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_INT_LIT8:
16962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) * dec_insn.vC);
16972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_INT_LIT16:
16992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_INT_LIT8:
1700d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB),
1701d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    dec_insn.vC);
17022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_INT_LIT16:
17042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_INT_LIT8:
1705d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB),
1706d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                       dec_insn.vC);
17072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_INT_LIT16:
17092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_INT_LIT8:
17102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) & dec_insn.vC);
17112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_INT_LIT16:
17132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_INT_LIT8:
17142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) | dec_insn.vC);
17152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_INT_LIT16:
17172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_INT_LIT8:
17182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) ^ dec_insn.vC);
17192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_INT_LIT8:
17212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) << dec_insn.vC);
17222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_INT_LIT8:
17242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) >> dec_insn.vC);
17252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_INT_LIT8:
17272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
17282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vB)) >>
17292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             dec_insn.vC);
17302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      default:
17322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        LOG(FATAL) << "Unexpected instruction: " << inst->DumpString(&mh.GetDexFile());
17332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
17352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (UNLIKELY(self->IsExceptionPending())) {
17362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      uint32_t found_dex_pc =
17372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          shadow_frame.GetMethod()->FindCatchBlock(self->GetException()->GetClass(),
17382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                   inst->GetDexPc(insns));
17392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      if (found_dex_pc == DexFile::kDexNoIndex) {
17402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
17412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(0);
17422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;  // Handler in caller.
17432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      } else {
17442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        next_inst = Instruction::At(insns + found_dex_pc);
17452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
17462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
17472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    inst = next_inst;
17482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
17492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
17502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
17512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersvoid EnterInterpreterFromInvoke(Thread* self, AbstractMethod* method, Object* receiver,
17522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                JValue* args, JValue* result) {
175364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  DCHECK_EQ(self, Thread::Current());
1754d752132c73072084a3def9257cca4fcee76047b6jeffhao  if (__builtin_frame_address(0) < self->GetStackEnd()) {
1755d752132c73072084a3def9257cca4fcee76047b6jeffhao    ThrowStackOverflowError(self);
1756d752132c73072084a3def9257cca4fcee76047b6jeffhao    return;
1757d752132c73072084a3def9257cca4fcee76047b6jeffhao  }
1758d752132c73072084a3def9257cca4fcee76047b6jeffhao
17592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  MethodHelper mh(method);
17602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  const DexFile::CodeItem* code_item = mh.GetCodeItem();
17612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint16_t num_regs;
17622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint16_t num_ins;
17632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (code_item != NULL) {
17642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    num_regs =  code_item->registers_size_;
17652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    num_ins = code_item->ins_size_;
17660a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao  } else if (method->IsAbstract()) {
17670a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao    self->ThrowNewExceptionF("Ljava/lang/AbstractMethodError;", "abstract method \"%s\"",
17680a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao                             PrettyMethod(method).c_str());
17690a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao    return;
17702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else {
17712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    DCHECK(method->IsNative());
17722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty());
17732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (!method->IsStatic()) {
17742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      num_regs++;
17752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      num_ins++;
17762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
17772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
17782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  // Set up shadow frame with matching number of reference slots to vregs.
17792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame();
17802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  UniquePtr<ShadowFrame> shadow_frame(ShadowFrame::Create(num_regs, num_regs,
17812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                          (last_shadow_frame == NULL) ? NULL : last_shadow_frame->GetLink(),
17822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                          method, 0));
17832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  self->PushShadowFrame(shadow_frame.get());
17842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  size_t cur_reg = num_regs - num_ins;
17852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (!method->IsStatic()) {
17862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    CHECK(receiver != NULL);
17872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    shadow_frame->SetReferenceAndVReg(cur_reg, receiver);
17882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    ++cur_reg;
17892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else if (!method->GetDeclaringClass()->IsInitializing()) {
179094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao    if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(),
179194d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao                                                                 true, true)) {
179294d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao      DCHECK(Thread::Current()->IsExceptionPending());
179394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao      return;
179494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao    }
17952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    CHECK(method->GetDeclaringClass()->IsInitializing());
17962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
179764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  const char* shorty = mh.GetShorty();
17982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  size_t arg_pos = 0;
17992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  for (; cur_reg < num_regs; ++cur_reg, ++arg_pos) {
18002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    DCHECK_LT(arg_pos + 1, mh.GetShortyLength());
18012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    switch (shorty[arg_pos + 1]) {
18022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case 'L': {
18032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Object* o = args[arg_pos].GetL();
18042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame->SetReferenceAndVReg(cur_reg, o);
18052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
18062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
18072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case 'J': case 'D':
18082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame->SetVRegLong(cur_reg, args[arg_pos].GetJ());
18092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        cur_reg++;
18102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
18112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      default:
18122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame->SetVReg(cur_reg, args[arg_pos].GetI());
18132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
18142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
18152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
181664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (LIKELY(!method->IsNative())) {
18172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    JValue r = Execute(self, mh, code_item, *shadow_frame.get());
18182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (result != NULL) {
18192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      *result = r;
18202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
18212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else {
182264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // We don't expect to be asked to interpret native code (which is entered via a JNI compiler
182364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // generated stub) except during testing and image writing.
182464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (!Runtime::Current()->IsStarted()) {
182564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      UnstartedRuntimeJni(self, method, receiver, args, result);
18262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    } else {
182764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      InterpreterJni(self, method, shorty, receiver, args, result);
18282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
18292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
18302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  self->PopShadowFrame();
18312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
18322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
18332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}  // namespace interpreter
18342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}  // namespace art
1835