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 #ifndef V8_COMPILER_UNITTESTS_INSTRUCTION_SELECTOR_UNITTEST_H_ | 5 #ifndef V8_COMPILER_UNITTESTS_INSTRUCTION_SELECTOR_UNITTEST_H_ |
6 #define V8_COMPILER_UNITTESTS_INSTRUCTION_SELECTOR_UNITTEST_H_ | 6 #define V8_COMPILER_UNITTESTS_INSTRUCTION_SELECTOR_UNITTEST_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <set> | 9 #include <set> |
10 | 10 |
11 #include "src/base/utils/random-number-generator.h" | 11 #include "src/base/utils/random-number-generator.h" |
12 #include "src/compiler/instruction-selector.h" | 12 #include "src/compiler/instruction-selector.h" |
13 #include "src/compiler/raw-machine-assembler.h" | 13 #include "src/compiler/raw-machine-assembler.h" |
14 #include "test/compiler-unittests/compiler-unittests.h" | 14 #include "test/compiler-unittests/compiler-unittests.h" |
15 | 15 |
16 namespace v8 { | 16 namespace v8 { |
17 namespace internal { | 17 namespace internal { |
18 namespace compiler { | 18 namespace compiler { |
19 | 19 |
20 class InstructionSelectorTest : public CompilerTest { | 20 class InstructionSelectorTest : public CompilerTest { |
21 public: | 21 public: |
22 InstructionSelectorTest(); | 22 InstructionSelectorTest(); |
23 virtual ~InstructionSelectorTest() {} | 23 virtual ~InstructionSelectorTest() {} |
24 | 24 |
25 base::RandomNumberGenerator* rng() { return &rng_; } | 25 base::RandomNumberGenerator* rng() { return &rng_; } |
26 | 26 |
27 class Stream; | 27 class Stream; |
28 | 28 |
29 enum StreamBuilderMode { kAllInstructions, kTargetInstructions }; | 29 enum StreamBuilderMode { |
| 30 kAllInstructions, |
| 31 kTargetInstructions, |
| 32 kAllWithoutNopInstructions |
| 33 }; |
30 | 34 |
31 class StreamBuilder V8_FINAL : public RawMachineAssembler { | 35 class StreamBuilder V8_FINAL : public RawMachineAssembler { |
32 public: | 36 public: |
33 StreamBuilder(InstructionSelectorTest* test, MachineType return_type) | 37 StreamBuilder(InstructionSelectorTest* test, MachineType return_type) |
34 : RawMachineAssembler(new (test->zone()) Graph(test->zone()), | 38 : RawMachineAssembler(new (test->zone()) Graph(test->zone()), |
35 CallDescriptorBuilder(test->zone(), return_type)), | 39 CallDescriptorBuilder(test->zone(), return_type)), |
36 test_(test) {} | 40 test_(test) {} |
37 StreamBuilder(InstructionSelectorTest* test, MachineType return_type, | 41 StreamBuilder(InstructionSelectorTest* test, MachineType return_type, |
38 MachineType parameter0_type) | 42 MachineType parameter0_type) |
39 : RawMachineAssembler(new (test->zone()) Graph(test->zone()), | 43 : RawMachineAssembler(new (test->zone()) Graph(test->zone()), |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 int32_t ToInt32(const InstructionOperand* operand) const { | 143 int32_t ToInt32(const InstructionOperand* operand) const { |
140 return ToConstant(operand).ToInt32(); | 144 return ToConstant(operand).ToInt32(); |
141 } | 145 } |
142 | 146 |
143 int ToVreg(const InstructionOperand* operand) const { | 147 int ToVreg(const InstructionOperand* operand) const { |
144 if (operand->IsConstant()) return operand->index(); | 148 if (operand->IsConstant()) return operand->index(); |
145 EXPECT_EQ(InstructionOperand::UNALLOCATED, operand->kind()); | 149 EXPECT_EQ(InstructionOperand::UNALLOCATED, operand->kind()); |
146 return UnallocatedOperand::cast(operand)->virtual_register(); | 150 return UnallocatedOperand::cast(operand)->virtual_register(); |
147 } | 151 } |
148 | 152 |
| 153 FrameStateDescriptor* GetDeoptimizationEntry(int deoptimization_id) { |
| 154 EXPECT_LT(deoptimization_id, GetDeoptimizationEntryCount()); |
| 155 return deoptimization_entries_[deoptimization_id]; |
| 156 } |
| 157 |
| 158 int GetDeoptimizationEntryCount() { |
| 159 return static_cast<int>(deoptimization_entries_.size()); |
| 160 } |
| 161 |
149 private: | 162 private: |
150 Constant ToConstant(const InstructionOperand* operand) const { | 163 Constant ToConstant(const InstructionOperand* operand) const { |
151 ConstantMap::const_iterator i; | 164 ConstantMap::const_iterator i; |
152 if (operand->IsConstant()) { | 165 if (operand->IsConstant()) { |
153 i = constants_.find(operand->index()); | 166 i = constants_.find(operand->index()); |
154 EXPECT_FALSE(constants_.end() == i); | 167 EXPECT_FALSE(constants_.end() == i); |
155 } else { | 168 } else { |
156 EXPECT_EQ(InstructionOperand::IMMEDIATE, operand->kind()); | 169 EXPECT_EQ(InstructionOperand::IMMEDIATE, operand->kind()); |
157 i = immediates_.find(operand->index()); | 170 i = immediates_.find(operand->index()); |
158 EXPECT_FALSE(immediates_.end() == i); | 171 EXPECT_FALSE(immediates_.end() == i); |
159 } | 172 } |
160 EXPECT_EQ(operand->index(), i->first); | 173 EXPECT_EQ(operand->index(), i->first); |
161 return i->second; | 174 return i->second; |
162 } | 175 } |
163 | 176 |
164 friend class StreamBuilder; | 177 friend class StreamBuilder; |
165 | 178 |
166 typedef std::map<int, Constant> ConstantMap; | 179 typedef std::map<int, Constant> ConstantMap; |
167 | 180 |
168 ConstantMap constants_; | 181 ConstantMap constants_; |
169 ConstantMap immediates_; | 182 ConstantMap immediates_; |
170 std::deque<Instruction*> instructions_; | 183 std::deque<Instruction*> instructions_; |
171 std::set<int> doubles_; | 184 std::set<int> doubles_; |
172 std::set<int> references_; | 185 std::set<int> references_; |
| 186 std::deque<FrameStateDescriptor*> deoptimization_entries_; |
173 }; | 187 }; |
174 | 188 |
175 base::RandomNumberGenerator rng_; | 189 base::RandomNumberGenerator rng_; |
176 }; | 190 }; |
177 | 191 |
178 | 192 |
179 template <typename T> | 193 template <typename T> |
180 class InstructionSelectorTestWithParam | 194 class InstructionSelectorTestWithParam |
181 : public InstructionSelectorTest, | 195 : public InstructionSelectorTest, |
182 public ::testing::WithParamInterface<T> {}; | 196 public ::testing::WithParamInterface<T> {}; |
183 | 197 |
184 } // namespace compiler | 198 } // namespace compiler |
185 } // namespace internal | 199 } // namespace internal |
186 } // namespace v8 | 200 } // namespace v8 |
187 | 201 |
188 #endif // V8_COMPILER_UNITTESTS_INSTRUCTION_SELECTOR_UNITTEST_H_ | 202 #endif // V8_COMPILER_UNITTESTS_INSTRUCTION_SELECTOR_UNITTEST_H_ |
OLD | NEW |