| 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..698451b4fd877e572bd99f13d0a4003e2eeb2c1f 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -91,8 +91,52 @@ 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));
|
| + __ movq(kScratchRegister, kSlotsZapValue, RelocInfo::NONE);
|
| + Label loop;
|
| + __ bind(&loop);
|
| + __ push(kScratchRegister);
|
| + __ decl(rax);
|
| + __ j(not_zero, &loop);
|
| + } else {
|
| + __ subq(rsp, Immediate(slots * kPointerSize));
|
| +#ifdef _MSC_VER
|
| + // On windows, you may not access the stack more than one page below
|
| + // the most recently mapped page. To make the allocated area randomly
|
| + // accessible, we write to each page in turn (the value is irrelevant).
|
| + const int kPageSize = 4 * KB;
|
| + for (int offset = slots * kPointerSize - kPageSize;
|
| + offset > 0;
|
| + offset -= kPageSize) {
|
| + __ moveq(Operand(rsp, offset), rax);
|
| + }
|
| +#endif
|
| + }
|
| + }
|
| +
|
| + // Trace the call.
|
| + if (FLAG_trace) {
|
| + __ CallRuntime(Runtime::kTraceEnter, 0);
|
| + }
|
| + return !is_aborted();
|
| }
|
|
|
|
|
|
|