Chromium Code Reviews| Index: src/ia32/stub-cache-ia32.cc |
| =================================================================== |
| --- src/ia32/stub-cache-ia32.cc (revision 2337) |
| +++ src/ia32/stub-cache-ia32.cc (working copy) |
| @@ -41,39 +41,54 @@ |
| Code::Flags flags, |
| StubCache::Table table, |
| Register name, |
| - Register offset) { |
| + Register offset, |
| + Register extra) { |
| ExternalReference key_offset(SCTableReference::keyReference(table)); |
| ExternalReference value_offset(SCTableReference::valueReference(table)); |
| Label miss; |
| - // Save the offset on the stack. |
| - __ push(offset); |
| + if (extra.is_valid()) { |
| + // Get the code entry from the cache. |
|
Kasper Lund
2009/07/02 12:53:08
I take it you've considered having multiple extra.
|
| + __ mov(extra, Operand::StaticArray(offset, times_2, value_offset)); |
| - // Check that the key in the entry matches the name. |
| - __ cmp(name, Operand::StaticArray(offset, times_2, key_offset)); |
| - __ j(not_equal, &miss, not_taken); |
| + // Check that the key in the entry matches the name. |
| + __ cmp(name, Operand::StaticArray(offset, times_2, key_offset)); |
| + __ j(not_equal, &miss, not_taken); |
| - // Get the code entry from the cache. |
| - __ mov(offset, Operand::StaticArray(offset, times_2, value_offset)); |
| + // Check that the flags match what we're looking for. |
| + __ mov(offset, FieldOperand(extra, Code::kFlagsOffset)); |
| + __ and_(offset, ~Code::kFlagsNotUsedInLookup); |
| + __ cmp(offset, flags); |
| + __ j(not_equal, &miss); |
| - // Check that the flags match what we're looking for. |
| - __ mov(offset, FieldOperand(offset, Code::kFlagsOffset)); |
| - __ and_(offset, ~Code::kFlagsNotUsedInLookup); |
| - __ cmp(offset, flags); |
| - __ j(not_equal, &miss); |
| + // Jump to the first instruction in the code stub. |
| + __ add(Operand(extra), Immediate(Code::kHeaderSize - kHeapObjectTag)); |
| + __ jmp(Operand(extra)); |
| - // Restore offset and re-load code entry from cache. |
| - __ pop(offset); |
| - __ mov(offset, Operand::StaticArray(offset, times_2, value_offset)); |
| + } else { |
| + // Check that the key in the entry matches the name. |
| + __ cmp(name, Operand::StaticArray(offset, times_2, key_offset)); |
| + __ j(not_equal, &miss, not_taken); |
| - // Jump to the first instruction in the code stub. |
| - __ add(Operand(offset), Immediate(Code::kHeaderSize - kHeapObjectTag)); |
| - __ jmp(Operand(offset)); |
| + // Get the code entry from the cache. |
| + __ mov(offset, Operand::StaticArray(offset, times_2, value_offset)); |
| - // Miss: Restore offset and fall through. |
| + // Check that the flags match what we're looking for. |
| + __ mov(offset, FieldOperand(offset, Code::kFlagsOffset)); |
| + __ and_(offset, ~Code::kFlagsNotUsedInLookup); |
| + __ cmp(offset, flags); |
| + __ j(not_equal, &miss); |
| + |
| + // Restore offset and re-load code entry from cache. |
| + __ mov(offset, Operand::StaticArray(offset, times_2, value_offset)); |
| + |
| + // Jump to the first instruction in the code stub. |
| + __ add(Operand(offset), Immediate(Code::kHeaderSize - kHeapObjectTag)); |
| + __ jmp(Operand(offset)); |
| + |
| + } |
| __ bind(&miss); |
| - __ pop(offset); |
| } |
| @@ -81,7 +96,8 @@ |
| Code::Flags flags, |
| Register receiver, |
| Register name, |
| - Register scratch) { |
| + Register scratch, |
| + Register extra) { |
| Label miss; |
| // Make sure that code is valid. The shifting code relies on the |
| @@ -106,15 +122,19 @@ |
| __ and_(scratch, (kPrimaryTableSize - 1) << kHeapObjectTagSize); |
| // Probe the primary table. |
| - ProbeTable(masm, flags, kPrimary, name, scratch); |
| + ProbeTable(masm, flags, kPrimary, name, scratch, extra); |
| // Primary miss: Compute hash for secondary probe. |
| + __ mov(scratch, FieldOperand(name, String::kLengthOffset)); |
| + __ add(scratch, FieldOperand(receiver, HeapObject::kMapOffset)); |
| + __ xor_(scratch, flags); |
| + __ and_(scratch, (kPrimaryTableSize - 1) << kHeapObjectTagSize); |
| __ sub(scratch, Operand(name)); |
| __ add(Operand(scratch), Immediate(flags)); |
| __ and_(scratch, (kSecondaryTableSize - 1) << kHeapObjectTagSize); |
| // Probe the secondary table. |
| - ProbeTable(masm, flags, kSecondary, name, scratch); |
| + ProbeTable(masm, flags, kSecondary, name, scratch, extra); |
| // Cache miss: Fall-through and let caller handle the miss by |
| // entering the runtime system. |