Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Unified Diff: src/a64/deoptimizer-a64.cc

Issue 151373004: A64: Restore FP registers in Deoptimizer::EntryGenerator::Generate (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: updates Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/a64/assembler-a64.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/a64/deoptimizer-a64.cc
diff --git a/src/a64/deoptimizer-a64.cc b/src/a64/deoptimizer-a64.cc
index 95c5d3b1adde2fa1e50aed8b2b88b3c45a70e883..c50b167b1f199f079ec1f89d574b2ec281b08895 100644
--- a/src/a64/deoptimizer-a64.cc
+++ b/src/a64/deoptimizer-a64.cc
@@ -382,7 +382,7 @@ void Deoptimizer::EntryGenerator::Generate() {
// Save all allocatable floating point registers.
CPURegList saved_fp_registers(CPURegister::kFPRegister, kDRegSize,
- 0, FPRegister::NumAllocatableRegisters());
+ 0, FPRegister::NumAllocatableRegisters() - 1);
__ PushCPURegList(saved_fp_registers);
// We save all the registers expcept jssp, sp and lr.
@@ -485,13 +485,13 @@ void Deoptimizer::EntryGenerator::Generate() {
__ CallCFunction(
ExternalReference::compute_output_frames_function(isolate()), 1);
}
- __ Pop(x0); // Restore deoptimizer object (class Deoptimizer).
+ __ Pop(x4); // Restore deoptimizer object (class Deoptimizer).
// Replace the current (input) frame with the output frames.
Label outer_push_loop, inner_push_loop,
outer_loop_header, inner_loop_header;
- __ Ldrsw(x1, MemOperand(x0, Deoptimizer::output_count_offset()));
- __ Ldr(x0, MemOperand(x0, Deoptimizer::output_offset()));
+ __ Ldrsw(x1, MemOperand(x4, Deoptimizer::output_count_offset()));
+ __ Ldr(x0, MemOperand(x4, Deoptimizer::output_offset()));
__ Add(x1, x0, Operand(x1, LSL, kPointerSizeLog2));
__ B(&outer_loop_header);
@@ -514,8 +514,16 @@ 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()));
+ ASSERT(!saved_fp_registers.IncludesAliasOf(crankshaft_fp_scratch) &&
+ !saved_fp_registers.IncludesAliasOf(fp_zero) &&
+ !saved_fp_registers.IncludesAliasOf(fp_scratch));
+ int src_offset = FrameDescription::double_registers_offset();
+ while (!saved_fp_registers.IsEmpty()) {
+ const CPURegister reg = saved_fp_registers.PopLowestIndex();
+ __ Ldr(reg, MemOperand(x1, src_offset));
+ src_offset += kDoubleSize;
+ }
// Push state, pc, and continuation from the last output frame.
if (type() != OSR) {
« no previous file with comments | « src/a64/assembler-a64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698