X87: [ic] Also collect known map for relational comparison.
port e56f265f6d
(r30852).
original commit message:
Previously we only collected the known map for equality comparisons. But
if we also collect it for relational comparisons, we can inline a fast
path of ToPrimitive on the objects, which is especially interesting
since both sides have the same map.
For now we only inline a very limited subset of ToPrimitive in
Crankshaft, which is when the receiver map (and its prototype chain)
doesn't have @@toPrimitive, and both valueOf and toString are the
default versions on the %ObjectPrototype%. In this case the relational
comparison would reduce to a string comparison of "[object CLASS]" with
itself and so we can reduce that to a boolean constant plus map checks
on both left and right hand side, plus code dependencies on the
prototype chain. This repairs the regression on box2d.
BUG=
Review URL: https://codereview.chromium.org/1342243005
Cr-Commit-Position: refs/heads/master@{#30897}
This commit is contained in:
parent
5e6f7a6ccb
commit
687ef62eb5
@ -3426,15 +3426,24 @@ void CompareICStub::GenerateKnownObjects(MacroAssembler* masm) {
|
||||
__ JumpIfSmi(ecx, &miss, Label::kNear);
|
||||
|
||||
__ GetWeakValue(edi, cell);
|
||||
__ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset));
|
||||
__ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset));
|
||||
__ cmp(ecx, edi);
|
||||
__ cmp(edi, FieldOperand(eax, HeapObject::kMapOffset));
|
||||
__ j(not_equal, &miss, Label::kNear);
|
||||
__ cmp(ebx, edi);
|
||||
__ cmp(edi, FieldOperand(edx, HeapObject::kMapOffset));
|
||||
__ j(not_equal, &miss, Label::kNear);
|
||||
|
||||
__ sub(eax, edx);
|
||||
__ ret(0);
|
||||
if (Token::IsEqualityOp(op())) {
|
||||
__ sub(eax, edx);
|
||||
__ ret(0);
|
||||
} else if (is_strong(strength())) {
|
||||
__ TailCallRuntime(Runtime::kThrowStrongModeImplicitConversion, 0, 1);
|
||||
} else {
|
||||
__ PopReturnAddressTo(ecx);
|
||||
__ Push(edx);
|
||||
__ Push(eax);
|
||||
__ Push(Immediate(Smi::FromInt(NegativeComparisonResult(GetCondition()))));
|
||||
__ PushReturnAddressFrom(ecx);
|
||||
__ TailCallRuntime(Runtime::kCompare, 3, 1);
|
||||
}
|
||||
|
||||
__ bind(&miss);
|
||||
GenerateMiss(masm);
|
||||
|
Loading…
Reference in New Issue
Block a user