Index: src/interpreter/interpreter.cc |
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
index b461264c22863fcf3c73c3768da8ad0d43696e82..c4e285d03b55d0ed5f2242c313efb16c4c203a54 100644 |
--- a/src/interpreter/interpreter.cc |
+++ b/src/interpreter/interpreter.cc |
@@ -997,14 +997,19 @@ void Interpreter::DoShiftRightSmi(InterpreterAssembler* assembler) { |
__ Dispatch(); |
} |
-void Interpreter::DoUnaryOp(Callable callable, |
- InterpreterAssembler* assembler) { |
+void Interpreter::DoUnaryOp(Callable callable, InterpreterAssembler* assembler, |
+ Bytecode bytecode) { |
Node* target = __ HeapConstant(callable.code()); |
Node* accumulator = __ GetAccumulator(); |
Node* context = __ GetContext(); |
Node* result = |
__ CallStub(callable.descriptor(), target, context, accumulator); |
- __ SetAccumulator(result); |
+ if (Bytecodes::NumberOfOperands(bytecode) == 1 && |
rmcilroy
2016/07/21 09:31:48
Let's not do this in an if here. Split out BuildUn
klaasb
2016/07/21 10:55:19
Done.
|
+ Bytecodes::GetOperandType(bytecode, 0) == OperandType::kRegOut) { |
+ __ StoreRegister(result, __ BytecodeOperandReg(0)); |
+ } else { |
+ __ SetAccumulator(result); |
+ } |
__ Dispatch(); |
} |
@@ -1021,21 +1026,21 @@ void Interpreter::DoUnaryOp(InterpreterAssembler* assembler) { |
// |
// Cast the object referenced by the accumulator to a name. |
void Interpreter::DoToName(InterpreterAssembler* assembler) { |
- DoUnaryOp(CodeFactory::ToName(isolate_), assembler); |
+ DoUnaryOp(CodeFactory::ToName(isolate_), assembler, Bytecode::kToName); |
} |
// ToNumber |
// |
// Cast the object referenced by the accumulator to a number. |
void Interpreter::DoToNumber(InterpreterAssembler* assembler) { |
- DoUnaryOp(CodeFactory::ToNumber(isolate_), assembler); |
+ DoUnaryOp(CodeFactory::ToNumber(isolate_), assembler, Bytecode::kToNumber); |
} |
// ToObject |
// |
// Cast the object referenced by the accumulator to a JSObject. |
void Interpreter::DoToObject(InterpreterAssembler* assembler) { |
- DoUnaryOp(CodeFactory::ToObject(isolate_), assembler); |
+ DoUnaryOp(CodeFactory::ToObject(isolate_), assembler, Bytecode::kToObject); |
} |
// Inc |
@@ -1114,7 +1119,7 @@ void Interpreter::DoLogicalNot(InterpreterAssembler* assembler) { |
// Load the accumulator with the string representating type of the |
// object in the accumulator. |
void Interpreter::DoTypeOf(InterpreterAssembler* assembler) { |
- DoUnaryOp(CodeFactory::Typeof(isolate_), assembler); |
+ DoUnaryOp(CodeFactory::Typeof(isolate_), assembler, Bytecode::kTypeOf); |
} |
void Interpreter::DoDelete(Runtime::FunctionId function_id, |