Refactor runtime support builder.

Also, add inline assembly for load offset from current thread.

Change-Id: I5c32c04a5ab9a8574acbaf8ee3e08761ebe33d4f
diff --git a/src/compiler_llvm/method_compiler.cc b/src/compiler_llvm/method_compiler.cc
index bdad82b..620ba39 100644
--- a/src/compiler_llvm/method_compiler.cc
+++ b/src/compiler_llvm/method_compiler.cc
@@ -214,14 +214,10 @@
   frame_address = irb_.CreatePtrToInt(frame_address, irb_.getPtrEquivIntTy());
 
   // Get thread.stack_end_
-  llvm::Value* thread_object_addr =
-    irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
-
   llvm::Value* stack_end =
-    irb_.LoadFromObjectOffset(thread_object_addr,
-                              Thread::StackEndOffset().Int32Value(),
-                              irb_.getPtrEquivIntTy(),
-                              kTBAARuntimeInfo);
+    irb_.Runtime().EmitLoadFromThreadOffset(Thread::StackEndOffset().Int32Value(),
+                                            irb_.getPtrEquivIntTy(),
+                                            kTBAARuntimeInfo);
 
   // Check the frame address < thread.stack_end_ ?
   llvm::Value* is_stack_overflow = irb_.CreateICmpULT(frame_address, stack_end);
@@ -1263,22 +1259,16 @@
 
   DecodedInstruction dec_insn(insn);
 
-  // Get thread
-  llvm::Value* thread_object_addr =
-    irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
-
   // Get thread-local exception field address
   llvm::Value* exception_object_addr =
-    irb_.LoadFromObjectOffset(thread_object_addr,
-                              Thread::ExceptionOffset().Int32Value(),
-                              irb_.getJObjectTy(),
-                              kTBAAJRuntime);
+    irb_.Runtime().EmitLoadFromThreadOffset(Thread::ExceptionOffset().Int32Value(),
+                                            irb_.getJObjectTy(),
+                                            kTBAAJRuntime);
 
   // Set thread-local exception field address to NULL
-  irb_.StoreToObjectOffset(thread_object_addr,
-                           Thread::ExceptionOffset().Int32Value(),
-                           irb_.getJNull(),
-                           kTBAAJRuntime);
+  irb_.Runtime().EmitStoreToThreadOffset(Thread::ExceptionOffset().Int32Value(),
+                                         irb_.getJNull(),
+                                         kTBAAJRuntime);
 
   // Keep the exception object in the Dalvik register
   EmitStoreDalvikReg(dec_insn.vA, kObject, kAccurate, exception_object_addr);
@@ -1464,7 +1454,7 @@
 
     llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
 
-    llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+    llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
 
     llvm::Function* runtime_func =
       irb_.GetRuntime(InitializeTypeAndVerifyAccess);
@@ -1512,7 +1502,7 @@
 
     llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
 
-    llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+    llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
 
     EmitUpdateDexPC(dex_pc);
 
@@ -1562,7 +1552,7 @@
     EmitGuard_NullPointerException(dex_pc, object_addr);
   }
 
-  llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+  llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
 
   irb_.CreateCall2(irb_.GetRuntime(LockObject), object_addr, thread_object_addr);
 
@@ -1584,7 +1574,7 @@
 
   EmitUpdateDexPC(dex_pc);
 
-  llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+  llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
 
   irb_.CreateCall2(irb_.GetRuntime(UnlockObject), object_addr, thread_object_addr);
 
@@ -1762,7 +1752,7 @@
 
   llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
 
-  llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+  llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
 
   EmitUpdateDexPC(dex_pc);
 
@@ -1805,7 +1795,7 @@
 
   llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
 
-  llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+  llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
 
   EmitUpdateDexPC(dex_pc);
 
@@ -2508,7 +2498,7 @@
 
   llvm::Value* method_object_addr = EmitLoadMethodObjectAddr();
 
-  llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+  llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
 
   EmitUpdateDexPC(dex_pc);
 
@@ -3039,7 +3029,7 @@
 
   llvm::Value* caller_method_object_addr = EmitLoadMethodObjectAddr();
 
-  llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
+  llvm::Value* thread_object_addr = irb_.Runtime().EmitGetCurrentThread();
 
   EmitUpdateDexPC(dex_pc);
 
@@ -3694,8 +3684,7 @@
     return;
   }
 
-  llvm::Value* exception_pending =
-    irb_.CreateCall(irb_.GetRuntime(IsExceptionPending));
+  llvm::Value* exception_pending = irb_.Runtime().EmitIsExceptionPending();
 
   llvm::BasicBlock* block_cont = CreateBasicBlockWithDexPC(dex_pc, "cont");
 
@@ -3715,11 +3704,7 @@
     return;
   }
 
-  llvm::Value* runtime_func = irb_.GetRuntime(TestSuspend);
-
-  llvm::Value* thread_object_addr = irb_.CreateCall(irb_.GetRuntime(GetCurrentThread));
-
-  irb_.CreateCall(runtime_func, thread_object_addr);
+  irb_.Runtime().EmitTestSuspend();
 }
 
 
@@ -3960,9 +3945,15 @@
   llvm::Value* shadow_frame_upcast =
     irb_.CreateConstGEP2_32(shadow_frame_, 0, 0);
 
-  llvm::Value* result =
-      irb_.CreateCall3(irb_.GetRuntime(is_inline ? PushShadowFrame : PushShadowFrameNoInline),
-                       shadow_frame_upcast, method_object_addr, irb_.getJInt(shadow_frame_size_));
+  llvm::Value* result;
+  if (is_inline) {
+    result = irb_.Runtime().EmitPushShadowFrame(shadow_frame_upcast, method_object_addr,
+                                                shadow_frame_size_);
+  } else {
+    DCHECK(shadow_frame_size_ == 0);
+    result = irb_.Runtime().EmitPushShadowFrameNoInline(shadow_frame_upcast, method_object_addr,
+                                                        shadow_frame_size_);
+  }
   irb_.CreateStore(result, old_shadow_frame_, kTBAARegister);
 }
 
@@ -3981,14 +3972,12 @@
     irb_.CreateCondBr(need_pop, bb_pop, bb_cont, kUnlikely);
 
     irb_.SetInsertPoint(bb_pop);
-    irb_.CreateCall(irb_.GetRuntime(PopShadowFrame),
-                    irb_.CreateLoad(old_shadow_frame_, kTBAARegister));
+    irb_.Runtime().EmitPopShadowFrame(irb_.CreateLoad(old_shadow_frame_, kTBAARegister));
     irb_.CreateBr(bb_cont);
 
     irb_.SetInsertPoint(bb_cont);
   } else {
-    irb_.CreateCall(irb_.GetRuntime(PopShadowFrame),
-                    irb_.CreateLoad(old_shadow_frame_, kTBAARegister));
+    irb_.Runtime().EmitPopShadowFrame(irb_.CreateLoad(old_shadow_frame_, kTBAARegister));
   }
 }