Chromium Code Reviews| Index: src/interpreter/bytecode-array-builder.cc |
| diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc |
| index 989fb2d17749c9c54fbabdd4e24696ee3a09db4d..b51bcf67357cd7a25ef398e722dbea40d2dec3b8 100644 |
| --- a/src/interpreter/bytecode-array-builder.cc |
| +++ b/src/interpreter/bytecode-array-builder.cc |
| @@ -91,7 +91,7 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( |
| BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { |
| size_t entry = GetConstantPoolEntry(object); |
| - if (entry <= 255) { |
| + if (FitsByteOperand(entry)) { |
| Output(Bytecode::kLdaConstant, static_cast<uint8_t>(entry)); |
| } else { |
| UNIMPLEMENTED(); |
| @@ -144,6 +144,38 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( |
| } |
| +BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( |
| + Register name, int feedback_slot, LanguageMode language_mode) { |
| + if (is_strong(language_mode)) { |
| + UNIMPLEMENTED(); |
| + } |
| + |
| + if (FitsByteOperand(feedback_slot)) { |
| + Output(Bytecode::kLoadIC, name.ToOperand(), |
| + static_cast<uint8_t>(feedback_slot)); |
| + } else { |
| + UNIMPLEMENTED(); |
| + } |
| + return *this; |
| +} |
| + |
| + |
| +BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( |
| + Register key, int feedback_slot, LanguageMode language_mode) { |
| + if (is_strong(language_mode)) { |
| + UNIMPLEMENTED(); |
| + } |
| + |
| + if (FitsByteOperand(feedback_slot)) { |
| + Output(Bytecode::kKeyedLoadIC, key.ToOperand(), |
| + static_cast<uint8_t>(feedback_slot)); |
| + } else { |
| + UNIMPLEMENTED(); |
| + } |
| + return *this; |
| +} |
| + |
| + |
| BytecodeArrayBuilder& BytecodeArrayBuilder::Return() { |
| Output(Bytecode::kReturn); |
| return *this; |
| @@ -194,9 +226,8 @@ bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode, int operand_index, |
| case OperandType::kNone: |
| return false; |
| case OperandType::kImm8: |
| - return true; |
| case OperandType::kIdx: |
| - return operand_value < constants_.size(); |
| + return true; |
| case OperandType::kReg: { |
| int reg_index = Register::FromOperand(operand_value).index(); |
| return (reg_index >= 0 && reg_index < temporary_register_next_) || |
| @@ -267,6 +298,13 @@ Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { |
| } |
| +// static |
| +template <typename T> |
| +bool BytecodeArrayBuilder::FitsByteOperand(T value) { |
|
oth
2015/09/01 14:01:54
Template seems a bit gratuitous here - it's invoke
rmcilroy
2015/09/01 15:53:36
Ahh, is_integral is exactly what I wanted, thanks.
|
| + return 0 <= value <= 255; |
| +} |
| + |
| + |
| TemporaryRegisterScope::TemporaryRegisterScope(BytecodeArrayBuilder* builder) |
| : builder_(builder), count_(0), last_register_index_(-1) {} |