Chromium Code Reviews| Index: src/arm/code-stubs-arm.cc |
| =================================================================== |
| --- src/arm/code-stubs-arm.cc (revision 7153) |
| +++ src/arm/code-stubs-arm.cc (working copy) |
| @@ -5960,7 +5960,6 @@ |
| Register symbol_table = c2; |
| __ LoadRoot(symbol_table, Heap::kSymbolTableRootIndex); |
| - // Load undefined value |
| Register undefined = scratch4; |
| __ LoadRoot(undefined, Heap::kUndefinedValueRootIndex); |
| @@ -5981,6 +5980,7 @@ |
| // mask: capacity mask |
| // first_symbol_table_element: address of the first element of |
| // the symbol table |
| + // undefined: the undefined object |
| // scratch: - |
| // Perform a number of probes in the symbol table. |
| @@ -6008,20 +6008,27 @@ |
| kPointerSizeLog2)); |
| // If entry is undefined no string with this hash can be found. |
| - __ cmp(candidate, undefined); |
| + Label is_string; |
| + __ CompareObjectType(candidate, scratch, scratch, ODDBALL_TYPE); |
| + __ b(ne, &is_string); |
| + |
| + __ cmp(undefined, candidate); |
| __ b(eq, not_found); |
| + // Must be null (deleted entry). |
|
Lasse Reichstein
2011/03/15 09:07:01
How about adding some debug code to test that it i
Erik Corry
2011/03/15 10:00:50
Done.
|
| + __ jmp(&next_probe[i]); |
| + __ bind(&is_string); |
| + |
| + // Check that the candidate is a non-external ascii string. The instance |
|
Lasse Reichstein
2011/03/15 09:07:01
ASCII is an acronym.
Erik Corry
2011/03/15 10:00:50
Done.
|
| + // type is still in the scratch register from the CompareObjectType |
| + // operation. |
| + __ JumpIfInstanceTypeIsNotSequentialAscii(scratch, scratch, &next_probe[i]); |
| + |
| // If length is not 2 the string is not a candidate. |
| __ ldr(scratch, FieldMemOperand(candidate, String::kLengthOffset)); |
| __ cmp(scratch, Operand(Smi::FromInt(2))); |
| __ b(ne, &next_probe[i]); |
| - // Check that the candidate is a non-external ascii string. |
| - __ ldr(scratch, FieldMemOperand(candidate, HeapObject::kMapOffset)); |
| - __ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset)); |
| - __ JumpIfInstanceTypeIsNotSequentialAscii(scratch, scratch, |
| - &next_probe[i]); |
| - |
| // Check if the two characters match. |
| // Assumes that word load is little endian. |
| __ ldrh(scratch, FieldMemOperand(candidate, SeqAsciiString::kHeaderSize)); |
| @@ -6448,8 +6455,8 @@ |
| // Adding two lengths can't overflow. |
| STATIC_ASSERT(String::kMaxLength < String::kMaxLength * 2); |
| __ add(r6, r2, Operand(r3)); |
| - // Use the runtime system when adding two one character strings, as it |
| - // contains optimizations for this specific case using the symbol table. |
| + // Use the symbol table when adding two one character strings, as it |
| + // helps later optimizations to return a symbol here. |
| __ cmp(r6, Operand(2)); |
| __ b(ne, &longer_than_two); |