Index: src/x64/virtual-frame-x64.cc |
diff --git a/src/x64/virtual-frame-x64.cc b/src/x64/virtual-frame-x64.cc |
index ed7107517ddf26971a14079deab5b41f338ac927..e65378dc074e8ed554e7a04d9a7cf6ee2c5fd187 100644 |
--- a/src/x64/virtual-frame-x64.cc |
+++ b/src/x64/virtual-frame-x64.cc |
@@ -961,16 +961,18 @@ void VirtualFrame::SyncRange(int begin, int end) { |
// Sync elements below the range if they have not been materialized |
// on the stack. |
int start = Min(begin, stack_pointer_ + 1); |
+ int end_or_stack_pointer = Min(stack_pointer_, end); |
+ // Emit normal push instructions for elements above stack pointer |
+ // and use mov instructions if we are below stack pointer. |
+ int i = start; |
- // If positive we have to adjust the stack pointer. |
- int delta = end - stack_pointer_; |
- if (delta > 0) { |
- stack_pointer_ = end; |
- __ subq(rsp, Immediate(delta * kPointerSize)); |
- } |
- |
- for (int i = start; i <= end; i++) { |
+ while (i <= end_or_stack_pointer) { |
if (!elements_[i].is_synced()) SyncElementBelowStackPointer(i); |
+ i++; |
+ } |
+ while (i <= end) { |
+ SyncElementByPushing(i); |
+ i++; |
} |
} |