Add object-space related runtime support.

Change-Id: Ieac2be41efcb57923de6f1dedad94fab0803812d
diff --git a/src/compiler_llvm/art_module.ll b/src/compiler_llvm/art_module.ll
index 274d575..39fbec7 100644
--- a/src/compiler_llvm/art_module.ll
+++ b/src/compiler_llvm/art_module.ll
@@ -84,7 +84,9 @@
 declare void @art_find_instance_field_from_code(i32, %JavaObject*)
 declare void @art_find_static_field_from_code(i32, %JavaObject*)
 
-declare %JavaObject* @art_find_interface_method_from_code(i32, %JavaObject*)
+declare %JavaObject* @art_find_interface_method_from_code(i32, %JavaObject*, %JavaObject*)
+declare %JavaObject* @art_find_virtual_method_from_code(i32, %JavaObject*, %JavaObject*)
+declare %JavaObject* @art_find_super_method_from_code(i32, %JavaObject*, %JavaObject*)
 
 declare %JavaObject* @art_initialize_static_storage_from_code(i32, %JavaObject*)
 declare %JavaObject* @art_initialize_type_from_code(i32, %JavaObject*)
diff --git a/src/compiler_llvm/generated/art_module.cc b/src/compiler_llvm/generated/art_module.cc
index 22a12fa..dedc392 100644
--- a/src/compiler_llvm/generated/art_module.cc
+++ b/src/compiler_llvm/generated/art_module.cc
@@ -526,7 +526,7 @@
 Function* func_art_find_interface_method_from_code = mod->getFunction("art_find_interface_method_from_code");
 if (!func_art_find_interface_method_from_code) {
 func_art_find_interface_method_from_code = Function::Create(
- /*Type=*/FuncTy_11,
+ /*Type=*/FuncTy_24,
  /*Linkage=*/GlobalValue::ExternalLinkage,
  /*Name=*/"art_find_interface_method_from_code", mod); // (external, no body)
 func_art_find_interface_method_from_code->setCallingConv(CallingConv::C);
@@ -534,6 +534,28 @@
 AttrListPtr func_art_find_interface_method_from_code_PAL;
 func_art_find_interface_method_from_code->setAttributes(func_art_find_interface_method_from_code_PAL);
 
+Function* func_art_find_virtual_method_from_code = mod->getFunction("art_find_virtual_method_from_code");
+if (!func_art_find_virtual_method_from_code) {
+func_art_find_virtual_method_from_code = Function::Create(
+ /*Type=*/FuncTy_24,
+ /*Linkage=*/GlobalValue::ExternalLinkage,
+ /*Name=*/"art_find_virtual_method_from_code", mod); // (external, no body)
+func_art_find_virtual_method_from_code->setCallingConv(CallingConv::C);
+}
+AttrListPtr func_art_find_virtual_method_from_code_PAL;
+func_art_find_virtual_method_from_code->setAttributes(func_art_find_virtual_method_from_code_PAL);
+
+Function* func_art_find_super_method_from_code = mod->getFunction("art_find_super_method_from_code");
+if (!func_art_find_super_method_from_code) {
+func_art_find_super_method_from_code = Function::Create(
+ /*Type=*/FuncTy_24,
+ /*Linkage=*/GlobalValue::ExternalLinkage,
+ /*Name=*/"art_find_super_method_from_code", mod); // (external, no body)
+func_art_find_super_method_from_code->setCallingConv(CallingConv::C);
+}
+AttrListPtr func_art_find_super_method_from_code_PAL;
+func_art_find_super_method_from_code->setAttributes(func_art_find_super_method_from_code_PAL);
+
 Function* func_art_initialize_static_storage_from_code = mod->getFunction("art_initialize_static_storage_from_code");
 if (!func_art_initialize_static_storage_from_code) {
 func_art_initialize_static_storage_from_code = Function::Create(
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index c1c9e19..18e157e 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -2716,6 +2716,58 @@
 }
 
 
+void MethodCompiler::EmitInsn_InvokeVirtualSuperSlow(uint32_t dex_pc,
+                                                     DecodedInstruction &dec_insn,
+                                                     bool is_range,
+                                                     uint32_t callee_method_idx,
+                                                     bool is_virtual) {
+  // Callee method can't be resolved at compile time.  Emit the runtime
+  // method resolution code.
+
+  // Test: Is "this" pointer equal to null?
+  llvm::Value* this_addr = EmitLoadCalleeThis(dec_insn, is_range);
+  EmitGuard_NullPointerException(dex_pc, this_addr);
+
+  // Resolve the callee method object address at runtime
+  llvm::Value* runtime_func;
+  if (is_virtual) {
+    runtime_func = irb_.GetRuntime(FindVirtualMethod);
+  } else {
+    runtime_func = irb_.GetRuntime(FindSuperMethod);
+  }
+
+  llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
+
+  llvm::Value* callee_method_idx_value = irb_.getInt32(callee_method_idx);
+
+  EmitUpdateLineNumFromDexPC(dex_pc);
+
+  llvm::Value* callee_method_object_addr =
+      irb_.CreateCall3(runtime_func,
+                       callee_method_idx_value, this_addr, method_object_addr);
+
+  EmitGuard_ExceptionLandingPad(dex_pc);
+
+  llvm::Value* code_addr =
+      EmitLoadCodeAddr(callee_method_object_addr, callee_method_idx, false);
+  // Load the actual parameter
+  std::vector<llvm::Value*> args;
+  args.push_back(callee_method_object_addr);
+  args.push_back(this_addr);
+  EmitLoadActualParameters(args, callee_method_idx, dec_insn, is_range, false);
+
+  // Invoke callee
+  EmitUpdateLineNumFromDexPC(dex_pc);
+  llvm::Value* retval = irb_.CreateCall(code_addr, args);
+  EmitGuard_ExceptionLandingPad(dex_pc);
+
+  UniquePtr<OatCompilationUnit>
+      callee(oat_compilation_unit_->GetCallee(callee_method_idx, /* access flags */ 0));
+  char ret_shorty = callee->GetShorty()[0];
+  if (ret_shorty != 'V') {
+    EmitStoreDalvikRetValReg(ret_shorty, kAccurate, retval);
+  }
+}
 
 void MethodCompiler::EmitInsn_InvokeVirtual(uint32_t dex_pc,
                                             Instruction const* insn,
@@ -2729,12 +2781,8 @@
   Method* callee_method = ResolveMethod(callee_method_idx);
 
   if (callee_method == NULL) {
-    // Callee method can't be resolved at compile time.  Emit the runtime
-    // method resolution code.
-
-    UNIMPLEMENTED(FATAL) << "Method index " << callee_method_idx
-                         << " can't be resolved";
-
+    EmitInsn_InvokeVirtualSuperSlow(dex_pc, dec_insn, is_range,
+                                    callee_method_idx, /*is_virtual*/ true);
   } else {
     // Test: Is *this* parameter equal to null?
     llvm::Value* this_addr = EmitLoadCalleeThis(dec_insn, is_range);
@@ -2788,12 +2836,8 @@
   Method* callee_overiding_method = ResolveMethod(callee_method_idx);
 
   if (callee_overiding_method == NULL) {
-    // Callee method can't be resolved at compile time.  Emit the runtime
-    // method resolution code.
-
-    UNIMPLEMENTED(FATAL) << "Method index " << callee_method_idx
-                         << " can't be resolved";
-
+    EmitInsn_InvokeVirtualSuperSlow(dex_pc, dec_insn, is_range,
+                                    callee_method_idx, /*is_virtual*/ false);
   } else {
     // CHECK: Is the instruction well-encoded or is the class hierarchy correct?
     Class* declaring_class = method_->GetDeclaringClass();
@@ -2960,7 +3004,8 @@
   EmitUpdateLineNumFromDexPC(dex_pc);
 
   llvm::Value* callee_method_object_addr =
-    irb_.CreateCall2(runtime_func, callee_method_idx_value, method_object_addr);
+    irb_.CreateCall3(runtime_func,
+                     callee_method_idx_value, this_addr, method_object_addr);
 
   EmitGuard_ExceptionLandingPad(dex_pc);
 
diff --git a/src/compiler_llvm/method_compiler.h b/src/compiler_llvm/method_compiler.h
index c9e03a4..782b934 100644
--- a/src/compiler_llvm/method_compiler.h
+++ b/src/compiler_llvm/method_compiler.h
@@ -192,6 +192,11 @@
   // INVOKE instructions
   void EmitInsn_InvokeVirtual(GEN_INSN_ARGS, bool is_range);
   void EmitInsn_InvokeSuper(GEN_INSN_ARGS, bool is_range);
+  void EmitInsn_InvokeVirtualSuperSlow(uint32_t dex_pc,
+                                       DecodedInstruction &dec_insn,
+                                       bool is_range,
+                                       uint32_t callee_method_idx,
+                                       bool is_virtual);
   void EmitInsn_InvokeStaticDirect(GEN_INSN_ARGS,
                                    InvokeType invoke_type,
                                    bool is_range);
diff --git a/src/compiler_llvm/runtime_support_func_list.h b/src/compiler_llvm/runtime_support_func_list.h
index a98dd15..0170148 100644
--- a/src/compiler_llvm/runtime_support_func_list.h
+++ b/src/compiler_llvm/runtime_support_func_list.h
@@ -36,8 +36,9 @@
   V(AllocArrayWithAccessCheck, art_alloc_array_from_code_with_access_check) \
   V(CheckAndAllocArray, art_check_and_alloc_array_from_code) \
   V(CheckAndAllocArrayWithAccessCheck, art_check_and_alloc_array_from_code_with_access_check) \
-  V(FindInstanceField, art_find_instance_field_from_code) \
-  V(FindStaticField, art_find_static_field_from_code) \
+  V(FindInterfaceMethod, art_find_interface_method_from_code) \
+  V(FindVirtualMethod, art_find_virtual_method_from_code) \
+  V(FindSuperMethod, art_find_super_method_from_code) \
   V(ResolveString, art_resolve_string_from_code) \
   V(Set32Static, art_set32_static_from_code) \
   V(Set64Static, art_set64_static_from_code) \
@@ -53,5 +54,4 @@
   V(GetObjectInstance, art_get_obj_instance_from_code) \
   V(InitializeStaticStorage, art_initialize_static_storage_from_code) \
   V(IsExceptionPending, art_is_exception_pending_from_code) \
-  V(FindCatchBlock, art_find_catch_block_from_code) \
-  V(FindInterfaceMethod, art_find_interface_method_from_code)
+  V(FindCatchBlock, art_find_catch_block_from_code)
diff --git a/src/compiler_llvm/runtime_support_llvm.cc b/src/compiler_llvm/runtime_support_llvm.cc
index 300376b..16f9704 100644
--- a/src/compiler_llvm/runtime_support_llvm.cc
+++ b/src/compiler_llvm/runtime_support_llvm.cc
@@ -174,160 +174,124 @@
 // Object Space
 //----------------------------------------------------------------------------
 
-Object* art_alloc_object_from_code(uint32_t type_idx, Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+Object* art_alloc_object_from_code(uint32_t type_idx, Method* referrer) {
+  return AllocObjectFromCode(type_idx, referrer, Thread::Current(), false);
 }
 
-Object* art_alloc_object_from_code_with_access_check(uint32_t type_idx,
-                                                     Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+Object* art_alloc_object_from_code_with_access_check(uint32_t type_idx, Method* referrer) {
+  return AllocObjectFromCode(type_idx, referrer, Thread::Current(), true);
 }
 
-Object* art_alloc_array_from_code(uint32_t type_idx,
-                                  Object* referrer,
-                                  uint32_t length) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+Object* art_alloc_array_from_code(uint32_t type_idx, Method* referrer, uint32_t length) {
+  return AllocArrayFromCode(type_idx, referrer, length, Thread::Current(), false);
 }
 
 Object* art_alloc_array_from_code_with_access_check(uint32_t type_idx,
-                                                    Object* referrer,
+                                                    Method* referrer,
                                                     uint32_t length) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+  return AllocArrayFromCode(type_idx, referrer, length, Thread::Current(), true);
 }
 
 Object* art_check_and_alloc_array_from_code(uint32_t type_idx,
-                                            Object* referrer,
+                                            Method* referrer,
                                             uint32_t length) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+  return CheckAndAllocArrayFromCode(type_idx, referrer, length, Thread::Current(), false);
 }
 
 Object* art_check_and_alloc_array_from_code_with_access_check(uint32_t type_idx,
-                                                              Object* referrer,
+                                                              Method* referrer,
                                                               uint32_t length) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
-}
-
-void art_find_instance_field_from_code(uint32_t field_idx, Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-}
-
-void art_find_static_field_from_code(uint32_t field_idx, Object* referrer) {
-  UNIMPLEMENTED(WARNING);
+  return CheckAndAllocArrayFromCode(type_idx, referrer, length, Thread::Current(), true);
 }
 
 Object* art_find_interface_method_from_code(uint32_t method_idx,
-                                            Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+                                            Object* this_object,
+                                            Method* referrer) {
+  return _artInvokeCommon(method_idx, this_object, referrer,
+                          Thread::Current(), NULL, true, kInterface);
 }
 
-Object* art_initialize_static_storage_from_code(uint32_t type_idx,
-                                                Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+Object* art_find_virtual_method_from_code(uint32_t method_idx,
+                                          Object* this_object,
+                                          Method* referrer) {
+  return _artInvokeCommon(method_idx, this_object, referrer,
+                          Thread::Current(), NULL, true, kVirtual);
 }
 
-Object* art_initialize_type_from_code(uint32_t type_idx, Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+Object* art_find_super_method_from_code(uint32_t method_idx,
+                                        Object* this_object,
+                                        Method* referrer) {
+  return _artInvokeCommon(method_idx, this_object, referrer,
+                          Thread::Current(), NULL, true, kSuper);
 }
 
-Object* art_initialize_type_and_verify_access_from_code(uint32_t type_idx,
-                                                        Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+Object* art_initialize_static_storage_from_code(uint32_t type_idx, Method* referrer) {
+  return ResolveVerifyAndClinit(type_idx, referrer, Thread::Current(), true, true);
 }
 
-Object* art_resolve_string_from_code(Object* referrer, uint32_t string_idx) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+Object* art_initialize_type_from_code(uint32_t type_idx, Method* referrer) {
+  return ResolveVerifyAndClinit(type_idx, referrer, Thread::Current(), false, false);
 }
 
-int32_t art_set32_static_from_code(uint32_t field_idx,
-                                   Object* referrer,
-                                   int32_t new_value) {
-  UNIMPLEMENTED(WARNING);
-  return -1;
+Object* art_initialize_type_and_verify_access_from_code(uint32_t type_idx, Method* referrer) {
+  // Called when caller isn't guaranteed to have access to a type and the dex cache may be
+  // unpopulated
+  return ResolveVerifyAndClinit(type_idx, referrer, Thread::Current(), false, true);
 }
 
-int32_t art_set64_static_from_code(uint32_t field_idx,
-                                   Object* referrer,
-                                   int64_t new_value) {
-  UNIMPLEMENTED(WARNING);
-  return -1;
+Object* art_resolve_string_from_code(Method* referrer, uint32_t string_idx) {
+  return ResolveStringFromCode(referrer, string_idx);
 }
 
-int32_t art_set_obj_static_from_code(uint32_t field_idx,
-                                     Object* referrer,
-                                     Object* new_value) {
-  UNIMPLEMENTED(WARNING);
-  return -1;
+int32_t art_set32_static_from_code(uint32_t field_idx, Method* referrer, int32_t new_value) {
+  return artSet32StaticFromCode(field_idx, new_value, referrer, Thread::Current(), NULL);
 }
 
-int32_t art_get32_static_from_code(uint32_t field_idx, Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return 0;
+int32_t art_set64_static_from_code(uint32_t field_idx, Method* referrer, int64_t new_value) {
+  return artSet64StaticFromCode(field_idx, referrer, new_value, Thread::Current(), NULL);
 }
 
-int64_t art_get64_static_from_code(uint32_t field_idx, Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return 0;
+int32_t art_set_obj_static_from_code(uint32_t field_idx, Method* referrer, Object* new_value) {
+  return artSetObjStaticFromCode(field_idx, new_value, referrer, Thread::Current(), NULL);
 }
 
-Object* art_get_obj_static_from_code(uint32_t field_idx, Object* referrer) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+int32_t art_get32_static_from_code(uint32_t field_idx, Method* referrer) {
+  return artGet32StaticFromCode(field_idx, referrer, Thread::Current(), NULL);
 }
 
-int32_t art_set32_instance_from_code(uint32_t field_idx,
-                                     Object* referrer,
-                                     Object* object,
-                                     uint32_t new_value) {
-  UNIMPLEMENTED(WARNING);
-  return -1;
+int64_t art_get64_static_from_code(uint32_t field_idx, Method* referrer) {
+  return artGet64StaticFromCode(field_idx, referrer, Thread::Current(), NULL);
 }
 
-int32_t art_set64_instance_from_code(uint32_t field_idx,
-                                     Object* referrer,
-                                     Object* object,
-                                     int64_t new_value) {
-  UNIMPLEMENTED(WARNING);
-  return -1;
+Object* art_get_obj_static_from_code(uint32_t field_idx, Method* referrer) {
+  return artGetObjStaticFromCode(field_idx, referrer, Thread::Current(), NULL);
 }
 
-int32_t art_set_obj_instance_from_code(uint32_t field_idx,
-                                       Object* referrer,
-                                       Object* object,
-                                       Object* new_value) {
-  UNIMPLEMENTED(WARNING);
-  return -1;
+int32_t art_set32_instance_from_code(uint32_t field_idx, Method* referrer,
+                                     Object* obj, uint32_t new_value) {
+  return artSet32InstanceFromCode(field_idx, obj, new_value, referrer, Thread::Current(), NULL);
 }
 
-int32_t art_get32_instance_from_code(uint32_t field_idx,
-                                     Object* referrer,
-                                     Object* object) {
-  UNIMPLEMENTED(WARNING);
-  return 0;
+int32_t art_set64_instance_from_code(uint32_t field_idx, Method* referrer,
+                                     Object* obj, int64_t new_value) {
+  return artSet64InstanceFromCode(field_idx, obj, new_value, referrer, Thread::Current(), NULL);
 }
 
-int64_t art_get64_instance_from_code(uint32_t field_idx,
-                                     Object* referrer,
-                                     Object* object) {
-  UNIMPLEMENTED(WARNING);
-  return 0;
+int32_t art_set_obj_instance_from_code(uint32_t field_idx, Method* referrer,
+                                       Object* obj, Object* new_value) {
+  return artSetObjInstanceFromCode(field_idx, obj, new_value, referrer, Thread::Current(), NULL);
 }
 
-Object* art_get_obj_instance_from_code(uint32_t field_idx,
-                                       Object* referrer,
-                                       Object* object) {
-  UNIMPLEMENTED(WARNING);
-  return NULL;
+int32_t art_get32_instance_from_code(uint32_t field_idx, Method* referrer, Object* obj) {
+  return artGet32InstanceFromCode(field_idx, obj, referrer, Thread::Current(), NULL);
+}
+
+int64_t art_get64_instance_from_code(uint32_t field_idx, Method* referrer, Object* obj) {
+  return artGet64InstanceFromCode(field_idx, obj, referrer, Thread::Current(), NULL);
+}
+
+Object* art_get_obj_instance_from_code(uint32_t field_idx, Method* referrer, Object* obj) {
+  return artGetObjInstanceFromCode(field_idx, obj, referrer, Thread::Current(), NULL);
 }
 
 
diff --git a/src/runtime_support.cc b/src/runtime_support.cc
index 7e4e410..7f5fe10 100644
--- a/src/runtime_support.cc
+++ b/src/runtime_support.cc
@@ -580,216 +580,6 @@
   return code;
 }
 
-
-extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx, const Method* referrer,
-                                           Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, true, false, sizeof(int32_t));
-  if (LIKELY(field != NULL)) {
-    return field->Get32(NULL);
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, true, true, false, sizeof(int32_t));
-  if (LIKELY(field != NULL)) {
-    return field->Get32(NULL);
-  }
-  return 0;  // Will throw exception by checking with Thread::Current
-}
-
-extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx, const Method* referrer,
-                                           Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, true, false, sizeof(int64_t));
-  if (LIKELY(field != NULL)) {
-    return field->Get64(NULL);
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, true, true, false, sizeof(int64_t));
-  if (LIKELY(field != NULL)) {
-    return field->Get64(NULL);
-  }
-  return 0;  // Will throw exception by checking with Thread::Current
-}
-
-extern "C" Object* artGetObjStaticFromCode(uint32_t field_idx, const Method* referrer,
-                                           Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, false, false, sizeof(Object*));
-  if (LIKELY(field != NULL)) {
-    return field->GetObj(NULL);
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, true, false, false, sizeof(Object*));
-  if (LIKELY(field != NULL)) {
-    return field->GetObj(NULL);
-  }
-  return NULL;  // Will throw exception by checking with Thread::Current
-}
-
-extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, Object* obj,
-                                             const Method* referrer, Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, true, false, sizeof(int32_t));
-  if (LIKELY(field != NULL && obj != NULL)) {
-    return field->Get32(obj);
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, false, true, false, sizeof(int32_t));
-  if (LIKELY(field != NULL)) {
-    if (UNLIKELY(obj == NULL)) {
-      ThrowNullPointerExceptionForFieldAccess(self, field, true);
-    } else {
-      return field->Get32(obj);
-    }
-  }
-  return 0;  // Will throw exception by checking with Thread::Current
-}
-
-extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, Object* obj,
-                                             const Method* referrer, Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, true, false, sizeof(int64_t));
-  if (LIKELY(field != NULL && obj != NULL)) {
-    return field->Get64(obj);
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, false, true, false, sizeof(int64_t));
-  if (LIKELY(field != NULL)) {
-    if (UNLIKELY(obj == NULL)) {
-      ThrowNullPointerExceptionForFieldAccess(self, field, true);
-    } else {
-      return field->Get64(obj);
-    }
-  }
-  return 0;  // Will throw exception by checking with Thread::Current
-}
-
-extern "C" Object* artGetObjInstanceFromCode(uint32_t field_idx, Object* obj,
-                                              const Method* referrer, Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, false, false, sizeof(Object*));
-  if (LIKELY(field != NULL && obj != NULL)) {
-    return field->GetObj(obj);
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, false, false, false, sizeof(Object*));
-  if (LIKELY(field != NULL)) {
-    if (UNLIKELY(obj == NULL)) {
-      ThrowNullPointerExceptionForFieldAccess(self, field, true);
-    } else {
-      return field->GetObj(obj);
-    }
-  }
-  return NULL;  // Will throw exception by checking with Thread::Current
-}
-
-extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
-                                      const Method* referrer, Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, true, true, sizeof(int32_t));
-  if (LIKELY(field != NULL)) {
-    field->Set32(NULL, new_value);
-    return 0;  // success
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, true, true, true, sizeof(int32_t));
-  if (LIKELY(field != NULL)) {
-    field->Set32(NULL, new_value);
-    return 0;  // success
-  }
-  return -1;  // failure
-}
-
-extern "C" int artSet64StaticFromCode(uint32_t field_idx, const Method* referrer,
-                                      uint64_t new_value, Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, true, true, sizeof(int64_t));
-  if (LIKELY(field != NULL)) {
-    field->Set64(NULL, new_value);
-    return 0;  // success
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, true, true, true, sizeof(int64_t));
-  if (LIKELY(field != NULL)) {
-    field->Set64(NULL, new_value);
-    return 0;  // success
-  }
-  return -1;  // failure
-}
-
-extern "C" int artSetObjStaticFromCode(uint32_t field_idx, Object* new_value,
-                                       const Method* referrer, Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, false, true, sizeof(Object*));
-  if (LIKELY(field != NULL)) {
-    if (LIKELY(!FieldHelper(field).IsPrimitiveType())) {
-      field->SetObj(NULL, new_value);
-      return 0;  // success
-    }
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, true, false, true, sizeof(Object*));
-  if (LIKELY(field != NULL)) {
-    field->SetObj(NULL, new_value);
-    return 0;  // success
-  }
-  return -1;  // failure
-}
-
-extern "C" int artSet32InstanceFromCode(uint32_t field_idx, Object* obj, uint32_t new_value,
-                                        const Method* referrer, Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, true, true, sizeof(int32_t));
-  if (LIKELY(field != NULL && obj != NULL)) {
-    field->Set32(obj, new_value);
-    return 0;  // success
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, false, true, true, sizeof(int32_t));
-  if (LIKELY(field != NULL)) {
-    if (UNLIKELY(obj == NULL)) {
-      ThrowNullPointerExceptionForFieldAccess(self, field, false);
-    } else {
-      field->Set32(obj, new_value);
-      return 0;  // success
-    }
-  }
-  return -1;  // failure
-}
-
-extern "C" int artSet64InstanceFromCode(uint32_t field_idx, Object* obj, uint64_t new_value,
-                                        Thread* self, Method** sp) {
-  Method* callee_save = Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly);
-  Method* referrer = sp[callee_save->GetFrameSizeInBytes() / sizeof(Method*)];
-  Field* field = FindFieldFast(field_idx, referrer, true, true, sizeof(int64_t));
-  if (LIKELY(field != NULL  && obj != NULL)) {
-    field->Set64(obj, new_value);
-    return 0;  // success
-  }
-  *sp = callee_save;
-  self->SetTopOfStack(sp, 0);
-  field = FindFieldFromCode(field_idx, referrer, self, false, true, true, sizeof(int64_t));
-  if (LIKELY(field != NULL)) {
-    if (UNLIKELY(obj == NULL)) {
-      ThrowNullPointerExceptionForFieldAccess(self, field, false);
-    } else {
-      field->Set64(obj, new_value);
-      return 0;  // success
-    }
-  }
-  return -1;  // failure
-}
-
-extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, Object* obj, Object* new_value,
-                                         const Method* referrer, Thread* self, Method** sp) {
-  Field* field = FindFieldFast(field_idx, referrer, false, true, sizeof(Object*));
-  if (LIKELY(field != NULL && obj != NULL)) {
-    field->SetObj(obj, new_value);
-    return 0;  // success
-  }
-  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
-  field = FindFieldFromCode(field_idx, referrer, self, false, false, true, sizeof(Object*));
-  if (LIKELY(field != NULL)) {
-    if (UNLIKELY(obj == NULL)) {
-      ThrowNullPointerExceptionForFieldAccess(self, field, false);
-    } else {
-      field->SetObj(obj, new_value);
-      return 0;  // success
-    }
-  }
-  return -1;  // failure
-}
-
 extern "C" Object* artAllocObjectFromCode(uint32_t type_idx, Method* method,
                                           Thread* self, Method** sp) {
   FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
@@ -871,39 +661,6 @@
   }
 }
 
-Class* ResolveVerifyAndClinit(uint32_t type_idx, const Method* referrer, Thread* self,
-                               bool can_run_clinit, bool verify_access) {
-  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
-  Class* klass = class_linker->ResolveType(type_idx, referrer);
-  if (UNLIKELY(klass == NULL)) {
-    CHECK(self->IsExceptionPending());
-    return NULL;  // Failure - Indicate to caller to deliver exception
-  }
-  // Perform access check if necessary.
-  Class* referring_class = referrer->GetDeclaringClass();
-  if (verify_access && UNLIKELY(!referring_class->CanAccess(klass))) {
-    ThrowNewIllegalAccessErrorClass(self, referring_class, klass);
-    return NULL;  // Failure - Indicate to caller to deliver exception
-  }
-  // If we're just implementing const-class, we shouldn't call <clinit>.
-  if (!can_run_clinit) {
-    return klass;
-  }
-  // If we are the <clinit> of this class, just return our storage.
-  //
-  // Do not set the DexCache InitializedStaticStorage, since that implies <clinit> has finished
-  // running.
-  if (klass == referring_class && MethodHelper(referrer).IsClassInitializer()) {
-    return klass;
-  }
-  if (!class_linker->EnsureInitialized(klass, true)) {
-    CHECK(self->IsExceptionPending());
-    return NULL;  // Failure - Indicate to caller to deliver exception
-  }
-  referrer->GetDexCacheInitializedStaticStorage()->Set(type_idx, klass);
-  return klass;
-}
-
 extern "C" Class* artInitializeStaticStorageFromCode(uint32_t type_idx, const Method* referrer,
                                                      Thread* self, Method** sp) {
   FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
@@ -926,11 +683,6 @@
   return ResolveVerifyAndClinit(type_idx, referrer, self, false, true);
 }
 
-String* ResolveStringFromCode(const Method* referrer, uint32_t string_idx) {
-  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
-  return class_linker->ResolveString(string_idx, referrer);
-}
-
 extern "C" String* artResolveStringFromCode(Method* referrer, int32_t string_idx,
                                             Thread* self, Method** sp) {
   FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
@@ -1001,30 +753,6 @@
   return 0;  // Success
 }
 
-static uint64_t artInvokeCommon(uint32_t method_idx, Object* this_object, Method* caller_method,
-                                Thread* self, Method** sp, bool access_check, InvokeType type){
-  Method* method = FindMethodFast(method_idx, this_object, caller_method, access_check, type);
-  if (UNLIKELY(method == NULL)) {
-    FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsAndArgs);
-    if (UNLIKELY(this_object == NULL && type != kDirect && type != kStatic)) {
-      ThrowNullPointerExceptionForMethodAccess(self, caller_method, method_idx, type);
-      return 0;  // failure
-    }
-    method = FindMethodFromCode(method_idx, this_object, caller_method, self, access_check, type);
-    if (UNLIKELY(method == NULL)) {
-      CHECK(self->IsExceptionPending());
-      return 0;  // failure
-    }
-  }
-  DCHECK(!self->IsExceptionPending());
-  const void* code = method->GetCode();
-
-  uint32_t method_uint = reinterpret_cast<uint32_t>(method);
-  uint64_t code_uint = reinterpret_cast<uint32_t>(code);
-  uint64_t result = ((code_uint << 32) | method_uint);
-  return result;
-}
-
 // See comments in runtime_support_asm.S
 extern "C" uint64_t artInvokeInterfaceTrampoline(uint32_t method_idx, Object* this_object,
                                                  Method* caller_method, Thread* self,
diff --git a/src/runtime_support_common.cc b/src/runtime_support_common.cc
index 7be9a6f..9309df9 100644
--- a/src/runtime_support_common.cc
+++ b/src/runtime_support_common.cc
@@ -196,4 +196,277 @@
   }
 }
 
+Class* ResolveVerifyAndClinit(uint32_t type_idx, const Method* referrer, Thread* self,
+                               bool can_run_clinit, bool verify_access) {
+  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
+  Class* klass = class_linker->ResolveType(type_idx, referrer);
+  if (UNLIKELY(klass == NULL)) {
+    CHECK(self->IsExceptionPending());
+    return NULL;  // Failure - Indicate to caller to deliver exception
+  }
+  // Perform access check if necessary.
+  Class* referring_class = referrer->GetDeclaringClass();
+  if (verify_access && UNLIKELY(!referring_class->CanAccess(klass))) {
+    ThrowNewIllegalAccessErrorClass(self, referring_class, klass);
+    return NULL;  // Failure - Indicate to caller to deliver exception
+  }
+  // If we're just implementing const-class, we shouldn't call <clinit>.
+  if (!can_run_clinit) {
+    return klass;
+  }
+  // If we are the <clinit> of this class, just return our storage.
+  //
+  // Do not set the DexCache InitializedStaticStorage, since that implies <clinit> has finished
+  // running.
+  if (klass == referring_class && MethodHelper(referrer).IsClassInitializer()) {
+    return klass;
+  }
+  if (!class_linker->EnsureInitialized(klass, true)) {
+    CHECK(self->IsExceptionPending());
+    return NULL;  // Failure - Indicate to caller to deliver exception
+  }
+  referrer->GetDexCacheInitializedStaticStorage()->Set(type_idx, klass);
+  return klass;
+}
+
+extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx, const Method* referrer,
+                                           Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, true, false, sizeof(int32_t));
+  if (LIKELY(field != NULL)) {
+    return field->Get32(NULL);
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, true, true, false, sizeof(int32_t));
+  if (LIKELY(field != NULL)) {
+    return field->Get32(NULL);
+  }
+  return 0;  // Will throw exception by checking with Thread::Current
+}
+
+extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx, const Method* referrer,
+                                           Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, true, false, sizeof(int64_t));
+  if (LIKELY(field != NULL)) {
+    return field->Get64(NULL);
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, true, true, false, sizeof(int64_t));
+  if (LIKELY(field != NULL)) {
+    return field->Get64(NULL);
+  }
+  return 0;  // Will throw exception by checking with Thread::Current
+}
+
+extern "C" Object* artGetObjStaticFromCode(uint32_t field_idx, const Method* referrer,
+                                           Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, false, false, sizeof(Object*));
+  if (LIKELY(field != NULL)) {
+    return field->GetObj(NULL);
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, true, false, false, sizeof(Object*));
+  if (LIKELY(field != NULL)) {
+    return field->GetObj(NULL);
+  }
+  return NULL;  // Will throw exception by checking with Thread::Current
+}
+
+extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, Object* obj,
+                                             const Method* referrer, Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, true, false, sizeof(int32_t));
+  if (LIKELY(field != NULL && obj != NULL)) {
+    return field->Get32(obj);
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, false, true, false, sizeof(int32_t));
+  if (LIKELY(field != NULL)) {
+    if (UNLIKELY(obj == NULL)) {
+      ThrowNullPointerExceptionForFieldAccess(self, field, true);
+    } else {
+      return field->Get32(obj);
+    }
+  }
+  return 0;  // Will throw exception by checking with Thread::Current
+}
+
+extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, Object* obj,
+                                             const Method* referrer, Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, true, false, sizeof(int64_t));
+  if (LIKELY(field != NULL && obj != NULL)) {
+    return field->Get64(obj);
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, false, true, false, sizeof(int64_t));
+  if (LIKELY(field != NULL)) {
+    if (UNLIKELY(obj == NULL)) {
+      ThrowNullPointerExceptionForFieldAccess(self, field, true);
+    } else {
+      return field->Get64(obj);
+    }
+  }
+  return 0;  // Will throw exception by checking with Thread::Current
+}
+
+extern "C" Object* artGetObjInstanceFromCode(uint32_t field_idx, Object* obj,
+                                             const Method* referrer, Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, false, false, sizeof(Object*));
+  if (LIKELY(field != NULL && obj != NULL)) {
+    return field->GetObj(obj);
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, false, false, false, sizeof(Object*));
+  if (LIKELY(field != NULL)) {
+    if (UNLIKELY(obj == NULL)) {
+      ThrowNullPointerExceptionForFieldAccess(self, field, true);
+    } else {
+      return field->GetObj(obj);
+    }
+  }
+  return NULL;  // Will throw exception by checking with Thread::Current
+}
+
+extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
+                                      const Method* referrer, Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, true, true, sizeof(int32_t));
+  if (LIKELY(field != NULL)) {
+    field->Set32(NULL, new_value);
+    return 0;  // success
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, true, true, true, sizeof(int32_t));
+  if (LIKELY(field != NULL)) {
+    field->Set32(NULL, new_value);
+    return 0;  // success
+  }
+  return -1;  // failure
+}
+
+extern "C" int artSet64StaticFromCode(uint32_t field_idx, const Method* referrer,
+                                      uint64_t new_value, Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, true, true, sizeof(int64_t));
+  if (LIKELY(field != NULL)) {
+    field->Set64(NULL, new_value);
+    return 0;  // success
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, true, true, true, sizeof(int64_t));
+  if (LIKELY(field != NULL)) {
+    field->Set64(NULL, new_value);
+    return 0;  // success
+  }
+  return -1;  // failure
+}
+
+extern "C" int artSetObjStaticFromCode(uint32_t field_idx, Object* new_value,
+                                       const Method* referrer, Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, false, true, sizeof(Object*));
+  if (LIKELY(field != NULL)) {
+    if (LIKELY(!FieldHelper(field).IsPrimitiveType())) {
+      field->SetObj(NULL, new_value);
+      return 0;  // success
+    }
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, true, false, true, sizeof(Object*));
+  if (LIKELY(field != NULL)) {
+    field->SetObj(NULL, new_value);
+    return 0;  // success
+  }
+  return -1;  // failure
+}
+
+extern "C" int artSet32InstanceFromCode(uint32_t field_idx, Object* obj, uint32_t new_value,
+                                        const Method* referrer, Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, true, true, sizeof(int32_t));
+  if (LIKELY(field != NULL && obj != NULL)) {
+    field->Set32(obj, new_value);
+    return 0;  // success
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, false, true, true, sizeof(int32_t));
+  if (LIKELY(field != NULL)) {
+    if (UNLIKELY(obj == NULL)) {
+      ThrowNullPointerExceptionForFieldAccess(self, field, false);
+    } else {
+      field->Set32(obj, new_value);
+      return 0;  // success
+    }
+  }
+  return -1;  // failure
+}
+
+extern "C" int artSet64InstanceFromCode(uint32_t field_idx, Object* obj, uint64_t new_value,
+#if !defined(ART_USE_LLVM_COMPILER)
+                                        Thread* self, Method** sp) {
+#else
+                                        const Method* referrer, Thread* self, Method** sp) {
+#endif
+#if !defined(ART_USE_LLVM_COMPILER)
+  Method* callee_save = Runtime::Current()->GetCalleeSaveMethod(Runtime::kRefsOnly);
+  Method* referrer = sp[callee_save->GetFrameSizeInBytes() / sizeof(Method*)];
+#endif
+  Field* field = FindFieldFast(field_idx, referrer, true, true, sizeof(int64_t));
+  if (LIKELY(field != NULL  && obj != NULL)) {
+    field->Set64(obj, new_value);
+    return 0;  // success
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  *sp = callee_save;
+  self->SetTopOfStack(sp, 0);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, false, true, true, sizeof(int64_t));
+  if (LIKELY(field != NULL)) {
+    if (UNLIKELY(obj == NULL)) {
+      ThrowNullPointerExceptionForFieldAccess(self, field, false);
+    } else {
+      field->Set64(obj, new_value);
+      return 0;  // success
+    }
+  }
+  return -1;  // failure
+}
+
+extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, Object* obj, Object* new_value,
+                                         const Method* referrer, Thread* self, Method** sp) {
+  Field* field = FindFieldFast(field_idx, referrer, false, true, sizeof(Object*));
+  if (LIKELY(field != NULL && obj != NULL)) {
+    field->SetObj(obj, new_value);
+    return 0;  // success
+  }
+#if !defined(ART_USE_LLVM_COMPILER)
+  FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly);
+#endif
+  field = FindFieldFromCode(field_idx, referrer, self, false, false, true, sizeof(Object*));
+  if (LIKELY(field != NULL)) {
+    if (UNLIKELY(obj == NULL)) {
+      ThrowNullPointerExceptionForFieldAccess(self, field, false);
+    } else {
+      field->SetObj(obj, new_value);
+      return 0;  // success
+    }
+  }
+  return -1;  // failure
+}
+
+
 }  // namespace art
diff --git a/src/runtime_support_common.h b/src/runtime_support_common.h
index db3687b..c7b3074 100644
--- a/src/runtime_support_common.h
+++ b/src/runtime_support_common.h
@@ -247,6 +247,89 @@
 extern Method* FindMethodFromCode(uint32_t method_idx, Object* this_object, const Method* referrer,
                                   Thread* self, bool access_check, InvokeType type);
 
+static inline
+Method* _artInvokeCommon(uint32_t method_idx, Object* this_object, Method* caller_method,
+                         Thread* self, Method** sp, bool access_check, InvokeType type){
+  Method* method = FindMethodFast(method_idx, this_object, caller_method, access_check, type);
+  if (UNLIKELY(method == NULL)) {
+#if !defined(ART_USE_LLVM_COMPILER)
+    FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsAndArgs);
+    if (UNLIKELY(this_object == NULL && type != kDirect && type != kStatic)) {
+      ThrowNullPointerExceptionForMethodAccess(self, caller_method, method_idx, type);
+      return 0;  // failure
+    }
+#endif
+    method = FindMethodFromCode(method_idx, this_object, caller_method, self, access_check, type);
+    if (UNLIKELY(method == NULL)) {
+      CHECK(self->IsExceptionPending());
+      return 0;  // failure
+    }
+  }
+  DCHECK(!self->IsExceptionPending());
+  return method;
+}
+
+static inline
+uint64_t artInvokeCommon(uint32_t method_idx, Object* this_object, Method* caller_method,
+                         Thread* self, Method** sp, bool access_check, InvokeType type){
+  Method* method = _artInvokeCommon(method_idx, this_object, caller_method,
+                                    self, sp, access_check, type);
+  const void* code = method->GetCode();
+
+  uint32_t method_uint = reinterpret_cast<uint32_t>(method);
+  uint64_t code_uint = reinterpret_cast<uint32_t>(code);
+  uint64_t result = ((code_uint << 32) | method_uint);
+  return result;
+}
+
+extern Class* ResolveVerifyAndClinit(uint32_t type_idx, const Method* referrer, Thread* self,
+                                     bool can_run_clinit, bool verify_access);
+
+static inline String* ResolveStringFromCode(const Method* referrer, uint32_t string_idx) {
+  ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
+  return class_linker->ResolveString(string_idx, referrer);
+}
+
+extern "C" uint32_t artGet32StaticFromCode(uint32_t field_idx, const Method* referrer,
+                                           Thread* self, Method** sp);
+
+extern "C" uint64_t artGet64StaticFromCode(uint32_t field_idx, const Method* referrer,
+                                           Thread* self, Method** sp);
+
+extern "C" Object* artGetObjStaticFromCode(uint32_t field_idx, const Method* referrer,
+                                           Thread* self, Method** sp);
+
+extern "C" uint32_t artGet32InstanceFromCode(uint32_t field_idx, Object* obj,
+                                             const Method* referrer, Thread* self, Method** sp);
+
+extern "C" uint64_t artGet64InstanceFromCode(uint32_t field_idx, Object* obj,
+                                             const Method* referrer, Thread* self, Method** sp);
+
+extern "C" Object* artGetObjInstanceFromCode(uint32_t field_idx, Object* obj,
+                                             const Method* referrer, Thread* self, Method** sp);
+
+extern "C" int artSet32StaticFromCode(uint32_t field_idx, uint32_t new_value,
+                                      const Method* referrer, Thread* self, Method** sp);
+
+extern "C" int artSet64StaticFromCode(uint32_t field_idx, const Method* referrer,
+                                      uint64_t new_value, Thread* self, Method** sp);
+
+extern "C" int artSetObjStaticFromCode(uint32_t field_idx, Object* new_value,
+                                       const Method* referrer, Thread* self, Method** sp);
+
+extern "C" int artSet32InstanceFromCode(uint32_t field_idx, Object* obj, uint32_t new_value,
+                                        const Method* referrer, Thread* self, Method** sp);
+
+extern "C" int artSet64InstanceFromCode(uint32_t field_idx, Object* obj, uint64_t new_value,
+#if !defined(ART_USE_LLVM_COMPILER)
+                                        Thread* self, Method** sp);
+#else
+                                        const Method* referrer, Thread* self, Method** sp);
+#endif
+
+extern "C" int artSetObjInstanceFromCode(uint32_t field_idx, Object* obj, Object* new_value,
+                                         const Method* referrer, Thread* self, Method** sp);
+
 }  // namespace art
 
 #endif  // ART_SRC_RUNTIME_SUPPORT_COMMON_H_