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. |