Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index 3a4ce7416f80f1b8b0e2b2699b5fab9c888c2394..250f020a624f7cf55cacd8ab0aa5dc3fa8a00cc0 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -6661,6 +6661,8 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) { |
ASSERT(state_ == CompareIC::STRINGS); |
Label miss; |
+ bool equality = Token::IsEqualityOp(op_); |
+ |
// Registers containing left and right operands respectively. |
Register left = r1; |
Register right = r0; |
@@ -6694,28 +6696,39 @@ 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. |
- ASSERT(GetCondition() == eq); |
- STATIC_ASSERT(kSymbolTag != 0); |
- __ and_(tmp3, tmp1, Operand(tmp2)); |
- __ tst(tmp3, Operand(kIsSymbolMask)); |
- // Make sure r0 is non-zero. At this point input operands are |
- // guaranteed to be non-zero. |
- ASSERT(right.is(r0)); |
- __ Ret(ne); |
+ if (equality) { |
+ ASSERT(GetCondition() == eq); |
+ STATIC_ASSERT(kSymbolTag != 0); |
+ __ and_(tmp3, tmp1, Operand(tmp2)); |
+ __ tst(tmp3, Operand(kIsSymbolMask)); |
+ // Make sure r0 is non-zero. At this point input operands are |
+ // guaranteed to be non-zero. |
+ ASSERT(right.is(r0)); |
+ __ Ret(ne); |
+ } |
// Check that both strings are sequential ASCII. |
Label runtime; |
- __ JumpIfBothInstanceTypesAreNotSequentialAscii(tmp1, tmp2, tmp3, tmp4, |
- &runtime); |
+ __ JumpIfBothInstanceTypesAreNotSequentialAscii( |
+ tmp1, tmp2, tmp3, tmp4, &runtime); |
// Compare flat ASCII strings. Returns when done. |
- StringCompareStub::GenerateFlatAsciiStringEquals( |
- masm, left, right, tmp1, tmp2, tmp3); |
+ if (equality) { |
+ StringCompareStub::GenerateFlatAsciiStringEquals( |
+ masm, left, right, tmp1, tmp2, tmp3); |
+ } else { |
+ StringCompareStub::GenerateCompareFlatAsciiStrings( |
+ masm, left, right, tmp1, tmp2, tmp3, tmp4); |
+ } |
// Handle more complex cases in runtime. |
__ bind(&runtime); |
__ Push(left, right); |
- __ TailCallRuntime(Runtime::kStringEquals, 2, 1); |
+ if (equality) { |
+ __ TailCallRuntime(Runtime::kStringEquals, 2, 1); |
+ } else { |
+ __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
+ } |
__ bind(&miss); |
GenerateMiss(masm); |