Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 5097) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -11839,6 +11839,12 @@ |
__ 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; |
@@ -11858,7 +11864,7 @@ |
__ cmov(above, eax, Operand(ecx)); |
__ mov(ecx, Immediate(Smi::FromInt(-1))); |
__ cmov(below, eax, Operand(ecx)); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
} else { |
FloatingPointHelper::CheckFloatOperands( |
masm, &non_number_comparison, ebx); |
@@ -11869,20 +11875,22 @@ |
__ j(parity_even, &unordered, not_taken); |
Label below_label, above_label; |
- // Return a result of -1, 0, or 1, based on EFLAGS. |
+ // 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. |
__ j(below, &below_label, not_taken); |
__ j(above, &above_label, not_taken); |
__ xor_(eax, Operand(eax)); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
__ bind(&below_label); |
__ mov(eax, Immediate(Smi::FromInt(-1))); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
__ bind(&above_label); |
__ mov(eax, Immediate(Smi::FromInt(1))); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
} |
// If one of the numbers was NaN, then the result is always false. |
@@ -11894,7 +11902,7 @@ |
} else { |
__ mov(eax, Immediate(Smi::FromInt(-1))); |
} |
- __ ret(0); |
+ __ ret(2 * kPointerSize); // eax, edx were pushed |
// The number comparison code did not provide a valid result. |
__ bind(&non_number_comparison); |
@@ -11909,7 +11917,7 @@ |
// 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(0); |
+ __ ret(2 * kPointerSize); |
} |
__ bind(&check_for_strings); |
@@ -11962,12 +11970,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); // rax, rdx were pushed |
+ __ ret(2 * kPointerSize); // rax, rdx were pushed |
__ bind(¬_both_objects); |
} |
- // Push arguments below the return address. |
+ // must swap argument order |
__ pop(ecx); |
+ __ pop(edx); |
+ __ pop(eax); |
__ push(edx); |
__ push(eax); |
@@ -13544,19 +13554,19 @@ |
ASSERT_EQ(0, EQUAL); |
ASSERT_EQ(0, kSmiTag); |
__ Set(eax, Immediate(Smi::FromInt(EQUAL))); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
__ bind(&result_not_equal); |
__ j(greater, &result_greater); |
// Result is LESS. |
__ Set(eax, Immediate(Smi::FromInt(LESS))); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
// Result is GREATER. |
__ bind(&result_greater); |
__ Set(eax, Immediate(Smi::FromInt(GREATER))); |
- __ ret(0); |
+ __ ret(2 * kPointerSize); |
} |
@@ -13586,10 +13596,6 @@ |
__ 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) |