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