X87: [ic] Change CompareIC to handle JSReceiver instead of JSObject.
port 0ed0878041
(r32642)
original commit message:
There's no reason to limit the CompareIC to (known) JSObject instances,
as all JSReceivers behave the same wrt. abstract and strict equality.
So remove this historical limitation and track JSReceivers instead.
BUG=
Review URL: https://codereview.chromium.org/1501373003
Cr-Commit-Position: refs/heads/master@{#32645}
This commit is contained in:
parent
086d459847
commit
1ecb225477
@ -3306,19 +3306,20 @@ void CompareICStub::GenerateStrings(MacroAssembler* masm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CompareICStub::GenerateObjects(MacroAssembler* masm) {
|
void CompareICStub::GenerateReceivers(MacroAssembler* masm) {
|
||||||
DCHECK(state() == CompareICState::OBJECT);
|
DCHECK_EQ(CompareICState::RECEIVER, state());
|
||||||
Label miss;
|
Label miss;
|
||||||
__ mov(ecx, edx);
|
__ mov(ecx, edx);
|
||||||
__ and_(ecx, eax);
|
__ and_(ecx, eax);
|
||||||
__ JumpIfSmi(ecx, &miss, Label::kNear);
|
__ JumpIfSmi(ecx, &miss, Label::kNear);
|
||||||
|
|
||||||
__ CmpObjectType(eax, JS_OBJECT_TYPE, ecx);
|
STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
|
||||||
__ j(not_equal, &miss, Label::kNear);
|
__ CmpObjectType(eax, FIRST_JS_RECEIVER_TYPE, ecx);
|
||||||
__ CmpObjectType(edx, JS_OBJECT_TYPE, ecx);
|
__ j(below, &miss, Label::kNear);
|
||||||
__ j(not_equal, &miss, Label::kNear);
|
__ CmpObjectType(edx, FIRST_JS_RECEIVER_TYPE, ecx);
|
||||||
|
__ j(below, &miss, Label::kNear);
|
||||||
|
|
||||||
DCHECK(GetCondition() == equal);
|
DCHECK_EQ(equal, GetCondition());
|
||||||
__ sub(eax, edx);
|
__ sub(eax, edx);
|
||||||
__ ret(0);
|
__ ret(0);
|
||||||
|
|
||||||
@ -3327,7 +3328,7 @@ void CompareICStub::GenerateObjects(MacroAssembler* masm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CompareICStub::GenerateKnownObjects(MacroAssembler* masm) {
|
void CompareICStub::GenerateKnownReceivers(MacroAssembler* masm) {
|
||||||
Label miss;
|
Label miss;
|
||||||
Handle<WeakCell> cell = Map::WeakCellForMap(known_map_);
|
Handle<WeakCell> cell = Map::WeakCellForMap(known_map_);
|
||||||
__ mov(ecx, edx);
|
__ mov(ecx, edx);
|
||||||
|
Loading…
Reference in New Issue
Block a user