| Index: test/unittests/interpreter/interpreter-assembler-unittest.cc
|
| diff --git a/test/unittests/compiler/interpreter-assembler-unittest.cc b/test/unittests/interpreter/interpreter-assembler-unittest.cc
|
| similarity index 69%
|
| rename from test/unittests/compiler/interpreter-assembler-unittest.cc
|
| rename to test/unittests/interpreter/interpreter-assembler-unittest.cc
|
| index f7560360aff81b0b5e9912b7f7b6b4bfa9f7187a..e5f9f67094e6a93f5cf4e8782bae59dd55cc6ce4 100644
|
| --- a/test/unittests/compiler/interpreter-assembler-unittest.cc
|
| +++ b/test/unittests/interpreter/interpreter-assembler-unittest.cc
|
| @@ -2,7 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "test/unittests/compiler/interpreter-assembler-unittest.h"
|
| +#include "test/unittests/interpreter/interpreter-assembler-unittest.h"
|
|
|
| #include "src/code-factory.h"
|
| #include "src/compiler/graph.h"
|
| @@ -16,7 +16,10 @@ using ::testing::_;
|
|
|
| namespace v8 {
|
| namespace internal {
|
| -namespace compiler {
|
| +
|
| +using namespace compiler;
|
| +
|
| +namespace interpreter {
|
|
|
| const interpreter::Bytecode kBytecodes[] = {
|
| #define DEFINE_BYTECODE(Name, ...) interpreter::Bytecode::k##Name,
|
| @@ -24,55 +27,47 @@ const interpreter::Bytecode kBytecodes[] = {
|
| #undef DEFINE_BYTECODE
|
| };
|
|
|
| -
|
| Matcher<Node*> IsIntPtrConstant(const intptr_t value) {
|
| return kPointerSize == 8 ? IsInt64Constant(static_cast<int64_t>(value))
|
| : IsInt32Constant(static_cast<int32_t>(value));
|
| }
|
|
|
| -
|
| Matcher<Node*> IsIntPtrAdd(const Matcher<Node*>& lhs_matcher,
|
| const Matcher<Node*>& rhs_matcher) {
|
| return kPointerSize == 8 ? IsInt64Add(lhs_matcher, rhs_matcher)
|
| : IsInt32Add(lhs_matcher, rhs_matcher);
|
| }
|
|
|
| -
|
| Matcher<Node*> IsIntPtrSub(const Matcher<Node*>& lhs_matcher,
|
| const Matcher<Node*>& rhs_matcher) {
|
| return kPointerSize == 8 ? IsInt64Sub(lhs_matcher, rhs_matcher)
|
| : IsInt32Sub(lhs_matcher, rhs_matcher);
|
| }
|
|
|
| -
|
| Matcher<Node*> IsWordShl(const Matcher<Node*>& lhs_matcher,
|
| const Matcher<Node*>& rhs_matcher) {
|
| return kPointerSize == 8 ? IsWord64Shl(lhs_matcher, rhs_matcher)
|
| : IsWord32Shl(lhs_matcher, rhs_matcher);
|
| }
|
|
|
| -
|
| Matcher<Node*> IsWordSar(const Matcher<Node*>& lhs_matcher,
|
| const Matcher<Node*>& rhs_matcher) {
|
| return kPointerSize == 8 ? IsWord64Sar(lhs_matcher, rhs_matcher)
|
| : IsWord32Sar(lhs_matcher, rhs_matcher);
|
| }
|
|
|
| -
|
| Matcher<Node*> IsWordOr(const Matcher<Node*>& lhs_matcher,
|
| const Matcher<Node*>& rhs_matcher) {
|
| return kPointerSize == 8 ? IsWord64Or(lhs_matcher, rhs_matcher)
|
| : IsWord32Or(lhs_matcher, rhs_matcher);
|
| }
|
|
|
| -
|
| Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsLoad(
|
| const Matcher<LoadRepresentation>& rep_matcher,
|
| const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher) {
|
| return ::i::compiler::IsLoad(rep_matcher, base_matcher, index_matcher, _, _);
|
| }
|
|
|
| -
|
| Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsStore(
|
| const Matcher<StoreRepresentation>& rep_matcher,
|
| const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher,
|
| @@ -81,52 +76,57 @@ Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsStore(
|
| value_matcher, _, _);
|
| }
|
|
|
| -
|
| Matcher<Node*>
|
| InterpreterAssemblerTest::InterpreterAssemblerForTest::IsBytecodeOperand(
|
| int offset) {
|
| return IsLoad(
|
| MachineType::Uint8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(offset)));
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsIntPtrAdd(
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(offset)));
|
| }
|
|
|
| -
|
| Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::
|
| IsBytecodeOperandSignExtended(int offset) {
|
| Matcher<Node*> load_matcher = IsLoad(
|
| MachineType::Int8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(offset)));
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsIntPtrAdd(
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(offset)));
|
| if (kPointerSize == 8) {
|
| load_matcher = IsChangeInt32ToInt64(load_matcher);
|
| }
|
| return load_matcher;
|
| }
|
|
|
| -
|
| Matcher<Node*>
|
| InterpreterAssemblerTest::InterpreterAssemblerForTest::IsBytecodeOperandShort(
|
| int offset) {
|
| if (TargetSupportsUnalignedAccess()) {
|
| return IsLoad(
|
| MachineType::Uint16(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(offset)));
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsIntPtrAdd(
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(offset)));
|
| } else {
|
| Matcher<Node*> first_byte = IsLoad(
|
| MachineType::Uint8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(offset)));
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsIntPtrAdd(
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(offset)));
|
| Matcher<Node*> second_byte = IsLoad(
|
| MachineType::Uint8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(offset + 1)));
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsIntPtrAdd(
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(offset + 1)));
|
| #if V8_TARGET_LITTLE_ENDIAN
|
| return IsWordOr(IsWordShl(second_byte, IsInt32Constant(kBitsPerByte)),
|
| first_byte);
|
| @@ -139,16 +139,17 @@ InterpreterAssemblerTest::InterpreterAssemblerForTest::IsBytecodeOperandShort(
|
| }
|
| }
|
|
|
| -
|
| Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::
|
| IsBytecodeOperandShortSignExtended(int offset) {
|
| Matcher<Node*> load_matcher;
|
| if (TargetSupportsUnalignedAccess()) {
|
| load_matcher = IsLoad(
|
| MachineType::Int16(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(offset)));
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsIntPtrAdd(
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(offset)));
|
| } else {
|
| #if V8_TARGET_LITTLE_ENDIAN
|
| int hi_byte_offset = offset + 1;
|
| @@ -162,15 +163,19 @@ Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::
|
| #endif
|
| Matcher<Node*> hi_byte = IsLoad(
|
| MachineType::Int8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(hi_byte_offset)));
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsIntPtrAdd(
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(hi_byte_offset)));
|
| hi_byte = IsWord32Shl(hi_byte, IsInt32Constant(kBitsPerByte));
|
| Matcher<Node*> lo_byte = IsLoad(
|
| MachineType::Uint8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(lo_byte_offset)));
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsIntPtrAdd(
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(lo_byte_offset)));
|
| load_matcher = IsWord32Or(hi_byte, lo_byte);
|
| }
|
|
|
| @@ -180,7 +185,6 @@ Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::
|
| return load_matcher;
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, Dispatch) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -191,34 +195,33 @@ TARGET_TEST_F(InterpreterAssemblerTest, Dispatch) {
|
| EXPECT_EQ(1, end->InputCount());
|
| Node* tail_call_node = end->InputAt(0);
|
|
|
| - Matcher<Node*> next_bytecode_offset_matcher =
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(interpreter::Bytecodes::Size(bytecode)));
|
| - Matcher<Node*> target_bytecode_matcher =
|
| - m.IsLoad(MachineType::Uint8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - next_bytecode_offset_matcher);
|
| - Matcher<Node*> code_target_matcher =
|
| - m.IsLoad(MachineType::Pointer(),
|
| - IsParameter(Linkage::kInterpreterDispatchTableParameter),
|
| - IsWord32Shl(target_bytecode_matcher,
|
| - IsInt32Constant(kPointerSizeLog2)));
|
| -
|
| - EXPECT_EQ(CallDescriptor::kCallCodeObject, m.call_descriptor()->kind());
|
| - EXPECT_TRUE(m.call_descriptor()->flags() & CallDescriptor::kCanUseRoots);
|
| + Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd(
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(interpreter::Bytecodes::Size(bytecode)));
|
| + Matcher<Node*> target_bytecode_matcher = m.IsLoad(
|
| + MachineType::Uint8(),
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + next_bytecode_offset_matcher);
|
| + Matcher<Node*> code_target_matcher = m.IsLoad(
|
| + MachineType::Pointer(),
|
| + IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter),
|
| + IsWord32Shl(target_bytecode_matcher,
|
| + IsInt32Constant(kPointerSizeLog2)));
|
| +
|
| EXPECT_THAT(
|
| tail_call_node,
|
| - IsTailCall(m.call_descriptor(), code_target_matcher,
|
| - IsParameter(Linkage::kInterpreterAccumulatorParameter),
|
| - IsParameter(Linkage::kInterpreterRegisterFileParameter),
|
| - next_bytecode_offset_matcher,
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsParameter(Linkage::kInterpreterDispatchTableParameter),
|
| - IsParameter(Linkage::kInterpreterContextParameter), _, _));
|
| + IsTailCall(
|
| + _, code_target_matcher,
|
| + IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter),
|
| + next_bytecode_offset_matcher,
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kContextParameter), _,
|
| + _));
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, Jump) {
|
| int jump_offsets[] = {-9710, -77, 0, +3, +97109};
|
| TRACED_FOREACH(int, jump_offset, jump_offsets) {
|
| @@ -230,35 +233,37 @@ TARGET_TEST_F(InterpreterAssemblerTest, Jump) {
|
| EXPECT_EQ(1, end->InputCount());
|
| Node* tail_call_node = end->InputAt(0);
|
|
|
| - Matcher<Node*> next_bytecode_offset_matcher =
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(jump_offset));
|
| - Matcher<Node*> target_bytecode_matcher =
|
| - m.IsLoad(MachineType::Uint8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - next_bytecode_offset_matcher);
|
| - Matcher<Node*> code_target_matcher =
|
| - m.IsLoad(MachineType::Pointer(),
|
| - IsParameter(Linkage::kInterpreterDispatchTableParameter),
|
| - IsWord32Shl(target_bytecode_matcher,
|
| - IsInt32Constant(kPointerSizeLog2)));
|
| -
|
| - EXPECT_EQ(CallDescriptor::kCallCodeObject, m.call_descriptor()->kind());
|
| - EXPECT_TRUE(m.call_descriptor()->flags() & CallDescriptor::kCanUseRoots);
|
| + Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd(
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(jump_offset));
|
| + Matcher<Node*> target_bytecode_matcher = m.IsLoad(
|
| + MachineType::Uint8(),
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + next_bytecode_offset_matcher);
|
| + Matcher<Node*> code_target_matcher = m.IsLoad(
|
| + MachineType::Pointer(),
|
| + IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter),
|
| + IsWord32Shl(target_bytecode_matcher,
|
| + IsInt32Constant(kPointerSizeLog2)));
|
| +
|
| EXPECT_THAT(
|
| tail_call_node,
|
| - IsTailCall(m.call_descriptor(), code_target_matcher,
|
| - IsParameter(Linkage::kInterpreterAccumulatorParameter),
|
| - IsParameter(Linkage::kInterpreterRegisterFileParameter),
|
| - next_bytecode_offset_matcher,
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsParameter(Linkage::kInterpreterDispatchTableParameter),
|
| - IsParameter(Linkage::kInterpreterContextParameter), _, _));
|
| + IsTailCall(
|
| + _, code_target_matcher,
|
| + IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter),
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kRegisterFileParameter),
|
| + next_bytecode_offset_matcher,
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kDispatchTableParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kContextParameter), _,
|
| + _));
|
| }
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, JumpIfWordEqual) {
|
| static const int kJumpIfTrueOffset = 73;
|
|
|
| @@ -276,61 +281,65 @@ TARGET_TEST_F(InterpreterAssemblerTest, JumpIfWordEqual) {
|
| int jump_offsets[] = {kJumpIfTrueOffset,
|
| interpreter::Bytecodes::Size(bytecode)};
|
| for (int i = 0; i < static_cast<int>(arraysize(jump_offsets)); i++) {
|
| - Matcher<Node*> next_bytecode_offset_matcher =
|
| - IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsInt32Constant(jump_offsets[i]));
|
| - Matcher<Node*> target_bytecode_matcher =
|
| - m.IsLoad(MachineType::Uint8(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - next_bytecode_offset_matcher);
|
| - Matcher<Node*> code_target_matcher =
|
| - m.IsLoad(MachineType::Pointer(),
|
| - IsParameter(Linkage::kInterpreterDispatchTableParameter),
|
| - IsWord32Shl(target_bytecode_matcher,
|
| - IsInt32Constant(kPointerSizeLog2)));
|
| + Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd(
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsInt32Constant(jump_offsets[i]));
|
| + Matcher<Node*> target_bytecode_matcher = m.IsLoad(
|
| + MachineType::Uint8(),
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + next_bytecode_offset_matcher);
|
| + Matcher<Node*> code_target_matcher = m.IsLoad(
|
| + MachineType::Pointer(),
|
| + IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter),
|
| + IsWord32Shl(target_bytecode_matcher,
|
| + IsInt32Constant(kPointerSizeLog2)));
|
| EXPECT_THAT(
|
| end->InputAt(i),
|
| - IsTailCall(m.call_descriptor(), code_target_matcher,
|
| - IsParameter(Linkage::kInterpreterAccumulatorParameter),
|
| - IsParameter(Linkage::kInterpreterRegisterFileParameter),
|
| - next_bytecode_offset_matcher,
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsParameter(Linkage::kInterpreterDispatchTableParameter),
|
| - IsParameter(Linkage::kInterpreterContextParameter), _, _));
|
| + IsTailCall(
|
| + _, code_target_matcher,
|
| + IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter),
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kRegisterFileParameter),
|
| + next_bytecode_offset_matcher,
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kDispatchTableParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kContextParameter), _,
|
| + _));
|
| }
|
|
|
| // TODO(oth): test control flow paths.
|
| }
|
| }
|
|
|
| -
|
| -TARGET_TEST_F(InterpreterAssemblerTest, Return) {
|
| +TARGET_TEST_F(InterpreterAssemblerTest, InterpreterReturn) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| - m.Return();
|
| + m.InterpreterReturn();
|
| Graph* graph = m.graph();
|
|
|
| Node* end = graph->end();
|
| EXPECT_EQ(1, end->InputCount());
|
| Node* tail_call_node = end->InputAt(0);
|
|
|
| - EXPECT_EQ(CallDescriptor::kCallCodeObject, m.call_descriptor()->kind());
|
| - EXPECT_TRUE(m.call_descriptor()->flags() & CallDescriptor::kCanUseRoots);
|
| Handle<HeapObject> exit_trampoline =
|
| isolate()->builtins()->InterpreterExitTrampoline();
|
| EXPECT_THAT(
|
| tail_call_node,
|
| - IsTailCall(m.call_descriptor(), IsHeapConstant(exit_trampoline),
|
| - IsParameter(Linkage::kInterpreterAccumulatorParameter),
|
| - IsParameter(Linkage::kInterpreterRegisterFileParameter),
|
| - IsParameter(Linkage::kInterpreterBytecodeOffsetParameter),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| - IsParameter(Linkage::kInterpreterDispatchTableParameter),
|
| - IsParameter(Linkage::kInterpreterContextParameter), _, _));
|
| + IsTailCall(
|
| + _, IsHeapConstant(exit_trampoline),
|
| + IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter),
|
| + IsParameter(
|
| + InterpreterDispatchDescriptor::kBytecodeOffsetParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kContextParameter), _,
|
| + _));
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, BytecodeOperand) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -382,15 +391,15 @@ TARGET_TEST_F(InterpreterAssemblerTest, BytecodeOperand) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, GetSetAccumulator) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| // Should be incoming accumulator if not set.
|
| - EXPECT_THAT(m.GetAccumulator(),
|
| - IsParameter(Linkage::kInterpreterAccumulatorParameter));
|
| + EXPECT_THAT(
|
| + m.GetAccumulator(),
|
| + IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter));
|
|
|
| - // Should be set by SedtAccumulator.
|
| + // Should be set by SetAccumulator.
|
| Node* accumulator_value_1 = m.Int32Constant(0xdeadbeef);
|
| m.SetAccumulator(accumulator_value_1);
|
| EXPECT_THAT(m.GetAccumulator(), accumulator_value_1);
|
| @@ -407,12 +416,10 @@ TARGET_TEST_F(InterpreterAssemblerTest, GetSetAccumulator) {
|
| Node* tail_call_node = end->InputAt(0);
|
|
|
| EXPECT_THAT(tail_call_node,
|
| - IsTailCall(m.call_descriptor(), _, accumulator_value_2, _, _, _,
|
| - _, _, _));
|
| + IsTailCall(_, _, accumulator_value_2, _, _, _, _, _, _));
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, GetSetContext) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -422,7 +429,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, GetSetContext) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, RegisterLocation) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -431,12 +437,11 @@ TARGET_TEST_F(InterpreterAssemblerTest, RegisterLocation) {
|
| EXPECT_THAT(
|
| reg_location_node,
|
| IsIntPtrAdd(
|
| - IsParameter(Linkage::kInterpreterRegisterFileParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter),
|
| IsWordShl(reg_index_node, IsInt32Constant(kPointerSizeLog2))));
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, LoadRegister) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -444,13 +449,13 @@ TARGET_TEST_F(InterpreterAssemblerTest, LoadRegister) {
|
| Node* load_reg_node = m.LoadRegister(reg_index_node);
|
| EXPECT_THAT(
|
| load_reg_node,
|
| - m.IsLoad(MachineType::AnyTagged(),
|
| - IsParameter(Linkage::kInterpreterRegisterFileParameter),
|
| - IsWordShl(reg_index_node, IsInt32Constant(kPointerSizeLog2))));
|
| + m.IsLoad(
|
| + MachineType::AnyTagged(),
|
| + IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter),
|
| + IsWordShl(reg_index_node, IsInt32Constant(kPointerSizeLog2))));
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, StoreRegister) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -459,15 +464,15 @@ TARGET_TEST_F(InterpreterAssemblerTest, StoreRegister) {
|
| Node* store_reg_node = m.StoreRegister(store_value, reg_index_node);
|
| EXPECT_THAT(
|
| store_reg_node,
|
| - m.IsStore(StoreRepresentation(MachineRepresentation::kTagged,
|
| - kNoWriteBarrier),
|
| - IsParameter(Linkage::kInterpreterRegisterFileParameter),
|
| - IsWordShl(reg_index_node, IsInt32Constant(kPointerSizeLog2)),
|
| - store_value));
|
| + m.IsStore(
|
| + StoreRepresentation(MachineRepresentation::kTagged,
|
| + kNoWriteBarrier),
|
| + IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter),
|
| + IsWordShl(reg_index_node, IsInt32Constant(kPointerSizeLog2)),
|
| + store_value));
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, SmiTag) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -479,7 +484,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, SmiTag) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, IntPtrAdd) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -490,7 +494,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, IntPtrAdd) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, IntPtrSub) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -501,7 +504,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, IntPtrSub) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, WordShl) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -511,7 +513,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, WordShl) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, LoadConstantPoolEntry) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -519,7 +520,7 @@ TARGET_TEST_F(InterpreterAssemblerTest, LoadConstantPoolEntry) {
|
| Node* load_constant = m.LoadConstantPoolEntry(index);
|
| Matcher<Node*> constant_pool_matcher = m.IsLoad(
|
| MachineType::AnyTagged(),
|
| - IsParameter(Linkage::kInterpreterBytecodeArrayParameter),
|
| + IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter),
|
| IsIntPtrConstant(BytecodeArray::kConstantPoolOffset - kHeapObjectTag));
|
| EXPECT_THAT(
|
| load_constant,
|
| @@ -530,7 +531,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, LoadConstantPoolEntry) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, LoadFixedArrayElement) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -547,7 +547,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, LoadFixedArrayElement) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, LoadObjectField) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -560,7 +559,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, LoadObjectField) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, LoadContextSlot) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -576,7 +574,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, LoadContextSlot) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, StoreContextSlot) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -595,21 +592,22 @@ TARGET_TEST_F(InterpreterAssemblerTest, StoreContextSlot) {
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, CallRuntime2) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| Node* arg1 = m.Int32Constant(2);
|
| Node* arg2 = m.Int32Constant(3);
|
| - Node* call_runtime = m.CallRuntime(Runtime::kAdd, arg1, arg2);
|
| + Node* context =
|
| + m.Parameter(InterpreterDispatchDescriptor::kContextParameter);
|
| + Node* call_runtime = m.CallRuntime(Runtime::kAdd, context, arg1, arg2);
|
| EXPECT_THAT(
|
| call_runtime,
|
| IsCall(_, _, arg1, arg2, _, IsInt32Constant(2),
|
| - IsParameter(Linkage::kInterpreterContextParameter), _, _));
|
| + IsParameter(InterpreterDispatchDescriptor::kContextParameter), _,
|
| + _));
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, CallRuntime) {
|
| const int kResultSizes[] = {1, 2};
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| @@ -620,6 +618,8 @@ TARGET_TEST_F(InterpreterAssemblerTest, CallRuntime) {
|
| Node* function_id = m.Int32Constant(0);
|
| Node* first_arg = m.Int32Constant(1);
|
| Node* arg_count = m.Int32Constant(2);
|
| + Node* context =
|
| + m.Parameter(InterpreterDispatchDescriptor::kContextParameter);
|
|
|
| Matcher<Node*> function_table = IsExternalConstant(
|
| ExternalReference::runtime_function_table_address(isolate()));
|
| @@ -630,36 +630,18 @@ TARGET_TEST_F(InterpreterAssemblerTest, CallRuntime) {
|
| m.IsLoad(MachineType::Pointer(), function,
|
| IsInt32Constant(offsetof(Runtime::Function, entry)));
|
|
|
| - Node* call_runtime =
|
| - m.CallRuntime(function_id, first_arg, arg_count, result_size);
|
| + Node* call_runtime = m.CallRuntimeN(function_id, context, first_arg,
|
| + arg_count, result_size);
|
| EXPECT_THAT(
|
| call_runtime,
|
| IsCall(_, IsHeapConstant(builtin.code()), arg_count, first_arg,
|
| function_entry,
|
| - IsParameter(Linkage::kInterpreterContextParameter), _, _));
|
| + IsParameter(InterpreterDispatchDescriptor::kContextParameter),
|
| + _, _));
|
| }
|
| }
|
| }
|
|
|
| -
|
| -TARGET_TEST_F(InterpreterAssemblerTest, CallIC) {
|
| - TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| - InterpreterAssemblerForTest m(this, bytecode);
|
| - LoadWithVectorDescriptor descriptor(isolate());
|
| - Node* target = m.Int32Constant(1);
|
| - Node* arg1 = m.Int32Constant(2);
|
| - Node* arg2 = m.Int32Constant(3);
|
| - Node* arg3 = m.Int32Constant(4);
|
| - Node* arg4 = m.Int32Constant(5);
|
| - Node* call_ic = m.CallIC(descriptor, target, arg1, arg2, arg3, arg4);
|
| - EXPECT_THAT(
|
| - call_ic,
|
| - IsCall(_, target, arg1, arg2, arg3, arg4,
|
| - IsParameter(Linkage::kInterpreterContextParameter), _, _));
|
| - }
|
| -}
|
| -
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, CallJS) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| @@ -667,26 +649,28 @@ TARGET_TEST_F(InterpreterAssemblerTest, CallJS) {
|
| Node* function = m.Int32Constant(0);
|
| Node* first_arg = m.Int32Constant(1);
|
| Node* arg_count = m.Int32Constant(2);
|
| - Node* call_js = m.CallJS(function, first_arg, arg_count);
|
| + Node* context =
|
| + m.Parameter(InterpreterDispatchDescriptor::kContextParameter);
|
| + Node* call_js = m.CallJS(function, context, first_arg, arg_count);
|
| EXPECT_THAT(
|
| call_js,
|
| IsCall(_, IsHeapConstant(builtin.code()), arg_count, first_arg,
|
| - function, IsParameter(Linkage::kInterpreterContextParameter), _,
|
| + function,
|
| + IsParameter(InterpreterDispatchDescriptor::kContextParameter), _,
|
| _));
|
| }
|
| }
|
|
|
| -
|
| TARGET_TEST_F(InterpreterAssemblerTest, LoadTypeFeedbackVector) {
|
| TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
|
| InterpreterAssemblerForTest m(this, bytecode);
|
| Node* feedback_vector = m.LoadTypeFeedbackVector();
|
|
|
| - Matcher<Node*> load_function_matcher =
|
| - m.IsLoad(MachineType::AnyTagged(),
|
| - IsParameter(Linkage::kInterpreterRegisterFileParameter),
|
| - IsIntPtrConstant(
|
| - InterpreterFrameConstants::kFunctionFromRegisterPointer));
|
| + Matcher<Node*> load_function_matcher = m.IsLoad(
|
| + MachineType::AnyTagged(),
|
| + IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter),
|
| + IsIntPtrConstant(
|
| + InterpreterFrameConstants::kFunctionFromRegisterPointer));
|
| Matcher<Node*> load_shared_function_info_matcher =
|
| m.IsLoad(MachineType::AnyTagged(), load_function_matcher,
|
| IsIntPtrConstant(JSFunction::kSharedFunctionInfoOffset -
|
| @@ -700,6 +684,6 @@ TARGET_TEST_F(InterpreterAssemblerTest, LoadTypeFeedbackVector) {
|
| }
|
| }
|
|
|
| -} // namespace compiler
|
| +} // namespace interpreter
|
| } // namespace internal
|
| } // namespace v8
|
|
|