| Index: test/unittests/compiler/bytecode-graph-builder-unittest.cc
|
| diff --git a/test/unittests/compiler/bytecode-graph-builder-unittest.cc b/test/unittests/compiler/bytecode-graph-builder-unittest.cc
|
| index e6c56cb63b7b65c7c7e91f07568b58386f405ca2..3135db022939b822b0331cfbac78b2b22942cc5c 100644
|
| --- a/test/unittests/compiler/bytecode-graph-builder-unittest.cc
|
| +++ b/test/unittests/compiler/bytecode-graph-builder-unittest.cc
|
| @@ -721,6 +721,92 @@ TEST_F(BytecodeGraphBuilderTest, KeyedStore) {
|
| }
|
| }
|
|
|
| +
|
| +TEST_F(BytecodeGraphBuilderTest, CallRuntime) {
|
| + interpreter::BytecodeArrayBuilder array_builder(isolate(), zone());
|
| + array_builder.set_locals_count(2);
|
| + array_builder.set_context_count(0);
|
| + array_builder.set_parameter_count(3);
|
| +
|
| + array_builder.LoadAccumulatorWithRegister(array_builder.Parameter(1))
|
| + .StoreAccumulatorInRegister(interpreter::Register(0))
|
| + .LoadAccumulatorWithRegister(array_builder.Parameter(2))
|
| + .StoreAccumulatorInRegister(interpreter::Register(1))
|
| + .CallRuntime(Runtime::kAdd, interpreter::Register(0), 2)
|
| + .Return();
|
| +
|
| + Graph* graph = GetCompletedGraph(array_builder.ToBytecodeArray());
|
| + Node* start = graph->start();
|
| + Node* ret = graph->end()->InputAt(0);
|
| + std::vector<Matcher<Node*>> call_inputs;
|
| + call_inputs.push_back(IsParameter(1));
|
| + call_inputs.push_back(IsParameter(2));
|
| + Matcher<Node*> call_js_runtime = IsJSCallRuntime(call_inputs, start, start);
|
| +
|
| + EXPECT_THAT(ret, IsReturn(call_js_runtime, call_js_runtime, IsIfSuccess(_)));
|
| +}
|
| +
|
| +
|
| +TEST_F(BytecodeGraphBuilderTest, CallJSRuntime) {
|
| + interpreter::BytecodeArrayBuilder array_builder(isolate(), zone());
|
| + array_builder.set_locals_count(1);
|
| + array_builder.set_context_count(1);
|
| + array_builder.set_parameter_count(2);
|
| +
|
| + // function f(arg) { return %spread_arguments(arg0); }
|
| + interpreter::Register reg0 = interpreter::Register(0);
|
| + array_builder.LoadAccumulatorWithRegister(array_builder.Parameter(1))
|
| + .StoreAccumulatorInRegister(reg0)
|
| + .CallJSRuntime(Context::SPREAD_ARGUMENTS_INDEX, reg0, 1)
|
| + .Return();
|
| +
|
| + Graph* graph = GetCompletedGraph(array_builder.ToBytecodeArray());
|
| + Node* ret = graph->end()->InputAt(0);
|
| + Matcher<Node*> load_context =
|
| + IsLoadContext(ContextAccess(0, Context::SPREAD_ARGUMENTS_INDEX, true), _);
|
| + std::vector<Matcher<Node*>> call_inputs;
|
| + call_inputs.push_back(load_context);
|
| + call_inputs.push_back(IsParameter(1));
|
| + Matcher<Node*> call_js_function =
|
| + IsJSCallFunction(call_inputs, load_context, graph->start());
|
| +
|
| + EXPECT_THAT(ret,
|
| + IsReturn(call_js_function, call_js_function, IsIfSuccess(_)));
|
| +}
|
| +
|
| +
|
| +TEST_F(BytecodeGraphBuilderTest, New) {
|
| + interpreter::BytecodeArrayBuilder array_builder(isolate(), zone());
|
| + array_builder.set_locals_count(4);
|
| + array_builder.set_context_count(0);
|
| + array_builder.set_parameter_count(5);
|
| +
|
| + array_builder.LoadAccumulatorWithRegister(array_builder.Parameter(1))
|
| + .StoreAccumulatorInRegister(interpreter::Register(0))
|
| + .LoadAccumulatorWithRegister(array_builder.Parameter(2))
|
| + .StoreAccumulatorInRegister(interpreter::Register(1))
|
| + .LoadAccumulatorWithRegister(array_builder.Parameter(3))
|
| + .StoreAccumulatorInRegister(interpreter::Register(2))
|
| + .LoadAccumulatorWithRegister(array_builder.Parameter(4))
|
| + .StoreAccumulatorInRegister(interpreter::Register(3))
|
| + .New(interpreter::Register(0), interpreter::Register(1), 3)
|
| + .Return();
|
| + auto bytecode_array = array_builder.ToBytecodeArray();
|
| + Graph* graph = GetCompletedGraph(bytecode_array);
|
| +
|
| + Node* start = graph->start();
|
| + Node* ret = graph->end()->InputAt(0);
|
| + std::vector<Matcher<Node*>> construct_inputs;
|
| + construct_inputs.push_back(IsParameter(1));
|
| + construct_inputs.push_back(IsParameter(2));
|
| + construct_inputs.push_back(IsParameter(3));
|
| + construct_inputs.push_back(IsParameter(4));
|
| + construct_inputs.push_back(IsParameter(1));
|
| + Matcher<Node*> call_construct =
|
| + IsJSCallConstruct(construct_inputs, start, start);
|
| + EXPECT_THAT(ret, IsReturn(call_construct, call_construct, IsIfSuccess(_)));
|
| +}
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|