| Index: src/arm/ic-arm.cc
|
| ===================================================================
|
| --- src/arm/ic-arm.cc (revision 5174)
|
| +++ src/arm/ic-arm.cc (working copy)
|
| @@ -1105,7 +1105,7 @@
|
| // -- r0 : key
|
| // -- r1 : receiver
|
| // -----------------------------------
|
| - Label slow, check_string, index_smi, index_string;
|
| + Label slow, check_string, index_smi, index_string, property_array_property;
|
| Label check_pixel_array, probe_dictionary, check_number_dictionary;
|
|
|
| Register key = r0;
|
| @@ -1193,7 +1193,7 @@
|
| __ cmp(r0, r5);
|
| __ b(ne, &slow);
|
|
|
| - // Get field offset and check that it is an in-object property.
|
| + // Get field offset.
|
| // r0 : key
|
| // r1 : receiver
|
| // r2 : receiver's map
|
| @@ -1203,11 +1203,10 @@
|
| __ mov(r4, Operand(cache_field_offsets));
|
| __ ldr(r5, MemOperand(r4, r3, LSL, kPointerSizeLog2));
|
| __ ldrb(r6, FieldMemOperand(r2, Map::kInObjectPropertiesOffset));
|
| - __ cmp(r5, r6);
|
| - __ b(ge, &slow);
|
| + __ sub(r5, r5, r6, SetCC);
|
| + __ b(ge, &property_array_property);
|
|
|
| // Load in-object property.
|
| - __ sub(r5, r5, r6); // Index from end of object.
|
| __ ldrb(r6, FieldMemOperand(r2, Map::kInstanceSizeOffset));
|
| __ add(r6, r6, r5); // Index from start of object.
|
| __ sub(r1, r1, Operand(kHeapObjectTag)); // Remove the heap tag.
|
| @@ -1215,6 +1214,14 @@
|
| __ IncrementCounter(&Counters::keyed_load_generic_lookup_cache, 1, r2, r3);
|
| __ Ret();
|
|
|
| + // Load property array property.
|
| + __ bind(&property_array_property);
|
| + __ ldr(r1, FieldMemOperand(r1, JSObject::kPropertiesOffset));
|
| + __ add(r1, r1, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
|
| + __ ldr(r0, MemOperand(r1, r5, LSL, kPointerSizeLog2));
|
| + __ IncrementCounter(&Counters::keyed_load_generic_lookup_cache, 1, r2, r3);
|
| + __ Ret();
|
| +
|
| // Do a quick inline probe of the receiver's dictionary, if it
|
| // exists.
|
| __ bind(&probe_dictionary);
|
|
|