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