OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/instruction-selector-unittest.h" | 5 #include "test/unittests/compiler/instruction-selector-unittest.h" |
6 | 6 |
7 #include "src/compiler/graph.h" | 7 #include "src/compiler/graph.h" |
8 #include "src/compiler/schedule.h" | 8 #include "src/compiler/schedule.h" |
9 #include "src/flags.h" | 9 #include "src/flags.h" |
10 #include "test/unittests/compiler/compiler-test-utils.h" | 10 #include "test/unittests/compiler/compiler-test-utils.h" |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 | 141 |
142 | 142 |
143 bool InstructionSelectorTest::Stream::IsUsedAtStart( | 143 bool InstructionSelectorTest::Stream::IsUsedAtStart( |
144 const InstructionOperand* operand) const { | 144 const InstructionOperand* operand) const { |
145 if (!operand->IsUnallocated()) return false; | 145 if (!operand->IsUnallocated()) return false; |
146 const UnallocatedOperand* unallocated = UnallocatedOperand::cast(operand); | 146 const UnallocatedOperand* unallocated = UnallocatedOperand::cast(operand); |
147 return unallocated->IsUsedAtStart(); | 147 return unallocated->IsUsedAtStart(); |
148 } | 148 } |
149 | 149 |
150 | 150 |
| 151 const FrameStateFunctionInfo* |
| 152 InstructionSelectorTest::StreamBuilder::GetFrameStateFunctionInfo( |
| 153 int parameter_count, int local_count) { |
| 154 return common()->CreateFrameStateFunctionInfo( |
| 155 FrameStateType::kJavaScriptFunction, parameter_count, local_count, |
| 156 Handle<SharedFunctionInfo>()); |
| 157 } |
| 158 |
| 159 |
151 // ----------------------------------------------------------------------------- | 160 // ----------------------------------------------------------------------------- |
152 // Return. | 161 // Return. |
153 | 162 |
154 | 163 |
155 TARGET_TEST_F(InstructionSelectorTest, ReturnFloat32Constant) { | 164 TARGET_TEST_F(InstructionSelectorTest, ReturnFloat32Constant) { |
156 const float kValue = 4.2f; | 165 const float kValue = 4.2f; |
157 StreamBuilder m(this, kMachFloat32); | 166 StreamBuilder m(this, kMachFloat32); |
158 m.Return(m.Float32Constant(kValue)); | 167 m.Return(m.Float32Constant(kValue)); |
159 Stream s = m.Build(kAllInstructions); | 168 Stream s = m.Build(kAllInstructions); |
160 ASSERT_EQ(3U, s.size()); | 169 ASSERT_EQ(3U, s.size()); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 | 364 |
356 ZoneVector<MachineType> int32_type(1, kMachInt32, zone()); | 365 ZoneVector<MachineType> int32_type(1, kMachInt32, zone()); |
357 ZoneVector<MachineType> empty_types(zone()); | 366 ZoneVector<MachineType> empty_types(zone()); |
358 | 367 |
359 Node* parameters = | 368 Node* parameters = |
360 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(1)); | 369 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(1)); |
361 Node* locals = m.NewNode(m.common()->TypedStateValues(&empty_types)); | 370 Node* locals = m.NewNode(m.common()->TypedStateValues(&empty_types)); |
362 Node* stack = m.NewNode(m.common()->TypedStateValues(&empty_types)); | 371 Node* stack = m.NewNode(m.common()->TypedStateValues(&empty_types)); |
363 Node* context_dummy = m.Int32Constant(0); | 372 Node* context_dummy = m.Int32Constant(0); |
364 | 373 |
365 Node* state_node = | 374 Node* state_node = m.NewNode( |
366 m.NewNode(m.common()->FrameState(JS_FRAME, bailout_id, | 375 m.common()->FrameState(bailout_id, OutputFrameStateCombine::Push(), |
367 OutputFrameStateCombine::Push()), | 376 m.GetFrameStateFunctionInfo(1, 0)), |
368 parameters, locals, stack, context_dummy, function_node, | 377 parameters, locals, stack, context_dummy, function_node, |
369 m.UndefinedConstant()); | 378 m.UndefinedConstant()); |
370 Node* call = m.CallJS0(function_node, receiver, context, state_node); | 379 Node* call = m.CallJS0(function_node, receiver, context, state_node); |
371 m.Return(call); | 380 m.Return(call); |
372 | 381 |
373 Stream s = m.Build(kAllExceptNopInstructions); | 382 Stream s = m.Build(kAllExceptNopInstructions); |
374 | 383 |
375 // Skip until kArchCallJSFunction. | 384 // Skip until kArchCallJSFunction. |
376 size_t index = 0; | 385 size_t index = 0; |
377 for (; index < s.size() && s[index]->arch_opcode() != kArchCallJSFunction; | 386 for (; index < s.size() && s[index]->arch_opcode() != kArchCallJSFunction; |
378 index++) { | 387 index++) { |
379 } | 388 } |
(...skipping 24 matching lines...) Expand all Loading... |
404 | 413 |
405 // Build frame state for the state before the call. | 414 // Build frame state for the state before the call. |
406 Node* parameters = | 415 Node* parameters = |
407 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(43)); | 416 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(43)); |
408 Node* locals = m.NewNode(m.common()->TypedStateValues(&float64_type), | 417 Node* locals = m.NewNode(m.common()->TypedStateValues(&float64_type), |
409 m.Float64Constant(0.5)); | 418 m.Float64Constant(0.5)); |
410 Node* stack = m.NewNode(m.common()->TypedStateValues(&tagged_type), | 419 Node* stack = m.NewNode(m.common()->TypedStateValues(&tagged_type), |
411 m.UndefinedConstant()); | 420 m.UndefinedConstant()); |
412 | 421 |
413 Node* context_sentinel = m.Int32Constant(0); | 422 Node* context_sentinel = m.Int32Constant(0); |
414 Node* frame_state_before = | 423 Node* frame_state_before = m.NewNode( |
415 m.NewNode(m.common()->FrameState(JS_FRAME, bailout_id_before, | 424 m.common()->FrameState(bailout_id_before, OutputFrameStateCombine::Push(), |
416 OutputFrameStateCombine::Push()), | 425 m.GetFrameStateFunctionInfo(1, 1)), |
417 parameters, locals, stack, context_sentinel, function_node, | 426 parameters, locals, stack, context_sentinel, function_node, |
418 m.UndefinedConstant()); | 427 m.UndefinedConstant()); |
419 | 428 |
420 // Build the call. | 429 // Build the call. |
421 Node* call = m.CallFunctionStub0(function_node, receiver, context, | 430 Node* call = m.CallFunctionStub0(function_node, receiver, context, |
422 frame_state_before, CALL_AS_METHOD); | 431 frame_state_before, CALL_AS_METHOD); |
423 | 432 |
424 m.Return(call); | 433 m.Return(call); |
425 | 434 |
426 Stream s = m.Build(kAllExceptNopInstructions); | 435 Stream s = m.Build(kAllExceptNopInstructions); |
427 | 436 |
428 // Skip until kArchCallJSFunction. | 437 // Skip until kArchCallJSFunction. |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 ZoneVector<MachineType> float64_type(1, kMachFloat64, zone()); | 508 ZoneVector<MachineType> float64_type(1, kMachFloat64, zone()); |
500 | 509 |
501 // Build frame state for the state before the call. | 510 // Build frame state for the state before the call. |
502 Node* parameters = | 511 Node* parameters = |
503 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(63)); | 512 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(63)); |
504 Node* locals = | 513 Node* locals = |
505 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(64)); | 514 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(64)); |
506 Node* stack = | 515 Node* stack = |
507 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(65)); | 516 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(65)); |
508 Node* frame_state_parent = m.NewNode( | 517 Node* frame_state_parent = m.NewNode( |
509 m.common()->FrameState(JS_FRAME, bailout_id_parent, | 518 m.common()->FrameState(bailout_id_parent, |
510 OutputFrameStateCombine::Ignore()), | 519 OutputFrameStateCombine::Ignore(), |
| 520 m.GetFrameStateFunctionInfo(1, 1)), |
511 parameters, locals, stack, context, function_node, m.UndefinedConstant()); | 521 parameters, locals, stack, context, function_node, m.UndefinedConstant()); |
512 | 522 |
513 Node* context2 = m.Int32Constant(46); | 523 Node* context2 = m.Int32Constant(46); |
514 Node* parameters2 = | 524 Node* parameters2 = |
515 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(43)); | 525 m.NewNode(m.common()->TypedStateValues(&int32_type), m.Int32Constant(43)); |
516 Node* locals2 = m.NewNode(m.common()->TypedStateValues(&float64_type), | 526 Node* locals2 = m.NewNode(m.common()->TypedStateValues(&float64_type), |
517 m.Float64Constant(0.25)); | 527 m.Float64Constant(0.25)); |
518 Node* stack2 = m.NewNode(m.common()->TypedStateValues(&int32x2_type), | 528 Node* stack2 = m.NewNode(m.common()->TypedStateValues(&int32x2_type), |
519 m.Int32Constant(44), m.Int32Constant(45)); | 529 m.Int32Constant(44), m.Int32Constant(45)); |
520 Node* frame_state_before = | 530 Node* frame_state_before = m.NewNode( |
521 m.NewNode(m.common()->FrameState(JS_FRAME, bailout_id_before, | 531 m.common()->FrameState(bailout_id_before, OutputFrameStateCombine::Push(), |
522 OutputFrameStateCombine::Push()), | 532 m.GetFrameStateFunctionInfo(1, 1)), |
523 parameters2, locals2, stack2, context2, function_node, | 533 parameters2, locals2, stack2, context2, function_node, |
524 frame_state_parent); | 534 frame_state_parent); |
525 | 535 |
526 // Build the call. | 536 // Build the call. |
527 Node* call = m.CallFunctionStub0(function_node, receiver, context2, | 537 Node* call = m.CallFunctionStub0(function_node, receiver, context2, |
528 frame_state_before, CALL_AS_METHOD); | 538 frame_state_before, CALL_AS_METHOD); |
529 | 539 |
530 m.Return(call); | 540 m.Return(call); |
531 | 541 |
532 Stream s = m.Build(kAllExceptNopInstructions); | 542 Stream s = m.Build(kAllExceptNopInstructions); |
533 | 543 |
534 // Skip until kArchCallJSFunction. | 544 // Skip until kArchCallJSFunction. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 EXPECT_EQ(s.ToVreg(context2), s.ToVreg(call_instr->InputAt(14))); | 605 EXPECT_EQ(s.ToVreg(context2), s.ToVreg(call_instr->InputAt(14))); |
596 // Continuation. | 606 // Continuation. |
597 | 607 |
598 EXPECT_EQ(kArchRet, s[index++]->arch_opcode()); | 608 EXPECT_EQ(kArchRet, s[index++]->arch_opcode()); |
599 EXPECT_EQ(index, s.size()); | 609 EXPECT_EQ(index, s.size()); |
600 } | 610 } |
601 | 611 |
602 } // namespace compiler | 612 } // namespace compiler |
603 } // namespace internal | 613 } // namespace internal |
604 } // namespace v8 | 614 } // namespace v8 |
OLD | NEW |