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

Side by Side Diff: test/unittests/compiler/ia32/instruction-selector-ia32-unittest.cc

Issue 614013002: [turbofan] intel lea add multiply matchers (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: rebase Created 6 years, 2 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
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 "test/unittests/compiler/instruction-selector-unittest.h" 5 #include "test/unittests/compiler/instruction-selector-unittest.h"
6 6
7 namespace v8 { 7 namespace v8 {
8 namespace internal { 8 namespace internal {
9 namespace compiler { 9 namespace compiler {
10 10
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 {11, false, kMode_None}}; 467 {11, false, kMode_None}};
468 468
469 } // namespace 469 } // namespace
470 470
471 471
472 typedef InstructionSelectorTestWithParam<MultParam> InstructionSelectorMultTest; 472 typedef InstructionSelectorTestWithParam<MultParam> InstructionSelectorMultTest;
473 473
474 474
475 static unsigned InputCountForLea(AddressingMode mode) { 475 static unsigned InputCountForLea(AddressingMode mode) {
476 switch (mode) { 476 switch (mode) {
477 case kMode_MR1I:
478 case kMode_MR2I:
479 case kMode_MR4I:
480 case kMode_MR8I:
481 return 3U;
482 case kMode_M1I:
483 case kMode_M2I:
484 case kMode_M4I:
485 case kMode_M8I:
486 return 2U;
477 case kMode_MR1: 487 case kMode_MR1:
478 case kMode_MR2: 488 case kMode_MR2:
479 case kMode_MR4: 489 case kMode_MR4:
480 case kMode_MR8: 490 case kMode_MR8:
481 return 2U; 491 return 2U;
482 case kMode_M1: 492 case kMode_M1:
483 case kMode_M2: 493 case kMode_M2:
484 case kMode_M4: 494 case kMode_M4:
485 case kMode_M8: 495 case kMode_M8:
486 return 1U; 496 return 1U;
487 default: 497 default:
488 UNREACHABLE(); 498 UNREACHABLE();
489 return 0U; 499 return 0U;
490 } 500 }
491 } 501 }
492 502
493 503
504 static AddressingMode AddressingModeForAddMult(const MultParam& m) {
505 switch (m.addressing_mode) {
506 case kMode_MR1:
507 return kMode_MR1I;
508 case kMode_MR2:
509 return kMode_MR2I;
510 case kMode_MR4:
511 return kMode_MR4I;
512 case kMode_MR8:
513 return kMode_MR8I;
514 case kMode_M1:
515 return kMode_M1I;
516 case kMode_M2:
517 return kMode_M2I;
518 case kMode_M4:
519 return kMode_M4I;
520 case kMode_M8:
521 return kMode_M8I;
522 default:
523 UNREACHABLE();
524 return kMode_None;
525 }
526 }
527
528
494 TEST_P(InstructionSelectorMultTest, Mult32) { 529 TEST_P(InstructionSelectorMultTest, Mult32) {
495 const MultParam m_param = GetParam(); 530 const MultParam m_param = GetParam();
496 StreamBuilder m(this, kMachInt32, kMachInt32); 531 StreamBuilder m(this, kMachInt32, kMachInt32);
497 Node* param = m.Parameter(0); 532 Node* param = m.Parameter(0);
498 Node* mult = m.Int32Mul(param, m.Int32Constant(m_param.value)); 533 Node* mult = m.Int32Mul(param, m.Int32Constant(m_param.value));
499 m.Return(mult); 534 m.Return(mult);
500 Stream s = m.Build(); 535 Stream s = m.Build();
501 ASSERT_EQ(1U, s.size()); 536 ASSERT_EQ(1U, s.size());
502 EXPECT_EQ(m_param.addressing_mode, s[0]->addressing_mode()); 537 EXPECT_EQ(m_param.addressing_mode, s[0]->addressing_mode());
503 if (m_param.lea_expected) { 538 if (m_param.lea_expected) {
504 EXPECT_EQ(kIA32Lea, s[0]->arch_opcode()); 539 EXPECT_EQ(kIA32Lea, s[0]->arch_opcode());
505 ASSERT_EQ(InputCountForLea(s[0]->addressing_mode()), s[0]->InputCount()); 540 ASSERT_EQ(InputCountForLea(s[0]->addressing_mode()), s[0]->InputCount());
506 } else { 541 } else {
507 EXPECT_EQ(kIA32Imul, s[0]->arch_opcode()); 542 EXPECT_EQ(kIA32Imul, s[0]->arch_opcode());
508 ASSERT_EQ(2U, s[0]->InputCount()); 543 ASSERT_EQ(2U, s[0]->InputCount());
509 } 544 }
510 EXPECT_EQ(param->id(), s.ToVreg(s[0]->InputAt(0))); 545 EXPECT_EQ(param->id(), s.ToVreg(s[0]->InputAt(0)));
511 } 546 }
512 547
513 548
549 TEST_P(InstructionSelectorMultTest, MultAdd32) {
550 TRACED_FOREACH(int32_t, imm, kImmediates) {
551 const MultParam m_param = GetParam();
552 StreamBuilder m(this, kMachInt32, kMachInt32);
553 Node* param = m.Parameter(0);
554 Node* mult = m.Int32Add(m.Int32Mul(param, m.Int32Constant(m_param.value)),
555 m.Int32Constant(imm));
556 m.Return(mult);
557 Stream s = m.Build();
558 if (m_param.lea_expected) {
559 ASSERT_EQ(1U, s.size());
560 EXPECT_EQ(kIA32Lea, s[0]->arch_opcode());
561 EXPECT_EQ(AddressingModeForAddMult(m_param), s[0]->addressing_mode());
562 unsigned input_count = InputCountForLea(s[0]->addressing_mode());
563 ASSERT_EQ(input_count, s[0]->InputCount());
564 ASSERT_EQ(InstructionOperand::IMMEDIATE,
565 s[0]->InputAt(input_count - 1)->kind());
566 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(input_count - 1)));
567 } else {
568 ASSERT_EQ(2U, s.size());
569 EXPECT_EQ(kIA32Imul, s[0]->arch_opcode());
570 EXPECT_EQ(kIA32Add, s[1]->arch_opcode());
571 }
572 }
573 }
574
575
514 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorMultTest, 576 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorMultTest,
515 ::testing::ValuesIn(kMultParams)); 577 ::testing::ValuesIn(kMultParams));
516 578
517 } // namespace compiler 579 } // namespace compiler
518 } // namespace internal 580 } // namespace internal
519 } // namespace v8 581 } // namespace v8
OLDNEW
« no previous file with comments | « test/cctest/compiler/value-helper.h ('k') | test/unittests/compiler/x64/instruction-selector-x64-unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698