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:
zhengxing.li 2015-12-07 00:41:05 -08:00 committed by Commit bot
parent 086d459847
commit 1ecb225477

View File

@ -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);