Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 5097) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -10288,6 +10288,12 @@ |
__ 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; |
@@ -10303,7 +10309,7 @@ |
__ setcc(above, rax); |
__ setcc(below, rcx); |
__ subq(rax, rcx); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); // rax, rdx were pushed |
// If one of the numbers was NaN, then the result is always false. |
// The cc is never not-equal. |
@@ -10314,7 +10320,7 @@ |
} else { |
__ Set(rax, -1); |
} |
- __ ret(0); |
+ __ ret(2 * kPointerSize); // rax, rdx were pushed |
// The number comparison code did not provide a valid result. |
__ bind(&non_number_comparison); |
@@ -10329,7 +10335,7 @@ |
// 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(0); |
+ __ ret(2 * kPointerSize); |
} |
__ bind(&check_for_strings); |
@@ -10380,12 +10386,14 @@ |
__ 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(0); |
+ __ ret(2 * kPointerSize); // rax, rdx were pushed |
__ bind(¬_both_objects); |
} |
- // Push arguments below the return address to prepare jump to builtin. |
+ // must swap argument order |
__ pop(rcx); |
+ __ pop(rdx); |
+ __ pop(rax); |
__ push(rdx); |
__ push(rax); |
@@ -11962,7 +11970,7 @@ |
// Result is EQUAL. |
__ Move(rax, Smi::FromInt(EQUAL)); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
Label result_greater; |
__ bind(&result_not_equal); |
@@ -11971,12 +11979,12 @@ |
// Result is LESS. |
__ Move(rax, Smi::FromInt(LESS)); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
// Result is GREATER. |
__ bind(&result_greater); |
__ Move(rax, Smi::FromInt(GREATER)); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
} |
@@ -12006,10 +12014,6 @@ |
// 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) |