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

Side by Side Diff: test/cctest/compiler/test-instruction-selector-arm.cc

Issue 447203002: Add Uint32AddWithOverflow and Uint32SubWithOverflow machine operators. Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « src/compiler/x64/instruction-selector-x64.cc ('k') | test/cctest/compiler/test-run-machops.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <list> 5 #include <list>
6 6
7 #include "test/cctest/compiler/instruction-selector-tester.h" 7 #include "test/cctest/compiler/instruction-selector-tester.h"
8 #include "test/cctest/compiler/value-helper.h" 8 #include "test/cctest/compiler/value-helper.h"
9 9
10 using namespace v8::internal; 10 using namespace v8::internal;
(...skipping 27 matching lines...) Expand all
38 DPI sub = {machine.Int32Sub(), kArmSub, kArmRsb, kArmCmp}; 38 DPI sub = {machine.Int32Sub(), kArmSub, kArmRsb, kArmCmp};
39 push_back(sub); 39 push_back(sub);
40 } 40 }
41 }; 41 };
42 42
43 43
44 struct ODPI { 44 struct ODPI {
45 Operator* op; 45 Operator* op;
46 ArchOpcode arch_opcode; 46 ArchOpcode arch_opcode;
47 ArchOpcode reverse_arch_opcode; 47 ArchOpcode reverse_arch_opcode;
48 FlagsCondition condition;
49 FlagsCondition negated_condition;
48 }; 50 };
49 51
50 52
51 // ARM data processing instructions with overflow. 53 // ARM data processing instructions with overflow.
52 class ODPIs V8_FINAL : public std::list<ODPI>, private HandleAndZoneScope { 54 class ODPIs V8_FINAL : public std::list<ODPI>, private HandleAndZoneScope {
53 public: 55 public:
54 ODPIs() { 56 ODPIs() {
55 MachineOperatorBuilder machine(main_zone()); 57 MachineOperatorBuilder machine(main_zone());
56 ODPI add = {machine.Int32AddWithOverflow(), kArmAdd, kArmAdd}; 58 ODPI sadd = {machine.Int32AddWithOverflow(), kArmAdd, kArmAdd, kOverflow,
57 push_back(add); 59 kNotOverflow};
58 ODPI sub = {machine.Int32SubWithOverflow(), kArmSub, kArmRsb}; 60 push_back(sadd);
59 push_back(sub); 61 ODPI ssub = {machine.Int32SubWithOverflow(), kArmSub, kArmRsb, kOverflow,
62 kNotOverflow};
63 push_back(ssub);
64 ODPI uadd = {machine.Uint32AddWithOverflow(), kArmAdd, kArmAdd,
65 kUnsignedGreaterThanOrEqual, kUnsignedLessThan};
66 push_back(uadd);
67 ODPI usub = {machine.Uint32SubWithOverflow(), kArmSub, kArmRsb,
68 kUnsignedLessThan, kUnsignedGreaterThanOrEqual};
69 push_back(usub);
60 } 70 }
61 }; 71 };
62 72
63 73
64 // ARM immediates. 74 // ARM immediates.
65 class Immediates V8_FINAL : public std::list<int32_t> { 75 class Immediates V8_FINAL : public std::list<int32_t> {
66 public: 76 public:
67 Immediates() { 77 Immediates() {
68 for (uint32_t imm8 = 0; imm8 < 256; ++imm8) { 78 for (uint32_t imm8 = 0; imm8 < 256; ++imm8) {
69 for (uint32_t rot4 = 0; rot4 < 32; rot4 += 2) { 79 for (uint32_t rot4 = 0; rot4 < 32; rot4 += 2) {
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 ODPI odpi = *i; 290 ODPI odpi = *i;
281 { 291 {
282 InstructionSelectorTester m; 292 InstructionSelectorTester m;
283 m.Return( 293 m.Return(
284 m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); 294 m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1))));
285 m.SelectInstructions(); 295 m.SelectInstructions();
286 CHECK_EQ(1, m.code.size()); 296 CHECK_EQ(1, m.code.size());
287 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 297 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
288 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); 298 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
289 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 299 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
290 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 300 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
291 CHECK_EQ(2, m.code[0]->InputCount()); 301 CHECK_EQ(2, m.code[0]->InputCount());
292 CHECK_LE(1, m.code[0]->OutputCount()); 302 CHECK_LE(1, m.code[0]->OutputCount());
293 } 303 }
294 { 304 {
295 InstructionSelectorTester m; 305 InstructionSelectorTester m;
296 m.Return( 306 m.Return(
297 m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)))); 307 m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1))));
298 m.SelectInstructions(); 308 m.SelectInstructions();
299 CHECK_EQ(1, m.code.size()); 309 CHECK_EQ(1, m.code.size());
300 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 310 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
301 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); 311 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
302 CHECK_EQ(kFlags_none, m.code[0]->flags_mode()); 312 CHECK_EQ(kFlags_none, m.code[0]->flags_mode());
303 CHECK_EQ(2, m.code[0]->InputCount()); 313 CHECK_EQ(2, m.code[0]->InputCount());
304 CHECK_LE(1, m.code[0]->OutputCount()); 314 CHECK_LE(1, m.code[0]->OutputCount());
305 } 315 }
306 { 316 {
307 InstructionSelectorTester m; 317 InstructionSelectorTester m;
308 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); 318 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1));
309 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); 319 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node)));
310 m.SelectInstructions(); 320 m.SelectInstructions();
311 CHECK_LE(1, m.code.size()); 321 CHECK_LE(1, m.code.size());
312 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 322 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
313 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); 323 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
314 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 324 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
315 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 325 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
316 CHECK_EQ(2, m.code[0]->InputCount()); 326 CHECK_EQ(2, m.code[0]->InputCount());
317 CHECK_EQ(2, m.code[0]->OutputCount()); 327 CHECK_EQ(2, m.code[0]->OutputCount());
318 } 328 }
319 } 329 }
320 } 330 }
321 331
322 332
323 TEST(InstructionSelectorODPIImm) { 333 TEST(InstructionSelectorODPIImm) {
324 ODPIs odpis; 334 ODPIs odpis;
325 Immediates immediates; 335 Immediates immediates;
326 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { 336 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) {
327 ODPI odpi = *i; 337 ODPI odpi = *i;
328 for (Immediates::const_iterator j = immediates.begin(); 338 for (Immediates::const_iterator j = immediates.begin();
329 j != immediates.end(); ++j) { 339 j != immediates.end(); ++j) {
330 int32_t imm = *j; 340 int32_t imm = *j;
331 { 341 {
332 InstructionSelectorTester m; 342 InstructionSelectorTester m;
333 m.Return(m.Projection( 343 m.Return(m.Projection(
334 1, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); 344 1, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm))));
335 m.SelectInstructions(); 345 m.SelectInstructions();
336 CHECK_EQ(1, m.code.size()); 346 CHECK_EQ(1, m.code.size());
337 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 347 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
338 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); 348 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
339 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 349 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
340 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 350 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
341 CHECK_EQ(2, m.code[0]->InputCount()); 351 CHECK_EQ(2, m.code[0]->InputCount());
342 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); 352 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
343 CHECK_LE(1, m.code[0]->OutputCount()); 353 CHECK_LE(1, m.code[0]->OutputCount());
344 } 354 }
345 { 355 {
346 InstructionSelectorTester m; 356 InstructionSelectorTester m;
347 m.Return(m.Projection( 357 m.Return(m.Projection(
348 1, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)))); 358 1, m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0))));
349 m.SelectInstructions(); 359 m.SelectInstructions();
350 CHECK_EQ(1, m.code.size()); 360 CHECK_EQ(1, m.code.size());
351 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); 361 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode());
352 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); 362 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
353 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 363 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
354 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 364 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
355 CHECK_EQ(2, m.code[0]->InputCount()); 365 CHECK_EQ(2, m.code[0]->InputCount());
356 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); 366 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
357 CHECK_LE(1, m.code[0]->OutputCount()); 367 CHECK_LE(1, m.code[0]->OutputCount());
358 } 368 }
359 { 369 {
360 InstructionSelectorTester m; 370 InstructionSelectorTester m;
361 m.Return(m.Projection( 371 m.Return(m.Projection(
362 0, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)))); 372 0, m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm))));
363 m.SelectInstructions(); 373 m.SelectInstructions();
364 CHECK_EQ(1, m.code.size()); 374 CHECK_EQ(1, m.code.size());
(...skipping 19 matching lines...) Expand all
384 } 394 }
385 { 395 {
386 InstructionSelectorTester m; 396 InstructionSelectorTester m;
387 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); 397 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm));
388 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); 398 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node)));
389 m.SelectInstructions(); 399 m.SelectInstructions();
390 CHECK_LE(1, m.code.size()); 400 CHECK_LE(1, m.code.size());
391 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 401 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
392 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); 402 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
393 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 403 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
394 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 404 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
395 CHECK_EQ(2, m.code[0]->InputCount()); 405 CHECK_EQ(2, m.code[0]->InputCount());
396 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); 406 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
397 CHECK_EQ(2, m.code[0]->OutputCount()); 407 CHECK_EQ(2, m.code[0]->OutputCount());
398 } 408 }
399 { 409 {
400 InstructionSelectorTester m; 410 InstructionSelectorTester m;
401 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); 411 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0));
402 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); 412 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node)));
403 m.SelectInstructions(); 413 m.SelectInstructions();
404 CHECK_LE(1, m.code.size()); 414 CHECK_LE(1, m.code.size());
405 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); 415 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode());
406 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); 416 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
407 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 417 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
408 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 418 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
409 CHECK_EQ(2, m.code[0]->InputCount()); 419 CHECK_EQ(2, m.code[0]->InputCount());
410 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); 420 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
411 CHECK_EQ(2, m.code[0]->OutputCount()); 421 CHECK_EQ(2, m.code[0]->OutputCount());
412 } 422 }
413 } 423 }
414 } 424 }
415 } 425 }
416 426
417 427
418 TEST(InstructionSelectorODPIAndShiftP) { 428 TEST(InstructionSelectorODPIAndShiftP) {
419 ODPIs odpis; 429 ODPIs odpis;
420 Shifts shifts; 430 Shifts shifts;
421 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { 431 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) {
422 ODPI odpi = *i; 432 ODPI odpi = *i;
423 for (Shifts::const_iterator j = shifts.begin(); j != shifts.end(); ++j) { 433 for (Shifts::const_iterator j = shifts.begin(); j != shifts.end(); ++j) {
424 Shift shift = *j; 434 Shift shift = *j;
425 { 435 {
426 InstructionSelectorTester m; 436 InstructionSelectorTester m;
427 m.Return(m.Projection( 437 m.Return(m.Projection(
428 1, m.NewNode(odpi.op, m.Parameter(0), 438 1, m.NewNode(odpi.op, m.Parameter(0),
429 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); 439 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2)))));
430 m.SelectInstructions(); 440 m.SelectInstructions();
431 CHECK_EQ(1, m.code.size()); 441 CHECK_EQ(1, m.code.size());
432 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 442 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
433 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); 443 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode());
434 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 444 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
435 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 445 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
436 CHECK_EQ(3, m.code[0]->InputCount()); 446 CHECK_EQ(3, m.code[0]->InputCount());
437 CHECK_LE(1, m.code[0]->OutputCount()); 447 CHECK_LE(1, m.code[0]->OutputCount());
438 } 448 }
439 { 449 {
440 InstructionSelectorTester m; 450 InstructionSelectorTester m;
441 m.Return(m.Projection( 451 m.Return(m.Projection(
442 1, m.NewNode(odpi.op, 452 1, m.NewNode(odpi.op,
443 m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), 453 m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)),
444 m.Parameter(2)))); 454 m.Parameter(2))));
445 m.SelectInstructions(); 455 m.SelectInstructions();
446 CHECK_EQ(1, m.code.size()); 456 CHECK_EQ(1, m.code.size());
447 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); 457 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode());
448 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); 458 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode());
449 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 459 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
450 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 460 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
451 CHECK_EQ(3, m.code[0]->InputCount()); 461 CHECK_EQ(3, m.code[0]->InputCount());
452 CHECK_LE(1, m.code[0]->OutputCount()); 462 CHECK_LE(1, m.code[0]->OutputCount());
453 } 463 }
454 { 464 {
455 InstructionSelectorTester m; 465 InstructionSelectorTester m;
456 m.Return(m.Projection( 466 m.Return(m.Projection(
457 0, m.NewNode(odpi.op, m.Parameter(0), 467 0, m.NewNode(odpi.op, m.Parameter(0),
458 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))))); 468 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2)))));
459 m.SelectInstructions(); 469 m.SelectInstructions();
460 CHECK_EQ(1, m.code.size()); 470 CHECK_EQ(1, m.code.size());
(...skipping 21 matching lines...) Expand all
482 InstructionSelectorTester m; 492 InstructionSelectorTester m;
483 Node* node = 493 Node* node =
484 m.NewNode(odpi.op, m.Parameter(0), 494 m.NewNode(odpi.op, m.Parameter(0),
485 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2))); 495 m.NewNode(shift.op, m.Parameter(1), m.Parameter(2)));
486 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); 496 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node)));
487 m.SelectInstructions(); 497 m.SelectInstructions();
488 CHECK_LE(1, m.code.size()); 498 CHECK_LE(1, m.code.size());
489 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 499 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
490 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); 500 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode());
491 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 501 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
492 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 502 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
493 CHECK_EQ(3, m.code[0]->InputCount()); 503 CHECK_EQ(3, m.code[0]->InputCount());
494 CHECK_EQ(2, m.code[0]->OutputCount()); 504 CHECK_EQ(2, m.code[0]->OutputCount());
495 } 505 }
496 { 506 {
497 InstructionSelectorTester m; 507 InstructionSelectorTester m;
498 Node* node = m.NewNode( 508 Node* node = m.NewNode(
499 odpi.op, m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)), 509 odpi.op, m.NewNode(shift.op, m.Parameter(0), m.Parameter(1)),
500 m.Parameter(2)); 510 m.Parameter(2));
501 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); 511 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node)));
502 m.SelectInstructions(); 512 m.SelectInstructions();
503 CHECK_LE(1, m.code.size()); 513 CHECK_LE(1, m.code.size());
504 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); 514 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode());
505 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode()); 515 CHECK_EQ(shift.r_mode, m.code[0]->addressing_mode());
506 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 516 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
507 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 517 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
508 CHECK_EQ(3, m.code[0]->InputCount()); 518 CHECK_EQ(3, m.code[0]->InputCount());
509 CHECK_EQ(2, m.code[0]->OutputCount()); 519 CHECK_EQ(2, m.code[0]->OutputCount());
510 } 520 }
511 } 521 }
512 } 522 }
513 } 523 }
514 524
515 525
516 TEST(InstructionSelectorODPIAndShiftImm) { 526 TEST(InstructionSelectorODPIAndShiftImm) {
517 ODPIs odpis; 527 ODPIs odpis;
518 Shifts shifts; 528 Shifts shifts;
519 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { 529 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) {
520 ODPI odpi = *i; 530 ODPI odpi = *i;
521 for (Shifts::const_iterator j = shifts.begin(); j != shifts.end(); ++j) { 531 for (Shifts::const_iterator j = shifts.begin(); j != shifts.end(); ++j) {
522 Shift shift = *j; 532 Shift shift = *j;
523 for (int32_t imm = shift.i_low; imm <= shift.i_high; ++imm) { 533 for (int32_t imm = shift.i_low; imm <= shift.i_high; ++imm) {
524 { 534 {
525 InstructionSelectorTester m; 535 InstructionSelectorTester m;
526 m.Return(m.Projection(1, m.NewNode(odpi.op, m.Parameter(0), 536 m.Return(m.Projection(1, m.NewNode(odpi.op, m.Parameter(0),
527 m.NewNode(shift.op, m.Parameter(1), 537 m.NewNode(shift.op, m.Parameter(1),
528 m.Int32Constant(imm))))); 538 m.Int32Constant(imm)))));
529 m.SelectInstructions(); 539 m.SelectInstructions();
530 CHECK_EQ(1, m.code.size()); 540 CHECK_EQ(1, m.code.size());
531 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 541 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
532 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); 542 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode());
533 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 543 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
534 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 544 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
535 CHECK_EQ(3, m.code[0]->InputCount()); 545 CHECK_EQ(3, m.code[0]->InputCount());
536 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); 546 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2)));
537 CHECK_LE(1, m.code[0]->OutputCount()); 547 CHECK_LE(1, m.code[0]->OutputCount());
538 } 548 }
539 { 549 {
540 InstructionSelectorTester m; 550 InstructionSelectorTester m;
541 m.Return(m.Projection( 551 m.Return(m.Projection(
542 1, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), 552 1, m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0),
543 m.Int32Constant(imm)), 553 m.Int32Constant(imm)),
544 m.Parameter(1)))); 554 m.Parameter(1))));
545 m.SelectInstructions(); 555 m.SelectInstructions();
546 CHECK_EQ(1, m.code.size()); 556 CHECK_EQ(1, m.code.size());
547 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); 557 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode());
548 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); 558 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode());
549 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 559 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
550 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 560 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
551 CHECK_EQ(3, m.code[0]->InputCount()); 561 CHECK_EQ(3, m.code[0]->InputCount());
552 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); 562 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2)));
553 CHECK_LE(1, m.code[0]->OutputCount()); 563 CHECK_LE(1, m.code[0]->OutputCount());
554 } 564 }
555 { 565 {
556 InstructionSelectorTester m; 566 InstructionSelectorTester m;
557 m.Return(m.Projection(0, m.NewNode(odpi.op, m.Parameter(0), 567 m.Return(m.Projection(0, m.NewNode(odpi.op, m.Parameter(0),
558 m.NewNode(shift.op, m.Parameter(1), 568 m.NewNode(shift.op, m.Parameter(1),
559 m.Int32Constant(imm))))); 569 m.Int32Constant(imm)))));
560 m.SelectInstructions(); 570 m.SelectInstructions();
(...skipping 24 matching lines...) Expand all
585 InstructionSelectorTester m; 595 InstructionSelectorTester m;
586 Node* node = m.NewNode( 596 Node* node = m.NewNode(
587 odpi.op, m.Parameter(0), 597 odpi.op, m.Parameter(0),
588 m.NewNode(shift.op, m.Parameter(1), m.Int32Constant(imm))); 598 m.NewNode(shift.op, m.Parameter(1), m.Int32Constant(imm)));
589 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); 599 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node)));
590 m.SelectInstructions(); 600 m.SelectInstructions();
591 CHECK_LE(1, m.code.size()); 601 CHECK_LE(1, m.code.size());
592 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 602 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
593 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); 603 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode());
594 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 604 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
595 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 605 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
596 CHECK_EQ(3, m.code[0]->InputCount()); 606 CHECK_EQ(3, m.code[0]->InputCount());
597 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); 607 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2)));
598 CHECK_EQ(2, m.code[0]->OutputCount()); 608 CHECK_EQ(2, m.code[0]->OutputCount());
599 } 609 }
600 { 610 {
601 InstructionSelectorTester m; 611 InstructionSelectorTester m;
602 Node* node = m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0), 612 Node* node = m.NewNode(odpi.op, m.NewNode(shift.op, m.Parameter(0),
603 m.Int32Constant(imm)), 613 m.Int32Constant(imm)),
604 m.Parameter(1)); 614 m.Parameter(1));
605 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node))); 615 m.Return(m.Word32Equal(m.Projection(0, node), m.Projection(1, node)));
606 m.SelectInstructions(); 616 m.SelectInstructions();
607 CHECK_LE(1, m.code.size()); 617 CHECK_LE(1, m.code.size());
608 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); 618 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode());
609 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode()); 619 CHECK_EQ(shift.i_mode, m.code[0]->addressing_mode());
610 CHECK_EQ(kFlags_set, m.code[0]->flags_mode()); 620 CHECK_EQ(kFlags_set, m.code[0]->flags_mode());
611 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 621 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
612 CHECK_EQ(3, m.code[0]->InputCount()); 622 CHECK_EQ(3, m.code[0]->InputCount());
613 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2))); 623 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(2)));
614 CHECK_EQ(2, m.code[0]->OutputCount()); 624 CHECK_EQ(2, m.code[0]->OutputCount());
615 } 625 }
616 } 626 }
617 } 627 }
618 } 628 }
619 } 629 }
620 630
621 631
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1729 m.Branch(m.Projection(1, node), &blocka, &blockb); 1739 m.Branch(m.Projection(1, node), &blocka, &blockb);
1730 m.Bind(&blocka); 1740 m.Bind(&blocka);
1731 m.Return(m.Int32Constant(0)); 1741 m.Return(m.Int32Constant(0));
1732 m.Bind(&blockb); 1742 m.Bind(&blockb);
1733 m.Return(m.Projection(0, node)); 1743 m.Return(m.Projection(0, node));
1734 m.SelectInstructions(); 1744 m.SelectInstructions();
1735 CHECK_EQ(1, m.code.size()); 1745 CHECK_EQ(1, m.code.size());
1736 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 1746 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
1737 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); 1747 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
1738 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); 1748 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode());
1739 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 1749 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
1740 } 1750 }
1741 { 1751 {
1742 InstructionSelectorTester m; 1752 InstructionSelectorTester m;
1743 MLabel blocka, blockb; 1753 MLabel blocka, blockb;
1744 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); 1754 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1));
1745 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), 1755 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)),
1746 &blocka, &blockb); 1756 &blocka, &blockb);
1747 m.Bind(&blocka); 1757 m.Bind(&blocka);
1748 m.Return(m.Int32Constant(0)); 1758 m.Return(m.Int32Constant(0));
1749 m.Bind(&blockb); 1759 m.Bind(&blockb);
1750 m.Return(m.Projection(0, node)); 1760 m.Return(m.Projection(0, node));
1751 m.SelectInstructions(); 1761 m.SelectInstructions();
1752 CHECK_EQ(1, m.code.size()); 1762 CHECK_EQ(1, m.code.size());
1753 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 1763 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
1754 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); 1764 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
1755 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); 1765 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode());
1756 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); 1766 CHECK_EQ(odpi.negated_condition, m.code[0]->flags_condition());
1757 } 1767 }
1758 { 1768 {
1759 InstructionSelectorTester m; 1769 InstructionSelectorTester m;
1760 MLabel blocka, blockb; 1770 MLabel blocka, blockb;
1761 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1)); 1771 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Parameter(1));
1762 m.Branch(m.Word32Equal(m.Int32Constant(0), m.Projection(1, node)), 1772 m.Branch(m.Word32Equal(m.Int32Constant(0), m.Projection(1, node)),
1763 &blocka, &blockb); 1773 &blocka, &blockb);
1764 m.Bind(&blocka); 1774 m.Bind(&blocka);
1765 m.Return(m.Int32Constant(0)); 1775 m.Return(m.Int32Constant(0));
1766 m.Bind(&blockb); 1776 m.Bind(&blockb);
1767 m.Return(m.Projection(0, node)); 1777 m.Return(m.Projection(0, node));
1768 m.SelectInstructions(); 1778 m.SelectInstructions();
1769 CHECK_EQ(1, m.code.size()); 1779 CHECK_EQ(1, m.code.size());
1770 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 1780 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
1771 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode()); 1781 CHECK_EQ(kMode_Operand2_R, m.code[0]->addressing_mode());
1772 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); 1782 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode());
1773 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); 1783 CHECK_EQ(odpi.negated_condition, m.code[0]->flags_condition());
1774 } 1784 }
1775 } 1785 }
1776 } 1786 }
1777 1787
1778 1788
1779 TEST(InstructionSelectorBranchWithODPIImm) { 1789 TEST(InstructionSelectorBranchWithODPIImm) {
1780 ODPIs odpis; 1790 ODPIs odpis;
1781 Immediates immediates; 1791 Immediates immediates;
1782 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) { 1792 for (ODPIs::const_iterator i = odpis.begin(); i != odpis.end(); ++i) {
1783 ODPI odpi = *i; 1793 ODPI odpi = *i;
1784 for (Immediates::const_iterator j = immediates.begin(); 1794 for (Immediates::const_iterator j = immediates.begin();
1785 j != immediates.end(); ++j) { 1795 j != immediates.end(); ++j) {
1786 int32_t imm = *j; 1796 int32_t imm = *j;
1787 { 1797 {
1788 InstructionSelectorTester m; 1798 InstructionSelectorTester m;
1789 MLabel blocka, blockb; 1799 MLabel blocka, blockb;
1790 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); 1800 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm));
1791 m.Branch(m.Projection(1, node), &blocka, &blockb); 1801 m.Branch(m.Projection(1, node), &blocka, &blockb);
1792 m.Bind(&blocka); 1802 m.Bind(&blocka);
1793 m.Return(m.Int32Constant(0)); 1803 m.Return(m.Int32Constant(0));
1794 m.Bind(&blockb); 1804 m.Bind(&blockb);
1795 m.Return(m.Projection(0, node)); 1805 m.Return(m.Projection(0, node));
1796 m.SelectInstructions(); 1806 m.SelectInstructions();
1797 CHECK_EQ(1, m.code.size()); 1807 CHECK_EQ(1, m.code.size());
1798 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 1808 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
1799 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); 1809 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
1800 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); 1810 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode());
1801 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 1811 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
1802 CHECK_LE(2, m.code[0]->InputCount()); 1812 CHECK_LE(2, m.code[0]->InputCount());
1803 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); 1813 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
1804 } 1814 }
1805 { 1815 {
1806 InstructionSelectorTester m; 1816 InstructionSelectorTester m;
1807 MLabel blocka, blockb; 1817 MLabel blocka, blockb;
1808 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); 1818 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0));
1809 m.Branch(m.Projection(1, node), &blocka, &blockb); 1819 m.Branch(m.Projection(1, node), &blocka, &blockb);
1810 m.Bind(&blocka); 1820 m.Bind(&blocka);
1811 m.Return(m.Int32Constant(0)); 1821 m.Return(m.Int32Constant(0));
1812 m.Bind(&blockb); 1822 m.Bind(&blockb);
1813 m.Return(m.Projection(0, node)); 1823 m.Return(m.Projection(0, node));
1814 m.SelectInstructions(); 1824 m.SelectInstructions();
1815 CHECK_EQ(1, m.code.size()); 1825 CHECK_EQ(1, m.code.size());
1816 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); 1826 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode());
1817 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); 1827 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
1818 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); 1828 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode());
1819 CHECK_EQ(kOverflow, m.code[0]->flags_condition()); 1829 CHECK_EQ(odpi.condition, m.code[0]->flags_condition());
1820 CHECK_LE(2, m.code[0]->InputCount()); 1830 CHECK_LE(2, m.code[0]->InputCount());
1821 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); 1831 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
1822 } 1832 }
1823 { 1833 {
1824 InstructionSelectorTester m; 1834 InstructionSelectorTester m;
1825 MLabel blocka, blockb; 1835 MLabel blocka, blockb;
1826 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm)); 1836 Node* node = m.NewNode(odpi.op, m.Parameter(0), m.Int32Constant(imm));
1827 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), 1837 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)),
1828 &blocka, &blockb); 1838 &blocka, &blockb);
1829 m.Bind(&blocka); 1839 m.Bind(&blocka);
1830 m.Return(m.Int32Constant(0)); 1840 m.Return(m.Int32Constant(0));
1831 m.Bind(&blockb); 1841 m.Bind(&blockb);
1832 m.Return(m.Projection(0, node)); 1842 m.Return(m.Projection(0, node));
1833 m.SelectInstructions(); 1843 m.SelectInstructions();
1834 CHECK_EQ(1, m.code.size()); 1844 CHECK_EQ(1, m.code.size());
1835 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode()); 1845 CHECK_EQ(odpi.arch_opcode, m.code[0]->arch_opcode());
1836 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); 1846 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
1837 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); 1847 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode());
1838 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); 1848 CHECK_EQ(odpi.negated_condition, m.code[0]->flags_condition());
1839 CHECK_LE(2, m.code[0]->InputCount()); 1849 CHECK_LE(2, m.code[0]->InputCount());
1840 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); 1850 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
1841 } 1851 }
1842 { 1852 {
1843 InstructionSelectorTester m; 1853 InstructionSelectorTester m;
1844 MLabel blocka, blockb; 1854 MLabel blocka, blockb;
1845 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0)); 1855 Node* node = m.NewNode(odpi.op, m.Int32Constant(imm), m.Parameter(0));
1846 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)), 1856 m.Branch(m.Word32Equal(m.Projection(1, node), m.Int32Constant(0)),
1847 &blocka, &blockb); 1857 &blocka, &blockb);
1848 m.Bind(&blocka); 1858 m.Bind(&blocka);
1849 m.Return(m.Int32Constant(0)); 1859 m.Return(m.Int32Constant(0));
1850 m.Bind(&blockb); 1860 m.Bind(&blockb);
1851 m.Return(m.Projection(0, node)); 1861 m.Return(m.Projection(0, node));
1852 m.SelectInstructions(); 1862 m.SelectInstructions();
1853 CHECK_EQ(1, m.code.size()); 1863 CHECK_EQ(1, m.code.size());
1854 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode()); 1864 CHECK_EQ(odpi.reverse_arch_opcode, m.code[0]->arch_opcode());
1855 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode()); 1865 CHECK_EQ(kMode_Operand2_I, m.code[0]->addressing_mode());
1856 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode()); 1866 CHECK_EQ(kFlags_branch, m.code[0]->flags_mode());
1857 CHECK_EQ(kNotOverflow, m.code[0]->flags_condition()); 1867 CHECK_EQ(odpi.negated_condition, m.code[0]->flags_condition());
1858 CHECK_LE(2, m.code[0]->InputCount()); 1868 CHECK_LE(2, m.code[0]->InputCount());
1859 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1))); 1869 CHECK_EQ(imm, m.ToInt32(m.code[0]->InputAt(1)));
1860 } 1870 }
1861 } 1871 }
1862 } 1872 }
1863 } 1873 }
OLDNEW
« no previous file with comments | « src/compiler/x64/instruction-selector-x64.cc ('k') | test/cctest/compiler/test-run-machops.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698