interpreter.cc revision 11ffc2d02b7d979f26a8a04013fce3eb4f9a2816
12fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers/*
22fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Copyright (C) 2012 The Android Open Source Project
32fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers *
42fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Licensed under the Apache License, Version 2.0 (the "License");
52fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * you may not use this file except in compliance with the License.
62fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * You may obtain a copy of the License at
72fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers *
82fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers *      http://www.apache.org/licenses/LICENSE-2.0
92fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers *
102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * Unless required by applicable law or agreed to in writing, software
112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * distributed under the License is distributed on an "AS IS" BASIS,
122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * See the License for the specific language governing permissions and
142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers * limitations under the License.
152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers */
162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "interpreter.h"
182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include <math.h>
202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
2107ed66b5ae659c452cbe1ab20c3dbf1d6f546461Elliott Hughes#include "base/logging.h"
222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "class_linker-inl.h"
232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "common_throws.h"
24373c52fd70336531010268a2de4f7d3b0f236924jeffhao#include "debugger.h"
252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "dex_instruction.h"
262dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "gc/card_table-inl.h"
272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "invoke_arg_array_builder.h"
2864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers#include "nth_caller_visitor.h"
292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class.h"
302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/class-inl.h"
312dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/field-inl.h"
322dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method.h"
332dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/abstract_method-inl.h"
342dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h"
352dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h"
362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "object_utils.h"
372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "runtime_support.h"
382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "ScopedLocalRef.h"
392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "scoped_thread_state_change.h"
402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers#include "thread.h"
412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
422dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersusing namespace art::mirror;
432dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers
442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace art {
452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersnamespace interpreter {
462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
4787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMaxInt = std::numeric_limits<int32_t>::max();
4887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int32_t kMinInt = std::numeric_limits<int32_t>::min();
4987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMaxLong = std::numeric_limits<int64_t>::max();
5087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhaostatic const int64_t kMinLong = std::numeric_limits<int64_t>::min();
5187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao
529b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhaostatic JDWP::FrameId throw_frame_id_ = 0;
539b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhaostatic AbstractMethod* throw_method_ = NULL;
549b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhaostatic uint32_t throw_dex_pc_ = 0;
559b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao
5664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeInvoke(Thread* self, AbstractMethod* target_method,
5764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   Object* receiver, JValue* args, JValue* result)
5864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
5964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  // In a runtime that's not started we intercept certain methods to avoid complicated dependency
6064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  // problems in core libraries.
6164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  std::string name(PrettyMethod(target_method));
6264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (name == "java.lang.Class java.lang.Class.forName(java.lang.String)") {
6364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    std::string descriptor(DotToDescriptor(args[0].GetL()->AsString()->ToModifiedUtf8().c_str()));
6464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    ClassLoader* class_loader = NULL; // shadow_frame.GetMethod()->GetDeclaringClass()->GetClassLoader();
6564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Class* found = Runtime::Current()->GetClassLinker()->FindClass(descriptor.c_str(),
6664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                                                   class_loader);
6764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(found != NULL) << "Class.forName failed in un-started runtime for class: "
6864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        << PrettyDescriptor(descriptor);
6964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(found);
7064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Object java.lang.Class.newInstance()") {
7164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Class* klass = receiver->AsClass();
7264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    AbstractMethod* c = klass->FindDeclaredDirectMethod("<init>", "()V");
7364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(c != NULL);
7464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Object* obj = klass->AllocObject(self);
7564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(obj != NULL);
7664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    EnterInterpreterFromInvoke(self, c, obj, NULL, NULL);
7764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(obj);
7864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.reflect.Field java.lang.Class.getDeclaredField(java.lang.String)") {
7964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // Special managed code cut-out to allow field lookup in a un-started runtime that'd fail
8064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // going the reflective Dex way.
8164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Class* klass = receiver->AsClass();
8264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    String* name = args[0].GetL()->AsString();
8364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Field* found = NULL;
8464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    FieldHelper fh;
8564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    ObjectArray<Field>* fields = klass->GetIFields();
8664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) {
8764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      Field* f = fields->Get(i);
8864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fh.ChangeField(f);
8964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      if (name->Equals(fh.GetName())) {
9064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        found = f;
9164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
9264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
9364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (found == NULL) {
9464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fields = klass->GetSFields();
9564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      for (int32_t i = 0; i < fields->GetLength() && found == NULL; ++i) {
9664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        Field* f = fields->Get(i);
9764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        fh.ChangeField(f);
9864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        if (name->Equals(fh.GetName())) {
9964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          found = f;
10064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        }
10164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
10264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
10364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(found != NULL)
10464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      << "Failed to find field in Class.getDeclaredField in un-started runtime. name="
10564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      << name->ToModifiedUtf8() << " class=" << PrettyDescriptor(klass);
10664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // TODO: getDeclaredField calls GetType once the field is found to ensure a
10764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    //       NoClassDefFoundError is thrown if the field's type cannot be resolved.
10864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(found);
10964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "void java.lang.System.arraycopy(java.lang.Object, int, java.lang.Object, int, int)") {
11064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // Special case array copying without initializing System.
11164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Class* ctype = args[0].GetL()->GetClass()->GetComponentType();
11264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint srcPos = args[1].GetI();
11364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint dstPos = args[3].GetI();
11464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint length = args[4].GetI();
11564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (!ctype->IsPrimitive()) {
11664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ObjectArray<Object>* src = args[0].GetL()->AsObjectArray<Object>();
11764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ObjectArray<Object>* dst = args[2].GetL()->AsObjectArray<Object>();
11864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      for (jint i = 0; i < length; ++i) {
11964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        dst->Set(dstPos + i, src->Get(srcPos + i));
12064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
12164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (ctype->IsPrimitiveChar()) {
12264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      CharArray* src = args[0].GetL()->AsCharArray();
12364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      CharArray* dst = args[2].GetL()->AsCharArray();
12464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      for (jint i = 0; i < length; ++i) {
12564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        dst->Set(dstPos + i, src->Get(srcPos + i));
12664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
12764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (ctype->IsPrimitiveInt()) {
12864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      IntArray* src = args[0].GetL()->AsIntArray();
12964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      IntArray* dst = args[2].GetL()->AsIntArray();
13064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      for (jint i = 0; i < length; ++i) {
13164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        dst->Set(dstPos + i, src->Get(srcPos + i));
13264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
13364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else {
13464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      UNIMPLEMENTED(FATAL) << "System.arraycopy of unexpected type: " << PrettyDescriptor(ctype);
13564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
13664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else {
13764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // Not special, continue with regular interpreter execution.
13864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    EnterInterpreterFromInvoke(self, target_method, receiver, args, result);
13964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  }
14064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers}
14164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers
14264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers// Hand select a number of methods to be run in a not yet started runtime without using JNI.
14364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void UnstartedRuntimeJni(Thread* self, AbstractMethod* method,
14464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                Object* receiver, JValue* args, JValue* result)
14564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
14664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  std::string name(PrettyMethod(method));
14764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (name == "java.lang.ClassLoader dalvik.system.VMStack.getCallingClassLoader()") {
14864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(NULL);
14964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Class dalvik.system.VMStack.getStackClass2()") {
1507a22fa657b972e8323692368975bc5a7be1cc0f5Ian Rogers    NthCallerVisitor visitor(self, 3);
15164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    visitor.WalkStack();
15264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(visitor.caller->GetDeclaringClass());
15364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "double java.lang.Math.log(double)") {
15464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetD(log(args[0].GetD()));
15564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.String java.lang.Class.getNameNative()") {
15664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(receiver->AsClass()->ComputeName());
15764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "int java.lang.Float.floatToRawIntBits(float)") {
15864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetI(args[0].GetI());
15964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "float java.lang.Float.intBitsToFloat(int)") {
16064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetF(args[0].GetF());
16164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "double java.lang.Math.exp(double)") {
16264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetD(exp(args[0].GetD()));
16364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Object java.lang.Object.internalClone()") {
16464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(receiver->Clone(self));
16564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "void java.lang.Object.notifyAll()") {
16664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    receiver->NotifyAll();
16764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "int java.lang.String.compareTo(java.lang.String)") {
16864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    String* rhs = args[0].GetL()->AsString();
16964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    CHECK(rhs != NULL);
17064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetI(receiver->AsString()->CompareTo(rhs));
17164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.String java.lang.String.intern()") {
17264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(receiver->AsString()->Intern());
17364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "int java.lang.String.fastIndexOf(int, int)") {
17464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetI(receiver->AsString()->FastIndexOf(args[0].GetI(), args[1].GetI()));
17564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Object java.lang.reflect.Array.createMultiArray(java.lang.Class, int[])") {
17664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(Array::CreateMultiArray(self, args[0].GetL()->AsClass(), args[1].GetL()->AsIntArray()));
17764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "java.lang.Object java.lang.Throwable.nativeFillInStackTrace()") {
17864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    ScopedObjectAccessUnchecked soa(self);
17964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetL(soa.Decode<Object*>(self->CreateInternalStackTrace(soa)));
18064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "boolean java.nio.ByteOrder.isLittleEndian()") {
18164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetJ(JNI_TRUE);
18264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "boolean sun.misc.Unsafe.compareAndSwapInt(java.lang.Object, long, int, int)") {
18364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Object* obj = args[0].GetL();
18464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jlong offset = args[1].GetJ();
18564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint expectedValue = args[2].GetI();
18664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    jint newValue = args[3].GetI();
18764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    byte* raw_addr = reinterpret_cast<byte*>(obj) + offset;
18864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    volatile int32_t* address = reinterpret_cast<volatile int32_t*>(raw_addr);
18964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // Note: android_atomic_release_cas() returns 0 on success, not failure.
19064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    int r = android_atomic_release_cas(expectedValue, newValue, address);
19164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    result->SetZ(r == 0);
19264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else if (name == "void sun.misc.Unsafe.putObject(java.lang.Object, long, java.lang.Object)") {
19364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Object* obj = args[0].GetL();
19464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    Object* newValue = args[2].GetL();
19564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    obj->SetFieldObject(MemberOffset(args[1].GetJ()), newValue, false);
19664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else {
19764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    LOG(FATAL) << "Attempt to invoke native method in non-started runtime: " << name;
19864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  }
19964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers}
20064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers
20164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogersstatic void InterpreterJni(Thread* self, AbstractMethod* method, StringPiece shorty,
20264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                           Object* receiver, JValue* args, JValue* result)
20364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
20464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  // TODO: The following enters JNI code using a typedef-ed function rather than the JNI compiler,
20564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  //       it should be removed and JNI compiled stubs used instead.
20664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  ScopedObjectAccessUnchecked soa(self);
20764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (method->IsStatic()) {
20864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (shorty == "L") {
20964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jobject (fnptr)(JNIEnv*, jclass);
21064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
21164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
21264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
213556d637764b71563030c479bc35364a75188d559Ian Rogers      jobject jresult;
214556d637764b71563030c479bc35364a75188d559Ian Rogers      {
215556d637764b71563030c479bc35364a75188d559Ian Rogers        ScopedThreadStateChange tsc(self, kNative);
216556d637764b71563030c479bc35364a75188d559Ian Rogers        jresult = fn(soa.Env(), klass.get());
217556d637764b71563030c479bc35364a75188d559Ian Rogers      }
218556d637764b71563030c479bc35364a75188d559Ian Rogers      result->SetL(soa.Decode<Object*>(jresult));
21964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "V") {
22064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef void (fnptr)(JNIEnv*, jclass);
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      fn(soa.Env(), klass.get());
22664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "Z") {
22764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jboolean (fnptr)(JNIEnv*, jclass);
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->SetZ(fn(soa.Env(), klass.get()));
23364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "BI") {
23464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jbyte (fnptr)(JNIEnv*, jclass, jint);
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      ScopedThreadStateChange tsc(self, kNative);
23964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetB(fn(soa.Env(), klass.get(), args[0].GetI()));
24064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "II") {
24164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jint (fnptr)(JNIEnv*, jclass, jint);
24264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
24364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
24464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
24564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
24664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetI(fn(soa.Env(), klass.get(), args[0].GetI()));
24764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "LL") {
24864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jobject (fnptr)(JNIEnv*, jclass, jobject);
24964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
25064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
25164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
25264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
25364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
254556d637764b71563030c479bc35364a75188d559Ian Rogers      jobject jresult;
255556d637764b71563030c479bc35364a75188d559Ian Rogers      {
256556d637764b71563030c479bc35364a75188d559Ian Rogers        ScopedThreadStateChange tsc(self, kNative);
257556d637764b71563030c479bc35364a75188d559Ian Rogers        jresult = fn(soa.Env(), klass.get(), arg0.get());
258556d637764b71563030c479bc35364a75188d559Ian Rogers      }
259556d637764b71563030c479bc35364a75188d559Ian Rogers      result->SetL(soa.Decode<Object*>(jresult));
26064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "IIZ") {
26164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jint (fnptr)(JNIEnv*, jclass, jint, jboolean);
26264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
26364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
26464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
26564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
26664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetI(fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ()));
26764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "ILI") {
26864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jint (fnptr)(JNIEnv*, jclass, jobject, jint);
26964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
27064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
27164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
27264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
27364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
27464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
27564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetI(fn(soa.Env(), klass.get(), arg0.get(), args[1].GetI()));
27664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "SIZ") {
27764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jshort (fnptr)(JNIEnv*, jclass, jint, jboolean);
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      ScopedThreadStateChange tsc(self, kNative);
28264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetS(fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ()));
28364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "VIZ") {
28464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef void (fnptr)(JNIEnv*, jclass, jint, jboolean);
28564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
28664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
28764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
28864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
28964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fn(soa.Env(), klass.get(), args[0].GetI(), args[1].GetZ());
29064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "ZLL") {
29164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jboolean (fnptr)(JNIEnv*, jclass, jobject, jobject);
29264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
29364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
29464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
29564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
29664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
29764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg1(soa.Env(),
29864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[1].GetL()));
29964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
30064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetZ(fn(soa.Env(), klass.get(), arg0.get(), arg1.get()));
30164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "ZILL") {
30264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jboolean (fnptr)(JNIEnv*, jclass, jint, jobject, jobject);
30364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
30464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
30564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
30664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg1(soa.Env(),
30764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[1].GetL()));
30864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg2(soa.Env(),
30964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[2].GetL()));
31064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
31164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetZ(fn(soa.Env(), klass.get(), args[0].GetI(), arg1.get(), arg2.get()));
31264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "VILII") {
31364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef void (fnptr)(JNIEnv*, jclass, jint, jobject, jint, jint);
31464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
31564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
31664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
31764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg1(soa.Env(),
31864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[1].GetL()));
31964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
32064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fn(soa.Env(), klass.get(), args[0].GetI(), arg1.get(), args[2].GetI(), args[3].GetI());
32164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "VLILII") {
32264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef void (fnptr)(JNIEnv*, jclass, jobject, jint, jobject, jint, jint);
32364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
32464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jclass> klass(soa.Env(),
32564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jclass>(method->GetDeclaringClass()));
32664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
32764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
32864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg2(soa.Env(),
32964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[2].GetL()));
33064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
33164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fn(soa.Env(), klass.get(), arg0.get(), args[1].GetI(), arg2.get(), args[3].GetI(),
33264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers         args[4].GetI());
33364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else {
33464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      LOG(FATAL) << "Do something with static native method: " << PrettyMethod(method)
33564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          << " shorty: " << shorty;
33664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
33764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else {
33864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (shorty == "L") {
33964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jobject (fnptr)(JNIEnv*, jobject);
34064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
34164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> rcvr(soa.Env(),
34264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(receiver));
343556d637764b71563030c479bc35364a75188d559Ian Rogers      jobject jresult;
344556d637764b71563030c479bc35364a75188d559Ian Rogers      {
345556d637764b71563030c479bc35364a75188d559Ian Rogers        ScopedThreadStateChange tsc(self, kNative);
346556d637764b71563030c479bc35364a75188d559Ian Rogers        jresult = fn(soa.Env(), rcvr.get());
347556d637764b71563030c479bc35364a75188d559Ian Rogers      }
348556d637764b71563030c479bc35364a75188d559Ian Rogers      result->SetL(soa.Decode<Object*>(jresult));
34964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "LL") {
35064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jobject (fnptr)(JNIEnv*, jobject, jobject);
35164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
35264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> rcvr(soa.Env(),
35364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(receiver));
35464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> arg0(soa.Env(),
35564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(args[0].GetL()));
356556d637764b71563030c479bc35364a75188d559Ian Rogers      jobject jresult;
357556d637764b71563030c479bc35364a75188d559Ian Rogers      {
358556d637764b71563030c479bc35364a75188d559Ian Rogers        ScopedThreadStateChange tsc(self, kNative);
359556d637764b71563030c479bc35364a75188d559Ian Rogers        jresult = fn(soa.Env(), rcvr.get(), arg0.get());
360556d637764b71563030c479bc35364a75188d559Ian Rogers
361556d637764b71563030c479bc35364a75188d559Ian Rogers      }
362556d637764b71563030c479bc35364a75188d559Ian Rogers      result->SetL(soa.Decode<Object*>(jresult));
36364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
36464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else if (shorty == "III") {
36564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      typedef jint (fnptr)(JNIEnv*, jobject, jint, jint);
36664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      fnptr* fn = reinterpret_cast<fnptr*>(method->GetNativeMethod());
36764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedLocalRef<jobject> rcvr(soa.Env(),
36864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                   soa.AddLocalReference<jobject>(receiver));
36964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      ScopedThreadStateChange tsc(self, kNative);
37064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      result->SetI(fn(soa.Env(), rcvr.get(), args[0].GetI(), args[1].GetI()));
37164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    } else {
37264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      LOG(FATAL) << "Do something with native method: " << PrettyMethod(method)
37364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          << " shorty: " << shorty;
37464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    }
37564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  }
37664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers}
37764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers
3782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorEnter(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS {
3792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  ref->MonitorEnter(self);
3802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
3812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
3822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoMonitorExit(Thread* self, Object* ref) NO_THREAD_SAFETY_ANALYSIS {
3832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  ref->MonitorExit(self);
3842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
3852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
3862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoInvoke(Thread* self, MethodHelper& mh, ShadowFrame& shadow_frame,
3872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                     const DecodedInstruction& dec_insn, InvokeType type, bool is_range,
3882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                     JValue* result)
3892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
3902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  Object* receiver;
3912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (type == kStatic) {
3922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    receiver = NULL;
3932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else {
394ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa    receiver = shadow_frame.GetVRegReference(dec_insn.vC);
3952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
3962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint32_t method_idx = dec_insn.vB;
3972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  AbstractMethod* target_method = FindMethodFromCode(method_idx, receiver,
3982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                     shadow_frame.GetMethod(), self, true,
3992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                     type);
4002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (UNLIKELY(target_method == NULL)) {
4012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    CHECK(self->IsExceptionPending());
4022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    result->SetJ(0);
4032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    return;
4042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
4052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  mh.ChangeMethod(target_method);
4062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  ArgArray arg_array(mh.GetShorty(), mh.GetShortyLength());
4072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (is_range) {
4082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    arg_array.BuildArgArray(shadow_frame, dec_insn.vC + (type != kStatic ? 1 : 0));
4092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else {
4102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    arg_array.BuildArgArray(shadow_frame, dec_insn.arg + (type != kStatic ? 1 : 0));
4112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
41264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (LIKELY(Runtime::Current()->IsStarted())) {
41364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    target_method->Invoke(self, receiver, arg_array.get(), result);
41464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  } else {
41564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    UnstartedRuntimeInvoke(self, target_method, receiver, arg_array.get(), result);
41664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  }
4172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  mh.ChangeMethod(shadow_frame.GetMethod());
4182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
4192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
4202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldGet(Thread* self, ShadowFrame& shadow_frame,
4212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                       const DecodedInstruction& dec_insn, FindFieldType find_type,
4222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                       Primitive::Type field_type)
4232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
4242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  bool is_static = (find_type == StaticObjectRead) || (find_type == StaticPrimitiveRead);
4252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint32_t field_idx = is_static ? dec_insn.vB : dec_insn.vC;
4262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self,
4272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                               find_type, Primitive::FieldSize(field_type));
4282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (LIKELY(f != NULL)) {
4292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    Object* obj;
4302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (is_static) {
4312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      obj = f->GetDeclaringClass();
4322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    } else {
433ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa      obj = shadow_frame.GetVRegReference(dec_insn.vB);
4342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      if (UNLIKELY(obj == NULL)) {
4352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        ThrowNullPointerExceptionForFieldAccess(f, true);
436689d9f0cee08a3baaa85a85fb365c7b99f503617Ian Rogers        return;
4372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
4382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
4392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    switch (field_type) {
4402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimBoolean:
4412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetBoolean(obj));
4422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimByte:
4442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetByte(obj));
4452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimChar:
4472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetChar(obj));
4482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimShort:
4502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetShort(obj));
4512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimInt:
4532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, f->GetInt(obj));
4542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimLong:
4562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, f->GetLong(obj));
4572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimNot:
459ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, f->GetObject(obj));
4602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      default:
4622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        LOG(FATAL) << "Unreachable: " << field_type;
4632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
4642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
4652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
4662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
4672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic void DoFieldPut(Thread* self, ShadowFrame& shadow_frame,
4682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                       const DecodedInstruction& dec_insn, FindFieldType find_type,
4692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                       Primitive::Type field_type)
4702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
4712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  bool is_static = (find_type == StaticObjectWrite) || (find_type == StaticPrimitiveWrite);
4722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint32_t field_idx = is_static ? dec_insn.vB : dec_insn.vC;
4732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  Field* f = FindFieldFromCode(field_idx, shadow_frame.GetMethod(), self,
4742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                               find_type, Primitive::FieldSize(field_type));
4752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (LIKELY(f != NULL)) {
4762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    Object* obj;
4772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (is_static) {
4782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      obj = f->GetDeclaringClass();
4792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    } else {
480ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa      obj = shadow_frame.GetVRegReference(dec_insn.vB);
4812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      if (UNLIKELY(obj == NULL)) {
4822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        ThrowNullPointerExceptionForFieldAccess(f, false);
483689d9f0cee08a3baaa85a85fb365c7b99f503617Ian Rogers        return;
4842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
4852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
4862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    switch (field_type) {
4872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimBoolean:
4882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetBoolean(obj, shadow_frame.GetVReg(dec_insn.vA));
4892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimByte:
4912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetByte(obj, shadow_frame.GetVReg(dec_insn.vA));
4922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimChar:
4942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetChar(obj, shadow_frame.GetVReg(dec_insn.vA));
4952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimShort:
4972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetShort(obj, shadow_frame.GetVReg(dec_insn.vA));
4982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
4992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimInt:
5002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetInt(obj, shadow_frame.GetVReg(dec_insn.vA));
5012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
5022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimLong:
5032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        f->SetLong(obj, shadow_frame.GetVRegLong(dec_insn.vA));
5042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
5052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Primitive::kPrimNot:
506ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        f->SetObj(obj, shadow_frame.GetVRegReference(dec_insn.vA));
5072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
5082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      default:
5092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        LOG(FATAL) << "Unreachable: " << field_type;
5102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
5112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
5122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
5132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
514d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoIntDivide(Thread* self, ShadowFrame& shadow_frame, size_t result_reg,
515d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    int32_t dividend, int32_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
516d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  if (UNLIKELY(divisor == 0)) {
517d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero");
518d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) {
519d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVReg(result_reg, kMinInt);
520d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else {
521d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVReg(result_reg, dividend / divisor);
522d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  }
523d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao}
524d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao
525d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoIntRemainder(Thread* self, ShadowFrame& shadow_frame, size_t result_reg,
526d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    int32_t dividend, int32_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
527d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  if (UNLIKELY(divisor == 0)) {
528d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero");
529d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else if (UNLIKELY(dividend == kMinInt && divisor == -1)) {
530d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVReg(result_reg, 0);
531d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else {
532d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVReg(result_reg, dividend % divisor);
533d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  }
534d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao}
535d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao
536d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoLongDivide(Thread* self, ShadowFrame& shadow_frame, size_t result_reg,
537d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    int64_t dividend, int64_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
538d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  if (UNLIKELY(divisor == 0)) {
539d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero");
540d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) {
541d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVRegLong(result_reg, kMinLong);
542d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else {
543d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVRegLong(result_reg, dividend / divisor);
544d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  }
545d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao}
546d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao
547d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhaostatic void DoLongRemainder(Thread* self, ShadowFrame& shadow_frame, size_t result_reg,
548d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    int64_t dividend, int64_t divisor) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
549d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  if (UNLIKELY(divisor == 0)) {
550d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    self->ThrowNewException("Ljava/lang/ArithmeticException;", "divide by zero");
551d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else if (UNLIKELY(dividend == kMinLong && divisor == -1)) {
552d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVRegLong(result_reg, 0);
553d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  } else {
554d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao    shadow_frame.SetVRegLong(result_reg, dividend % divisor);
555d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao  }
556d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao}
557d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao
5582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersstatic JValue Execute(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item,
559306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers                      ShadowFrame& shadow_frame, JValue result_register)
560306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
5612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  const uint16_t* insns = code_item->insns_;
5622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  const Instruction* inst = Instruction::At(insns + shadow_frame.GetDexPC());
56314f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao  bool entry = (inst->GetDexPc(insns) == 0);
5642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  while (true) {
565373c52fd70336531010268a2de4f7d3b0f236924jeffhao    CheckSuspend(self);
566373c52fd70336531010268a2de4f7d3b0f236924jeffhao    uint32_t dex_pc = inst->GetDexPc(insns);
567373c52fd70336531010268a2de4f7d3b0f236924jeffhao    shadow_frame.SetDexPC(dex_pc);
56814f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao    if (entry) {
56914f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao      Dbg::UpdateDebugger(-1, self);
57014f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao    }
57114f0db92225d34622fa5cb1a6dc9287334aaf6c7jeffhao    entry = false;
572373c52fd70336531010268a2de4f7d3b0f236924jeffhao    Dbg::UpdateDebugger(dex_pc, self);
5732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    DecodedInstruction dec_insn(inst);
57464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    const bool kTracing = false;
5752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (kTracing) {
5762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      LOG(INFO) << PrettyMethod(shadow_frame.GetMethod())
5772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                << StringPrintf("\n0x%x: %s\nReferences:",
5782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                inst->GetDexPc(insns), inst->DumpString(&mh.GetDexFile()).c_str());
579ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa      for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) {
580ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* o = shadow_frame.GetVRegReference(i);
5812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (o != NULL) {
5822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          if (o->GetClass()->IsStringClass() && o->AsString()->GetCharArray() != NULL) {
5832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            LOG(INFO) << i << ": java.lang.String " << static_cast<void*>(o)
5842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                  << " \"" << o->AsString()->ToModifiedUtf8() << "\"";
5852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          } else {
5862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            LOG(INFO) << i << ": " << PrettyTypeOf(o) << " " << static_cast<void*>(o);
5872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          }
5882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
5892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          LOG(INFO) << i << ": null";
5902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
5912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
5922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      LOG(INFO) << "vregs:";
593ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa      for (size_t i = 0; i < shadow_frame.NumberOfVRegs(); ++i) {
5942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        LOG(INFO) << StringPrintf("%d: %08x", i, shadow_frame.GetVReg(i));
5952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
5962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
5972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    const Instruction* next_inst = inst->Next();
5982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    switch (dec_insn.opcode) {
5992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NOP:
6002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE:
6022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_FROM16:
6032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_16:
6042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
6052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_WIDE:
6072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_WIDE_FROM16:
6082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_WIDE_16:
6092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB));
6102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_OBJECT:
6122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_OBJECT_FROM16:
6132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_OBJECT_16:
614ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, shadow_frame.GetVRegReference(dec_insn.vB));
6152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_RESULT:
6172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result_register.GetI());
6182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_RESULT_WIDE:
6202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, result_register.GetJ());
6212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_RESULT_OBJECT:
623ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, result_register.GetL());
6242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MOVE_EXCEPTION: {
6262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Throwable* exception = self->GetException();
6272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        self->ClearException();
628ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, exception);
6292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RETURN_VOID: {
6322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
6332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(0);
6342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;
6352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RETURN: {
6372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
6382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(0);
6392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetI(shadow_frame.GetVReg(dec_insn.vA));
6402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;
6412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RETURN_WIDE: {
6432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
6442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(shadow_frame.GetVRegLong(dec_insn.vA));
6452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;
6462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RETURN_OBJECT: {
6482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
6492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(0);
650ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        result.SetL(shadow_frame.GetVRegReference(dec_insn.vA));
6512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;
6522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_4: {
65464b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        int32_t val = static_cast<int32_t>(dec_insn.vB << 28) >> 28;
6552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, val);
6562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val == 0) {
657ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa          shadow_frame.SetVRegReference(dec_insn.vA, NULL);
6582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_16: {
6622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t val = static_cast<int16_t>(dec_insn.vB);
6632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, val);
6642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val == 0) {
665ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa          shadow_frame.SetVRegReference(dec_insn.vA, NULL);
6662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST: {
6702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t val = dec_insn.vB;
6712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, val);
6722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val == 0) {
673ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa          shadow_frame.SetVRegReference(dec_insn.vA, NULL);
6742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
6772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_HIGH16: {
6782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t val = dec_insn.vB << 16;
6792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, val);
6802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val == 0) {
681ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa          shadow_frame.SetVRegReference(dec_insn.vA, NULL);
6822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
6832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
68564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      case Instruction::CONST_WIDE_16:
68664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, static_cast<int16_t>(dec_insn.vB));
6872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
68864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      case Instruction::CONST_WIDE_32:
68964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, static_cast<int32_t>(dec_insn.vB));
6902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_WIDE:
69264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, dec_insn.vB_wide);
6932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_WIDE_HIGH16:
69564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, static_cast<uint64_t>(dec_insn.vB) << 48);
6962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
6972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_STRING:
6982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CONST_STRING_JUMBO: {
6992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(!String::GetJavaLangString()->IsInitialized())) {
7002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          Runtime::Current()->GetClassLinker()->EnsureInitialized(String::GetJavaLangString(),
7012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                                  true, true);
7022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
7032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        String* s = mh.ResolveString(dec_insn.vB);
704ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, s);
7052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7070a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao      case Instruction::CONST_CLASS: {
7080a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true);
709ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, c);
7102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7110a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao      }
71287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::MONITOR_ENTER: {
713ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* obj = shadow_frame.GetVRegReference(dec_insn.vA);
71487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (UNLIKELY(obj == NULL)) {
71587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
71687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
71787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          DoMonitorEnter(self, obj);
71887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
7192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
72087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
72187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::MONITOR_EXIT: {
722ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* obj = shadow_frame.GetVRegReference(dec_insn.vA);
72387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (UNLIKELY(obj == NULL)) {
72487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
72587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
72687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          DoMonitorExit(self, obj);
72787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
7282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
72987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
7302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CHECK_CAST: {
7310a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        Class* c = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true);
73287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (UNLIKELY(c == NULL)) {
73387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          CHECK(self->IsExceptionPending());
73487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
735ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa          Object* obj = shadow_frame.GetVRegReference(dec_insn.vA);
73687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          if (UNLIKELY(obj != NULL && !obj->InstanceOf(c))) {
73787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao            self->ThrowNewExceptionF("Ljava/lang/ClassCastException;",
73887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao                "%s cannot be cast to %s",
73987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao                PrettyDescriptor(obj->GetClass()).c_str(),
74087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao                PrettyDescriptor(c).c_str());
74187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          }
7422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
7432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INSTANCE_OF: {
7460a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        Class* c = ResolveVerifyAndClinit(dec_insn.vC, shadow_frame.GetMethod(), self, false, true);
74787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (UNLIKELY(c == NULL)) {
74887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          CHECK(self->IsExceptionPending());
74987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
750ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa          Object* obj = shadow_frame.GetVRegReference(dec_insn.vB);
75187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, (obj != NULL && obj->InstanceOf(c)) ? 1 : 0);
75287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
7532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ARRAY_LENGTH:  {
756ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* array = shadow_frame.GetVRegReference(dec_insn.vB);
7572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(array == NULL)) {
7582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
7592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
7602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
76164b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        shadow_frame.SetVReg(dec_insn.vA, array->AsArray()->GetLength());
7622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEW_INSTANCE: {
7652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Object* obj = AllocObjectFromCode(dec_insn.vB, shadow_frame.GetMethod(), self, true);
766ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, obj);
7672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEW_ARRAY: {
7702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t length = shadow_frame.GetVReg(dec_insn.vB);
7712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Object* obj = AllocArrayFromCode(dec_insn.vC, shadow_frame.GetMethod(), length, self, true);
772ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, obj);
7732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
7742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
7752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::FILLED_NEW_ARRAY:
77664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      case Instruction::FILLED_NEW_ARRAY_RANGE: {
77764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        bool is_range = (dec_insn.opcode == Instruction::FILLED_NEW_ARRAY_RANGE);
77864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        int32_t length = dec_insn.vA;
77964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        CHECK(is_range || length <= 5);
78042b4dc4280c25a624bf38e19da70be39d2676232jeffhao        if (UNLIKELY(length < 0)) {
78142b4dc4280c25a624bf38e19da70be39d2676232jeffhao          self->ThrowNewExceptionF("Ljava/lang/NegativeArraySizeException;", "%d", length);
78242b4dc4280c25a624bf38e19da70be39d2676232jeffhao          break;
78342b4dc4280c25a624bf38e19da70be39d2676232jeffhao        }
7840a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao        Class* arrayClass = ResolveVerifyAndClinit(dec_insn.vB, shadow_frame.GetMethod(), self, false, true);
78542b4dc4280c25a624bf38e19da70be39d2676232jeffhao        if (UNLIKELY(arrayClass == NULL)) {
78642b4dc4280c25a624bf38e19da70be39d2676232jeffhao          CHECK(self->IsExceptionPending());
78742b4dc4280c25a624bf38e19da70be39d2676232jeffhao          break;
78842b4dc4280c25a624bf38e19da70be39d2676232jeffhao        }
78964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        CHECK(arrayClass->IsArrayClass());
79042b4dc4280c25a624bf38e19da70be39d2676232jeffhao        Class* componentClass = arrayClass->GetComponentType();
79142b4dc4280c25a624bf38e19da70be39d2676232jeffhao        if (UNLIKELY(componentClass->IsPrimitive() && !componentClass->IsPrimitiveInt())) {
79242b4dc4280c25a624bf38e19da70be39d2676232jeffhao          if (componentClass->IsPrimitiveLong() || componentClass->IsPrimitiveDouble()) {
79342b4dc4280c25a624bf38e19da70be39d2676232jeffhao            self->ThrowNewExceptionF("Ljava/lang/RuntimeException;",
79442b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                     "Bad filled array request for type %s",
79542b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                     PrettyDescriptor(componentClass).c_str());
79642b4dc4280c25a624bf38e19da70be39d2676232jeffhao          } else {
79742b4dc4280c25a624bf38e19da70be39d2676232jeffhao            self->ThrowNewExceptionF("Ljava/lang/InternalError;",
79842b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                     "Found type %s; filled-new-array not implemented for anything but \'int\'",
79942b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                     PrettyDescriptor(componentClass).c_str());
80042b4dc4280c25a624bf38e19da70be39d2676232jeffhao          }
80142b4dc4280c25a624bf38e19da70be39d2676232jeffhao          break;
80242b4dc4280c25a624bf38e19da70be39d2676232jeffhao        }
80342b4dc4280c25a624bf38e19da70be39d2676232jeffhao        Object* newArray = Array::Alloc(self, arrayClass, length);
80442b4dc4280c25a624bf38e19da70be39d2676232jeffhao        if (newArray != NULL) {
80542b4dc4280c25a624bf38e19da70be39d2676232jeffhao          for (int32_t i = 0; i < length; ++i) {
80642b4dc4280c25a624bf38e19da70be39d2676232jeffhao            if (is_range) {
80742b4dc4280c25a624bf38e19da70be39d2676232jeffhao              if (componentClass->IsPrimitiveInt()) {
80842b4dc4280c25a624bf38e19da70be39d2676232jeffhao                newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(dec_insn.vC + i));
80942b4dc4280c25a624bf38e19da70be39d2676232jeffhao              } else {
81042b4dc4280c25a624bf38e19da70be39d2676232jeffhao                newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(dec_insn.vC + i));
81142b4dc4280c25a624bf38e19da70be39d2676232jeffhao              }
81242b4dc4280c25a624bf38e19da70be39d2676232jeffhao            } else {
81342b4dc4280c25a624bf38e19da70be39d2676232jeffhao              if (componentClass->IsPrimitiveInt()) {
81442b4dc4280c25a624bf38e19da70be39d2676232jeffhao                newArray->AsIntArray()->Set(i, shadow_frame.GetVReg(dec_insn.arg[i]));
81564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers              } else {
81642b4dc4280c25a624bf38e19da70be39d2676232jeffhao                newArray->AsObjectArray<Object>()->Set(i, shadow_frame.GetVRegReference(dec_insn.arg[i]));
81764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers              }
81864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers            }
81964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          }
82064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers        }
82142b4dc4280c25a624bf38e19da70be39d2676232jeffhao        result_register.SetL(newArray);
8222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
82364b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      }
8242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMPL_FLOAT: {
8252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        float val1 = shadow_frame.GetVRegFloat(dec_insn.vB);
8262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        float val2 = shadow_frame.GetVRegFloat(dec_insn.vC);
8272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
8282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val1 == val2) {
8292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
8302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else if (val1 > val2) {
8312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 1;
8322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
8332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = -1;
8342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMPG_FLOAT: {
8392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        float val1 = shadow_frame.GetVRegFloat(dec_insn.vB);
8402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        float val2 = shadow_frame.GetVRegFloat(dec_insn.vC);
8412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
8422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val1 == val2) {
8432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
8442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else if (val1 < val2) {
8452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = -1;
8462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
8472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 1;
8482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMPL_DOUBLE: {
8532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        double val1 = shadow_frame.GetVRegDouble(dec_insn.vB);
8542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        double val2 = shadow_frame.GetVRegDouble(dec_insn.vC);
8552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
8562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val1 == val2) {
8572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
85858bf0c6d756ff59d3b50d3e90bcdada92b2c933fIan Rogers        } else if (val1 > val2) {
8592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 1;
8602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
8612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = -1;
8622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
8672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMPG_DOUBLE: {
8682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        double val1 = shadow_frame.GetVRegDouble(dec_insn.vB);
8692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        double val2 = shadow_frame.GetVRegDouble(dec_insn.vC);
8702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
8712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (val1 == val2) {
8722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
87358bf0c6d756ff59d3b50d3e90bcdada92b2c933fIan Rogers        } else if (val1 < val2) {
8742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = -1;
8752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
8762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 1;
8772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::CMP_LONG: {
8822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int64_t val1 = shadow_frame.GetVRegLong(dec_insn.vB);
8832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int64_t val2 = shadow_frame.GetVRegLong(dec_insn.vC);
8842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t result;
88587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val1 > val2) {
88664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          result = 1;
8872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else if (val1 == val2) {
8882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          result = 0;
8892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        } else {
89064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers          result = -1;
8912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
8922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, result);
8932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
8942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
8952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::THROW: {
8965f548e0a4151ae56c14d88f188872b573599f952Ian Rogers        Object* o = shadow_frame.GetVRegReference(dec_insn.vA);
8975f548e0a4151ae56c14d88f188872b573599f952Ian Rogers        Throwable* t = (o == NULL) ? NULL : o->AsThrowable();
89894d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        self->DeliverException(t);
8992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::GOTO:
9022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::GOTO_16:
9032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::GOTO_32: {
9042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint32_t dex_pc = inst->GetDexPc(insns);
9052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        next_inst = Instruction::At(insns + dex_pc + dec_insn.vA);
9062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
908556d637764b71563030c479bc35364a75188d559Ian Rogers      case Instruction::PACKED_SWITCH: {
909556d637764b71563030c479bc35364a75188d559Ian Rogers        uint32_t dex_pc = inst->GetDexPc(insns);
910556d637764b71563030c479bc35364a75188d559Ian Rogers        const uint16_t* switch_data = insns + dex_pc + dec_insn.vB;
911556d637764b71563030c479bc35364a75188d559Ian Rogers        int32_t test_val = shadow_frame.GetVReg(dec_insn.vA);
912556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kPackedSwitchSignature));
913556d637764b71563030c479bc35364a75188d559Ian Rogers        uint16_t size = switch_data[1];
914556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK_GT(size, 0);
915556d637764b71563030c479bc35364a75188d559Ian Rogers        const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]);
916556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK(IsAligned<4>(keys));
917556d637764b71563030c479bc35364a75188d559Ian Rogers        int32_t first_key = keys[0];
918556d637764b71563030c479bc35364a75188d559Ian Rogers        const int32_t* targets = reinterpret_cast<const int32_t*>(&switch_data[4]);
919556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK(IsAligned<4>(targets));
920556d637764b71563030c479bc35364a75188d559Ian Rogers        int32_t index = test_val - first_key;
921556d637764b71563030c479bc35364a75188d559Ian Rogers        if (index >= 0 && index < size) {
922556d637764b71563030c479bc35364a75188d559Ian Rogers          next_inst = Instruction::At(insns + dex_pc + targets[index]);
923556d637764b71563030c479bc35364a75188d559Ian Rogers        }
9242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
925556d637764b71563030c479bc35364a75188d559Ian Rogers      }
9262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPARSE_SWITCH: {
9272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint32_t dex_pc = inst->GetDexPc(insns);
928556d637764b71563030c479bc35364a75188d559Ian Rogers        const uint16_t* switch_data = insns + dex_pc + dec_insn.vB;
929556d637764b71563030c479bc35364a75188d559Ian Rogers        int32_t test_val = shadow_frame.GetVReg(dec_insn.vA);
930556d637764b71563030c479bc35364a75188d559Ian Rogers        CHECK_EQ(switch_data[0], static_cast<uint16_t>(Instruction::kSparseSwitchSignature));
931556d637764b71563030c479bc35364a75188d559Ian Rogers        uint16_t size = switch_data[1];
9322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        CHECK_GT(size, 0);
933556d637764b71563030c479bc35364a75188d559Ian Rogers        const int32_t* keys = reinterpret_cast<const int32_t*>(&switch_data[2]);
9342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        CHECK(IsAligned<4>(keys));
9352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        const int32_t* entries = keys + size;
9362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        CHECK(IsAligned<4>(entries));
9372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int lo = 0;
9382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int hi = size - 1;
9392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        while (lo <= hi) {
9402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          int mid = (lo + hi) / 2;
9412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          int32_t foundVal = keys[mid];
942556d637764b71563030c479bc35364a75188d559Ian Rogers          if (test_val < foundVal) {
9432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            hi = mid - 1;
944556d637764b71563030c479bc35364a75188d559Ian Rogers          } else if (test_val > foundVal) {
9452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            lo = mid + 1;
9462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          } else {
9472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            next_inst = Instruction::At(insns + dex_pc + entries[mid]);
9482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            break;
9492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          }
9502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::FILL_ARRAY_DATA: {
954ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* obj = shadow_frame.GetVRegReference(dec_insn.vA);
95594d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        if (UNLIKELY(obj == NULL)) {
9562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          Thread::Current()->ThrowNewExceptionF("Ljava/lang/NullPointerException;",
9572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers              "null array in FILL_ARRAY_DATA");
9582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
9592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
96094d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        Array* array = obj->AsArray();
9612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DCHECK(array->IsArrayInstance() && !array->IsObjectArray());
9622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint32_t dex_pc = inst->GetDexPc(insns);
9632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        const Instruction::ArrayDataPayload* payload =
9642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers            reinterpret_cast<const Instruction::ArrayDataPayload*>(insns + dex_pc + dec_insn.vB);
9652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(static_cast<int32_t>(payload->element_count) > array->GetLength())) {
9662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          Thread::Current()->ThrowNewExceptionF("Ljava/lang/ArrayIndexOutOfBoundsException;",
9672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                "failed FILL_ARRAY_DATA; length=%d, index=%d",
9682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                array->GetLength(), payload->element_count);
9692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
9702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint32_t size_in_bytes = payload->element_count * payload->element_width;
9722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        memcpy(array->GetRawData(payload->element_width), payload->data, size_in_bytes);
9732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_EQ: {
9762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) == shadow_frame.GetVReg(dec_insn.vB)) {
9772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_NE: {
9832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) != shadow_frame.GetVReg(dec_insn.vB)) {
9842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_LT: {
9902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) < shadow_frame.GetVReg(dec_insn.vB)) {
9912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
9932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
9942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
9952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
9962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_GE: {
9972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) >= shadow_frame.GetVReg(dec_insn.vB)) {
9982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
9992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
10002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_GT: {
10042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) > shadow_frame.GetVReg(dec_insn.vB)) {
10052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
10072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_LE: {
10112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) <= shadow_frame.GetVReg(dec_insn.vB)) {
10122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vC);
10142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_EQZ: {
10182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) == 0) {
10192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_NEZ: {
10252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) != 0) {
10262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_LTZ: {
10322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) < 0) {
10332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_GEZ: {
10392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) >= 0) {
10402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_GTZ: {
10462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) > 0) {
10472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IF_LEZ:  {
10532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (shadow_frame.GetVReg(dec_insn.vA) <= 0) {
10542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          uint32_t dex_pc = inst->GetDexPc(insns);
10552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          next_inst = Instruction::At(insns + dex_pc + dec_insn.vB);
10562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_BOOLEAN: {
1060ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
10612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
106694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsBooleanArray()->Get(index));
10672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_BYTE: {
1070ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
10712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
107694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsByteArray()->Get(index));
10772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_CHAR: {
1080ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
10812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
108694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsCharArray()->Get(index));
10872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_SHORT: {
1090ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
10912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
10922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
10932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
10942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
10952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
109694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsShortArray()->Get(index));
10972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
10982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
10992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET: {
1100ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
11012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
110694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVReg(dec_insn.vA, a->AsIntArray()->Get(index));
11072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_WIDE:  {
1110ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
11112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
111694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        shadow_frame.SetVRegLong(dec_insn.vA, a->AsLongArray()->Get(index));
11172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AGET_OBJECT: {
1120ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(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);
1126ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame.SetVRegReference(dec_insn.vA, a->AsObjectArray<Object>()->Get(index));
11272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_BOOLEAN: {
11302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint8_t val = shadow_frame.GetVReg(dec_insn.vA);
1131ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(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->AsBooleanArray()->Set(index, val);
11382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_BYTE: {
11412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int8_t val = shadow_frame.GetVReg(dec_insn.vA);
1142ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(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->AsByteArray()->Set(index, val);
11492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_CHAR: {
11522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        uint16_t val = shadow_frame.GetVReg(dec_insn.vA);
1153ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(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->AsCharArray()->Set(index, val);
11602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_SHORT: {
11632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int16_t val = shadow_frame.GetVReg(dec_insn.vA);
1164ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(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->AsShortArray()->Set(index, val);
11712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT: {
11742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t val = shadow_frame.GetVReg(dec_insn.vA);
1175ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
11762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
118194d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsIntArray()->Set(index, val);
11822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_WIDE: {
11852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int64_t val = shadow_frame.GetVRegLong(dec_insn.vA);
1186ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
11872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
11892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
11902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
11912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
119294d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsLongArray()->Set(index, val);
11932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
11942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
11952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::APUT_OBJECT: {
1196ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* val = shadow_frame.GetVRegReference(dec_insn.vA);
1197ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        Object* a = shadow_frame.GetVRegReference(dec_insn.vB);
11982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        if (UNLIKELY(a == NULL)) {
11992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          ThrowNullPointerExceptionFromDexPC(shadow_frame.GetMethod(), inst->GetDexPc(insns));
12002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          break;
12012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        }
12022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        int32_t index = shadow_frame.GetVReg(dec_insn.vC);
120394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao        a->AsObjectArray<Object>()->Set(index, val);
12042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
12062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_BOOLEAN:
12072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimBoolean);
12082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_BYTE:
12102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimByte);
12112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_CHAR:
12132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimChar);
12142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_SHORT:
12162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimShort);
12172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET:
12192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimInt);
12202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_WIDE:
12222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstancePrimitiveRead, Primitive::kPrimLong);
12232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IGET_OBJECT:
12252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, InstanceObjectRead, Primitive::kPrimNot);
12262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_BOOLEAN:
12282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimBoolean);
12292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_BYTE:
12312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimByte);
12322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_CHAR:
12342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimChar);
12352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_SHORT:
12372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimShort);
12382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET:
12402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimInt);
12412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_WIDE:
12432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticPrimitiveRead, Primitive::kPrimLong);
12442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SGET_OBJECT:
12462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldGet(self, shadow_frame, dec_insn, StaticObjectRead, Primitive::kPrimNot);
12472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_BOOLEAN:
12492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimBoolean);
12502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_BYTE:
12522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimByte);
12532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_CHAR:
12552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimChar);
12562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_SHORT:
12582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimShort);
12592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT:
12612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimInt);
12622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_WIDE:
12642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstancePrimitiveWrite, Primitive::kPrimLong);
12652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::IPUT_OBJECT:
12672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, InstanceObjectWrite, Primitive::kPrimNot);
12682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_BOOLEAN:
12702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimBoolean);
12712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_BYTE:
12732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimByte);
12742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_CHAR:
12762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimChar);
12772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_SHORT:
12792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimShort);
12802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT:
12822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimInt);
12832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_WIDE:
12852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticPrimitiveWrite, Primitive::kPrimLong);
12862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SPUT_OBJECT:
12882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoFieldPut(self, shadow_frame, dec_insn, StaticObjectWrite, Primitive::kPrimNot);
12892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_VIRTUAL:
12912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kVirtual, false, &result_register);
12922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_VIRTUAL_RANGE:
12942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kVirtual, true, &result_register);
12952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_SUPER:
12972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kSuper, false, &result_register);
12982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
12992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_SUPER_RANGE:
13002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kSuper, true, &result_register);
13012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_DIRECT:
13032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kDirect, false, &result_register);
13042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_DIRECT_RANGE:
13062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kDirect, true, &result_register);
13072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_INTERFACE:
13092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kInterface, false, &result_register);
13102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_INTERFACE_RANGE:
13122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kInterface, true, &result_register);
13132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_STATIC:
13152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kStatic, false, &result_register);
13162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INVOKE_STATIC_RANGE:
13182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        DoInvoke(self, mh, shadow_frame, dec_insn, kStatic, true, &result_register);
13192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEG_INT:
13212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, -shadow_frame.GetVReg(dec_insn.vB));
13222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NOT_INT:
132442b4dc4280c25a624bf38e19da70be39d2676232jeffhao        shadow_frame.SetVReg(dec_insn.vA, ~shadow_frame.GetVReg(dec_insn.vB));
13252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEG_LONG:
13272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, -shadow_frame.GetVRegLong(dec_insn.vB));
13282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NOT_LONG:
133042b4dc4280c25a624bf38e19da70be39d2676232jeffhao        shadow_frame.SetVRegLong(dec_insn.vA, ~shadow_frame.GetVRegLong(dec_insn.vB));
13312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEG_FLOAT:
13332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA, -shadow_frame.GetVRegFloat(dec_insn.vB));
13342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::NEG_DOUBLE:
13362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA, -shadow_frame.GetVRegDouble(dec_insn.vB));
13372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_LONG:
13392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
13402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_FLOAT:
13422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
13432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_DOUBLE:
13452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB));
13462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::LONG_TO_INT:
13482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB));
13492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::LONG_TO_FLOAT:
13512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB));
13522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
13532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::LONG_TO_DOUBLE:
13542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB));
13552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
135687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::FLOAT_TO_INT: {
135787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        float val = shadow_frame.GetVRegFloat(dec_insn.vB);
135887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val != val) {
135987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, 0);
136087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val > static_cast<float>(kMaxInt)) {
136187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, kMaxInt);
136287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val < static_cast<float>(kMinInt)) {
136387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, kMinInt);
136487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
136587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, val);
136687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
13672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
136887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
136987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::FLOAT_TO_LONG: {
137087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        float val = shadow_frame.GetVRegFloat(dec_insn.vB);
137187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val != val) {
137287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, 0);
137387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val > static_cast<float>(kMaxLong)) {
137487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, kMaxLong);
137587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val < static_cast<float>(kMinLong)) {
137687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, kMinLong);
137787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
137887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, val);
137987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
13802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
138187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
13822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::FLOAT_TO_DOUBLE:
13832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA, shadow_frame.GetVRegFloat(dec_insn.vB));
13842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
138587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::DOUBLE_TO_INT: {
138687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        double val = shadow_frame.GetVRegDouble(dec_insn.vB);
138787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val != val) {
138887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, 0);
138987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val > static_cast<double>(kMaxInt)) {
139087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, kMaxInt);
139187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val < static_cast<double>(kMinInt)) {
139287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, kMinInt);
139387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
139487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVReg(dec_insn.vA, val);
139587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
13962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
139787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
139887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      case Instruction::DOUBLE_TO_LONG: {
139987a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        double val = shadow_frame.GetVRegDouble(dec_insn.vB);
140087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        if (val != val) {
140187a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, 0);
140287a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val > static_cast<double>(kMaxLong)) {
140387a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, kMaxLong);
140487a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else if (val < static_cast<double>(kMinLong)) {
140587a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, kMinLong);
140687a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        } else {
140787a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao          shadow_frame.SetVRegLong(dec_insn.vA, val);
140887a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao        }
14092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
141087a6edd81227a60b3651f9d8e11bdabb793a535fjeffhao      }
14112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DOUBLE_TO_FLOAT:
14122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA, shadow_frame.GetVRegDouble(dec_insn.vB));
14132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_BYTE:
14152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, static_cast<int8_t>(shadow_frame.GetVReg(dec_insn.vB)));
14162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_CHAR:
14182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, static_cast<uint16_t>(shadow_frame.GetVReg(dec_insn.vB)));
14192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::INT_TO_SHORT:
14212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, static_cast<int16_t>(shadow_frame.GetVReg(dec_insn.vB)));
14222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_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::SUB_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::MUL_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::REM_INT:
1436d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB),
1437d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                       shadow_frame.GetVReg(dec_insn.vC));
14382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_INT:
1440d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB),
1441d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    shadow_frame.GetVReg(dec_insn.vC));
14422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_INT:
144442b4dc4280c25a624bf38e19da70be39d2676232jeffhao        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) <<
144542b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (shadow_frame.GetVReg(dec_insn.vC) & 0x1f));
14462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_INT:
144842b4dc4280c25a624bf38e19da70be39d2676232jeffhao        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) >>
144942b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (shadow_frame.GetVReg(dec_insn.vC) & 0x1f));
14502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_INT:
14522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vB)) >>
145442b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (shadow_frame.GetVReg(dec_insn.vC) & 0x1f));
14552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_INT:
14572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) & shadow_frame.GetVReg(dec_insn.vC));
14592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_INT:
14612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) | shadow_frame.GetVReg(dec_insn.vC));
14632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_INT:
14652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
14662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vB) ^ shadow_frame.GetVReg(dec_insn.vC));
14672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_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::SUB_LONG:
14742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) -
14762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_LONG:
14792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) *
14812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_LONG:
1484d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoLongDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB),
1485d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    shadow_frame.GetVRegLong(dec_insn.vC));
14862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_LONG:
1488d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoLongRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vB),
1489d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                        shadow_frame.GetVRegLong(dec_insn.vC));
14902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_LONG:
14922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) &
14942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
14952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
14962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_LONG:
14972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
14982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) |
14992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
15002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_LONG:
15022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
15032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) ^
15042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vC));
15052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_LONG:
15072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
15082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) <<
150942b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                 (shadow_frame.GetVReg(dec_insn.vC) & 0x3f));
15102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_LONG:
15122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
15132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB) >>
151442b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                 (shadow_frame.GetVReg(dec_insn.vC) & 0x3f));
15152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_LONG:
15172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
15182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 static_cast<uint64_t>(shadow_frame.GetVRegLong(dec_insn.vB)) >>
151942b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                 (shadow_frame.GetVReg(dec_insn.vC) & 0x3f));
15202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_FLOAT:
15222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
15232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB) +
15242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vC));
15252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_FLOAT:
15272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
15282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB) -
15292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vC));
15302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_FLOAT:
15322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
15332fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB) *
15342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vC));
15352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_FLOAT:
15372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
15382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB) /
15392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vC));
15402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_FLOAT:
15422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
15432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  fmodf(shadow_frame.GetVRegFloat(dec_insn.vB),
15442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                        shadow_frame.GetVRegFloat(dec_insn.vC)));
15452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_DOUBLE:
15472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB) +
15492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vC));
15502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_DOUBLE:
15522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB) -
15542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vC));
15552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_DOUBLE:
15572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB) *
15592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vC));
15602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_DOUBLE:
15622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB) /
15642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vC));
15652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_DOUBLE:
15672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
15682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   fmod(shadow_frame.GetVRegDouble(dec_insn.vB),
15692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                        shadow_frame.GetVRegDouble(dec_insn.vC)));
15702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_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::SUB_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::MUL_INT_2ADDR:
15802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) * shadow_frame.GetVReg(dec_insn.vB));
15822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_INT_2ADDR:
1584d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA),
1585d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                       shadow_frame.GetVReg(dec_insn.vB));
15862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_INT_2ADDR:
158842b4dc4280c25a624bf38e19da70be39d2676232jeffhao        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA) <<
158942b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (shadow_frame.GetVReg(dec_insn.vB) & 0x1f));
15902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_INT_2ADDR:
159242b4dc4280c25a624bf38e19da70be39d2676232jeffhao        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA) >>
159342b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (shadow_frame.GetVReg(dec_insn.vB) & 0x1f));
15942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
15952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_INT_2ADDR:
15962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
15972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vA)) >>
159842b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (shadow_frame.GetVReg(dec_insn.vB) & 0x1f));
15992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_INT_2ADDR:
16012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
16022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) & shadow_frame.GetVReg(dec_insn.vB));
16032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_INT_2ADDR:
16052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
16062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) | shadow_frame.GetVReg(dec_insn.vB));
16072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_INT_2ADDR:
16092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
16102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             shadow_frame.GetVReg(dec_insn.vA) ^ shadow_frame.GetVReg(dec_insn.vB));
16112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_INT_2ADDR:
1613d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vA),
1614d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    shadow_frame.GetVReg(dec_insn.vB));
16152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_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::SUB_LONG_2ADDR:
16222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16232fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) -
16242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
16252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_LONG_2ADDR:
16272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
162864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) *
16292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
16302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_LONG_2ADDR:
1632d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoLongDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vA),
1633d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    shadow_frame.GetVRegLong(dec_insn.vB));
16342fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_LONG_2ADDR:
1636d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoLongRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVRegLong(dec_insn.vA),
1637d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                        shadow_frame.GetVRegLong(dec_insn.vB));
16382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_LONG_2ADDR:
16402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) &
16422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
16432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_LONG_2ADDR:
16452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) |
16472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
16482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_LONG_2ADDR:
16502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) ^
16522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vB));
16532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_LONG_2ADDR:
16552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) <<
165742b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                 (shadow_frame.GetVReg(dec_insn.vB) & 0x3f));
16582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16592fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_LONG_2ADDR:
16602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 shadow_frame.GetVRegLong(dec_insn.vA) >>
166242b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                 (shadow_frame.GetVReg(dec_insn.vB) & 0x3f));
16632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_LONG_2ADDR:
16652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegLong(dec_insn.vA,
16662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                 static_cast<uint64_t>(shadow_frame.GetVRegLong(dec_insn.vA)) >>
166742b4dc4280c25a624bf38e19da70be39d2676232jeffhao                                 (shadow_frame.GetVReg(dec_insn.vB) & 0x3f));
16682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_FLOAT_2ADDR:
16702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vA) +
16722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB));
16732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_FLOAT_2ADDR:
16752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vA) -
16772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB));
16782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_FLOAT_2ADDR:
16802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vA) *
16822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB));
16832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16842fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_FLOAT_2ADDR:
16852fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16862fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vA) /
16872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  shadow_frame.GetVRegFloat(dec_insn.vB));
16882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_FLOAT_2ADDR:
16902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegFloat(dec_insn.vA,
16912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                  fmodf(shadow_frame.GetVRegFloat(dec_insn.vA),
16922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                        shadow_frame.GetVRegFloat(dec_insn.vB)));
16932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_DOUBLE_2ADDR:
16952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
16962fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vA) +
16972fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB));
16982fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
16992fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SUB_DOUBLE_2ADDR:
17002fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
17012fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vA) -
17022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB));
17032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_DOUBLE_2ADDR:
17052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
17062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vA) *
17072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB));
17082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17092fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_DOUBLE_2ADDR:
17102fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
17112fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vA) /
17122fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   shadow_frame.GetVRegDouble(dec_insn.vB));
17132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_DOUBLE_2ADDR:
17152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVRegDouble(dec_insn.vA,
17162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                   fmod(shadow_frame.GetVRegDouble(dec_insn.vA),
17172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                        shadow_frame.GetVRegDouble(dec_insn.vB)));
17182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_INT_LIT16:
17202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::ADD_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::RSUB_INT:
17242fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::RSUB_INT_LIT8:
17252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, dec_insn.vC - shadow_frame.GetVReg(dec_insn.vB));
17262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_INT_LIT16:
17282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::MUL_INT_LIT8:
17292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) * dec_insn.vC);
17302fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_INT_LIT16:
17322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::DIV_INT_LIT8:
1733d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntDivide(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB),
1734d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                    dec_insn.vC);
17352fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17362fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_INT_LIT16:
17372fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::REM_INT_LIT8:
1738d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao        DoIntRemainder(self, shadow_frame, dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB),
1739d91398cc7ed6ea8acf251bf1aa525df46d914044jeffhao                       dec_insn.vC);
17402fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_INT_LIT16:
17422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::AND_INT_LIT8:
17432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) & dec_insn.vC);
17442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_INT_LIT16:
17462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::OR_INT_LIT8:
17472fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) | dec_insn.vC);
17482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_INT_LIT16:
17502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::XOR_INT_LIT8:
17512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) ^ dec_insn.vC);
17522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHL_INT_LIT8:
175442b4dc4280c25a624bf38e19da70be39d2676232jeffhao        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) <<
175542b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (dec_insn.vC & 0x1f));
17562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::SHR_INT_LIT8:
175842b4dc4280c25a624bf38e19da70be39d2676232jeffhao        shadow_frame.SetVReg(dec_insn.vA, shadow_frame.GetVReg(dec_insn.vB) >>
175942b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (dec_insn.vC & 0x1f));
17602fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case Instruction::USHR_INT_LIT8:
17622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame.SetVReg(dec_insn.vA,
17632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                             static_cast<uint32_t>(shadow_frame.GetVReg(dec_insn.vB)) >>
176442b4dc4280c25a624bf38e19da70be39d2676232jeffhao                             (dec_insn.vC & 0x1f));
17652fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17662fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      default:
17672fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        LOG(FATAL) << "Unexpected instruction: " << inst->DumpString(&mh.GetDexFile());
17682fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
17692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
17702fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (UNLIKELY(self->IsExceptionPending())) {
17719b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao      if (throw_frame_id_ == 0) {
17729b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao        throw_method_ = shadow_frame.GetMethod();
17739b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao        throw_dex_pc_ = dex_pc;
17749b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao      }
17759b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao      throw_frame_id_++;
17762fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      uint32_t found_dex_pc =
17772fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers          shadow_frame.GetMethod()->FindCatchBlock(self->GetException()->GetClass(),
17782fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                   inst->GetDexPc(insns));
17792fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      if (found_dex_pc == DexFile::kDexNoIndex) {
17802fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        JValue result;
17812fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        result.SetJ(0);
17822fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        return result;  // Handler in caller.
17832fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      } else {
17849b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao        Dbg::PostException(self, throw_frame_id_, throw_method_, throw_dex_pc_,
17859b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao                           shadow_frame.GetMethod(), found_dex_pc, self->GetException());
17869b5aa6f2029d3dae305009ac72e44ca97ca7b638jeffhao        throw_frame_id_ = 0;
17872fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        next_inst = Instruction::At(insns + found_dex_pc);
17882fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
17892fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
17902fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    inst = next_inst;
17912fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
17922fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
17932fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
17942fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogersvoid EnterInterpreterFromInvoke(Thread* self, AbstractMethod* method, Object* receiver,
17952fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                JValue* args, JValue* result) {
179664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  DCHECK_EQ(self, Thread::Current());
1797d752132c73072084a3def9257cca4fcee76047b6jeffhao  if (__builtin_frame_address(0) < self->GetStackEnd()) {
1798d752132c73072084a3def9257cca4fcee76047b6jeffhao    ThrowStackOverflowError(self);
1799d752132c73072084a3def9257cca4fcee76047b6jeffhao    return;
1800d752132c73072084a3def9257cca4fcee76047b6jeffhao  }
1801d752132c73072084a3def9257cca4fcee76047b6jeffhao
18022fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  MethodHelper mh(method);
18032fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  const DexFile::CodeItem* code_item = mh.GetCodeItem();
18042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint16_t num_regs;
18052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  uint16_t num_ins;
18062fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (code_item != NULL) {
18072fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    num_regs =  code_item->registers_size_;
18082fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    num_ins = code_item->ins_size_;
18090a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao  } else if (method->IsAbstract()) {
18100a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao    self->ThrowNewExceptionF("Ljava/lang/AbstractMethodError;", "abstract method \"%s\"",
18110a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao                             PrettyMethod(method).c_str());
18120a9bb73c70298922ad33d67c209a4e440b216fa2jeffhao    return;
18132fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else {
18142fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    DCHECK(method->IsNative());
18152fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    num_regs = num_ins = AbstractMethod::NumArgRegisters(mh.GetShorty());
18162fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (!method->IsStatic()) {
18172fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      num_regs++;
18182fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      num_ins++;
18192fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
18202fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
18212fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  // Set up shadow frame with matching number of reference slots to vregs.
18222fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  ShadowFrame* last_shadow_frame = self->GetManagedStack()->GetTopShadowFrame();
1823ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa  UniquePtr<ShadowFrame> shadow_frame(ShadowFrame::Create(num_regs,
18247db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers                                                          last_shadow_frame,
18252fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers                                                          method, 0));
18262fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  self->PushShadowFrame(shadow_frame.get());
18272fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  size_t cur_reg = num_regs - num_ins;
18282fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  if (!method->IsStatic()) {
18292fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    CHECK(receiver != NULL);
1830ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa    shadow_frame->SetVRegReference(cur_reg, receiver);
18312fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    ++cur_reg;
18322fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else if (!method->GetDeclaringClass()->IsInitializing()) {
183394d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao    if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(method->GetDeclaringClass(),
183494d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao                                                                 true, true)) {
183594d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao      DCHECK(Thread::Current()->IsExceptionPending());
183694d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao      return;
183794d6df471a406a03bb1afba8ca3ae9c0fbf366b5jeffhao    }
18382fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    CHECK(method->GetDeclaringClass()->IsInitializing());
18392fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
184064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  const char* shorty = mh.GetShorty();
18412fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  size_t arg_pos = 0;
18422fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  for (; cur_reg < num_regs; ++cur_reg, ++arg_pos) {
18432fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    DCHECK_LT(arg_pos + 1, mh.GetShortyLength());
18442fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    switch (shorty[arg_pos + 1]) {
18452fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case 'L': {
18462fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        Object* o = args[arg_pos].GetL();
1847ce4cc0d1818e872c1c7f3c3519a82259afd5c288TDYa        shadow_frame->SetVRegReference(cur_reg, o);
18482fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
18492fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      }
18502fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      case 'J': case 'D':
18512fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame->SetVRegLong(cur_reg, args[arg_pos].GetJ());
18522fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        cur_reg++;
18532fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
18542fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      default:
18552fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        shadow_frame->SetVReg(cur_reg, args[arg_pos].GetI());
18562fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers        break;
18572fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
18582fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
185964b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers  if (LIKELY(!method->IsNative())) {
1860306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers    JValue r = Execute(self, mh, code_item, *shadow_frame.get(), JValue());
18612fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    if (result != NULL) {
18622fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers      *result = r;
18632fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
18642fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  } else {
186564b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // We don't expect to be asked to interpret native code (which is entered via a JNI compiler
186664b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    // generated stub) except during testing and image writing.
186764b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers    if (!Runtime::Current()->IsStarted()) {
186864b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      UnstartedRuntimeJni(self, method, receiver, args, result);
18692fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    } else {
187064b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers      InterpreterJni(self, method, shorty, receiver, args, result);
18712fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers    }
18722fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  }
18732fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers  self->PopShadowFrame();
18742fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}
18752fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers
1876306057fd278d75bf3794bd5243a3b6652c487d18Ian RogersJValue EnterInterpreterFromDeoptimize(Thread* self, ShadowFrame& shadow_frame, JValue ret_val)
1877306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
1878306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  MethodHelper mh(shadow_frame.GetMethod());
1879306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  const DexFile::CodeItem* code_item = mh.GetCodeItem();
1880306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers  return Execute(self, mh, code_item, shadow_frame, ret_val);
1881306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers}
1882306057fd278d75bf3794bd5243a3b6652c487d18Ian Rogers
188311ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Haovoid EnterInterpreterFromLLVM(Thread* self, ShadowFrame* shadow_frame, JValue* ret_val)
188411ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
188511ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao  JValue value;
188611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao  MethodHelper mh(shadow_frame->GetMethod());
188711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao  const DexFile::CodeItem* code_item = mh.GetCodeItem();
188811ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao  while (shadow_frame != NULL) {
188911ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao    value = Execute(self, mh, code_item, *shadow_frame, value);
189011ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao    ShadowFrame* old_frame = shadow_frame;
189111ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao    shadow_frame = shadow_frame->GetLink();
189211ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao    mh.ChangeMethod(shadow_frame->GetMethod());
189311ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao    delete old_frame;
189411ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao  }
189511ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao  ret_val->SetJ(value.GetJ());
189611ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao}
189711ffc2d02b7d979f26a8a04013fce3eb4f9a2816Jeff Hao
18987db619bb2a4e01e8532a04b613745d4926b205d7Ian RogersJValue EnterInterpreterFromStub(Thread* self, MethodHelper& mh, const DexFile::CodeItem* code_item,
18997db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers                                ShadowFrame& shadow_frame)
19007db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers    SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
19017db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers  return Execute(self, mh, code_item, shadow_frame, JValue());
19027db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers}
19037db619bb2a4e01e8532a04b613745d4926b205d7Ian Rogers
19042fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}  // namespace interpreter
19052fa6b2e2fc3d2a2fc27808ce518dc76b80ce369aIan Rogers}  // namespace art
1906