Method prologue and epilogues, add missing x86 functionality.

Enables compiling and running a number of JNI internal managed code
methods on the host.

Change-Id: I56fceb813d0cb24637bc784ba57f2d1d16911d48
diff --git a/src/jni_compiler.cc b/src/jni_compiler.cc
index bb64c73..25d76ca 100644
--- a/src/jni_compiler.cc
+++ b/src/jni_compiler.cc
@@ -97,7 +97,7 @@
     } else {
       if (!mr_conv->IsCurrentParamOnStack()) {
         // regular non-straddling move
-        __ Move(out_reg, in_reg);
+        __ Move(out_reg, in_reg, mr_conv->CurrentParamSize());
       } else {
         UNIMPLEMENTED(FATAL);  // we currently don't expect to see this case
       }
@@ -159,7 +159,7 @@
     __ StoreRawPtr(dest, in_reg);
   } else {
     if (!jni_conv->CurrentParamRegister().Equals(in_reg)) {
-      __ Move(jni_conv->CurrentParamRegister(), in_reg);
+      __ Move(jni_conv->CurrentParamRegister(), in_reg, jni_conv->CurrentParamSize());
     }
   }
 }
@@ -199,7 +199,7 @@
   // 1. Build the frame saving all callee saves
   const size_t frame_size(jni_conv->FrameSize());
   const std::vector<ManagedRegister>& callee_save_regs = jni_conv->CalleeSaveRegisters();
-  __ BuildFrame(frame_size, mr_conv->MethodRegister(), callee_save_regs);
+  __ BuildFrame(frame_size, mr_conv->MethodRegister(), callee_save_regs, mr_conv->EntrySpills());
 
   // 2. Set up the StackIndirectReferenceTable
   mr_conv->ResetIterator(FrameOffset(frame_size));
@@ -279,9 +279,11 @@
     // Compute arguments in registers to preserve
     mr_conv->ResetIterator(FrameOffset(frame_size + out_arg_size));
     std::vector<ManagedRegister> live_argument_regs;
+    std::vector<size_t> live_argument_regs_size;
     while (mr_conv->HasNext()) {
       if (mr_conv->IsCurrentParamInRegister()) {
         live_argument_regs.push_back(mr_conv->CurrentParamRegister());
+        live_argument_regs_size.push_back(mr_conv->CurrentParamSize());
       }
       mr_conv->Next();
     }
@@ -289,7 +291,7 @@
     // Copy arguments to preserve to callee save registers
     CHECK_LE(live_argument_regs.size(), callee_save_regs.size());
     for (size_t i = 0; i < live_argument_regs.size(); i++) {
-      __ Move(callee_save_regs.at(i), live_argument_regs.at(i));
+      __ Move(callee_save_regs.at(i), live_argument_regs.at(i), live_argument_regs_size.at(i));
     }
 
     // Get SIRT entry for 1st argument (jclass or this) to be 1st argument to
@@ -331,7 +333,7 @@
 
     // Restore live arguments
     for (size_t i = 0; i < live_argument_regs.size(); i++) {
-      __ Move(live_argument_regs.at(i), callee_save_regs.at(i));
+      __ Move(live_argument_regs.at(i), callee_save_regs.at(i), live_argument_regs_size.at(i));
     }
   }
 
@@ -515,7 +517,8 @@
     __ DecreaseFrameSize(out_arg_size);
     jni_conv->ResetIterator(FrameOffset(0));
   }
-  __ Move(mr_conv->ReturnRegister(), jni_conv->ReturnRegister());
+  DCHECK_EQ(mr_conv->SizeOfReturnValue(), jni_conv->SizeOfReturnValue());
+  __ Move(mr_conv->ReturnRegister(), jni_conv->ReturnRegister(), mr_conv->SizeOfReturnValue());
 
   // 14. Restore segment state and remove SIRT from thread
   {