Index: src/ppc/macro-assembler-ppc.cc |
diff --git a/src/ppc/macro-assembler-ppc.cc b/src/ppc/macro-assembler-ppc.cc |
index d3671433b9988c0a0f933176679958fdfad04648..b646b36c19b700607047f4ab4206c9d010dbefda 100644 |
--- a/src/ppc/macro-assembler-ppc.cc |
+++ b/src/ppc/macro-assembler-ppc.cc |
@@ -4537,23 +4537,35 @@ void MacroAssembler::JumpIfDictionaryInPrototypeChain(Register object, |
Register scratch1, |
Label* found) { |
DCHECK(!scratch1.is(scratch0)); |
- Factory* factory = isolate()->factory(); |
Register current = scratch0; |
- Label loop_again; |
+ Label loop_again, end; |
// scratch contained elements pointer. |
mr(current, object); |
+ LoadP(current, FieldMemOperand(current, HeapObject::kMapOffset)); |
+ LoadP(current, FieldMemOperand(current, Map::kPrototypeOffset)); |
+ CompareRoot(current, Heap::kNullValueRootIndex); |
+ beq(&end); |
// Loop based on the map going up the prototype chain. |
bind(&loop_again); |
LoadP(current, FieldMemOperand(current, HeapObject::kMapOffset)); |
+ |
+ STATIC_ASSERT(JS_PROXY_TYPE < JS_OBJECT_TYPE); |
+ STATIC_ASSERT(JS_VALUE_TYPE < JS_OBJECT_TYPE); |
+ lbz(scratch1, FieldMemOperand(current, Map::kInstanceTypeOffset)); |
+ cmpi(scratch1, Operand(JS_OBJECT_TYPE)); |
+ blt(found); |
+ |
lbz(scratch1, FieldMemOperand(current, Map::kBitField2Offset)); |
DecodeField<Map::ElementsKindBits>(scratch1); |
cmpi(scratch1, Operand(DICTIONARY_ELEMENTS)); |
beq(found); |
LoadP(current, FieldMemOperand(current, Map::kPrototypeOffset)); |
- Cmpi(current, Operand(factory->null_value()), r0); |
+ CompareRoot(current, Heap::kNullValueRootIndex); |
bne(&loop_again); |
+ |
+ bind(&end); |
} |