ARM64: Remove suspend register.

It also clean up build/remove frame used by JNI compiler and generates
stp/ldp instead of str/ldr. Also x19 has been unblocked in both quick and
optimizing compiler.

Change-Id: Idbeac0942265f493266b2ef9b7a65bb4054f0e2d
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc
index 33eacba..263f83f 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -466,8 +466,10 @@
     //      sp[0]                     : current method.
     __ Str(kArtMethodRegister, MemOperand(sp, -frame_size, PreIndex));
     GetAssembler()->cfi().AdjustCFAOffset(frame_size);
-    SpillRegisters(GetFramePreservedCoreRegisters(), frame_size - GetCoreSpillSize());
-    SpillRegisters(GetFramePreservedFPRegisters(), frame_size - FrameEntrySpillSize());
+    GetAssembler()->SpillRegisters(GetFramePreservedCoreRegisters(),
+        frame_size - GetCoreSpillSize());
+    GetAssembler()->SpillRegisters(GetFramePreservedFPRegisters(),
+        frame_size - FrameEntrySpillSize());
   }
 }
 
@@ -475,8 +477,10 @@
   GetAssembler()->cfi().RememberState();
   if (!HasEmptyFrame()) {
     int frame_size = GetFrameSize();
-    UnspillRegisters(GetFramePreservedFPRegisters(), frame_size - FrameEntrySpillSize());
-    UnspillRegisters(GetFramePreservedCoreRegisters(), frame_size - GetCoreSpillSize());
+    GetAssembler()->UnspillRegisters(GetFramePreservedFPRegisters(),
+        frame_size - FrameEntrySpillSize());
+    GetAssembler()->UnspillRegisters(GetFramePreservedCoreRegisters(),
+        frame_size - GetCoreSpillSize());
     __ Drop(frame_size);
     GetAssembler()->cfi().AdjustCFAOffset(-frame_size);
   }
@@ -485,51 +489,6 @@
   GetAssembler()->cfi().DefCFAOffset(GetFrameSize());
 }
 
-static inline dwarf::Reg DWARFReg(CPURegister reg) {
-  if (reg.IsFPRegister()) {
-    return dwarf::Reg::Arm64Fp(reg.code());
-  } else {
-    DCHECK_LT(reg.code(), 31u);  // X0 - X30.
-    return dwarf::Reg::Arm64Core(reg.code());
-  }
-}
-
-void CodeGeneratorARM64::SpillRegisters(vixl::CPURegList registers, int offset) {
-  int size = registers.RegisterSizeInBytes();
-  while (registers.Count() >= 2) {
-    const CPURegister& dst0 = registers.PopLowestIndex();
-    const CPURegister& dst1 = registers.PopLowestIndex();
-    __ Stp(dst0, dst1, MemOperand(__ StackPointer(), offset));
-    GetAssembler()->cfi().RelOffset(DWARFReg(dst0), offset);
-    GetAssembler()->cfi().RelOffset(DWARFReg(dst1), offset + size);
-    offset += 2 * size;
-  }
-  if (!registers.IsEmpty()) {
-    const CPURegister& dst0 = registers.PopLowestIndex();
-    __ Str(dst0, MemOperand(__ StackPointer(), offset));
-    GetAssembler()->cfi().RelOffset(DWARFReg(dst0), offset);
-  }
-  DCHECK(registers.IsEmpty());
-}
-
-void CodeGeneratorARM64::UnspillRegisters(vixl::CPURegList registers, int offset) {
-  int size = registers.RegisterSizeInBytes();
-  while (registers.Count() >= 2) {
-    const CPURegister& dst0 = registers.PopLowestIndex();
-    const CPURegister& dst1 = registers.PopLowestIndex();
-    __ Ldp(dst0, dst1, MemOperand(__ StackPointer(), offset));
-    GetAssembler()->cfi().Restore(DWARFReg(dst0));
-    GetAssembler()->cfi().Restore(DWARFReg(dst1));
-    offset += 2 * size;
-  }
-  if (!registers.IsEmpty()) {
-    const CPURegister& dst0 = registers.PopLowestIndex();
-    __ Ldr(dst0, MemOperand(__ StackPointer(), offset));
-    GetAssembler()->cfi().Restore(DWARFReg(dst0));
-  }
-  DCHECK(registers.IsEmpty());
-}
-
 void CodeGeneratorARM64::Bind(HBasicBlock* block) {
   __ Bind(GetLabelOf(block));
 }