| Index: src/x64/full-codegen-x64.cc
|
| diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc
|
| index 137622e1cd5425b5568804e85b1cfb5d12ca9f7b..dcecadf7ce630bb6a648285e0c653fec44a9ea12 100644
|
| --- a/src/x64/full-codegen-x64.cc
|
| +++ b/src/x64/full-codegen-x64.cc
|
| @@ -101,6 +101,23 @@ class JumpPatchSite BASE_EMBEDDED {
|
| };
|
|
|
|
|
| +static void EmitStackCheck(MacroAssembler* masm_,
|
| + int pointers = 0,
|
| + Register scratch = rsp) {
|
| + Isolate* isolate = masm_->isolate();
|
| + Label ok;
|
| + ASSERT(scratch.is(rsp) == (pointers == 0));
|
| + if (pointers != 0) {
|
| + __ movq(scratch, rsp);
|
| + __ subq(scratch, Immediate(pointers * kPointerSize));
|
| + }
|
| + __ CompareRoot(scratch, Heap::kStackLimitRootIndex);
|
| + __ j(above_equal, &ok, Label::kNear);
|
| + __ call(isolate->builtins()->StackCheck(), RelocInfo::CODE_TARGET);
|
| + __ bind(&ok);
|
| +}
|
| +
|
| +
|
| // Generate code for a JS function. On entry to the function the receiver
|
| // and arguments have been pushed on the stack left to right, with the
|
| // return address on top of them. The actual argument count matches the
|
| @@ -171,8 +188,27 @@ void FullCodeGenerator::Generate() {
|
| if (locals_count == 1) {
|
| __ PushRoot(Heap::kUndefinedValueRootIndex);
|
| } else if (locals_count > 1) {
|
| + if (locals_count >= 128) {
|
| + EmitStackCheck(masm_, locals_count, rcx);
|
| + }
|
| __ LoadRoot(rdx, Heap::kUndefinedValueRootIndex);
|
| - for (int i = 0; i < locals_count; i++) {
|
| + const int kMaxPushes = 32;
|
| + if (locals_count >= kMaxPushes) {
|
| + int loop_iterations = locals_count / kMaxPushes;
|
| + __ movq(rcx, Immediate(loop_iterations));
|
| + Label loop_header;
|
| + __ bind(&loop_header);
|
| + // Do pushes.
|
| + for (int i = 0; i < kMaxPushes; i++) {
|
| + __ Push(rdx);
|
| + }
|
| + // Continue loop if not done.
|
| + __ decq(rcx);
|
| + __ j(not_zero, &loop_header, Label::kNear);
|
| + }
|
| + int remaining = locals_count % kMaxPushes;
|
| + // Emit the remaining pushes.
|
| + for (int i = 0; i < remaining; i++) {
|
| __ Push(rdx);
|
| }
|
| }
|
| @@ -284,11 +320,7 @@ void FullCodeGenerator::Generate() {
|
|
|
| { Comment cmnt(masm_, "[ Stack check");
|
| PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS);
|
| - Label ok;
|
| - __ CompareRoot(rsp, Heap::kStackLimitRootIndex);
|
| - __ j(above_equal, &ok, Label::kNear);
|
| - __ call(isolate()->builtins()->StackCheck(), RelocInfo::CODE_TARGET);
|
| - __ bind(&ok);
|
| + EmitStackCheck(masm_);
|
| }
|
|
|
| { Comment cmnt(masm_, "[ Body");
|
|
|