From 96a7cc4a3814f1dc0e5d968ce3ceba943e477787 Mon Sep 17 00:00:00 2001 From: "whesse@chromium.org" Date: Mon, 19 Jul 2010 13:35:41 +0000 Subject: [PATCH] Delay the pushing of arguments until just before calling runtime in CompareStub. This will allow jumps to runtime that skip useless tests. Review URL: http://codereview.chromium.org/3016004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5097 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ia32/codegen-ia32.cc | 38 ++++++++++++++++---------------------- src/x64/codegen-x64.cc | 28 ++++++++++++---------------- 2 files changed, 28 insertions(+), 38 deletions(-) diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc index 20fbfa35c2..d9b7a2823b 100644 --- a/src/ia32/codegen-ia32.cc +++ b/src/ia32/codegen-ia32.cc @@ -11839,12 +11839,6 @@ void CompareStub::Generate(MacroAssembler* masm) { __ bind(&slow); } - // Push arguments below the return address. - __ pop(ecx); - __ push(eax); - __ push(edx); - __ push(ecx); - // Generate the number comparison code. if (include_number_compare_) { Label non_number_comparison; @@ -11864,7 +11858,7 @@ void CompareStub::Generate(MacroAssembler* masm) { __ cmov(above, eax, Operand(ecx)); __ mov(ecx, Immediate(Smi::FromInt(-1))); __ cmov(below, eax, Operand(ecx)); - __ ret(2 * kPointerSize); + __ ret(0); } else { FloatingPointHelper::CheckFloatOperands( masm, &non_number_comparison, ebx); @@ -11875,22 +11869,20 @@ void CompareStub::Generate(MacroAssembler* masm) { __ j(parity_even, &unordered, not_taken); Label below_label, above_label; - // Return a result of -1, 0, or 1, based on EFLAGS. In all cases remove - // two arguments from the stack as they have been pushed in preparation - // of a possible runtime call. + // Return a result of -1, 0, or 1, based on EFLAGS. __ j(below, &below_label, not_taken); __ j(above, &above_label, not_taken); __ xor_(eax, Operand(eax)); - __ ret(2 * kPointerSize); + __ ret(0); __ bind(&below_label); __ mov(eax, Immediate(Smi::FromInt(-1))); - __ ret(2 * kPointerSize); + __ ret(0); __ bind(&above_label); __ mov(eax, Immediate(Smi::FromInt(1))); - __ ret(2 * kPointerSize); + __ ret(0); } // If one of the numbers was NaN, then the result is always false. @@ -11902,7 +11894,7 @@ void CompareStub::Generate(MacroAssembler* masm) { } else { __ mov(eax, Immediate(Smi::FromInt(-1))); } - __ ret(2 * kPointerSize); // eax, edx were pushed + __ ret(0); // The number comparison code did not provide a valid result. __ bind(&non_number_comparison); @@ -11917,7 +11909,7 @@ void CompareStub::Generate(MacroAssembler* masm) { // We've already checked for object identity, so if both operands // are symbols they aren't equal. Register eax already holds a // non-zero value, which indicates not equal, so just return. - __ ret(2 * kPointerSize); + __ ret(0); } __ bind(&check_for_strings); @@ -11970,14 +11962,12 @@ void CompareStub::Generate(MacroAssembler* masm) { __ bind(&return_unequal); // Return non-equal by returning the non-zero object pointer in eax, // or return equal if we fell through to here. - __ ret(2 * kPointerSize); // rax, rdx were pushed + __ ret(0); // rax, rdx were pushed __ bind(¬_both_objects); } - // must swap argument order + // Push arguments below the return address. __ pop(ecx); - __ pop(edx); - __ pop(eax); __ push(edx); __ push(eax); @@ -13554,19 +13544,19 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, ASSERT_EQ(0, EQUAL); ASSERT_EQ(0, kSmiTag); __ Set(eax, Immediate(Smi::FromInt(EQUAL))); - __ ret(2 * kPointerSize); + __ ret(0); __ bind(&result_not_equal); __ j(greater, &result_greater); // Result is LESS. __ Set(eax, Immediate(Smi::FromInt(LESS))); - __ ret(2 * kPointerSize); + __ ret(0); // Result is GREATER. __ bind(&result_greater); __ Set(eax, Immediate(Smi::FromInt(GREATER))); - __ ret(2 * kPointerSize); + __ ret(0); } @@ -13596,6 +13586,10 @@ void StringCompareStub::Generate(MacroAssembler* masm) { __ JumpIfNotBothSequentialAsciiStrings(edx, eax, ecx, ebx, &runtime); // Compare flat ascii strings. + // Drop arguments from the stack. + __ pop(ecx); + __ add(Operand(esp), Immediate(2 * kPointerSize)); + __ push(ecx); GenerateCompareFlatAsciiStrings(masm, edx, eax, ecx, ebx, edi); // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index b41fb74c8b..6de9286697 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -10288,12 +10288,6 @@ void CompareStub::Generate(MacroAssembler* masm) { __ bind(&slow); } - // Push arguments below the return address to prepare jump to builtin. - __ pop(rcx); - __ push(rax); - __ push(rdx); - __ push(rcx); - // Generate the number comparison code. if (include_number_compare_) { Label non_number_comparison; @@ -10309,7 +10303,7 @@ void CompareStub::Generate(MacroAssembler* masm) { __ setcc(above, rax); __ setcc(below, rcx); __ subq(rax, rcx); - __ ret(2 * kPointerSize); // rax, rdx were pushed + __ ret(0); // If one of the numbers was NaN, then the result is always false. // The cc is never not-equal. @@ -10320,7 +10314,7 @@ void CompareStub::Generate(MacroAssembler* masm) { } else { __ Set(rax, -1); } - __ ret(2 * kPointerSize); // rax, rdx were pushed + __ ret(0); // The number comparison code did not provide a valid result. __ bind(&non_number_comparison); @@ -10335,7 +10329,7 @@ void CompareStub::Generate(MacroAssembler* masm) { // We've already checked for object identity, so if both operands // are symbols they aren't equal. Register eax (not rax) already holds a // non-zero value, which indicates not equal, so just return. - __ ret(2 * kPointerSize); + __ ret(0); } __ bind(&check_for_strings); @@ -10386,14 +10380,12 @@ void CompareStub::Generate(MacroAssembler* masm) { __ bind(&return_unequal); // Return non-equal by returning the non-zero object pointer in eax, // or return equal if we fell through to here. - __ ret(2 * kPointerSize); // rax, rdx were pushed + __ ret(0); __ bind(¬_both_objects); } - // must swap argument order + // Push arguments below the return address to prepare jump to builtin. __ pop(rcx); - __ pop(rdx); - __ pop(rax); __ push(rdx); __ push(rax); @@ -11970,7 +11962,7 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, // Result is EQUAL. __ Move(rax, Smi::FromInt(EQUAL)); - __ ret(2 * kPointerSize); + __ ret(0); Label result_greater; __ bind(&result_not_equal); @@ -11979,12 +11971,12 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm, // Result is LESS. __ Move(rax, Smi::FromInt(LESS)); - __ ret(2 * kPointerSize); + __ ret(0); // Result is GREATER. __ bind(&result_greater); __ Move(rax, Smi::FromInt(GREATER)); - __ ret(2 * kPointerSize); + __ ret(0); } @@ -12014,6 +12006,10 @@ void StringCompareStub::Generate(MacroAssembler* masm) { // Inline comparison of ascii strings. __ IncrementCounter(&Counters::string_compare_native, 1); + // Drop arguments from the stack + __ pop(rcx); + __ addq(rsp, Immediate(2 * kPointerSize)); + __ push(rcx); GenerateCompareFlatAsciiStrings(masm, rdx, rax, rcx, rbx, rdi, r8); // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater)