Fix various JNI compiler bugs/unimplementeds.

For both x86 and arm we were under computing the outgoing argument size.
For ARM the managed double/long passing had been assumed to be following AAPCS,
however, currently we split long/doubles across R1_R2 and R3 and the stack.
Add support for this in the managed register and jni compiler code.
Add test and various other clean ups to jni compiler code.

Change-Id: I4129076d052a8bce42304f5331b71aa3ac50210f
diff --git a/src/assembler_arm.cc b/src/assembler_arm.cc
index 472d000..9f4e03f 100644
--- a/src/assembler_arm.cc
+++ b/src/assembler_arm.cc
@@ -1486,6 +1486,13 @@
   StoreToOffset(kStoreWord, src.AsCoreRegister(), SP, dest.Int32Value());
 }
 
+void Assembler::StoreSpanning(FrameOffset dest, ManagedRegister src,
+                              FrameOffset in_off, ManagedRegister scratch) {
+  StoreToOffset(kStoreWord, src.AsCoreRegister(), SP, dest.Int32Value());
+  LoadFromOffset(kLoadWord, scratch.AsCoreRegister(), SP, in_off.Int32Value());
+  StoreToOffset(kStoreWord, scratch.AsCoreRegister(), SP, dest.Int32Value() + 4);
+}
+
 void Assembler::CopyRef(FrameOffset dest, FrameOffset src,
                         ManagedRegister scratch) {
   LoadFromOffset(kLoadWord, scratch.AsCoreRegister(), SP, src.Int32Value());
@@ -1581,9 +1588,23 @@
     if (dest.IsCoreRegister()) {
       CHECK(src.IsCoreRegister());
       mov(dest.AsCoreRegister(), ShifterOperand(src.AsCoreRegister()));
+    } else if (dest.IsDRegister()) {
+      CHECK(src.IsDRegister());
+      vmovd(dest.AsDRegister(), src.AsDRegister());
+    } else if (dest.IsSRegister()) {
+      CHECK(src.IsSRegister());
+      vmovs(dest.AsSRegister(), src.AsSRegister());
     } else {
-      // TODO: VFP
-      UNIMPLEMENTED(FATAL) << ": VFP";
+      CHECK(dest.IsRegisterPair());
+      CHECK(src.IsRegisterPair());
+      // Ensure that the first move doesn't clobber the input of the second
+      if (src.AsRegisterPairHigh() != dest.AsRegisterPairLow()) {
+        mov(dest.AsRegisterPairLow(), ShifterOperand(src.AsRegisterPairLow()));
+        mov(dest.AsRegisterPairHigh(), ShifterOperand(src.AsRegisterPairHigh()));
+      } else {
+        mov(dest.AsRegisterPairHigh(), ShifterOperand(src.AsRegisterPairHigh()));
+        mov(dest.AsRegisterPairLow(), ShifterOperand(src.AsRegisterPairLow()));
+      }
     }
   }
 }