Index: src/x64/code-stubs-x64.cc |
diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc |
index 1354e62b44bd190d08e7785ded4f45fb697798c8..d616749e02f2a3c7a8389b92e1e975f42a81095a 100644 |
--- a/src/x64/code-stubs-x64.cc |
+++ b/src/x64/code-stubs-x64.cc |
@@ -5454,7 +5454,7 @@ void StringCompareStub::GenerateAsciiCharsCompareLoop( |
__ movb(scratch, Operand(left, index, times_1, 0)); |
__ cmpb(scratch, Operand(right, index, times_1, 0)); |
__ j(not_equal, chars_not_equal, near_jump); |
- __ addq(index, Immediate(1)); |
+ __ incq(index); |
__ j(not_zero, &loop); |
} |
@@ -5625,9 +5625,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 = rdx; |
Register right = rax; |
@@ -5665,24 +5666,31 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) { |
// 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); |
- __ testb(tmp1, Immediate(kIsSymbolMask)); |
- __ j(zero, &do_compare, Label::kNear); |
- // Make sure rax is non-zero. At this point input operands are |
- // guaranteed to be non-zero. |
- ASSERT(right.is(rax)); |
- __ ret(0); |
+ if (equality) { |
+ Label do_compare; |
+ STATIC_ASSERT(kSymbolTag != 0); |
+ __ and_(tmp1, tmp2); |
+ __ testb(tmp1, Immediate(kIsSymbolMask)); |
+ __ j(zero, &do_compare, Label::kNear); |
+ // Make sure rax is non-zero. At this point input operands are |
+ // guaranteed to be non-zero. |
+ ASSERT(right.is(rax)); |
+ __ 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, kScratchRegister); |
+ } |
// Handle more complex cases in runtime. |
__ bind(&runtime); |
@@ -5690,7 +5698,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); |