| 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);
|
| }
|
|
|
|
|