Index: src/ppc/macro-assembler-ppc.h |
diff --git a/src/ppc/macro-assembler-ppc.h b/src/ppc/macro-assembler-ppc.h |
index 967e276122121a8a461ec853f91883c481427297..600c297d3022d2e8b8073a8ec59cbabf533a6ede 100644 |
--- a/src/ppc/macro-assembler-ppc.h |
+++ b/src/ppc/macro-assembler-ppc.h |
@@ -1119,14 +1119,16 @@ class MacroAssembler : public Assembler { |
// (for consistency between 32/64-bit). |
// Extract consecutive bits (defined by rangeStart - rangeEnd) from src |
- // and place them into the least significant bits of dst. |
+ // and, if !test, shift them into the least significant bits of dst. |
inline void ExtractBitRange(Register dst, Register src, int rangeStart, |
- int rangeEnd, RCBit rc = LeaveRC) { |
+ int rangeEnd, RCBit rc = LeaveRC, |
+ bool test = false) { |
DCHECK(rangeStart >= rangeEnd && rangeStart < kBitsPerPointer); |
int rotate = (rangeEnd == 0) ? 0 : kBitsPerPointer - rangeEnd; |
int width = rangeStart - rangeEnd + 1; |
- if (rc == SetRC && rangeEnd == 0 && width <= 16) { |
- andi(dst, src, Operand((1 << width) - 1)); |
+ if (rc == SetRC && rangeStart < 16 && (rangeEnd == 0 || test)) { |
+ // Prefer faster andi when applicable. |
+ andi(dst, src, Operand(((1 << width) - 1) << rangeEnd)); |
} else { |
#if V8_TARGET_ARCH_PPC64 |
rldicl(dst, src, rotate, kBitsPerPointer - width, rc); |
@@ -1138,14 +1140,14 @@ class MacroAssembler : public Assembler { |
} |
inline void ExtractBit(Register dst, Register src, uint32_t bitNumber, |
- RCBit rc = LeaveRC) { |
- ExtractBitRange(dst, src, bitNumber, bitNumber, rc); |
+ RCBit rc = LeaveRC, bool test = false) { |
+ ExtractBitRange(dst, src, bitNumber, bitNumber, rc, test); |
} |
// Extract consecutive bits (defined by mask) from src and place them |
// into the least significant bits of dst. |
inline void ExtractBitMask(Register dst, Register src, uintptr_t mask, |
- RCBit rc = LeaveRC) { |
+ RCBit rc = LeaveRC, bool test = false) { |
int start = kBitsPerPointer - 1; |
int end; |
uintptr_t bit = (1L << start); |
@@ -1165,25 +1167,25 @@ class MacroAssembler : public Assembler { |
// 1-bits in mask must be contiguous |
DCHECK(bit == 0 || (mask & ((bit << 1) - 1)) == 0); |
- ExtractBitRange(dst, src, start, end, rc); |
+ ExtractBitRange(dst, src, start, end, rc, test); |
} |
// Test single bit in value. |
inline void TestBit(Register value, int bitNumber, Register scratch = r0) { |
- ExtractBitRange(scratch, value, bitNumber, bitNumber, SetRC); |
+ ExtractBitRange(scratch, value, bitNumber, bitNumber, SetRC, true); |
} |
// Test consecutive bit range in value. Range is defined by |
// rangeStart - rangeEnd. |
inline void TestBitRange(Register value, int rangeStart, int rangeEnd, |
Register scratch = r0) { |
- ExtractBitRange(scratch, value, rangeStart, rangeEnd, SetRC); |
+ ExtractBitRange(scratch, value, rangeStart, rangeEnd, SetRC, true); |
} |
// Test consecutive bit range in value. Range is defined by mask. |
inline void TestBitMask(Register value, uintptr_t mask, |
Register scratch = r0) { |
- ExtractBitMask(scratch, value, mask, SetRC); |
+ ExtractBitMask(scratch, value, mask, SetRC, true); |
} |