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) { |