Index: src/arm/stub-cache-arm.cc |
=================================================================== |
--- src/arm/stub-cache-arm.cc (revision 8654) |
+++ src/arm/stub-cache-arm.cc (working copy) |
@@ -41,7 +41,7 @@ |
static void ProbeTable(Isolate* isolate, |
MacroAssembler* masm, |
- Code::Flags flags, |
+ Register flags, |
StubCache::Table table, |
Register name, |
Register offset, |
@@ -63,14 +63,13 @@ |
// Check that the key in the entry matches the name. |
__ mov(offsets_base_addr, Operand(key_offset)); |
- __ ldr(ip, MemOperand(offsets_base_addr, offset, LSL, 1)); |
+ __ ldr(ip, MemOperand(offsets_base_addr, offset, LSL, 1, PreIndex)); |
__ cmp(name, ip); |
__ b(ne, &miss); |
// Get the code entry from the cache. |
- __ add(offsets_base_addr, offsets_base_addr, |
- Operand(value_off_addr - key_off_addr)); |
- __ ldr(scratch2, MemOperand(offsets_base_addr, offset, LSL, 1)); |
+ __ ldr(scratch2, MemOperand(offsets_base_addr, |
+ value_off_addr - key_off_addr)); |
// Check that the flags match what we're looking for. |
__ ldr(scratch2, FieldMemOperand(scratch2, Code::kFlagsOffset)); |
@@ -79,7 +78,7 @@ |
__ b(ne, &miss); |
// Re-load code entry from cache. |
- __ ldr(offset, MemOperand(offsets_base_addr, offset, LSL, 1)); |
+ __ ldr(offset, MemOperand(offsets_base_addr, value_off_addr - key_off_addr)); |
// Jump to the first instruction in the code stub. |
__ add(offset, offset, Operand(Code::kHeaderSize - kHeapObjectTag)); |
@@ -161,7 +160,8 @@ |
Register name, |
Register scratch, |
Register extra, |
- Register extra2) { |
+ Register extra2, |
+ Register extra3) { |
Isolate* isolate = masm->isolate(); |
Label miss; |
@@ -172,46 +172,37 @@ |
// Make sure the flags does not name a specific type. |
ASSERT(Code::ExtractTypeFromFlags(flags) == 0); |
- // Make sure that there are no register conflicts. |
- ASSERT(!scratch.is(receiver)); |
- ASSERT(!scratch.is(name)); |
- ASSERT(!extra.is(receiver)); |
- ASSERT(!extra.is(name)); |
- ASSERT(!extra.is(scratch)); |
- ASSERT(!extra2.is(receiver)); |
- ASSERT(!extra2.is(name)); |
- ASSERT(!extra2.is(scratch)); |
- ASSERT(!extra2.is(extra)); |
+ // Make sure that there are no register conflicts and registers are valid. |
+ ASSERT(NumRegs(receiver.bit() | name.bit() | scratch.bit() | extra.bit() | |
+ extra2.bit() | extra3.bit()) == 6); |
- // Check scratch, extra and extra2 registers are valid. |
- ASSERT(!scratch.is(no_reg)); |
- ASSERT(!extra.is(no_reg)); |
- ASSERT(!extra2.is(no_reg)); |
- |
// Check that the receiver isn't a smi. |
__ JumpIfSmi(receiver, &miss); |
+ // Copy flags into a register. |
+ __ mov(extra3, Operand(flags)); |
+ |
// Get the map of the receiver and compute the hash. |
__ ldr(scratch, FieldMemOperand(name, String::kHashFieldOffset)); |
__ ldr(ip, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
__ add(scratch, scratch, Operand(ip)); |
- __ eor(scratch, scratch, Operand(flags)); |
+ __ eor(scratch, scratch, Operand(extra3)); |
__ and_(scratch, |
scratch, |
Operand((kPrimaryTableSize - 1) << kHeapObjectTagSize)); |
// Probe the primary table. |
- ProbeTable(isolate, masm, flags, kPrimary, name, scratch, extra, extra2); |
+ ProbeTable(isolate, masm, extra3, kPrimary, name, scratch, extra, extra2); |
// Primary miss: Compute hash for secondary probe. |
__ sub(scratch, scratch, Operand(name)); |
- __ add(scratch, scratch, Operand(flags)); |
+ __ add(scratch, scratch, Operand(extra3)); |
__ and_(scratch, |
scratch, |
Operand((kSecondaryTableSize - 1) << kHeapObjectTagSize)); |
// Probe the secondary table. |
- ProbeTable(isolate, masm, flags, kSecondary, name, scratch, extra, extra2); |
+ ProbeTable(isolate, masm, extra3, kSecondary, name, scratch, extra, extra2); |
// Cache miss: Fall-through and let caller handle the miss by |
// entering the runtime system. |