Opt compiler: Add arm64 support for floating-point.

Change-Id: I0d97ab0f5ab770fee62c819505743febbce8835e
diff --git a/compiler/optimizing/code_generator_arm64.h b/compiler/optimizing/code_generator_arm64.h
index 4a41000..ad1f221 100644
--- a/compiler/optimizing/code_generator_arm64.h
+++ b/compiler/optimizing/code_generator_arm64.h
@@ -45,11 +45,14 @@
 const vixl::Register xSuspend = vixl::x19;
 
 const vixl::CPURegList vixl_reserved_core_registers(vixl::ip0, vixl::ip1);
+const vixl::CPURegList vixl_reserved_fp_registers(vixl::d31);
 const vixl::CPURegList runtime_reserved_core_registers(tr, xSuspend, vixl::lr);
 const vixl::CPURegList quick_callee_saved_registers(vixl::CPURegister::kRegister,
                                                     vixl::kXRegSize,
                                                     kArm64CalleeSaveRefSpills);
 
+Location ARM64ReturnLocation(Primitive::Type return_type);
+
 class InvokeDexCallingConvention : public CallingConvention<vixl::Register, vixl::FPRegister> {
  public:
   InvokeDexCallingConvention()
@@ -59,11 +62,7 @@
                           kParameterFPRegistersLength) {}
 
   Location GetReturnLocation(Primitive::Type return_type) {
-    DCHECK_NE(return_type, Primitive::kPrimVoid);
-    if (return_type == Primitive::kPrimFloat || return_type == Primitive::kPrimDouble) {
-      LOG(FATAL) << "Unimplemented return type " << return_type;
-    }
-    return Location::RegisterLocation(X0);
+    return ARM64ReturnLocation(return_type);
   }
 
 
@@ -73,7 +72,7 @@
 
 class InvokeDexCallingConventionVisitor {
  public:
-  InvokeDexCallingConventionVisitor() : gp_index_(0), stack_index_(0) {}
+  InvokeDexCallingConventionVisitor() : gp_index_(0), fp_index_(0), stack_index_(0) {}
 
   Location GetNextLocation(Primitive::Type type);
   Location GetReturnLocation(Primitive::Type return_type) {
@@ -84,6 +83,8 @@
   InvokeDexCallingConvention calling_convention;
   // The current index for core registers.
   uint32_t gp_index_;
+  // The current index for floating-point registers.
+  uint32_t fp_index_;
   // The current stack index.
   uint32_t stack_index_;
 
@@ -204,10 +205,8 @@
   // (xzr, wzr), or make for poor allocatable registers (sp alignment
   // requirements, etc.). This also facilitates our task as all other registers
   // can easily be mapped via to or from their type and index or code.
-  static const int kNumberOfAllocatableCoreRegisters = vixl::kNumberOfRegisters - 1;
-  static const int kNumberOfAllocatableFloatingPointRegisters = vixl::kNumberOfFPRegisters;
-  static const int kNumberOfAllocatableRegisters =
-      kNumberOfAllocatableCoreRegisters + kNumberOfAllocatableFloatingPointRegisters;
+  static const int kNumberOfAllocatableRegisters = vixl::kNumberOfRegisters - 1;
+  static const int kNumberOfAllocatableFPRegisters = vixl::kNumberOfFPRegisters;
   static constexpr int kNumberOfAllocatableRegisterPairs = 0;
 
   void DumpCoreRegister(std::ostream& stream, int reg) const OVERRIDE;