| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "test/unittests/compiler/interpreter-assembler-unittest.h" | 5 #include "test/unittests/compiler/interpreter-assembler-unittest.h" |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/compiler/graph.h" | 8 #include "src/compiler/graph.h" |
| 9 #include "src/compiler/node.h" | 9 #include "src/compiler/node.h" |
| 10 #include "src/interface-descriptors.h" | 10 #include "src/interface-descriptors.h" |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 #elif V8_TARGET_BIG_ENDIAN | 138 #elif V8_TARGET_BIG_ENDIAN |
| 139 return IsWordOr(IsWordShl(first_byte, IsInt32Constant(kBitsPerByte)), | 139 return IsWordOr(IsWordShl(first_byte, IsInt32Constant(kBitsPerByte)), |
| 140 second_byte); | 140 second_byte); |
| 141 #else | 141 #else |
| 142 #error "Unknown Architecture" | 142 #error "Unknown Architecture" |
| 143 #endif | 143 #endif |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 | 146 |
| 147 | 147 |
| 148 Graph* | |
| 149 InterpreterAssemblerTest::InterpreterAssemblerForTest::GetCompletedGraph() { | |
| 150 End(); | |
| 151 return graph(); | |
| 152 } | |
| 153 | |
| 154 | |
| 155 TARGET_TEST_F(InterpreterAssemblerTest, Dispatch) { | 148 TARGET_TEST_F(InterpreterAssemblerTest, Dispatch) { |
| 156 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 149 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 157 InterpreterAssemblerForTest m(this, bytecode); | 150 InterpreterAssemblerForTest m(this, bytecode); |
| 158 m.Dispatch(); | 151 m.Dispatch(); |
| 159 Graph* graph = m.GetCompletedGraph(); | 152 Graph* graph = m.graph(); |
| 160 | 153 |
| 161 Node* end = graph->end(); | 154 Node* end = graph->end(); |
| 162 EXPECT_EQ(1, end->InputCount()); | 155 EXPECT_EQ(1, end->InputCount()); |
| 163 Node* tail_call_node = end->InputAt(0); | 156 Node* tail_call_node = end->InputAt(0); |
| 164 | 157 |
| 165 Matcher<Node*> next_bytecode_offset_matcher = | 158 Matcher<Node*> next_bytecode_offset_matcher = |
| 166 IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), | 159 IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), |
| 167 IsInt32Constant(interpreter::Bytecodes::Size(bytecode))); | 160 IsInt32Constant(interpreter::Bytecodes::Size(bytecode))); |
| 168 Matcher<Node*> target_bytecode_matcher = m.IsLoad( | 161 Matcher<Node*> target_bytecode_matcher = m.IsLoad( |
| 169 kMachUint8, IsParameter(Linkage::kInterpreterBytecodeArrayParameter), | 162 kMachUint8, IsParameter(Linkage::kInterpreterBytecodeArrayParameter), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 188 } | 181 } |
| 189 } | 182 } |
| 190 | 183 |
| 191 | 184 |
| 192 TARGET_TEST_F(InterpreterAssemblerTest, Jump) { | 185 TARGET_TEST_F(InterpreterAssemblerTest, Jump) { |
| 193 int jump_offsets[] = {-9710, -77, 0, +3, +97109}; | 186 int jump_offsets[] = {-9710, -77, 0, +3, +97109}; |
| 194 TRACED_FOREACH(int, jump_offset, jump_offsets) { | 187 TRACED_FOREACH(int, jump_offset, jump_offsets) { |
| 195 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 188 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 196 InterpreterAssemblerForTest m(this, bytecode); | 189 InterpreterAssemblerForTest m(this, bytecode); |
| 197 m.Jump(m.Int32Constant(jump_offset)); | 190 m.Jump(m.Int32Constant(jump_offset)); |
| 198 Graph* graph = m.GetCompletedGraph(); | 191 Graph* graph = m.graph(); |
| 199 Node* end = graph->end(); | 192 Node* end = graph->end(); |
| 200 EXPECT_EQ(1, end->InputCount()); | 193 EXPECT_EQ(1, end->InputCount()); |
| 201 Node* tail_call_node = end->InputAt(0); | 194 Node* tail_call_node = end->InputAt(0); |
| 202 | 195 |
| 203 Matcher<Node*> next_bytecode_offset_matcher = | 196 Matcher<Node*> next_bytecode_offset_matcher = |
| 204 IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), | 197 IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), |
| 205 IsInt32Constant(jump_offset)); | 198 IsInt32Constant(jump_offset)); |
| 206 Matcher<Node*> target_bytecode_matcher = m.IsLoad( | 199 Matcher<Node*> target_bytecode_matcher = m.IsLoad( |
| 207 kMachUint8, IsParameter(Linkage::kInterpreterBytecodeArrayParameter), | 200 kMachUint8, IsParameter(Linkage::kInterpreterBytecodeArrayParameter), |
| 208 next_bytecode_offset_matcher); | 201 next_bytecode_offset_matcher); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 231 TARGET_TEST_F(InterpreterAssemblerTest, JumpIfWordEqual) { | 224 TARGET_TEST_F(InterpreterAssemblerTest, JumpIfWordEqual) { |
| 232 static const int kJumpIfTrueOffset = 73; | 225 static const int kJumpIfTrueOffset = 73; |
| 233 | 226 |
| 234 MachineOperatorBuilder machine(zone()); | 227 MachineOperatorBuilder machine(zone()); |
| 235 | 228 |
| 236 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 229 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 237 InterpreterAssemblerForTest m(this, bytecode); | 230 InterpreterAssemblerForTest m(this, bytecode); |
| 238 Node* lhs = m.IntPtrConstant(0); | 231 Node* lhs = m.IntPtrConstant(0); |
| 239 Node* rhs = m.IntPtrConstant(1); | 232 Node* rhs = m.IntPtrConstant(1); |
| 240 m.JumpIfWordEqual(lhs, rhs, m.Int32Constant(kJumpIfTrueOffset)); | 233 m.JumpIfWordEqual(lhs, rhs, m.Int32Constant(kJumpIfTrueOffset)); |
| 241 Graph* graph = m.GetCompletedGraph(); | 234 Graph* graph = m.graph(); |
| 242 Node* end = graph->end(); | 235 Node* end = graph->end(); |
| 243 EXPECT_EQ(2, end->InputCount()); | 236 EXPECT_EQ(2, end->InputCount()); |
| 244 | 237 |
| 245 int jump_offsets[] = {kJumpIfTrueOffset, | 238 int jump_offsets[] = {kJumpIfTrueOffset, |
| 246 interpreter::Bytecodes::Size(bytecode)}; | 239 interpreter::Bytecodes::Size(bytecode)}; |
| 247 for (int i = 0; i < static_cast<int>(arraysize(jump_offsets)); i++) { | 240 for (int i = 0; i < static_cast<int>(arraysize(jump_offsets)); i++) { |
| 248 Matcher<Node*> next_bytecode_offset_matcher = | 241 Matcher<Node*> next_bytecode_offset_matcher = |
| 249 IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), | 242 IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), |
| 250 IsInt32Constant(jump_offsets[i])); | 243 IsInt32Constant(jump_offsets[i])); |
| 251 Matcher<Node*> target_bytecode_matcher = m.IsLoad( | 244 Matcher<Node*> target_bytecode_matcher = m.IsLoad( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 269 | 262 |
| 270 // TODO(oth): test control flow paths. | 263 // TODO(oth): test control flow paths. |
| 271 } | 264 } |
| 272 } | 265 } |
| 273 | 266 |
| 274 | 267 |
| 275 TARGET_TEST_F(InterpreterAssemblerTest, Return) { | 268 TARGET_TEST_F(InterpreterAssemblerTest, Return) { |
| 276 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 269 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 277 InterpreterAssemblerForTest m(this, bytecode); | 270 InterpreterAssemblerForTest m(this, bytecode); |
| 278 m.Return(); | 271 m.Return(); |
| 279 Graph* graph = m.GetCompletedGraph(); | 272 Graph* graph = m.graph(); |
| 280 | 273 |
| 281 Node* end = graph->end(); | 274 Node* end = graph->end(); |
| 282 EXPECT_EQ(1, end->InputCount()); | 275 EXPECT_EQ(1, end->InputCount()); |
| 283 Node* tail_call_node = end->InputAt(0); | 276 Node* tail_call_node = end->InputAt(0); |
| 284 | 277 |
| 285 EXPECT_EQ(CallDescriptor::kCallCodeObject, m.call_descriptor()->kind()); | 278 EXPECT_EQ(CallDescriptor::kCallCodeObject, m.call_descriptor()->kind()); |
| 286 EXPECT_TRUE(m.call_descriptor()->flags() & CallDescriptor::kCanUseRoots); | 279 EXPECT_TRUE(m.call_descriptor()->flags() & CallDescriptor::kCanUseRoots); |
| 287 Handle<HeapObject> exit_trampoline = | 280 Handle<HeapObject> exit_trampoline = |
| 288 isolate()->builtins()->InterpreterExitTrampoline(); | 281 isolate()->builtins()->InterpreterExitTrampoline(); |
| 289 EXPECT_THAT( | 282 EXPECT_THAT( |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 // Should be set by SedtAccumulator. | 342 // Should be set by SedtAccumulator. |
| 350 Node* accumulator_value_1 = m.Int32Constant(0xdeadbeef); | 343 Node* accumulator_value_1 = m.Int32Constant(0xdeadbeef); |
| 351 m.SetAccumulator(accumulator_value_1); | 344 m.SetAccumulator(accumulator_value_1); |
| 352 EXPECT_THAT(m.GetAccumulator(), accumulator_value_1); | 345 EXPECT_THAT(m.GetAccumulator(), accumulator_value_1); |
| 353 Node* accumulator_value_2 = m.Int32Constant(42); | 346 Node* accumulator_value_2 = m.Int32Constant(42); |
| 354 m.SetAccumulator(accumulator_value_2); | 347 m.SetAccumulator(accumulator_value_2); |
| 355 EXPECT_THAT(m.GetAccumulator(), accumulator_value_2); | 348 EXPECT_THAT(m.GetAccumulator(), accumulator_value_2); |
| 356 | 349 |
| 357 // Should be passed to next bytecode handler on dispatch. | 350 // Should be passed to next bytecode handler on dispatch. |
| 358 m.Dispatch(); | 351 m.Dispatch(); |
| 359 Graph* graph = m.GetCompletedGraph(); | 352 Graph* graph = m.graph(); |
| 360 | 353 |
| 361 Node* end = graph->end(); | 354 Node* end = graph->end(); |
| 362 EXPECT_EQ(1, end->InputCount()); | 355 EXPECT_EQ(1, end->InputCount()); |
| 363 Node* tail_call_node = end->InputAt(0); | 356 Node* tail_call_node = end->InputAt(0); |
| 364 | 357 |
| 365 EXPECT_THAT(tail_call_node, | 358 EXPECT_THAT(tail_call_node, |
| 366 IsTailCall(m.call_descriptor(), _, accumulator_value_2, _, _, _, | 359 IsTailCall(m.call_descriptor(), _, accumulator_value_2, _, _, _, |
| 367 _, graph->start(), graph->start())); | 360 _, graph->start(), graph->start())); |
| 368 } | 361 } |
| 369 } | 362 } |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 feedback_vector, | 624 feedback_vector, |
| 632 m.IsLoad(kMachAnyTagged, load_shared_function_info_matcher, | 625 m.IsLoad(kMachAnyTagged, load_shared_function_info_matcher, |
| 633 IsIntPtrConstant(SharedFunctionInfo::kFeedbackVectorOffset - | 626 IsIntPtrConstant(SharedFunctionInfo::kFeedbackVectorOffset - |
| 634 kHeapObjectTag))); | 627 kHeapObjectTag))); |
| 635 } | 628 } |
| 636 } | 629 } |
| 637 | 630 |
| 638 } // namespace compiler | 631 } // namespace compiler |
| 639 } // namespace internal | 632 } // namespace internal |
| 640 } // namespace v8 | 633 } // namespace v8 |
| OLD | NEW |