| Index: src/arm/stub-cache-arm.cc
|
| ===================================================================
|
| --- src/arm/stub-cache-arm.cc (revision 10591)
|
| +++ src/arm/stub-cache-arm.cc (working copy)
|
| @@ -205,8 +205,9 @@
|
| // Mask down the eor argument to the minimum to keep the immediate
|
| // ARM-encodable.
|
| __ eor(scratch, scratch, Operand(flags & mask));
|
| - // Prefer ubfx to and_ here because the mask is not ARM-encodable.
|
| - __ Ubfx(scratch, scratch, kHeapObjectTagSize, kPrimaryTableBits);
|
| + // Prefer and_ to ubfx here because ubfx takes 2 cycles.
|
| + __ and_(scratch, scratch, Operand(mask));
|
| + __ mov(scratch, Operand(scratch, LSR, 1));
|
|
|
| // Probe the primary table.
|
| ProbeTable(isolate,
|
| @@ -215,14 +216,15 @@
|
| kPrimary,
|
| name,
|
| scratch,
|
| - kHeapObjectTagSize,
|
| + 1,
|
| extra,
|
| extra2);
|
|
|
| // Primary miss: Compute hash for secondary probe.
|
| - __ rsb(scratch, name, Operand(scratch, LSL, kHeapObjectTagSize));
|
| - __ add(scratch, scratch, Operand(flags));
|
| - __ Ubfx(scratch, scratch, kHeapObjectTagSize, kSecondaryTableBits);
|
| + __ sub(scratch, scratch, Operand(name, LSR, 1));
|
| + uint32_t mask2 = (kSecondaryTableSize - 1) << (kHeapObjectTagSize - 1);
|
| + __ add(scratch, scratch, Operand((flags >> 1) & mask2));
|
| + __ and_(scratch, scratch, Operand(mask2));
|
|
|
| // Probe the secondary table.
|
| ProbeTable(isolate,
|
| @@ -231,7 +233,7 @@
|
| kSecondary,
|
| name,
|
| scratch,
|
| - kHeapObjectTagSize,
|
| + 1,
|
| extra,
|
| extra2);
|
|
|
|
|