Index: src/interpreter/interpreter.cc |
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
index 227bef538fafff8487362d8ff4af26aaba6ff7a4..d1a96825ab5910d5ab07bfe3945aa0d0ab3ce624 100644 |
--- a/src/interpreter/interpreter.cc |
+++ b/src/interpreter/interpreter.cc |
@@ -836,6 +836,42 @@ void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) { |
DoBinaryOp<ShiftRightLogicalStub>(assembler); |
} |
+template <class Generator> |
+void Interpreter::DoBinaryOpWithImmediate(InterpreterAssembler* assembler) { |
+ Node* reg_index = __ BytecodeOperandReg(1); |
+ Node* lhs = __ LoadRegister(reg_index); |
+ Node* raw_int = __ BytecodeOperandImm(0); |
+ Node* rhs = __ SmiTag(raw_int); |
+ Node* context = __ GetContext(); |
+ Node* result = Generator::Generate(assembler, lhs, rhs, context); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
+} |
+ |
+void Interpreter::DoAddSmi(InterpreterAssembler* assembler) { |
+ DoBinaryOpWithImmediate<AddSmiStub>(assembler); |
+} |
+ |
+void Interpreter::DoSubSmi(InterpreterAssembler* assembler) { |
+ DoBinaryOpWithImmediate<SubtractSmiStub>(assembler); |
+} |
+ |
+void Interpreter::DoBitwiseOrSmi(InterpreterAssembler* assembler) { |
+ DoBinaryOpWithImmediate<BitwiseOrSmiStub>(assembler); |
+} |
+ |
+void Interpreter::DoBitwiseAndSmi(InterpreterAssembler* assembler) { |
+ DoBinaryOpWithImmediate<BitwiseAndSmiStub>(assembler); |
+} |
+ |
+void Interpreter::DoShiftLeftSmi(InterpreterAssembler* assembler) { |
+ DoBinaryOpWithImmediate<ShiftLeftSmiStub>(assembler); |
+} |
+ |
+void Interpreter::DoShiftRightSmi(InterpreterAssembler* assembler) { |
+ DoBinaryOpWithImmediate<ShiftRightSmiStub>(assembler); |
+} |
+ |
void Interpreter::DoUnaryOp(Callable callable, |
InterpreterAssembler* assembler) { |
Node* target = __ HeapConstant(callable.code()); |