From: vegorov@chromium.org Date: Mon, 16 Jan 2012 15:11:56 +0000 (+0000) Subject: Fix and enable NEW_NON_STRICT_FAST ArgumentsAccess stub on x64. X-Git-Tag: upstream/4.7.83~17605 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7370cf6f9d1ee47790459b2a51328cbbc01fd21b;p=platform%2Fupstream%2Fv8.git Fix and enable NEW_NON_STRICT_FAST ArgumentsAccess stub on x64. R=fschneider@chromium.org BUG=v8:1903 Review URL: http://codereview.chromium.org/9179010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10411 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc index 48e07d9..ede810c 100644 --- a/src/ia32/full-codegen-ia32.cc +++ b/src/ia32/full-codegen-ia32.cc @@ -227,7 +227,7 @@ void FullCodeGenerator::Generate(CompilationInfo* info) { Operand(ebp, StandardFrameConstants::kCallerSPOffset + offset)); __ push(edx); __ SafePush(Immediate(Smi::FromInt(num_parameters))); - // Arguments to ArgumentsAccessStub and/or New...: + // Arguments to ArgumentsAccessStub: // function, receiver address, parameter count. // The stub will rewrite receiver and parameter count if the previous // stack frame was an arguments adapter frame. diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc index e0581dd..ae633dc 100644 --- a/src/x64/code-stubs-x64.cc +++ b/src/x64/code-stubs-x64.cc @@ -2357,6 +2357,7 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) { const int kParameterMapHeaderSize = FixedArray::kHeaderSize + 2 * kPointerSize; Label no_parameter_map; + __ xor_(r8, r8); __ testq(rbx, rbx); __ j(zero, &no_parameter_map, Label::kNear); __ lea(r8, Operand(rbx, times_pointer_size, kParameterMapHeaderSize)); @@ -2450,16 +2451,13 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) { Label parameters_loop, parameters_test; // Load tagged parameter count into r9. - __ movq(r9, Operand(rsp, 1 * kPointerSize)); + __ Integer32ToSmi(r9, rbx); __ Move(r8, Smi::FromInt(Context::MIN_CONTEXT_SLOTS)); - __ addq(r8, Operand(rsp, 3 * kPointerSize)); + __ addq(r8, Operand(rsp, 1 * kPointerSize)); __ subq(r8, r9); __ Move(r11, factory->the_hole_value()); __ movq(rdx, rdi); - __ SmiToInteger64(kScratchRegister, r9); - __ lea(rdi, Operand(rdi, kScratchRegister, - times_pointer_size, - kParameterMapHeaderSize)); + __ lea(rdi, Operand(rdi, rbx, times_pointer_size, kParameterMapHeaderSize)); // r9 = loop variable (tagged) // r8 = mapping index (tagged) // r11 = the hole value @@ -2495,9 +2493,8 @@ void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) { Label arguments_loop, arguments_test; __ movq(r8, rbx); __ movq(rdx, Operand(rsp, 2 * kPointerSize)); - // Untag rcx and r8 for the loop below. + // Untag rcx for the loop below. __ SmiToInteger64(rcx, rcx); - __ SmiToInteger64(r8, r8); __ lea(kScratchRegister, Operand(r8, times_pointer_size, 0)); __ subq(rdx, kScratchRegister); __ jmp(&arguments_test, Label::kNear); diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc index 34f9490..4387a32 100644 --- a/src/x64/full-codegen-x64.cc +++ b/src/x64/full-codegen-x64.cc @@ -226,9 +226,15 @@ void FullCodeGenerator::Generate(CompilationInfo* info) { // function, receiver address, parameter count. // The stub will rewrite receiver and parameter count if the previous // stack frame was an arguments adapter frame. - ArgumentsAccessStub stub( - is_classic_mode() ? ArgumentsAccessStub::NEW_NON_STRICT_SLOW - : ArgumentsAccessStub::NEW_STRICT); + ArgumentsAccessStub::Type type; + if (!is_classic_mode()) { + type = ArgumentsAccessStub::NEW_STRICT; + } else if (function()->has_duplicate_parameters()) { + type = ArgumentsAccessStub::NEW_NON_STRICT_SLOW; + } else { + type = ArgumentsAccessStub::NEW_NON_STRICT_FAST; + } + ArgumentsAccessStub stub(type); __ CallStub(&stub); SetVar(arguments, rax, rbx, rdx);