Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(497)

Side by Side Diff: test/unittests/compiler/interpreter-assembler-unittest.cc

Issue 1239793002: [interpreter] Add basic framework for bytecode handler code generation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Add tests Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "test/unittests/compiler/interpreter-assembler-unittest.h"
6
7 #include "src/compiler/graph.h"
8 #include "src/compiler/node.h"
9 #include "test/unittests/compiler/compiler-test-utils.h"
10 #include "test/unittests/compiler/node-test-utils.h"
11
12 namespace v8 {
13 namespace internal {
14 namespace compiler {
15
16 const interpreter::Bytecode kBytecodes[] = {
17 #define DEFINE_BYTECODE(Name, _) interpreter::Bytecode::k##Name,
18 BYTECODE_LIST(DEFINE_BYTECODE)
19 #undef DEFINE_BYTECODE
20 };
21
22
23 Graph*
24 InterpreterAssemblerTest::InterpreterAssemblerForTest::GetCompletedGraph() {
25 End();
26 return graph();
27 }
28
29
30 Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsLoad(
31 const Matcher<LoadRepresentation>& rep_matcher,
32 const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher) {
33 return ::i::compiler::IsLoad(rep_matcher, base_matcher, index_matcher,
34 graph()->start(), graph()->start());
35 }
36
37
38 Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsStore(
39 const Matcher<StoreRepresentation>& rep_matcher,
40 const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher,
41 const Matcher<Node*>& value_matcher) {
42 return ::i::compiler::IsStore(rep_matcher, base_matcher, index_matcher,
43 value_matcher, graph()->start(),
44 graph()->start());
45 }
46
47
48 TARGET_TEST_F(InterpreterAssemblerTest, Dispatch) {
49 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
50 InterpreterAssemblerForTest m(this, bytecode);
51 m.Dispatch();
52 Graph* graph = m.GetCompletedGraph();
53
54 Node* end = graph->end();
55 EXPECT_EQ(1, end->InputCount());
56 Node* tail_call_node = end->InputAt(0);
57
58 Matcher<Node*> next_bytecode_matcher =
59 IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeParameter),
60 IsInt32Constant(interpreter::Bytecodes::Size(bytecode)));
61 Matcher<Node*> target_bytecode_matcher =
62 m.IsLoad(kMachUint8, next_bytecode_matcher, IsInt32Constant(0));
63 Matcher<Node*> code_target_matcher = m.IsLoad(
64 kMachPtr, IsParameter(Linkage::kInterpreterDispatchTableParameter),
65 IsWord32Shl(target_bytecode_matcher,
66 IsInt32Constant(kPointerSizeLog2)));
67
68 EXPECT_EQ(CallDescriptor::kInterpreterDispatch,
69 m.call_descriptor()->kind());
70 EXPECT_THAT(
71 tail_call_node,
72 IsTailCall(m.call_descriptor(), code_target_matcher,
73 next_bytecode_matcher,
74 IsParameter(Linkage::kInterpreterDispatchTableParameter),
75 graph->start(), graph->start()));
76 }
77 }
78
79
80 TARGET_TEST_F(InterpreterAssemblerTest, BytecodeArg) {
81 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
82 InterpreterAssemblerForTest m(this, bytecode);
83 int number_of_args = interpreter::Bytecodes::NumberOfArguments(bytecode);
84 for (int i = 0; i < number_of_args; i++) {
85 Node* load_arg_node = m.BytecodeArg(i);
86 EXPECT_THAT(load_arg_node,
87 m.IsLoad(kMachUint8,
88 IsParameter(Linkage::kInterpreterBytecodeParameter),
89 IsInt32Constant(1 + i)));
90 }
91 }
92 }
93
94
95 TARGET_TEST_F(InterpreterAssemblerTest, LoadRegisterFixed) {
96 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
97 InterpreterAssemblerForTest m(this, bytecode);
98 for (int i = 0; i < m.max_register_index(); i++) {
99 Node* load_reg_node = m.LoadRegister(i);
100 EXPECT_THAT(load_reg_node,
101 m.IsLoad(kMachPtr, IsLoadFramePointer(),
102 IsInt32Constant(m.first_regster_offset_from_fp() -
103 (i << kPointerSizeLog2))));
104 }
105 }
106 }
107
108
109 TARGET_TEST_F(InterpreterAssemblerTest, LoadRegister) {
110 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
111 InterpreterAssemblerForTest m(this, bytecode);
112 Node* reg_index_node = m.Int32Constant(44);
113 Node* load_reg_node = m.LoadRegister(reg_index_node);
114 EXPECT_THAT(
115 load_reg_node,
116 m.IsLoad(kMachPtr, IsLoadFramePointer(),
117 IsInt32Sub(IsInt32Constant(m.first_regster_offset_from_fp()),
118 IsWord32Shl(reg_index_node,
119 IsInt32Constant(kPointerSizeLog2)))));
120 }
121 }
122
123
124 TARGET_TEST_F(InterpreterAssemblerTest, StoreRegisterFixed) {
125 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
126 InterpreterAssemblerForTest m(this, bytecode);
127 Node* store_value = m.Int32Constant(0xdeadbeef);
128 for (int i = 0; i < m.max_register_index(); i++) {
129 Node* store_reg_node = m.StoreRegister(store_value, i);
130 EXPECT_THAT(store_reg_node,
131 m.IsStore(StoreRepresentation(kMachPtr, kNoWriteBarrier),
132 IsLoadFramePointer(),
133 IsInt32Constant(m.first_regster_offset_from_fp() -
134 (i << kPointerSizeLog2)),
135 store_value));
136 }
137 }
138 }
139
140
141 TARGET_TEST_F(InterpreterAssemblerTest, StoreRegister) {
142 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) {
143 InterpreterAssemblerForTest m(this, bytecode);
144 Node* store_value = m.Int32Constant(0xdeadbeef);
145 Node* reg_index_node = m.Int32Constant(44);
146 Node* store_reg_node = m.StoreRegister(store_value, reg_index_node);
147 EXPECT_THAT(
148 store_reg_node,
149 m.IsStore(StoreRepresentation(kMachPtr, kNoWriteBarrier),
150 IsLoadFramePointer(),
151 IsInt32Sub(IsInt32Constant(m.first_regster_offset_from_fp()),
152 IsWord32Shl(reg_index_node,
153 IsInt32Constant(kPointerSizeLog2))),
154 store_value));
155 }
156 }
157
158 } // namespace compiler
159 } // namespace internal
160 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698