Index: src/arm/ic-arm.cc |
diff --git a/src/arm/ic-arm.cc b/src/arm/ic-arm.cc |
index db04f3308666c179005d2bab2f99f1a3d303fb2a..731c4719e79146ec3a99c3c1e9472f16bba98eb8 100644 |
--- a/src/arm/ic-arm.cc |
+++ b/src/arm/ic-arm.cc |
@@ -105,65 +105,6 @@ static void GenerateStringDictionaryReceiverCheck(MacroAssembler* masm, |
} |
-// Probe the string dictionary in the |elements| register. Jump to the |
-// |done| label if a property with the given name is found. Jump to |
-// the |miss| label otherwise. |
-static void GenerateStringDictionaryProbes(MacroAssembler* masm, |
- Label* miss, |
- Label* done, |
- Register elements, |
- Register name, |
- Register scratch1, |
- Register scratch2) { |
- // Assert that name contains a string. |
- if (FLAG_debug_code) __ AbortIfNotString(name); |
- |
- // Compute the capacity mask. |
- const int kCapacityOffset = StringDictionary::kHeaderSize + |
- StringDictionary::kCapacityIndex * kPointerSize; |
- __ ldr(scratch1, FieldMemOperand(elements, kCapacityOffset)); |
- __ mov(scratch1, Operand(scratch1, ASR, kSmiTagSize)); // convert smi to int |
- __ sub(scratch1, scratch1, Operand(1)); |
- |
- const int kElementsStartOffset = StringDictionary::kHeaderSize + |
- StringDictionary::kElementsStartIndex * kPointerSize; |
- |
- // Generate an unrolled loop that performs a few probes before |
- // giving up. Measurements done on Gmail indicate that 2 probes |
- // cover ~93% of loads from dictionaries. |
- static const int kProbes = 4; |
- for (int i = 0; i < kProbes; i++) { |
- // Compute the masked index: (hash + i + i * i) & mask. |
- __ ldr(scratch2, FieldMemOperand(name, String::kHashFieldOffset)); |
- if (i > 0) { |
- // Add the probe offset (i + i * i) left shifted to avoid right shifting |
- // the hash in a separate instruction. The value hash + i + i * i is right |
- // shifted in the following and instruction. |
- ASSERT(StringDictionary::GetProbeOffset(i) < |
- 1 << (32 - String::kHashFieldOffset)); |
- __ add(scratch2, scratch2, Operand( |
- StringDictionary::GetProbeOffset(i) << String::kHashShift)); |
- } |
- __ and_(scratch2, scratch1, Operand(scratch2, LSR, String::kHashShift)); |
- |
- // Scale the index by multiplying by the element size. |
- ASSERT(StringDictionary::kEntrySize == 3); |
- // scratch2 = scratch2 * 3. |
- __ add(scratch2, scratch2, Operand(scratch2, LSL, 1)); |
- |
- // Check if the key is identical to the name. |
- __ add(scratch2, elements, Operand(scratch2, LSL, 2)); |
- __ ldr(ip, FieldMemOperand(scratch2, kElementsStartOffset)); |
- __ cmp(name, Operand(ip)); |
- if (i != kProbes - 1) { |
- __ b(eq, done); |
- } else { |
- __ b(ne, miss); |
- } |
- } |
-} |
- |
- |
// Helper function used from LoadIC/CallIC GenerateNormal. |
// |
// elements: Property dictionary. It is not clobbered if a jump to the miss |
@@ -191,13 +132,13 @@ static void GenerateDictionaryLoad(MacroAssembler* masm, |
Label done; |
// Probe the dictionary. |
- GenerateStringDictionaryProbes(masm, |
- miss, |
- &done, |
- elements, |
- name, |
- scratch1, |
- scratch2); |
+ StringDictionaryLookupStub::GeneratePositiveLookup(masm, |
+ miss, |
+ &done, |
+ elements, |
+ name, |
+ scratch1, |
+ scratch2); |
// If probing finds an entry check that the value is a normal |
// property. |
@@ -240,13 +181,13 @@ static void GenerateDictionaryStore(MacroAssembler* masm, |
Label done; |
// Probe the dictionary. |
- GenerateStringDictionaryProbes(masm, |
- miss, |
- &done, |
- elements, |
- name, |
- scratch1, |
- scratch2); |
+ StringDictionaryLookupStub::GeneratePositiveLookup(masm, |
+ miss, |
+ &done, |
+ elements, |
+ name, |
+ scratch1, |
+ scratch2); |
// If probing finds an entry in the dictionary check that the value |
// is a normal property that is not read only. |