| Index: src/x87/code-stubs-x87.cc
|
| diff --git a/src/x87/code-stubs-x87.cc b/src/x87/code-stubs-x87.cc
|
| index d4834191053c5d83f55a556cd37f01265fd02017..5e713544a8b0f8ba88f8302a07a79a041d9439f2 100644
|
| --- a/src/x87/code-stubs-x87.cc
|
| +++ b/src/x87/code-stubs-x87.cc
|
| @@ -3137,6 +3137,37 @@ void BinaryOpICWithAllocationSiteStub::Generate(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| +void CompareICStub::GenerateBooleans(MacroAssembler* masm) {
|
| + DCHECK_EQ(CompareICState::BOOLEAN, state());
|
| + Label miss;
|
| + Label::Distance const miss_distance =
|
| + masm->emit_debug_code() ? Label::kFar : Label::kNear;
|
| +
|
| + __ JumpIfSmi(edx, &miss, miss_distance);
|
| + __ mov(ecx, FieldOperand(edx, HeapObject::kMapOffset));
|
| + __ JumpIfSmi(eax, &miss, miss_distance);
|
| + __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset));
|
| + __ JumpIfNotRoot(ecx, Heap::kBooleanMapRootIndex, &miss, miss_distance);
|
| + __ JumpIfNotRoot(ebx, Heap::kBooleanMapRootIndex, &miss, miss_distance);
|
| + if (op() != Token::EQ_STRICT && is_strong(strength())) {
|
| + __ TailCallRuntime(Runtime::kThrowStrongModeImplicitConversion, 0, 1);
|
| + } else {
|
| + if (!Token::IsEqualityOp(op())) {
|
| + __ mov(eax, FieldOperand(eax, Oddball::kToNumberOffset));
|
| + __ AssertSmi(eax);
|
| + __ mov(edx, FieldOperand(edx, Oddball::kToNumberOffset));
|
| + __ AssertSmi(edx);
|
| + __ xchg(eax, edx);
|
| + }
|
| + __ sub(eax, edx);
|
| + __ Ret();
|
| + }
|
| +
|
| + __ bind(&miss);
|
| + GenerateMiss(masm);
|
| +}
|
| +
|
| +
|
| void CompareICStub::GenerateSmis(MacroAssembler* masm) {
|
| DCHECK(state() == CompareICState::SMI);
|
| Label miss;
|
|
|