| 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 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 return kPointerSize == 8 ? IsWord64Sar(lhs_matcher, rhs_matcher) | 55 return kPointerSize == 8 ? IsWord64Sar(lhs_matcher, rhs_matcher) |
| 56 : IsWord32Sar(lhs_matcher, rhs_matcher); | 56 : IsWord32Sar(lhs_matcher, rhs_matcher); |
| 57 } | 57 } |
| 58 | 58 |
| 59 Matcher<Node*> IsWordOr(const Matcher<Node*>& lhs_matcher, | 59 Matcher<Node*> IsWordOr(const Matcher<Node*>& lhs_matcher, |
| 60 const Matcher<Node*>& rhs_matcher) { | 60 const Matcher<Node*>& rhs_matcher) { |
| 61 return kPointerSize == 8 ? IsWord64Or(lhs_matcher, rhs_matcher) | 61 return kPointerSize == 8 ? IsWord64Or(lhs_matcher, rhs_matcher) |
| 62 : IsWord32Or(lhs_matcher, rhs_matcher); | 62 : IsWord32Or(lhs_matcher, rhs_matcher); |
| 63 } | 63 } |
| 64 | 64 |
| 65 InterpreterAssemblerTest::InterpreterAssemblerForTest:: |
| 66 ~InterpreterAssemblerForTest() { |
| 67 // Tests don't necessarily read and write accumulator but |
| 68 // InterpreterAssembler checks accumulator uses. |
| 69 if (Bytecodes::ReadsAccumulator(bytecode())) { |
| 70 GetAccumulator(); |
| 71 } |
| 72 if (Bytecodes::WritesAccumulator(bytecode())) { |
| 73 SetAccumulator(nullptr); |
| 74 } |
| 75 } |
| 76 |
| 65 Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsLoad( | 77 Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsLoad( |
| 66 const Matcher<LoadRepresentation>& rep_matcher, | 78 const Matcher<LoadRepresentation>& rep_matcher, |
| 67 const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher) { | 79 const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher) { |
| 68 return ::i::compiler::IsLoad(rep_matcher, base_matcher, index_matcher, _, _); | 80 return ::i::compiler::IsLoad(rep_matcher, base_matcher, index_matcher, _, _); |
| 69 } | 81 } |
| 70 | 82 |
| 71 Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsStore( | 83 Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsStore( |
| 72 const Matcher<StoreRepresentation>& rep_matcher, | 84 const Matcher<StoreRepresentation>& rep_matcher, |
| 73 const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher, | 85 const Matcher<Node*>& base_matcher, const Matcher<Node*>& index_matcher, |
| 74 const Matcher<Node*>& value_matcher) { | 86 const Matcher<Node*>& value_matcher) { |
| (...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 UNREACHABLE(); | 529 UNREACHABLE(); |
| 518 break; | 530 break; |
| 519 } | 531 } |
| 520 } | 532 } |
| 521 } | 533 } |
| 522 } | 534 } |
| 523 } | 535 } |
| 524 | 536 |
| 525 TARGET_TEST_F(InterpreterAssemblerTest, GetSetAccumulator) { | 537 TARGET_TEST_F(InterpreterAssemblerTest, GetSetAccumulator) { |
| 526 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 538 TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { |
| 539 if (!interpreter::Bytecodes::ReadsAccumulator(bytecode) || |
| 540 !interpreter::Bytecodes::WritesAccumulator(bytecode)) { |
| 541 continue; |
| 542 } |
| 543 |
| 527 InterpreterAssemblerForTest m(this, bytecode); | 544 InterpreterAssemblerForTest m(this, bytecode); |
| 528 // Should be incoming accumulator if not set. | 545 // Should be incoming accumulator if not set. |
| 529 EXPECT_THAT( | 546 EXPECT_THAT( |
| 530 m.GetAccumulator(), | 547 m.GetAccumulator(), |
| 531 IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); | 548 IsParameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); |
| 532 | |
| 533 // Should be set by SetAccumulator. | 549 // Should be set by SetAccumulator. |
| 534 Node* accumulator_value_1 = m.Int32Constant(0xdeadbeef); | 550 Node* accumulator_value_1 = m.Int32Constant(0xdeadbeef); |
| 535 m.SetAccumulator(accumulator_value_1); | 551 m.SetAccumulator(accumulator_value_1); |
| 536 EXPECT_THAT(m.GetAccumulator(), accumulator_value_1); | 552 EXPECT_THAT(m.GetAccumulator(), accumulator_value_1); |
| 537 Node* accumulator_value_2 = m.Int32Constant(42); | 553 Node* accumulator_value_2 = m.Int32Constant(42); |
| 538 m.SetAccumulator(accumulator_value_2); | 554 m.SetAccumulator(accumulator_value_2); |
| 539 EXPECT_THAT(m.GetAccumulator(), accumulator_value_2); | 555 EXPECT_THAT(m.GetAccumulator(), accumulator_value_2); |
| 540 | 556 |
| 541 // Should be passed to next bytecode handler on dispatch. | 557 // Should be passed to next bytecode handler on dispatch. |
| 542 m.Dispatch(); | 558 m.Dispatch(); |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 feedback_vector, | 819 feedback_vector, |
| 804 m.IsLoad(MachineType::AnyTagged(), load_shared_function_info_matcher, | 820 m.IsLoad(MachineType::AnyTagged(), load_shared_function_info_matcher, |
| 805 IsIntPtrConstant(SharedFunctionInfo::kFeedbackVectorOffset - | 821 IsIntPtrConstant(SharedFunctionInfo::kFeedbackVectorOffset - |
| 806 kHeapObjectTag))); | 822 kHeapObjectTag))); |
| 807 } | 823 } |
| 808 } | 824 } |
| 809 | 825 |
| 810 } // namespace interpreter | 826 } // namespace interpreter |
| 811 } // namespace internal | 827 } // namespace internal |
| 812 } // namespace v8 | 828 } // namespace v8 |
| OLD | NEW |