Index: test/unittests/interpreter/interpreter-assembler-unittest.cc |
diff --git a/test/unittests/interpreter/interpreter-assembler-unittest.cc b/test/unittests/interpreter/interpreter-assembler-unittest.cc |
index 25b306e35924e8bb8d6593698bd791ff5ecb66ce..ebdb16c4b563dd758296d95c82051ecab1cd3bd3 100644 |
--- a/test/unittests/interpreter/interpreter-assembler-unittest.cc |
+++ b/test/unittests/interpreter/interpreter-assembler-unittest.cc |
@@ -379,6 +379,32 @@ |
InterpreterDispatchDescriptor::kDispatchTableParameter), |
_, _)); |
} |
+ } |
+} |
+ |
+TARGET_TEST_F(InterpreterAssemblerTest, InterpreterReturn) { |
+ // If debug code is enabled we emit extra code in InterpreterReturn. |
+ if (FLAG_debug_code) return; |
+ |
+ TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
+ InterpreterAssemblerForTest m(this, bytecode); |
+ Node* tail_call_node = m.InterpreterReturn(); |
+ |
+ Handle<HeapObject> exit_trampoline = |
+ isolate()->builtins()->InterpreterExitTrampoline(); |
+ Matcher<Node*> exit_trampoline_entry_matcher = |
+ IsIntPtrAdd(IsHeapConstant(exit_trampoline), |
+ IsIntPtrConstant(Code::kHeaderSize - kHeapObjectTag)); |
+ EXPECT_THAT( |
+ tail_call_node, |
+ IsTailCall( |
+ _, exit_trampoline_entry_matcher, |
+ IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter), |
+ IsParameter( |
+ InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
+ _, |
+ IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), |
+ _, _)); |
} |
} |