| Index: test/cctest/interpreter/test-interpreter.cc
|
| diff --git a/test/cctest/interpreter/test-interpreter.cc b/test/cctest/interpreter/test-interpreter.cc
|
| index 07a22b7fbe71648e006200e0e2a91165764a6644..0e65b41de1f15c2600557aa8483714e9bb9fff46 100644
|
| --- a/test/cctest/interpreter/test-interpreter.cc
|
| +++ b/test/cctest/interpreter/test-interpreter.cc
|
| @@ -790,7 +790,8 @@ TEST(InterpreterStoreKeyedProperty) {
|
| CHECK_EQ(Smi::cast(*result), Smi::FromInt(999));
|
| }
|
|
|
| -static void TestInterpreterCall(TailCallMode tail_call_mode) {
|
| +static void TestInterpreterCall(TailCallMode tail_call_mode,
|
| + bool has_feedback_slot) {
|
| HandleAndZoneScope handles;
|
| i::Isolate* isolate = handles.main_isolate();
|
| i::Factory* factory = isolate->factory();
|
| @@ -798,10 +799,15 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) {
|
|
|
| i::FeedbackVectorSpec feedback_spec(&zone);
|
| i::FeedbackVectorSlot slot = feedback_spec.AddLoadICSlot();
|
| + i::FeedbackVectorSlot call_slot = feedback_spec.AddCallICSlot();
|
|
|
| Handle<i::TypeFeedbackVector> vector =
|
| i::NewTypeFeedbackVector(isolate, &feedback_spec);
|
| int slot_index = vector->GetIndex(slot);
|
| + int call_slot_index = -1;
|
| + if (has_feedback_slot) {
|
| + call_slot_index = vector->GetIndex(call_slot);
|
| + }
|
|
|
| Handle<i::String> name = factory->NewStringFromAsciiChecked("func");
|
| name = factory->string_table()->LookupString(isolate, name);
|
| @@ -812,9 +818,16 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) {
|
| 0, 1);
|
|
|
| builder.LoadNamedProperty(builder.Parameter(0), name, slot_index)
|
| - .StoreAccumulatorInRegister(Register(0))
|
| - .Call(Register(0), builder.Parameter(0), 1, 0, tail_call_mode)
|
| - .Return();
|
| + .StoreAccumulatorInRegister(Register(0));
|
| +
|
| + if (has_feedback_slot) {
|
| + builder.CallWithFeedback(Register(0), builder.Parameter(0), 1,
|
| + call_slot_index, tail_call_mode);
|
| + } else {
|
| + builder.Call(Register(0), builder.Parameter(0), 1, tail_call_mode);
|
| + }
|
| +
|
| + builder.Return();
|
| Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
|
|
|
| InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
|
| @@ -832,9 +845,14 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) {
|
| 0, 1);
|
|
|
| builder.LoadNamedProperty(builder.Parameter(0), name, slot_index)
|
| - .StoreAccumulatorInRegister(Register(0))
|
| - .Call(Register(0), builder.Parameter(0), 1, 0, tail_call_mode)
|
| - .Return();
|
| + .StoreAccumulatorInRegister(Register(0));
|
| + if (has_feedback_slot) {
|
| + builder.CallWithFeedback(Register(0), builder.Parameter(0), 1,
|
| + call_slot_index, tail_call_mode);
|
| + } else {
|
| + builder.Call(Register(0), builder.Parameter(0), 1, tail_call_mode);
|
| + }
|
| + builder.Return();
|
| Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
|
|
|
| InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
|
| @@ -861,9 +879,17 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) {
|
| .LoadLiteral(Smi::FromInt(51))
|
| .StoreAccumulatorInRegister(Register(2))
|
| .LoadLiteral(Smi::FromInt(11))
|
| - .StoreAccumulatorInRegister(Register(3))
|
| - .Call(Register(0), Register(1), 3, 0, tail_call_mode)
|
| - .Return();
|
| + .StoreAccumulatorInRegister(Register(3));
|
| +
|
| + if (has_feedback_slot) {
|
| + builder.CallWithFeedback(Register(0), Register(1), 3, call_slot_index,
|
| + tail_call_mode);
|
| + } else {
|
| + builder.Call(Register(0), Register(1), 3, tail_call_mode);
|
| + }
|
| +
|
| + builder.Return();
|
| +
|
| Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
|
|
|
| InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
|
| @@ -905,9 +931,17 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) {
|
| .LoadLiteral(factory->NewStringFromAsciiChecked("i"))
|
| .StoreAccumulatorInRegister(Register(10))
|
| .LoadLiteral(factory->NewStringFromAsciiChecked("j"))
|
| - .StoreAccumulatorInRegister(Register(11))
|
| - .Call(Register(0), Register(1), 11, 0, tail_call_mode)
|
| - .Return();
|
| + .StoreAccumulatorInRegister(Register(11));
|
| +
|
| + if (has_feedback_slot) {
|
| + builder.CallWithFeedback(Register(0), Register(1), 11, call_slot_index,
|
| + tail_call_mode);
|
| + } else {
|
| + builder.Call(Register(0), Register(1), 11, tail_call_mode);
|
| + }
|
| +
|
| + builder.Return();
|
| +
|
| Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray();
|
|
|
| InterpreterTester tester(handles.main_isolate(), bytecode_array, vector);
|
| @@ -927,9 +961,17 @@ static void TestInterpreterCall(TailCallMode tail_call_mode) {
|
| }
|
| }
|
|
|
| -TEST(InterpreterCall) { TestInterpreterCall(TailCallMode::kDisallow); }
|
| +TEST(InterpreterCall) { TestInterpreterCall(TailCallMode::kDisallow, false); }
|
|
|
| -TEST(InterpreterTailCall) { TestInterpreterCall(TailCallMode::kAllow); }
|
| +TEST(InterpreterTailCall) { TestInterpreterCall(TailCallMode::kAllow, false); }
|
| +
|
| +TEST(InterpreterCallWithFeedback) {
|
| + TestInterpreterCall(TailCallMode::kDisallow, true);
|
| +}
|
| +
|
| +TEST(InterpreterTailCallWithFeedback) {
|
| + TestInterpreterCall(TailCallMode::kAllow, true);
|
| +}
|
|
|
| static BytecodeArrayBuilder& SetRegister(BytecodeArrayBuilder& builder,
|
| Register reg, int value,
|
|
|