Chromium Code Reviews| Index: src/arm/stub-cache-arm.cc |
| =================================================================== |
| --- src/arm/stub-cache-arm.cc (revision 8507) |
| +++ 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)); |
|
Erik Corry
2011/07/04 06:54:34
Strange indentation here. The value_off_addr shou
m.m.capewell
2011/07/14 15:00:18
Done.
|
| // 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(Assembler::NumRegistersInRegList(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. |