| Index: src/mips/code-stubs-mips.cc
|
| diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc
|
| index 3eaa524918156912e69058df6b717727ea70f4a3..19346af04bf29fd205e87a109cac20f962e79a7b 100644
|
| --- a/src/mips/code-stubs-mips.cc
|
| +++ b/src/mips/code-stubs-mips.cc
|
| @@ -6895,6 +6895,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 = a1;
|
| Register right = a0;
|
| @@ -6931,32 +6933,43 @@ 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));
|
| - __ And(tmp5, tmp3, Operand(kIsSymbolMask));
|
| - Label is_symbol;
|
| - __ Branch(&is_symbol, eq, tmp5, Operand(zero_reg), USE_DELAY_SLOT);
|
| - __ mov(v0, a0); // In the delay slot.
|
| - // Make sure a0 is non-zero. At this point input operands are
|
| - // guaranteed to be non-zero.
|
| - ASSERT(right.is(a0));
|
| - __ Ret();
|
| - __ bind(&is_symbol);
|
| + if (equality) {
|
| + ASSERT(GetCondition() == eq);
|
| + STATIC_ASSERT(kSymbolTag != 0);
|
| + __ And(tmp3, tmp1, Operand(tmp2));
|
| + __ And(tmp5, tmp3, Operand(kIsSymbolMask));
|
| + Label is_symbol;
|
| + __ Branch(&is_symbol, eq, tmp5, Operand(zero_reg), USE_DELAY_SLOT);
|
| + __ mov(v0, a0); // In the delay slot.
|
| + // Make sure a0 is non-zero. At this point input operands are
|
| + // guaranteed to be non-zero.
|
| + ASSERT(right.is(a0));
|
| + __ Ret();
|
| + __ bind(&is_symbol);
|
| + }
|
|
|
| // 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);
|
|
|