Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: test/unittests/compiler/machine-operator-unittest.cc

Issue 1128133003: [turbofan] Make an OptionalOperator for MachineOperatorBuilder. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: OPTIONAL macro Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "src/compiler/machine-operator.h" 5 #include "src/compiler/machine-operator.h"
6 #include "src/compiler/opcodes.h" 6 #include "src/compiler/opcodes.h"
7 #include "src/compiler/operator.h" 7 #include "src/compiler/operator.h"
8 #include "src/compiler/operator-properties.h" 8 #include "src/compiler/operator-properties.h"
9 #include "test/unittests/test-utils.h" 9 #include "test/unittests/test-utils.h"
10 10
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 } 142 }
143 143
144 144
145 INSTANTIATE_TEST_CASE_P( 145 INSTANTIATE_TEST_CASE_P(
146 MachineOperatorTest, MachineStoreOperatorTest, 146 MachineOperatorTest, MachineStoreOperatorTest,
147 ::testing::Combine( 147 ::testing::Combine(
148 ::testing::ValuesIn(kMachineReps), 148 ::testing::ValuesIn(kMachineReps),
149 ::testing::Combine(::testing::ValuesIn(kMachineTypes), 149 ::testing::Combine(::testing::ValuesIn(kMachineTypes),
150 ::testing::Values(kNoWriteBarrier, 150 ::testing::Values(kNoWriteBarrier,
151 kFullWriteBarrier)))); 151 kFullWriteBarrier))));
152 152 #endif
153 153
154 // ----------------------------------------------------------------------------- 154 // -----------------------------------------------------------------------------
155 // Pure operators. 155 // Pure operators.
156 156
157
158 namespace { 157 namespace {
159 158
160 struct PureOperator { 159 struct PureOperator {
161 const Operator* (MachineOperatorBuilder::*constructor)(); 160 const Operator* (MachineOperatorBuilder::*constructor)();
162 IrOpcode::Value opcode; 161 char const* const constructor_name;
163 int value_input_count; 162 int value_input_count;
164 int control_input_count; 163 int control_input_count;
165 int value_output_count; 164 int value_output_count;
166 }; 165 };
167 166
168 167
169 std::ostream& operator<<(std::ostream& os, const PureOperator& pop) { 168 std::ostream& operator<<(std::ostream& os, PureOperator const& pop) {
170 return os << IrOpcode::Mnemonic(pop.opcode); 169 return os << pop.constructor_name;
171 } 170 }
172 171
173
174 const PureOperator kPureOperators[] = { 172 const PureOperator kPureOperators[] = {
175 #define PURE(Name, value_input_count, control_input_count, value_output_count) \ 173 #define PURE(Name, value_input_count, control_input_count, value_output_count) \
176 { \ 174 { \
177 &MachineOperatorBuilder::Name, IrOpcode::k##Name, value_input_count, \ 175 &MachineOperatorBuilder::Name, #Name, value_input_count, \
178 control_input_count, value_output_count \ 176 control_input_count, value_output_count \
179 } 177 }
180 PURE(Word32And, 2, 0, 1), PURE(Word32Or, 2, 0, 1), PURE(Word32Xor, 2, 0, 1), 178 PURE(Word32And, 2, 0, 1), // --
181 PURE(Word32Shl, 2, 0, 1), PURE(Word32Shr, 2, 0, 1), 179 PURE(Word32Or, 2, 0, 1), // --
182 PURE(Word32Sar, 2, 0, 1), PURE(Word32Ror, 2, 0, 1), 180 PURE(Word32Xor, 2, 0, 1), // --
183 PURE(Word32Equal, 2, 0, 1), PURE(Word32Clz, 1, 0, 1), 181 PURE(Word32Shl, 2, 0, 1), // --
184 PURE(Word64And, 2, 0, 1), PURE(Word64Or, 2, 0, 1), PURE(Word64Xor, 2, 0, 1), 182 PURE(Word32Shr, 2, 0, 1), // --
185 PURE(Word64Shl, 2, 0, 1), PURE(Word64Shr, 2, 0, 1), 183 PURE(Word32Sar, 2, 0, 1), // --
186 PURE(Word64Sar, 2, 0, 1), PURE(Word64Ror, 2, 0, 1), 184 PURE(Word32Ror, 2, 0, 1), // --
187 PURE(Word64Equal, 2, 0, 1), PURE(Int32Add, 2, 0, 1), 185 PURE(Word32Equal, 2, 0, 1), // --
188 PURE(Int32AddWithOverflow, 2, 0, 2), PURE(Int32Sub, 2, 0, 1), 186 PURE(Word32Clz, 1, 0, 1), // --
189 PURE(Int32SubWithOverflow, 2, 0, 2), PURE(Int32Mul, 2, 0, 1), 187 PURE(Word64And, 2, 0, 1), // --
190 PURE(Int32MulHigh, 2, 0, 1), PURE(Int32Div, 2, 1, 1), 188 PURE(Word64Or, 2, 0, 1), // --
191 PURE(Uint32Div, 2, 1, 1), PURE(Int32Mod, 2, 1, 1), PURE(Uint32Mod, 2, 1, 1), 189 PURE(Word64Xor, 2, 0, 1), // --
192 PURE(Int32LessThan, 2, 0, 1), PURE(Int32LessThanOrEqual, 2, 0, 1), 190 PURE(Word64Shl, 2, 0, 1), // --
193 PURE(Uint32LessThan, 2, 0, 1), PURE(Uint32LessThanOrEqual, 2, 0, 1), 191 PURE(Word64Shr, 2, 0, 1), // --
194 PURE(Int64Add, 2, 0, 1), PURE(Int64Sub, 2, 0, 1), PURE(Int64Mul, 2, 0, 1), 192 PURE(Word64Sar, 2, 0, 1), // --
195 PURE(Int64Div, 2, 0, 1), PURE(Uint64Div, 2, 0, 1), PURE(Int64Mod, 2, 0, 1), 193 PURE(Word64Ror, 2, 0, 1), // --
196 PURE(Uint64Mod, 2, 0, 1), PURE(Int64LessThan, 2, 0, 1), 194 PURE(Word64Equal, 2, 0, 1), // --
197 PURE(Int64LessThanOrEqual, 2, 0, 1), PURE(Uint64LessThan, 2, 0, 1), 195 PURE(Int32Add, 2, 0, 1), // --
198 PURE(ChangeFloat32ToFloat64, 1, 0, 1), PURE(ChangeFloat64ToInt32, 1, 0, 1), 196 PURE(Int32AddWithOverflow, 2, 0, 2), // --
199 PURE(ChangeFloat64ToUint32, 1, 0, 1), PURE(ChangeInt32ToInt64, 1, 0, 1), 197 PURE(Int32Sub, 2, 0, 1), // --
200 PURE(ChangeUint32ToFloat64, 1, 0, 1), PURE(ChangeUint32ToUint64, 1, 0, 1), 198 PURE(Int32SubWithOverflow, 2, 0, 2), // --
201 PURE(TruncateFloat64ToFloat32, 1, 0, 1), 199 PURE(Int32Mul, 2, 0, 1), // --
202 PURE(TruncateFloat64ToInt32, 1, 0, 1), PURE(TruncateInt64ToInt32, 1, 0, 1), 200 PURE(Int32MulHigh, 2, 0, 1), // --
203 PURE(Float32Add, 2, 0, 1), PURE(Float32Sub, 2, 0, 1), 201 PURE(Int32Div, 2, 1, 1), // --
204 PURE(Float32Mul, 2, 0, 1), PURE(Float32Div, 2, 0, 1), 202 PURE(Uint32Div, 2, 1, 1), // --
205 PURE(Float32Abs, 1, 0, 1), PURE(Float32Sqrt, 1, 0, 1), 203 PURE(Int32Mod, 2, 1, 1), // --
206 PURE(Float32Equal, 2, 0, 1), PURE(Float32LessThan, 2, 0, 1), 204 PURE(Uint32Mod, 2, 1, 1), // --
207 PURE(Float32LessThanOrEqual, 2, 0, 1), PURE(Float32Max, 2, 0, 1), 205 PURE(Int32LessThan, 2, 0, 1), // --
208 PURE(Float32Min, 2, 0, 1), PURE(Float64Add, 2, 0, 1), 206 PURE(Int32LessThanOrEqual, 2, 0, 1), // --
209 PURE(Float64Sub, 2, 0, 1), PURE(Float64Mul, 2, 0, 1), 207 PURE(Uint32LessThan, 2, 0, 1), // --
210 PURE(Float64Div, 2, 0, 1), PURE(Float64Mod, 2, 0, 1), 208 PURE(Uint32LessThanOrEqual, 2, 0, 1), // --
211 PURE(Float64Abs, 1, 0, 1), PURE(Float64Sqrt, 1, 0, 1), 209 PURE(Int64Add, 2, 0, 1), // --
212 PURE(Float64Equal, 2, 0, 1), PURE(Float64LessThan, 2, 0, 1), 210 PURE(Int64Sub, 2, 0, 1), // --
213 PURE(Float64LessThanOrEqual, 2, 0, 1), PURE(Float64Max, 2, 0, 1), 211 PURE(Int64Mul, 2, 0, 1), // --
214 PURE(Float64Min, 2, 0, 1), PURE(LoadStackPointer, 0, 0, 1), 212 PURE(Int64Div, 2, 0, 1), // --
215 PURE(Float64RoundDown, 1, 0, 1), PURE(Float64RoundTruncate, 1, 0, 1), 213 PURE(Uint64Div, 2, 0, 1), // --
216 PURE(Float64RoundTiesAway, 1, 0, 1), PURE(Float64ExtractLowWord32, 1, 0, 1), 214 PURE(Int64Mod, 2, 0, 1), // --
217 PURE(Float64ExtractHighWord32, 1, 0, 1), 215 PURE(Uint64Mod, 2, 0, 1), // --
218 PURE(Float64InsertLowWord32, 2, 0, 1), 216 PURE(Int64LessThan, 2, 0, 1), // --
219 PURE(Float64InsertHighWord32, 2, 0, 1) 217 PURE(Int64LessThanOrEqual, 2, 0, 1), // --
218 PURE(Uint64LessThan, 2, 0, 1), // --
219 PURE(ChangeFloat32ToFloat64, 1, 0, 1), // --
220 PURE(ChangeFloat64ToInt32, 1, 0, 1), // --
221 PURE(ChangeFloat64ToUint32, 1, 0, 1), // --
222 PURE(ChangeInt32ToInt64, 1, 0, 1), // --
223 PURE(ChangeUint32ToFloat64, 1, 0, 1), // --
224 PURE(ChangeUint32ToUint64, 1, 0, 1), // --
225 PURE(TruncateFloat64ToFloat32, 1, 0, 1), // --
226 PURE(TruncateFloat64ToInt32, 1, 0, 1), // --
227 PURE(TruncateInt64ToInt32, 1, 0, 1), // --
228 PURE(Float32Abs, 1, 0, 1), // --
229 PURE(Float32Add, 2, 0, 1), // --
230 PURE(Float32Sub, 2, 0, 1), // --
231 PURE(Float32Mul, 2, 0, 1), // --
232 PURE(Float32Div, 2, 0, 1), // --
233 PURE(Float32Sqrt, 1, 0, 1), // --
234 PURE(Float32Equal, 2, 0, 1), // --
235 PURE(Float32LessThan, 2, 0, 1), // --
236 PURE(Float32LessThanOrEqual, 2, 0, 1), // --
237 PURE(Float64Abs, 1, 0, 1), // --
238 PURE(Float64Add, 2, 0, 1), // --
239 PURE(Float64Sub, 2, 0, 1), // --
240 PURE(Float64Mul, 2, 0, 1), // --
241 PURE(Float64Div, 2, 0, 1), // --
242 PURE(Float64Mod, 2, 0, 1), // --
243 PURE(Float64Sqrt, 1, 0, 1), // --
244 PURE(Float64Equal, 2, 0, 1), // --
245 PURE(Float64LessThan, 2, 0, 1), // --
246 PURE(Float64LessThanOrEqual, 2, 0, 1), // --
247 PURE(LoadStackPointer, 0, 0, 1), // --
248 PURE(Float64ExtractLowWord32, 1, 0, 1), // --
249 PURE(Float64ExtractHighWord32, 1, 0, 1), // --
250 PURE(Float64InsertLowWord32, 2, 0, 1), // --
251 PURE(Float64InsertHighWord32, 2, 0, 1), // --
220 #undef PURE 252 #undef PURE
221 }; 253 };
222 254
255 } // namespace
223 256
224 typedef MachineOperatorTestWithParam<PureOperator> MachinePureOperatorTest; 257 class MachinePureOperatorTest : public TestWithZone {
258 protected:
259 MachineType word_type() { return kMachPtr; }
260 };
225 261
262
263 TEST_F(MachinePureOperatorTest, PureOperators) {
264 TRACED_FOREACH(MachineType, machine_rep1, kMachineReps) {
265 MachineOperatorBuilder machine1(zone(), machine_rep1);
266 TRACED_FOREACH(MachineType, machine_rep2, kMachineReps) {
267 MachineOperatorBuilder machine2(zone(), machine_rep2);
268 TRACED_FOREACH(PureOperator, pop, kPureOperators) {
269 const Operator* op1 = (machine1.*pop.constructor)();
270 const Operator* op2 = (machine2.*pop.constructor)();
271 EXPECT_EQ(op1, op2);
272 EXPECT_EQ(pop.value_input_count, op1->ValueInputCount());
273 EXPECT_EQ(pop.control_input_count, op1->ControlInputCount());
274 EXPECT_EQ(pop.value_output_count, op1->ValueOutputCount());
275 }
276 }
277 }
278 }
279
280
281 // Optional operators.
282
283 namespace {
284
285 struct OptionalOperatorEntry {
286 const OptionalOperator (MachineOperatorBuilder::*constructor)();
287 MachineOperatorBuilder::Flag enabling_flag;
288 char const* const constructor_name;
289 int value_input_count;
290 int control_input_count;
291 int value_output_count;
292 };
293
294
295 std::ostream& operator<<(std::ostream& os, OptionalOperatorEntry const& pop) {
296 return os << pop.constructor_name;
297 }
298
299 const OptionalOperatorEntry kOptionalOperators[] = {
300 #define OPTIONAL_ENTRY(Name, value_input_count, control_input_count, \
301 value_output_count) \
302 { \
303 &MachineOperatorBuilder::Name, MachineOperatorBuilder::k##Name, #Name, \
304 value_input_count, control_input_count, value_output_count \
305 }
306 OPTIONAL_ENTRY(Float32Max, 2, 0, 1), // --
307 OPTIONAL_ENTRY(Float32Min, 2, 0, 1), // --
308 OPTIONAL_ENTRY(Float64Max, 2, 0, 1), // --
309 OPTIONAL_ENTRY(Float64Min, 2, 0, 1), // --
310 OPTIONAL_ENTRY(Float64RoundDown, 1, 0, 1), // --
311 OPTIONAL_ENTRY(Float64RoundTruncate, 1, 0, 1), // --
312 OPTIONAL_ENTRY(Float64RoundTiesAway, 1, 0, 1), // --
313 #undef OPTIONAL_ENTRY
314 };
226 } // namespace 315 } // namespace
227 316
228 317
229 TEST_P(MachinePureOperatorTest, InstancesAreGloballyShared) { 318 class MachineOptionalOperatorTest : public TestWithZone {
230 const PureOperator& pop = GetParam(); 319 protected:
231 MachineOperatorBuilder machine1(zone(), type()); 320 MachineType word_type() { return kMachPtr; }
232 MachineOperatorBuilder machine2(zone(), type()); 321 };
233 EXPECT_EQ((machine1.*pop.constructor)(), (machine2.*pop.constructor)()); 322
323
324 TEST_F(MachineOptionalOperatorTest, OptionalOperators) {
325 TRACED_FOREACH(OptionalOperatorEntry, pop, kOptionalOperators) {
326 TRACED_FOREACH(MachineType, machine_rep1, kMachineReps) {
327 MachineOperatorBuilder machine1(zone(), machine_rep1, pop.enabling_flag);
328 TRACED_FOREACH(MachineType, machine_rep2, kMachineReps) {
329 MachineOperatorBuilder machine2(zone(), machine_rep2,
330 pop.enabling_flag);
331 const Operator* op1 = (machine1.*pop.constructor)().op();
332 const Operator* op2 = (machine2.*pop.constructor)().op();
333 EXPECT_EQ(op1, op2);
334 EXPECT_EQ(pop.value_input_count, op1->ValueInputCount());
335 EXPECT_EQ(pop.control_input_count, op1->ControlInputCount());
336 EXPECT_EQ(pop.value_output_count, op1->ValueOutputCount());
337
338 MachineOperatorBuilder machine3(zone(), word_type());
339 EXPECT_TRUE((machine1.*pop.constructor)().IsSupported());
340 EXPECT_FALSE((machine3.*pop.constructor)().IsSupported());
341 }
342 }
343 }
234 } 344 }
235 345
236 346
237 TEST_P(MachinePureOperatorTest, NumberOfInputsAndOutputs) {
238 MachineOperatorBuilder machine(zone(), type());
239 const PureOperator& pop = GetParam();
240 const Operator* op = (machine.*pop.constructor)();
241
242 EXPECT_EQ(pop.value_input_count, op->ValueInputCount());
243 EXPECT_EQ(0, op->EffectInputCount());
244 EXPECT_EQ(pop.control_input_count, op->ControlInputCount());
245 EXPECT_EQ(pop.value_input_count + pop.control_input_count,
246 OperatorProperties::GetTotalInputCount(op));
247
248 EXPECT_EQ(pop.value_output_count, op->ValueOutputCount());
249 EXPECT_EQ(0, op->EffectOutputCount());
250 EXPECT_EQ(0, op->ControlOutputCount());
251 }
252
253
254 TEST_P(MachinePureOperatorTest, MarkedAsPure) {
255 MachineOperatorBuilder machine(zone(), type());
256 const PureOperator& pop = GetParam();
257 const Operator* op = (machine.*pop.constructor)();
258 EXPECT_TRUE(op->HasProperty(Operator::kPure));
259 }
260
261
262 TEST_P(MachinePureOperatorTest, OpcodeIsCorrect) {
263 MachineOperatorBuilder machine(zone(), type());
264 const PureOperator& pop = GetParam();
265 const Operator* op = (machine.*pop.constructor)();
266 EXPECT_EQ(pop.opcode, op->opcode());
267 }
268
269
270 INSTANTIATE_TEST_CASE_P(
271 MachineOperatorTest, MachinePureOperatorTest,
272 ::testing::Combine(::testing::ValuesIn(kMachineReps),
273 ::testing::ValuesIn(kPureOperators)));
274
275 #endif // GTEST_HAS_COMBINE
276
277
278 // ----------------------------------------------------------------------------- 347 // -----------------------------------------------------------------------------
279 // Pseudo operators. 348 // Pseudo operators.
280 349
281 350
282 namespace { 351 namespace {
283 352
284 typedef TestWithZone MachineOperatorTest; 353 typedef TestWithZone MachineOperatorTest;
285 354
286 } // namespace 355 } // namespace
287 356
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 EXPECT_EQ(machine.Uint64Div(), machine.UintDiv()); 394 EXPECT_EQ(machine.Uint64Div(), machine.UintDiv());
326 EXPECT_EQ(machine.Int64Mod(), machine.IntMod()); 395 EXPECT_EQ(machine.Int64Mod(), machine.IntMod());
327 EXPECT_EQ(machine.Uint64Mod(), machine.UintMod()); 396 EXPECT_EQ(machine.Uint64Mod(), machine.UintMod());
328 EXPECT_EQ(machine.Int64LessThan(), machine.IntLessThan()); 397 EXPECT_EQ(machine.Int64LessThan(), machine.IntLessThan());
329 EXPECT_EQ(machine.Int64LessThanOrEqual(), machine.IntLessThanOrEqual()); 398 EXPECT_EQ(machine.Int64LessThanOrEqual(), machine.IntLessThanOrEqual());
330 } 399 }
331 400
332 } // namespace compiler 401 } // namespace compiler
333 } // namespace internal 402 } // namespace internal
334 } // namespace v8 403 } // namespace v8
OLDNEW
« no previous file with comments | « test/unittests/compiler/instruction-selector-unittest.h ('k') | test/unittests/compiler/raw-machine-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698