| Index: src/mips/code-stubs-mips.cc
|
| diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc
|
| index 4717847a21e962863ee740c66e99f6f2b4e429d4..a928dc0aeb5c942ffb130999aa96881705fa6753 100644
|
| --- a/src/mips/code-stubs-mips.cc
|
| +++ b/src/mips/code-stubs-mips.cc
|
| @@ -6785,15 +6785,15 @@ void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) {
|
| ASSERT(state_ == CompareIC::HEAP_NUMBERS);
|
|
|
| Label generic_stub;
|
| - Label unordered;
|
| + Label unordered, maybe_undefined1, maybe_undefined2;
|
| Label miss;
|
| __ And(a2, a1, Operand(a0));
|
| __ JumpIfSmi(a2, &generic_stub);
|
|
|
| __ GetObjectType(a0, a2, a2);
|
| - __ Branch(&miss, ne, a2, Operand(HEAP_NUMBER_TYPE));
|
| + __ Branch(&maybe_undefined1, ne, a2, Operand(HEAP_NUMBER_TYPE));
|
| __ GetObjectType(a1, a2, a2);
|
| - __ Branch(&miss, ne, a2, Operand(HEAP_NUMBER_TYPE));
|
| + __ Branch(&maybe_undefined2, ne, a2, Operand(HEAP_NUMBER_TYPE));
|
|
|
| // Inlining the double comparison and falling back to the general compare
|
| // stub if NaN is involved or FPU is unsupported.
|
| @@ -6825,14 +6825,29 @@ void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) {
|
| __ bind(&fpu_lt);
|
| __ Ret(USE_DELAY_SLOT);
|
| __ li(v0, Operand(LESS)); // In delay slot.
|
| -
|
| - __ bind(&unordered);
|
| }
|
|
|
| + __ bind(&unordered);
|
| +
|
| CompareStub stub(GetCondition(), strict(), NO_COMPARE_FLAGS, a1, a0);
|
| __ bind(&generic_stub);
|
| __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
|
|
|
| + __ bind(&maybe_undefined1);
|
| + if (Token::IsOrderedRelationalCompareOp(op_)) {
|
| + __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
|
| + __ Branch(&miss, ne, a0, Operand(at));
|
| + __ GetObjectType(a1, a2, a2);
|
| + __ Branch(&maybe_undefined2, ne, a2, Operand(HEAP_NUMBER_TYPE));
|
| + __ jmp(&unordered);
|
| + }
|
| +
|
| + __ bind(&maybe_undefined2);
|
| + if (Token::IsOrderedRelationalCompareOp(op_)) {
|
| + __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
|
| + __ Branch(&unordered, eq, a1, Operand(at));
|
| + }
|
| +
|
| __ bind(&miss);
|
| GenerateMiss(masm);
|
| }
|
|
|