x86 JNI compiler and unit tests.

Change-Id: I4c2e10328961a2e8e27c90777fe2a93737b21143
diff --git a/src/calling_convention_arm.cc b/src/calling_convention_arm.cc
new file mode 100644
index 0000000..233905a
--- /dev/null
+++ b/src/calling_convention_arm.cc
@@ -0,0 +1,83 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+// Author: irogers@google.com (Ian Rogers)
+
+#include "src/calling_convention.h"
+#include "src/logging.h"
+
+namespace art {
+
+ManagedRegister CallingConvention::MethodRegister() {
+  return ManagedRegister::FromCoreRegister(R0);
+}
+
+ManagedRegister CallingConvention::InterproceduralScratchRegister() {
+  return ManagedRegister::FromCoreRegister(R12);
+}
+
+ManagedRegister CallingConvention::ReturnRegister() {
+  if (GetMethod()->IsReturnAFloat()) {
+    return ManagedRegister::FromSRegister(S0);
+  } else if (GetMethod()->IsReturnAFloat()) {
+    return ManagedRegister::FromDRegister(D0);
+  } else if (GetMethod()->IsReturnALong()) {
+    return ManagedRegister::FromRegisterPair(R0_R1);
+  } else {
+    return ManagedRegister::FromCoreRegister(R0);
+  }
+}
+
+// Managed runtime calling convention
+
+bool ManagedRuntimeCallingConvention::IsCurrentParamInRegister() {
+  return itr_position_ < 3;
+}
+
+bool ManagedRuntimeCallingConvention::IsCurrentParamOnStack() {
+  return itr_position_ >= 3;
+}
+
+static const Register kManagedArgumentRegisters[] = {
+  R1, R2, R3
+};
+ManagedRegister ManagedRuntimeCallingConvention::CurrentParamRegister() {
+  CHECK_LT(itr_position_, 3u);
+  return
+    ManagedRegister::FromCoreRegister(kManagedArgumentRegisters[itr_position_]);
+}
+
+FrameOffset ManagedRuntimeCallingConvention::CurrentParamStackOffset() {
+  CHECK_GE(itr_position_, 3u);
+  return FrameOffset(displacement_.Int32Value() +
+                 ((itr_position_ + itr_longs_and_doubles_ - 3) * kPointerSize));
+}
+
+// JNI calling convention
+
+bool JniCallingConvention::IsCurrentParamInRegister() {
+  return itr_position_ < 4;
+}
+
+bool JniCallingConvention::IsCurrentParamOnStack() {
+  return itr_position_ >= 4;
+}
+
+static const Register kJniArgumentRegisters[] = {
+  R0, R1, R2, R3
+};
+ManagedRegister JniCallingConvention::CurrentParamRegister() {
+  CHECK_LT(itr_position_, 4u);
+  return
+    ManagedRegister::FromCoreRegister(kJniArgumentRegisters[itr_position_]);
+}
+
+FrameOffset JniCallingConvention::CurrentParamStackOffset() {
+  CHECK_GE(itr_position_, 4u);
+  return FrameOffset(displacement_.Int32Value() - OutArgSize()
+               + ((itr_position_ + itr_longs_and_doubles_ - 4) * kPointerSize));
+}
+
+size_t JniCallingConvention::NumberOfOutgoingStackArgs() {
+  return GetMethod()->NumArgs() + GetMethod()->NumLongOrDoubleArgs() - 2;
+}
+
+}  // namespace art