Chromium Code Reviews| Index: src/interpreter/bytecodes.cc |
| diff --git a/src/interpreter/bytecodes.cc b/src/interpreter/bytecodes.cc |
| index 46134b7f1d418c52dbecbfe82775ad20586f08cf..7b1dc0cb4a5c1dad352b201985e1d0ead3d24a82 100644 |
| --- a/src/interpreter/bytecodes.cc |
| +++ b/src/interpreter/bytecodes.cc |
| @@ -6,6 +6,7 @@ |
| #include <iomanip> |
| +#include "src/base/bits.h" |
| #include "src/frames.h" |
| #include "src/interpreter/bytecode-traits.h" |
| #include "src/interpreter/interpreter.h" |
| @@ -592,38 +593,20 @@ bool Bytecodes::IsUnsignedOperandType(OperandType operand_type) { |
| // static |
| OperandSize Bytecodes::SizeForSignedOperand(int value) { |
| - if (kMinInt8 <= value && value <= kMaxInt8) { |
| - return OperandSize::kByte; |
| - } else if (kMinInt16 <= value && value <= kMaxInt16) { |
| - return OperandSize::kShort; |
| - } else { |
| - return OperandSize::kQuad; |
| - } |
| + uint32_t unsigned_value = (value >= 0) ? static_cast<uint32_t>(value) |
| + : static_cast<uint32_t>(-1 - value); |
| + // Signed operands require 1-bit for the sign, hence the multiplication by 2u; |
| + return SizeForUnsignedOperand(unsigned_value * 2u); |
|
rmcilroy
2016/06/07 10:32:46
I prefer the old approach we used here. Is there a
oth
2016/06/08 15:08:41
Done. This was just experimentation with slightly
|
| } |
| // static |
| -OperandSize Bytecodes::SizeForUnsignedOperand(int value) { |
| - DCHECK_GE(value, 0); |
| - if (value <= kMaxUInt8) { |
| - return OperandSize::kByte; |
| - } else if (value <= kMaxUInt16) { |
| - return OperandSize::kShort; |
| - } else { |
| - return OperandSize::kQuad; |
| - } |
| -} |
| - |
| -OperandSize Bytecodes::SizeForUnsignedOperand(size_t value) { |
| - if (value <= static_cast<size_t>(kMaxUInt8)) { |
| - return OperandSize::kByte; |
| - } else if (value <= static_cast<size_t>(kMaxUInt16)) { |
| - return OperandSize::kShort; |
| - } else if (value <= kMaxUInt32) { |
| - return OperandSize::kQuad; |
| - } else { |
| - UNREACHABLE(); |
| - return OperandSize::kQuad; |
| - } |
| +OperandSize Bytecodes::SizeForUnsignedOperand(uint32_t value) { |
| + unsigned leading_zeros = base::bits::CountLeadingZeros32(value); |
| + unsigned index = (32 - leading_zeros + 7) / 8; |
| + const OperandSize kSizes[] = {OperandSize::kByte, OperandSize::kByte, |
| + OperandSize::kShort, OperandSize::kQuad, |
| + OperandSize::kQuad}; |
| + return kSizes[index]; |
| } |
| OperandScale Bytecodes::OperandSizesToScale(OperandSize size0) { |