| 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/interpreter/interpreter-assembler-unittest.h" | 5 #include "test/unittests/interpreter/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 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter), | 216 IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter), |
| 217 next_bytecode_offset_matcher, | 217 next_bytecode_offset_matcher, |
| 218 IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), | 218 IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), |
| 219 IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), | 219 IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), |
| 220 IsParameter(InterpreterDispatchDescriptor::kContextParameter), _, | 220 IsParameter(InterpreterDispatchDescriptor::kContextParameter), _, |
| 221 _)); | 221 _)); |
| 222 } | 222 } |
| 223 } | 223 } |
| 224 | 224 |
| 225 TARGET_TEST_F(InterpreterAssemblerTest, Jump) { | 225 TARGET_TEST_F(InterpreterAssemblerTest, Jump) { |
| 226 // If debug code is enabled we emit extra code in Jump. |
| 227 if (FLAG_debug_code) return; |
| 228 |
| 226 int jump_offsets[] = {-9710, -77, 0, +3, +97109}; | 229 int jump_offsets[] = {-9710, -77, 0, +3, +97109}; |
| 227 TRACED_FOREACH(int, jump_offset, jump_offsets) { | 230 TRACED_FOREACH(int, jump_offset, jump_offsets) { |
| 228 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 231 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 229 InterpreterAssemblerForTest m(this, bytecode); | 232 InterpreterAssemblerForTest m(this, bytecode); |
| 230 m.Jump(m.Int32Constant(jump_offset)); | 233 m.Jump(m.Int32Constant(jump_offset)); |
| 231 Graph* graph = m.graph(); | 234 Graph* graph = m.graph(); |
| 232 Node* end = graph->end(); | 235 Node* end = graph->end(); |
| 233 EXPECT_EQ(1, end->InputCount()); | 236 EXPECT_EQ(1, end->InputCount()); |
| 234 Node* tail_call_node = end->InputAt(0); | 237 Node* tail_call_node = end->InputAt(0); |
| 235 | 238 |
| 236 Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd( | 239 Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd( |
| 237 IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter), | 240 IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
| 238 IsInt32Constant(jump_offset)); | 241 IsInt32Constant(jump_offset)); |
| 239 Matcher<Node*> target_bytecode_matcher = m.IsLoad( | 242 Matcher<Node*> target_bytecode_matcher = |
| 240 MachineType::Uint8(), | 243 m.IsLoad(MachineType::Uint8(), _, next_bytecode_offset_matcher); |
| 241 IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), | |
| 242 next_bytecode_offset_matcher); | |
| 243 Matcher<Node*> code_target_matcher = m.IsLoad( | 244 Matcher<Node*> code_target_matcher = m.IsLoad( |
| 244 MachineType::Pointer(), | 245 MachineType::Pointer(), |
| 245 IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), | 246 IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), |
| 246 IsWord32Shl(target_bytecode_matcher, | 247 IsWord32Shl(target_bytecode_matcher, |
| 247 IsInt32Constant(kPointerSizeLog2))); | 248 IsInt32Constant(kPointerSizeLog2))); |
| 248 | 249 |
| 249 EXPECT_THAT( | 250 EXPECT_THAT( |
| 250 tail_call_node, | 251 tail_call_node, |
| 251 IsTailCall( | 252 IsTailCall( |
| 252 _, code_target_matcher, | 253 _, code_target_matcher, |
| 253 IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter), | 254 IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter), |
| 254 IsParameter( | 255 IsParameter( |
| 255 InterpreterDispatchDescriptor::kRegisterFileParameter), | 256 InterpreterDispatchDescriptor::kRegisterFileParameter), |
| 256 next_bytecode_offset_matcher, | 257 next_bytecode_offset_matcher, _, |
| 257 IsParameter( | |
| 258 InterpreterDispatchDescriptor::kBytecodeArrayParameter), | |
| 259 IsParameter( | 258 IsParameter( |
| 260 InterpreterDispatchDescriptor::kDispatchTableParameter), | 259 InterpreterDispatchDescriptor::kDispatchTableParameter), |
| 261 IsParameter(InterpreterDispatchDescriptor::kContextParameter), _, | 260 IsParameter(InterpreterDispatchDescriptor::kContextParameter), _, |
| 262 _)); | 261 _)); |
| 263 } | 262 } |
| 264 } | 263 } |
| 265 } | 264 } |
| 266 | 265 |
| 267 TARGET_TEST_F(InterpreterAssemblerTest, JumpIfWordEqual) { | 266 TARGET_TEST_F(InterpreterAssemblerTest, JumpIfWordEqual) { |
| 268 static const int kJumpIfTrueOffset = 73; | 267 static const int kJumpIfTrueOffset = 73; |
| 269 | 268 |
| 269 // If debug code is enabled we emit extra code in Jump. |
| 270 if (FLAG_debug_code) return; |
| 271 |
| 270 MachineOperatorBuilder machine(zone()); | 272 MachineOperatorBuilder machine(zone()); |
| 271 | 273 |
| 272 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 274 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 273 InterpreterAssemblerForTest m(this, bytecode); | 275 InterpreterAssemblerForTest m(this, bytecode); |
| 274 Node* lhs = m.IntPtrConstant(0); | 276 Node* lhs = m.IntPtrConstant(0); |
| 275 Node* rhs = m.IntPtrConstant(1); | 277 Node* rhs = m.IntPtrConstant(1); |
| 276 m.JumpIfWordEqual(lhs, rhs, m.Int32Constant(kJumpIfTrueOffset)); | 278 m.JumpIfWordEqual(lhs, rhs, m.Int32Constant(kJumpIfTrueOffset)); |
| 277 Graph* graph = m.graph(); | 279 Graph* graph = m.graph(); |
| 278 Node* end = graph->end(); | 280 Node* end = graph->end(); |
| 279 EXPECT_EQ(2, end->InputCount()); | 281 EXPECT_EQ(2, end->InputCount()); |
| 280 | 282 |
| 281 int jump_offsets[] = {kJumpIfTrueOffset, | 283 int jump_offsets[] = {kJumpIfTrueOffset, |
| 282 interpreter::Bytecodes::Size(bytecode)}; | 284 interpreter::Bytecodes::Size(bytecode)}; |
| 283 for (int i = 0; i < static_cast<int>(arraysize(jump_offsets)); i++) { | 285 for (int i = 0; i < static_cast<int>(arraysize(jump_offsets)); i++) { |
| 284 Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd( | 286 Matcher<Node*> next_bytecode_offset_matcher = IsIntPtrAdd( |
| 285 IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter), | 287 IsParameter(InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
| 286 IsInt32Constant(jump_offsets[i])); | 288 IsInt32Constant(jump_offsets[i])); |
| 287 Matcher<Node*> target_bytecode_matcher = m.IsLoad( | 289 Matcher<Node*> target_bytecode_matcher = |
| 288 MachineType::Uint8(), | 290 m.IsLoad(MachineType::Uint8(), _, next_bytecode_offset_matcher); |
| 289 IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), | |
| 290 next_bytecode_offset_matcher); | |
| 291 Matcher<Node*> code_target_matcher = m.IsLoad( | 291 Matcher<Node*> code_target_matcher = m.IsLoad( |
| 292 MachineType::Pointer(), | 292 MachineType::Pointer(), |
| 293 IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), | 293 IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), |
| 294 IsWord32Shl(target_bytecode_matcher, | 294 IsWord32Shl(target_bytecode_matcher, |
| 295 IsInt32Constant(kPointerSizeLog2))); | 295 IsInt32Constant(kPointerSizeLog2))); |
| 296 EXPECT_THAT( | 296 EXPECT_THAT( |
| 297 end->InputAt(i), | 297 end->InputAt(i), |
| 298 IsTailCall( | 298 IsTailCall( |
| 299 _, code_target_matcher, | 299 _, code_target_matcher, |
| 300 IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter), | 300 IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter), |
| 301 IsParameter( | 301 IsParameter( |
| 302 InterpreterDispatchDescriptor::kRegisterFileParameter), | 302 InterpreterDispatchDescriptor::kRegisterFileParameter), |
| 303 next_bytecode_offset_matcher, | 303 next_bytecode_offset_matcher, _, |
| 304 IsParameter( | |
| 305 InterpreterDispatchDescriptor::kBytecodeArrayParameter), | |
| 306 IsParameter( | 304 IsParameter( |
| 307 InterpreterDispatchDescriptor::kDispatchTableParameter), | 305 InterpreterDispatchDescriptor::kDispatchTableParameter), |
| 308 IsParameter(InterpreterDispatchDescriptor::kContextParameter), _, | 306 IsParameter(InterpreterDispatchDescriptor::kContextParameter), _, |
| 309 _)); | 307 _)); |
| 310 } | 308 } |
| 311 | 309 |
| 312 // TODO(oth): test control flow paths. | 310 // TODO(oth): test control flow paths. |
| 313 } | 311 } |
| 314 } | 312 } |
| 315 | 313 |
| 316 TARGET_TEST_F(InterpreterAssemblerTest, InterpreterReturn) { | 314 TARGET_TEST_F(InterpreterAssemblerTest, InterpreterReturn) { |
| 315 // If debug code is enabled we emit extra code in InterpreterReturn. |
| 316 if (FLAG_debug_code) return; |
| 317 |
| 317 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 318 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 318 InterpreterAssemblerForTest m(this, bytecode); | 319 InterpreterAssemblerForTest m(this, bytecode); |
| 319 m.InterpreterReturn(); | 320 m.InterpreterReturn(); |
| 320 Graph* graph = m.graph(); | 321 Graph* graph = m.graph(); |
| 321 | 322 |
| 322 Node* end = graph->end(); | 323 Node* end = graph->end(); |
| 323 EXPECT_EQ(1, end->InputCount()); | 324 EXPECT_EQ(1, end->InputCount()); |
| 324 Node* tail_call_node = end->InputAt(0); | 325 Node* tail_call_node = end->InputAt(0); |
| 325 | 326 |
| 326 Handle<HeapObject> exit_trampoline = | 327 Handle<HeapObject> exit_trampoline = |
| 327 isolate()->builtins()->InterpreterExitTrampoline(); | 328 isolate()->builtins()->InterpreterExitTrampoline(); |
| 328 EXPECT_THAT( | 329 EXPECT_THAT( |
| 329 tail_call_node, | 330 tail_call_node, |
| 330 IsTailCall( | 331 IsTailCall( |
| 331 _, IsHeapConstant(exit_trampoline), | 332 _, IsHeapConstant(exit_trampoline), |
| 332 IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter), | 333 IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter), |
| 333 IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter), | 334 IsParameter(InterpreterDispatchDescriptor::kRegisterFileParameter), |
| 334 IsParameter( | 335 IsParameter( |
| 335 InterpreterDispatchDescriptor::kBytecodeOffsetParameter), | 336 InterpreterDispatchDescriptor::kBytecodeOffsetParameter), |
| 336 IsParameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter), | 337 _, |
| 337 IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), | 338 IsParameter(InterpreterDispatchDescriptor::kDispatchTableParameter), |
| 338 IsParameter(InterpreterDispatchDescriptor::kContextParameter), _, | 339 IsParameter(InterpreterDispatchDescriptor::kContextParameter), _, |
| 339 _)); | 340 _)); |
| 340 } | 341 } |
| 341 } | 342 } |
| 342 | 343 |
| 343 TARGET_TEST_F(InterpreterAssemblerTest, BytecodeOperand) { | 344 TARGET_TEST_F(InterpreterAssemblerTest, BytecodeOperand) { |
| 344 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 345 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 345 InterpreterAssemblerForTest m(this, bytecode); | 346 InterpreterAssemblerForTest m(this, bytecode); |
| 346 int number_of_operands = interpreter::Bytecodes::NumberOfOperands(bytecode); | 347 int number_of_operands = interpreter::Bytecodes::NumberOfOperands(bytecode); |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 feedback_vector, | 687 feedback_vector, |
| 687 m.IsLoad(MachineType::AnyTagged(), load_shared_function_info_matcher, | 688 m.IsLoad(MachineType::AnyTagged(), load_shared_function_info_matcher, |
| 688 IsIntPtrConstant(SharedFunctionInfo::kFeedbackVectorOffset - | 689 IsIntPtrConstant(SharedFunctionInfo::kFeedbackVectorOffset - |
| 689 kHeapObjectTag))); | 690 kHeapObjectTag))); |
| 690 } | 691 } |
| 691 } | 692 } |
| 692 | 693 |
| 693 } // namespace interpreter | 694 } // namespace interpreter |
| 694 } // namespace internal | 695 } // namespace internal |
| 695 } // namespace v8 | 696 } // namespace v8 |
| OLD | NEW |