Add Dalvik register allocation codegen.

Change-Id: I8842b1b03ff3fa362b69d386cc5927be6d65b460
diff --git a/src/compiler_llvm/method_compiler.h b/src/compiler_llvm/method_compiler.h
index 532ad1a..7834657 100644
--- a/src/compiler_llvm/method_compiler.h
+++ b/src/compiler_llvm/method_compiler.h
@@ -19,6 +19,7 @@
 
 #include "backend_types.h"
 #include "constants.h"
+#include "dalvik_reg.h"
 #include "dex_file.h"
 #include "dex_instruction.h"
 #include "object_utils.h"
@@ -80,8 +81,11 @@
   IRBuilder& irb_;
   llvm::Function* func_;
 
-  llvm::BasicBlock* prologue_;
+  std::vector<DalvikReg*> regs_;
+  UniquePtr<DalvikReg> retval_reg_;
 
+  llvm::BasicBlock* basic_block_reg_alloca_;
+  llvm::BasicBlock* basic_block_reg_zero_init_;
   std::vector<llvm::BasicBlock*> basic_blocks_;
 
 
@@ -100,10 +104,27 @@
 
   CompiledMethod* Compile();
 
+
+  // Code generation helper function
+
+  IRBuilder& GetIRBuilder() const {
+    return irb_;
+  }
+
+
+  // Register helper function
+
+  llvm::Value* AllocDalvikLocalVarReg(RegCategory cat, uint32_t reg_idx);
+
+  llvm::Value* AllocDalvikRetValReg(RegCategory cat);
+
+
  private:
   void CreateFunction();
 
+
   void EmitPrologue();
+  void EmitPrologueLastBranch();
   void EmitInstructions();
   void EmitInstruction(uint32_t dex_pc, Instruction const* insn);
 
@@ -123,6 +144,46 @@
   llvm::BasicBlock* CreateBasicBlockWithDexPC(uint32_t dex_pc,
                                               char const* postfix = NULL);
 
+
+  // Register helper function
+
+  llvm::Value* EmitLoadDalvikReg(uint32_t reg_idx, JType jty,
+                                 JTypeSpace space) {
+    return regs_[reg_idx]->GetValue(jty, space);
+  }
+
+  llvm::Value* EmitLoadDalvikReg(uint32_t reg_idx, char shorty,
+                                 JTypeSpace space) {
+    return EmitLoadDalvikReg(reg_idx, GetJTypeFromShorty(shorty), space);
+  }
+
+  void EmitStoreDalvikReg(uint32_t reg_idx, JType jty,
+                          JTypeSpace space, llvm::Value* new_value) {
+    regs_[reg_idx]->SetValue(jty, space, new_value);
+  }
+
+  void EmitStoreDalvikReg(uint32_t reg_idx, char shorty,
+                          JTypeSpace space, llvm::Value* new_value) {
+    EmitStoreDalvikReg(reg_idx, GetJTypeFromShorty(shorty), space, new_value);
+  }
+
+  llvm::Value* EmitLoadDalvikRetValReg(JType jty, JTypeSpace space) {
+    return retval_reg_->GetValue(jty, space);
+  }
+
+  llvm::Value* EmitLoadDalvikRetValReg(char shorty, JTypeSpace space) {
+    return EmitLoadDalvikRetValReg(GetJTypeFromShorty(shorty), space);
+  }
+
+  void EmitStoreDalvikRetValReg(JType jty, JTypeSpace space,
+                                llvm::Value* new_value) {
+    retval_reg_->SetValue(jty, space, new_value);
+  }
+
+  void EmitStoreDalvikRetValReg(char shorty, JTypeSpace space,
+                                llvm::Value* new_value) {
+    EmitStoreDalvikRetValReg(GetJTypeFromShorty(shorty), space, new_value);
+  }
 };