Reviewers: danno, Paul Lind, palfia, kisg, dusmil,
Description:
MIPS: Convert String array index/length hash to BitField.
Port r21533 (736c779)
BUG=
Please review this at https://codereview.chromium.org/297233007/
SVN Base: https://github.com/v8/v8.git@gbl
Affected files (+23, -12 lines):
M src/mips/macro-assembler-mips.h
M src/mips/macro-assembler-mips.cc
Index: src/mips/macro-assembler-mips.cc
diff --git a/src/mips/macro-assembler-mips.cc
b/src/mips/macro-assembler-mips.cc
index
d2fa8dec69e93c01d54e1308e4baa1b1e0740ee7..d2b1462f108675b128c04c4539075bc9ec7a260b
100644
--- a/src/mips/macro-assembler-mips.cc
+++ b/src/mips/macro-assembler-mips.cc
@@ -3999,19 +3999,14 @@ bool MacroAssembler::AllowThisStubCall(CodeStub*
stub) {
}
-void MacroAssembler::IndexFromHash(Register hash,
- Register index) {
+void MacroAssembler::IndexFromHash(Register hash, Register index) {
// If the hash field contains an array index pick it out. The assert
checks
// that the constants for the maximum number of digits for an array index
// cached in the hash field and the number of bits reserved for it does
not
// conflict.
ASSERT(TenToThe(String::kMaxCachedArrayIndexLength) <
(1 << String::kArrayIndexValueBits));
- // We want the smi-tagged index in key. kArrayIndexValueMask has zeros
in
- // the low kHashShift bits.
- STATIC_ASSERT(kSmiTag == 0);
- Ext(hash, hash, String::kHashShift, String::kArrayIndexValueBits);
- sll(index, hash, kSmiTagSize);
+ DecodeFieldToSmi<String::ArrayIndexValueBits>(index, hash);
}
Index: src/mips/macro-assembler-mips.h
diff --git a/src/mips/macro-assembler-mips.h
b/src/mips/macro-assembler-mips.h
index
88967db9c488c049dd0c9aba288485b2d48f4c46..dcf895bfcb11a210f2fb73c0a708c09e7f66106b
100644
--- a/src/mips/macro-assembler-mips.h
+++ b/src/mips/macro-assembler-mips.h
@@ -1485,17 +1485,33 @@ const Operand& rt = Operand(zero_reg),
BranchDelaySlot bd = PROTECT
template<typename Field>
void DecodeField(Register dst, Register src) {
+ Ext(dst, src, Field::kShift, Field::kSize);
+ }
+
+ template<typename Field>
+ void DecodeField(Register reg) {
+ DecodeField<Field>(reg, reg);
+ }
+
+ template<typename Field>
+ void DecodeFieldToSmi(Register dst, Register src) {
static const int shift = Field::kShift;
- static const int mask = Field::kMask >> shift;
- static const int size = Field::kSize;
- srl(dst, src, shift);
- if (shift + size != 32) {
+ static const int mask = Field::kMask >> shift << kSmiTagSize;
+ STATIC_ASSERT((mask & (0x80000000u >> (kSmiTagSize - 1))) == 0);
+ STATIC_ASSERT(kSmiTag == 0);
+ if (shift < kSmiTagSize) {
+ sll(dst, src, kSmiTagSize - shift);
And(dst, dst, Operand(mask));
+ } else if (shift > kSmiTagSize) {
+ srl(dst, src, shift - kSmiTagSize);
+ And(dst, dst, Operand(mask));
+ } else {
+ And(dst, src, Operand(mask));
}
}
template<typename Field>
- void DecodeField(Register reg) {
+ void DecodeFieldToSmi(Register reg) {
DecodeField<Field>(reg, reg);
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.