Index: src/ia32/code-stubs-ia32.cc |
diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc |
index 54a1a348a93f4a1cb306ebeedaf3555ce0c9d93d..d3e2a919cad26ad0d6f3fc36fbec19888be8fee1 100644 |
--- a/src/ia32/code-stubs-ia32.cc |
+++ b/src/ia32/code-stubs-ia32.cc |
@@ -6462,7 +6462,7 @@ void StringCompareStub::GenerateAsciiCharsCompareLoop( |
__ mov_b(scratch, Operand(left, index, times_1, 0)); |
__ cmpb(scratch, Operand(right, index, times_1, 0)); |
__ j(not_equal, chars_not_equal, chars_not_equal_near); |
- __ add(index, Immediate(1)); |
+ __ inc(index); |
__ j(not_zero, &loop); |
} |
@@ -6645,9 +6645,10 @@ void ICCompareStub::GenerateSymbols(MacroAssembler* masm) { |
void ICCompareStub::GenerateStrings(MacroAssembler* masm) { |
ASSERT(state_ == CompareIC::STRINGS); |
- ASSERT(GetCondition() == equal); |
Label miss; |
+ bool equality = Token::IsEqualityOp(op_); |
+ |
// Registers containing left and right operands respectively. |
Register left = edx; |
Register right = eax; |
@@ -6686,25 +6687,33 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) { |
__ bind(¬_same); |
// Check that both strings are symbols. If they are, we're done |
- // because we already know they are not identical. |
- Label do_compare; |
- STATIC_ASSERT(kSymbolTag != 0); |
- __ and_(tmp1, tmp2); |
- __ test(tmp1, Immediate(kIsSymbolMask)); |
- __ j(zero, &do_compare, Label::kNear); |
- // Make sure eax is non-zero. At this point input operands are |
- // guaranteed to be non-zero. |
- ASSERT(right.is(eax)); |
- __ ret(0); |
+ // because we already know they are not identical. But in the case of |
+ // non-equality compare, we still need to determine the order. |
+ if (equality) { |
+ Label do_compare; |
+ STATIC_ASSERT(kSymbolTag != 0); |
+ __ and_(tmp1, tmp2); |
+ __ test(tmp1, Immediate(kIsSymbolMask)); |
+ __ j(zero, &do_compare, Label::kNear); |
+ // Make sure eax is non-zero. At this point input operands are |
+ // guaranteed to be non-zero. |
+ ASSERT(right.is(eax)); |
+ __ ret(0); |
+ __ bind(&do_compare); |
+ } |
// Check that both strings are sequential ASCII. |
Label runtime; |
- __ bind(&do_compare); |
__ JumpIfNotBothSequentialAsciiStrings(left, right, tmp1, tmp2, &runtime); |
// Compare flat ASCII strings. Returns when done. |
- StringCompareStub::GenerateFlatAsciiStringEquals( |
- masm, left, right, tmp1, tmp2); |
+ if (equality) { |
+ StringCompareStub::GenerateFlatAsciiStringEquals( |
+ masm, left, right, tmp1, tmp2); |
+ } else { |
+ StringCompareStub::GenerateCompareFlatAsciiStrings( |
+ masm, left, right, tmp1, tmp2, tmp3); |
+ } |
// Handle more complex cases in runtime. |
__ bind(&runtime); |
@@ -6712,7 +6721,11 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) { |
__ push(left); |
__ push(right); |
__ push(tmp1); |
- __ TailCallRuntime(Runtime::kStringEquals, 2, 1); |
+ if (equality) { |
+ __ TailCallRuntime(Runtime::kStringEquals, 2, 1); |
+ } else { |
+ __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
+ } |
__ bind(&miss); |
GenerateMiss(masm); |