Index: src/x64/lithium-codegen-x64.cc |
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc |
index eb21b98be09fc97750c66e684523cc6de7d28ce8..82183f08b24da7db4baea49d99d60f8f9a420e91 100644 |
--- a/src/x64/lithium-codegen-x64.cc |
+++ b/src/x64/lithium-codegen-x64.cc |
@@ -91,8 +91,40 @@ void LCodeGen::Comment(const char* format, ...) { |
bool LCodeGen::GeneratePrologue() { |
- Abort("Unimplemented: %s", "GeneratePrologue"); |
- return false; |
+ ASSERT(is_generating()); |
+ |
+#ifdef DEBUG |
+ if (strlen(FLAG_stop_at) > 0 && |
+ info_->function()->name()->IsEqualTo(CStrVector(FLAG_stop_at))) { |
+ __ int3(); |
+ } |
+#endif |
+ |
+ __ push(rbp); // Caller's frame pointer. |
+ __ movq(rbp, rsp); |
+ __ push(rsi); // Callee's context. |
+ __ push(rdi); // Callee's JS function. |
+ |
+ // Reserve space for the stack slots needed by the code. |
+ int slots = StackSlotCount(); |
+ if (slots > 0) { |
+ if (FLAG_debug_code) { |
+ __ movl(rax, Immediate(slots)); |
+ Label loop; |
+ __ bind(&loop); |
+ __ push(Immediate(kSlotsZapValue)); |
+ __ decl(rax); |
+ __ j(not_zero, &loop); |
+ } else { |
+ __ subq(rsp, Immediate(slots * kPointerSize)); |
+ } |
+ } |
+ |
+ // Trace the call. |
+ if (FLAG_trace) { |
+ __ CallRuntime(Runtime::kTraceEnter, 0); |
+ } |
+ return !is_aborted(); |
} |