| Index: src/arm/ic-arm.cc
|
| ===================================================================
|
| --- src/arm/ic-arm.cc (revision 10448)
|
| +++ src/arm/ic-arm.cc (working copy)
|
| @@ -1031,14 +1031,25 @@
|
| __ mov(r3, Operand(r2, ASR, KeyedLookupCache::kMapHashShift));
|
| __ ldr(r4, FieldMemOperand(r0, String::kHashFieldOffset));
|
| __ eor(r3, r3, Operand(r4, ASR, String::kHashShift));
|
| - __ And(r3, r3, Operand(KeyedLookupCache::kCapacityMask));
|
| + int mask = KeyedLookupCache::kCapacityMask & KeyedLookupCache::kHashMask;
|
| + __ And(r3, r3, Operand(mask));
|
|
|
| // Load the key (consisting of map and symbol) from the cache and
|
| // check for match.
|
| + Label try_second_entry, hit_on_first_entry, load_in_object_property;
|
| ExternalReference cache_keys =
|
| ExternalReference::keyed_lookup_cache_keys(isolate);
|
| __ mov(r4, Operand(cache_keys));
|
| __ add(r4, r4, Operand(r3, LSL, kPointerSizeLog2 + 1));
|
| + // Move r4 to second entry.
|
| + __ ldr(r5, MemOperand(r4, kPointerSize * 2, PostIndex));
|
| + __ cmp(r2, r5);
|
| + __ b(ne, &try_second_entry);
|
| + __ ldr(r5, MemOperand(r4, -kPointerSize)); // Load symbol
|
| + __ cmp(r0, r5);
|
| + __ b(eq, &hit_on_first_entry);
|
| +
|
| + __ bind(&try_second_entry);
|
| __ ldr(r5, MemOperand(r4, kPointerSize, PostIndex)); // Move r4 to symbol.
|
| __ cmp(r2, r5);
|
| __ b(ne, &slow);
|
| @@ -1053,13 +1064,26 @@
|
| // r3 : lookup cache index
|
| ExternalReference cache_field_offsets =
|
| ExternalReference::keyed_lookup_cache_field_offsets(isolate);
|
| +
|
| + // Hit on second entry.
|
| __ mov(r4, Operand(cache_field_offsets));
|
| + __ add(r3, r3, Operand(1));
|
| __ ldr(r5, MemOperand(r4, r3, LSL, kPointerSizeLog2));
|
| __ ldrb(r6, FieldMemOperand(r2, Map::kInObjectPropertiesOffset));
|
| __ sub(r5, r5, r6, SetCC);
|
| __ b(ge, &property_array_property);
|
| + __ jmp(&load_in_object_property);
|
|
|
| + // Hit on first entry.
|
| + __ bind(&hit_on_first_entry);
|
| + __ mov(r4, Operand(cache_field_offsets));
|
| + __ ldr(r5, MemOperand(r4, r3, LSL, kPointerSizeLog2));
|
| + __ ldrb(r6, FieldMemOperand(r2, Map::kInObjectPropertiesOffset));
|
| + __ sub(r5, r5, r6, SetCC);
|
| + __ b(ge, &property_array_property);
|
| +
|
| // Load in-object property.
|
| + __ bind(&load_in_object_property);
|
| __ ldrb(r6, FieldMemOperand(r2, Map::kInstanceSizeOffset));
|
| __ add(r6, r6, r5); // Index from start of object.
|
| __ sub(r1, r1, Operand(kHeapObjectTag)); // Remove the heap tag.
|
|
|