Reviewers: Rodolph Perfetta (ARM), ulan,

Description:
A64: Restore FP registers in Deoptimizer::EntryGenerator::Generate

BUG=none
[email protected],[email protected]
LOG=y

Please review this at https://codereview.chromium.org/151373004/

SVN Base: https://v8.googlecode.com/svn/branches/experimental/a64

Affected files (+14, -2 lines):
  M src/a64/assembler-a64.h
  M src/a64/deoptimizer-a64.cc


Index: src/a64/assembler-a64.h
diff --git a/src/a64/assembler-a64.h b/src/a64/assembler-a64.h
index f8b6b7204eb88d4b60cf87ea4a0386c5083f8c88..bcc9a1ac3ebafe072a2d7dfe2ff7ea959e45b12a 100644
--- a/src/a64/assembler-a64.h
+++ b/src/a64/assembler-a64.h
@@ -342,6 +342,8 @@ const Register wzr = w31;

 // Crankshaft double scratch register.
 const FPRegister crankshaft_fp_scratch = d29;
+// Keeps the 0 double value.
+const FPRegister fp_zero = d30;
 // MacroAssembler double scratch register.
 const FPRegister fp_scratch = d31;

Index: src/a64/deoptimizer-a64.cc
diff --git a/src/a64/deoptimizer-a64.cc b/src/a64/deoptimizer-a64.cc
index 95c5d3b1adde2fa1e50aed8b2b88b3c45a70e883..5416b669abc81133973c4b7e98753a85b06e8cb2 100644
--- a/src/a64/deoptimizer-a64.cc
+++ b/src/a64/deoptimizer-a64.cc
@@ -486,6 +486,7 @@ void Deoptimizer::EntryGenerator::Generate() {
         ExternalReference::compute_output_frames_function(isolate()), 1);
   }
   __ Pop(x0);  // Restore deoptimizer object (class Deoptimizer).
+  __ Mov(x4, x0);

   // Replace the current (input) frame with the output frames.
   Label outer_push_loop, inner_push_loop,
@@ -514,8 +515,17 @@ void Deoptimizer::EntryGenerator::Generate() {
   __ Cmp(x0, x1);
   __ B(lt, &outer_push_loop);

-  // TODO(jbramley): The ARM code restores FP registers here.
-  TODO_UNIMPLEMENTED("EntryGenerator::Generate: Restore FP registers.");
+  __ Ldr(x1, MemOperand(x4, Deoptimizer::input_offset()));
+  int src_offset = FrameDescription::double_registers_offset();
+  for (unsigned i = 0; i < kNumberOfFPRegisters; ++i) {
+    if (i == crankshaft_fp_scratch.code()) continue;
+    if (i == fp_zero.code()) continue;
+    if (i == fp_scratch.code()) continue;
+
+    const FPRegister reg = FPRegister::from_code(i);
+    __ Ldr(reg, MemOperand(x1, src_offset));
+    src_offset += kDoubleSize;
+  }

   // Push state, pc, and continuation from the last output frame.
   if (type() != OSR) {


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to